blob: 7e72fbdafd70fd288c0109cb5d52aac87bb301be [file] [log] [blame]
Sjoerd Mullenderc4315491992-09-23 14:53:00 +00001/***********************************************************
2Copyright 1991, 1992 by Stichting Mathematisch Centrum, Amsterdam, The
3Netherlands.
4
5 All Rights Reserved
6
7Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
9provided that the above copyright notice appear in all copies and that
10both that copyright notice and this permission notice appear in
11supporting documentation, and that the names of Stichting Mathematisch
12Centrum or CWI not be used in advertising or publicity pertaining to
13distribution of the software without specific, written prior permission.
14
15STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
16THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
17FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
18FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
19WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
20ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
21OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
22
23******************************************************************/
24
25
26/* Cl objects */
27
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +000028#include <stdarg.h>
Sjoerd Mullenderc4315491992-09-23 14:53:00 +000029#include <cl.h>
30#include "allobjects.h"
31#include "modsupport.h" /* For getargs() etc. */
32#include "ceval.h" /* For call_object() */
33
34typedef struct {
35 OB_HEAD
36 int ob_isCompressor; /* Compressor or Decompressor */
37 CL_CompressorHdl ob_compressorHdl;
38 long ob_dataMaxSize;
Sjoerd Mullender384f2481992-09-29 16:43:43 +000039 long ob_frameSize;
Sjoerd Mullenderc4315491992-09-23 14:53:00 +000040 object *ob_callbackFunc;
41 object *ob_callbackID;
42 object *ob_data;
43} clobject;
44
Sjoerd Mullender37f17b71992-09-25 10:28:20 +000045#define CheckCompressor(self) if ((self)->ob_compressorHdl == NULL) { \
46 err_setstr(RuntimeError, "(de)compressor not active"); \
47 return NULL; \
48 }
49
Sjoerd Mullenderc4315491992-09-23 14:53:00 +000050extern typeobject Cltype; /* Really static, forward */
51
52#define is_clobject(v) ((v)->ob_type == &Cltype)
53
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +000054static object *ClError; /* exception cl.error */
55
56static int error_handler_called = 0;
57
58static void
59cl_ErrorHandler(long errnum, const char *fmt, ...)
60{
61 va_list ap;
62 char errbuf[BUFSIZ]; /* hopefully big enough */
Sjoerd Mullender384f2481992-09-29 16:43:43 +000063 char *p;
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +000064
Sjoerd Mullender384f2481992-09-29 16:43:43 +000065 if (err_occurred()) /* don't change existing error */
66 return;
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +000067 error_handler_called = 1;
68 va_start(ap, fmt);
69 vsprintf(errbuf, fmt, ap);
70 va_end(ap);
Sjoerd Mullender384f2481992-09-29 16:43:43 +000071 p = &errbuf[strlen(errbuf) - 1]; /* swat the line feed */
72 if (*p == '\n')
73 *p = 0;
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +000074 err_setstr(ClError, errbuf);
75}
76
Sjoerd Mullenderc4315491992-09-23 14:53:00 +000077static object *
Sjoerd Mullender384f2481992-09-29 16:43:43 +000078doClose(self, args, close_func)
Sjoerd Mullender37f17b71992-09-25 10:28:20 +000079 clobject *self;
80 object *args;
Sjoerd Mullender384f2481992-09-29 16:43:43 +000081 long (*close_func) PROTO((CL_CompressorHdl));
Sjoerd Mullender37f17b71992-09-25 10:28:20 +000082{
83 CheckCompressor(self);
84
85 if (!getnoarg(args))
86 return NULL;
87
Sjoerd Mullender384f2481992-09-29 16:43:43 +000088 if ((*close_func)(self->ob_compressorHdl) == FAILURE) {
Sjoerd Mullender37f17b71992-09-25 10:28:20 +000089 if (!error_handler_called)
90 err_setstr(ClError, "CloseCompressor failed");
91 return NULL;
92 }
93
94 self->ob_compressorHdl = NULL;
95
96 INCREF(None);
97 return None;
98}
99
100static object *
Sjoerd Mullender384f2481992-09-29 16:43:43 +0000101clm_CloseCompressor(self, args)
Sjoerd Mullender37f17b71992-09-25 10:28:20 +0000102 clobject *self;
103 object *args;
104{
Sjoerd Mullender384f2481992-09-29 16:43:43 +0000105 return doClose(self, args, clCloseCompressor);
Sjoerd Mullender37f17b71992-09-25 10:28:20 +0000106}
107
108static object *
Sjoerd Mullender384f2481992-09-29 16:43:43 +0000109clm_CloseDecompressor(self, args)
110 clobject *self;
111 object *args;
112{
113 return doClose(self, args, clCloseDecompressor);
114}
115
116static object *
117clm_Compress(self, args)
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000118 clobject *self;
119 object *args;
120{
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +0000121 object *data;
122 long frameIndex, numberOfFrames, dataSize;
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000123
Sjoerd Mullender37f17b71992-09-25 10:28:20 +0000124 CheckCompressor(self);
125
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000126 if (!getargs(args, "(ii)", &frameIndex, &numberOfFrames))
127 return NULL;
128
Sjoerd Mullender384f2481992-09-29 16:43:43 +0000129 dataSize = self->ob_dataMaxSize;
130 data = newsizedstringobject(NULL, dataSize);
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000131 if (data == NULL)
132 return NULL;
133
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +0000134 error_handler_called = 0;
135 if (clCompress(self->ob_compressorHdl, frameIndex, numberOfFrames,
136 &dataSize, (void *) getstringvalue(data)) == FAILURE) {
137 DECREF(data);
Sjoerd Mullender384f2481992-09-29 16:43:43 +0000138 if (!error_handler_called && !err_occurred())
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +0000139 err_setstr(ClError, "compress failed");
140 return NULL;
141 }
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000142
Sjoerd Mullender384f2481992-09-29 16:43:43 +0000143 if (dataSize < self->ob_dataMaxSize)
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000144 if (resizestring(&data, dataSize))
145 return NULL;
146
Sjoerd Mullender384f2481992-09-29 16:43:43 +0000147 if (dataSize > self->ob_dataMaxSize) {
148 /* we didn't get all data */
149 DECREF(data);
150 err_setstr(ClError, "buffer too small for compressed image");
151 return NULL;
152 }
153
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +0000154 return data;
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000155}
156
157static object *
Sjoerd Mullender384f2481992-09-29 16:43:43 +0000158clm_Decompress(self, args)
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000159 clobject *self;
160 object *args;
161{
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +0000162 object *data;
163 long frameIndex, numberOfFrames;
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000164
Sjoerd Mullender37f17b71992-09-25 10:28:20 +0000165 CheckCompressor(self);
166
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000167 if (!getargs(args, "(ii)", &frameIndex, &numberOfFrames))
168 return NULL;
169
170 data = newsizedstringobject(NULL,
Sjoerd Mullender384f2481992-09-29 16:43:43 +0000171 numberOfFrames * self->ob_frameSize);
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000172 if (data == NULL)
173 return NULL;
174
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +0000175 error_handler_called = 0;
176 if (clDecompress(self->ob_compressorHdl, frameIndex, numberOfFrames,
177 (void *) getstringvalue(data)) == FAILURE) {
178 DECREF(data);
Sjoerd Mullender384f2481992-09-29 16:43:43 +0000179 if (!error_handler_called && !err_occurred())
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +0000180 err_setstr(ClError, "decompress failed");
181 return NULL;
182 }
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000183
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +0000184 return data;
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000185}
186
187static object *
Sjoerd Mullender384f2481992-09-29 16:43:43 +0000188clm_GetCompressorInfo(self, args)
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000189 clobject *self;
190 object *args;
191{
192 long result, infoSize;
193 void *info;
194 object *infoObject, *res;
195
Sjoerd Mullender37f17b71992-09-25 10:28:20 +0000196 CheckCompressor(self);
197
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000198 if (!getnoarg(args))
199 return NULL;
200
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +0000201 error_handler_called = 0;
202 if (clGetCompressorInfo(self->ob_compressorHdl, &infoSize, &info) == FAILURE) {
203 if (!error_handler_called)
204 err_setstr(ClError, "getcompressorinfo failed");
205 return NULL;
206 }
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000207
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +0000208 return newsizedstringobject((char *) info, infoSize);
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000209}
210
211static object *
Sjoerd Mullender384f2481992-09-29 16:43:43 +0000212clm_GetDefault(self, args)
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000213 clobject *self;
214 object *args;
215{
216 long initial, result;
217
Sjoerd Mullender37f17b71992-09-25 10:28:20 +0000218 CheckCompressor(self);
219
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000220 if (!getargs(args, "i", &initial))
221 return NULL;
222
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +0000223 error_handler_called = 0;
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000224 result = clGetDefault(self->ob_compressorHdl, initial);
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +0000225 if (error_handler_called)
226 return NULL;
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000227
228 return newintobject(result);
229}
230
231static object *
Sjoerd Mullender384f2481992-09-29 16:43:43 +0000232clm_GetMinMax(self, args)
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000233 clobject *self;
234 object *args;
235{
236 long param, min, max;
237
Sjoerd Mullender37f17b71992-09-25 10:28:20 +0000238 CheckCompressor(self);
239
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000240 if (!getargs(args, "i", &param))
241 return NULL;
242
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +0000243 error_handler_called = 0;
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000244 clGetMinMax(self->ob_compressorHdl, param, &min, &max);
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +0000245 if (error_handler_called)
246 return NULL;
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000247
248 return mkvalue("(ii)", min, max);
249}
250
251static object *
Sjoerd Mullender384f2481992-09-29 16:43:43 +0000252clm_GetName(self, args)
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000253 clobject *self;
254 object *args;
255{
256 long descriptor;
257 char *name;
258
Sjoerd Mullender37f17b71992-09-25 10:28:20 +0000259 CheckCompressor(self);
260
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000261 if (!getargs(args, "i", &descriptor))
262 return NULL;
263
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +0000264 error_handler_called = 0;
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000265 name = clGetName(self->ob_compressorHdl, descriptor);
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +0000266 if (error_handler_called)
267 return NULL;
268 if (name == NULL) {
269 err_setstr(ClError, "getname failed");
270 return NULL;
271 }
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000272
273 return newstringobject(name);
274}
275
276static object *
277doParams(self, args, func, modified)
278 clobject *self;
279 object *args;
280 void (*func)(CL_CompressorHdl, long *, long);
281 int modified;
282{
283 object *list, *v;
284 long *PVbuffer;
285 long length;
286 int i;
287
Sjoerd Mullender37f17b71992-09-25 10:28:20 +0000288 CheckCompressor(self);
289
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000290 if (!getargs(args, "O", &list))
291 return NULL;
292 if (!is_listobject(list)) {
293 err_badarg();
294 return NULL;
295 }
296 length = getlistsize(list);
297 PVbuffer = NEW(long, length);
298 if (PVbuffer == NULL)
299 return err_nomem();
300 for (i = 0; i < length; i++) {
301 v = getlistitem(list, i);
302 if (!is_intobject(v)) {
303 DEL(PVbuffer);
304 err_badarg();
305 return NULL;
306 }
307 PVbuffer[i] = getintvalue(v);
308 }
309
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +0000310 error_handler_called = 0;
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000311 (*func)(self->ob_compressorHdl, PVbuffer, length);
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +0000312 if (error_handler_called)
313 return NULL;
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000314
315 if (modified) {
316 for (i = 0; i < length; i++)
317 setlistitem(list, i, newintobject(PVbuffer[i]));
318 }
319
320 DEL(PVbuffer);
321
322 INCREF(None);
323 return None;
324}
325
326static object *
Sjoerd Mullender384f2481992-09-29 16:43:43 +0000327clm_GetParams(self, args)
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000328 object *self, *args;
329{
330 return doParams(self, args, clGetParams, 1);
331}
332
333static object *
Sjoerd Mullender384f2481992-09-29 16:43:43 +0000334clm_SetParams(self, args)
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000335 object *self, *args;
336{
337 return doParams(self, args, clSetParams, 0);
338}
339
340static object *
Sjoerd Mullender384f2481992-09-29 16:43:43 +0000341clm_QueryParams(self, args)
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000342 clobject *self;
343 object *args;
344{
345 long bufferlength;
346 long *PVbuffer;
347 object *list;
348 int i;
349
Sjoerd Mullender37f17b71992-09-25 10:28:20 +0000350 CheckCompressor(self);
351
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000352 if (!getnoarg(args))
353 return NULL;
354
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +0000355 error_handler_called = 0;
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000356 bufferlength = clQueryParams(self->ob_compressorHdl, 0, 0);
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +0000357 if (error_handler_called)
358 return NULL;
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000359
360 PVbuffer = NEW(long, bufferlength);
361 if (PVbuffer == NULL)
362 return err_nomem();
363
364 bufferlength = clQueryParams(self->ob_compressorHdl, PVbuffer,
365 bufferlength);
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +0000366 if (error_handler_called) {
367 DEL(PVbuffer);
368 return NULL;
369 }
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000370
371 list = newlistobject(bufferlength);
372 if (list == NULL) {
373 DEL(PVbuffer);
374 return NULL;
375 }
376
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +0000377 for (i = 0; i < bufferlength; i++) {
378 if (i & 1)
379 setlistitem(list, i, newintobject(PVbuffer[i]));
380 else
381 setlistitem(list, i, newstringobject((char *) PVbuffer[i]));
382 }
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000383
384 DEL(PVbuffer);
385
386 return list;
387}
388
389static struct methodlist compressor_methods[] = {
Sjoerd Mullender384f2481992-09-29 16:43:43 +0000390 {"CloseCompressor", clm_CloseCompressor},
391 {"Compress", clm_Compress},
392 {"GetCompressorInfo", clm_GetCompressorInfo},
393 {"GetDefault", clm_GetDefault},
394 {"GetMinMax", clm_GetMinMax},
395 {"GetName", clm_GetName},
396 {"GetParams", clm_GetParams},
397 {"QueryParams", clm_QueryParams},
398 {"SetParams", clm_SetParams},
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000399 {NULL, NULL} /* sentinel */
400};
401
402static struct methodlist decompressor_methods[] = {
Sjoerd Mullender384f2481992-09-29 16:43:43 +0000403 {"CloseDecompressor", clm_CloseDecompressor},
404 {"Decompress", clm_Decompress},
405 {"GetDefault", clm_GetDefault},
406 {"GetMinMax", clm_GetMinMax},
407 {"GetName", clm_GetName},
408 {"GetParams", clm_GetParams},
409 {"QueryParams", clm_QueryParams},
410 {"SetParams", clm_SetParams},
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000411 {NULL, NULL} /* sentinel */
412};
413
414static void
415cl_dealloc(self)
416 clobject *self;
417{
418 if (self->ob_compressorHdl) {
419 if (self->ob_isCompressor)
420 clCloseCompressor(self->ob_compressorHdl);
421 else
422 clCloseDecompressor(self->ob_compressorHdl);
423 }
424 XDECREF(self->ob_callbackFunc);
425 XDECREF(self->ob_callbackID);
426 XDECREF(self->ob_data);
427 DEL(self);
428}
429
430static object *
431cl_getattr(self, name)
432 clobject *self;
433 char *name;
434{
435 if (self->ob_isCompressor)
436 return findmethod(compressor_methods, (object *)self, name);
437 else
438 return findmethod(decompressor_methods, (object *) self, name);
439}
440
441static typeobject Cltype = {
442 OB_HEAD_INIT(&Typetype)
443 0, /*ob_size*/
444 "cl", /*tp_name*/
445 sizeof(clobject), /*tp_size*/
446 0, /*tp_itemsize*/
447 /* methods */
448 cl_dealloc, /*tp_dealloc*/
449 0, /*tp_print*/
450 cl_getattr, /*tp_getattr*/
451 0, /*tp_setattr*/
452 0, /*tp_compare*/
453 0, /*tp_repr*/
454 0, /*tp_as_number*/
455 0, /*tp_as_sequence*/
456 0, /*tp_as_mapping*/
457};
458
459static long
460GetFrame(callbackID, frameIndex, numberOfFrames, data)
461 void *callbackID;
462 long frameIndex;
463 long numberOfFrames;
464 void **data;
465{
466 object *args;
467 clobject *self = (clobject *) callbackID;
468 object *result;
469
Sjoerd Mullender384f2481992-09-29 16:43:43 +0000470 args = mkvalue("(Oii)", self->ob_callbackID, frameIndex,
471 numberOfFrames);
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000472 if (args == NULL)
473 return FAILURE;
474
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000475 result = call_object(self->ob_callbackFunc, args);
476 DECREF(args);
477 if (result == NULL)
478 return FAILURE;
479
480 if (!is_stringobject(result)) {
481 DECREF(result);
482 return FAILURE;
483 }
484
485 XDECREF(self->ob_data);
486 self->ob_data = result;
487
488 *data = (void *) getstringvalue(result);
489
490 return SUCCESS;
491}
492
493static long
494GetData(callbackID, frameIndex, numberOfFrames, dataSize, data)
495 void *callbackID;
496 long frameIndex;
497 long numberOfFrames;
498 long *dataSize;
499 void **data;
500{
501 object *args, *result;
502 clobject *self = (clobject *) callbackID;
503
Sjoerd Mullender384f2481992-09-29 16:43:43 +0000504 args = mkvalue("(Oii)", self->ob_callbackID, frameIndex,
505 numberOfFrames);
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000506 if (args == NULL)
507 return FAILURE;
508
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000509 result = call_object(self->ob_callbackFunc, args);
510 DECREF(args);
511 if (result == NULL)
512 return FAILURE;
513
514 if (!is_stringobject(result)) {
515 DECREF(result);
516 return FAILURE;
517 }
518
519 XDECREF(self->ob_data);
520 self->ob_data = result;
521
522 *dataSize = getstringsize(result);
523 *data = (void *) getstringvalue(result);
524
525 return SUCCESS;
526}
527
528static object *
529cl_OpenCompressor(self, args)
530 object *self, *args;
531{
532 CL_CompressionFormat compressionFormat;
533 long qualityFactor;
534 object *GetFrameCBPtr;
535 object *callbackID;
536 clobject *new;
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000537
538 if (!getargs(args, "((iiiiiiiiii)iOO)",
539 &compressionFormat.width,
540 &compressionFormat.height,
541 &compressionFormat.frameSize,
542 &compressionFormat.dataMaxSize,
543 &compressionFormat.originalFormat,
544 &compressionFormat.components,
545 &compressionFormat.bitsPerComponent,
546 &compressionFormat.frameRate,
547 &compressionFormat.numberOfFrames,
548 &compressionFormat.compressionScheme,
549 &qualityFactor, &GetFrameCBPtr, &callbackID))
550 return NULL;
551
552 new = NEWOBJ(clobject, &Cltype);
553 if (new == 0)
554 return NULL;
555
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +0000556 new->ob_compressorHdl = NULL;
557 new->ob_callbackFunc = NULL;
558 new->ob_callbackID = NULL;
559 new->ob_data = NULL;
560
561 error_handler_called = 0;
562 if (clOpenCompressor(&compressionFormat, qualityFactor, GetFrame,
563 (void *) new, &new->ob_compressorHdl) == FAILURE) {
564 DECREF(new);
565 if (!error_handler_called)
566 err_setstr(ClError, "opencompressor failed");
567 return NULL;
568 }
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000569
570 new->ob_isCompressor = 1;
571 new->ob_callbackFunc = GetFrameCBPtr;
572 XINCREF(new->ob_callbackFunc);
573 if (callbackID == NULL)
574 callbackID = None;
575 new->ob_callbackID = callbackID;
576 INCREF(new->ob_callbackID);
577 new->ob_data = NULL;
578 new->ob_dataMaxSize = compressionFormat.dataMaxSize;
Sjoerd Mullender384f2481992-09-29 16:43:43 +0000579 new->ob_frameSize = compressionFormat.frameSize;
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000580
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +0000581 return new;
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000582}
583
584static object *
585cl_OpenDecompressor(self, args)
586 object *self, *args;
587{
588 CL_CompressionFormat compressionFormat;
589 long infoSize;
590 void *info;
591 object *GetDataCBPtr;
592 object *callbackID;
593 clobject *new;
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000594 object *res;
595
Sjoerd Mullender37f17b71992-09-25 10:28:20 +0000596 if (!getargs(args, "((iiiiiiiiii)s#OO)",
597 &compressionFormat.width,
598 &compressionFormat.height,
599 &compressionFormat.frameSize,
600 &compressionFormat.dataMaxSize,
601 &compressionFormat.originalFormat,
602 &compressionFormat.components,
603 &compressionFormat.bitsPerComponent,
604 &compressionFormat.frameRate,
605 &compressionFormat.numberOfFrames,
606 &compressionFormat.compressionScheme,
607 &info, &infoSize, &GetDataCBPtr, &callbackID))
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000608 return NULL;
609
610 new = NEWOBJ(clobject, &Cltype);
611 if (new == 0)
612 return NULL;
613
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +0000614 new->ob_compressorHdl = NULL;
615 new->ob_callbackFunc = NULL;
616 new->ob_callbackID = NULL;
617 new->ob_data = NULL;
618
619 error_handler_called = 0;
620 if (clOpenDecompressor(&compressionFormat, infoSize, info, GetData,
621 (void *) new, &new->ob_compressorHdl) == FAILURE) {
Sjoerd Mullender37f17b71992-09-25 10:28:20 +0000622 new->ob_compressorHdl = NULL; /* just in case... */
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +0000623 DECREF(new);
624 if (!error_handler_called)
625 err_setstr(ClError, "opendecompressor failed");
626 return NULL;
627 }
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000628
629 new->ob_isCompressor = 0;
630 new->ob_callbackFunc = GetDataCBPtr;
631 XINCREF(new->ob_callbackFunc);
632 if (callbackID == NULL)
633 callbackID = None;
634 new->ob_callbackID = callbackID;
635 XINCREF(new->ob_callbackID);
636 new->ob_data = NULL;
Sjoerd Mullender37f17b71992-09-25 10:28:20 +0000637 new->ob_dataMaxSize = compressionFormat.dataMaxSize;
Sjoerd Mullender384f2481992-09-29 16:43:43 +0000638 new->ob_frameSize = compressionFormat.frameSize;
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000639
Sjoerd Mullender37f17b71992-09-25 10:28:20 +0000640 return new;
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000641}
642
643static object *
644cl_AddParam(self, args)
645 object *self, *args;
646{
647 char *name;
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +0000648 long type, min, max, initial, paramID;
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000649
650 if (!getargs(args, "(siiii)", &name, &type, &min, &max, &initial))
651 return NULL;
652
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +0000653 error_handler_called = 0;
654 if (clAddParam(name, type, min, max, initial, &paramID) == FAILURE) {
655 if (!error_handler_called)
656 err_setstr(ClError, "addparam failed");
657 return NULL;
658 }
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000659
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +0000660 return newintobject(paramID);
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000661}
662
Sjoerd Mullender384f2481992-09-29 16:43:43 +0000663static object *
664cl_QueryParams(self, args)
665 object *self, *args;
666{
667 long handle, *PVbuffer, bufferlength;
668 object *list;
669 int i;
670
671 if (!getargs(args, "i", &handle))
672 return NULL;
673
674 error_handler_called = 0;
675 bufferlength = clQueryParams((CL_CompressorHdl) handle, 0, 0);
676 if (error_handler_called)
677 return NULL;
678
679 PVbuffer = NEW(long, bufferlength);
680 if (PVbuffer == NULL)
681 return err_nomem();
682
683 bufferlength = clQueryParams((CL_CompressorHdl) handle, PVbuffer,
684 bufferlength);
685 if (error_handler_called) {
686 DEL(PVbuffer);
687 return NULL;
688 }
689
690 list = newlistobject(bufferlength);
691 if (list == NULL) {
692 DEL(PVbuffer);
693 return NULL;
694 }
695
696 for (i = 0; i < bufferlength; i++) {
697 if (i & 1)
698 setlistitem(list, i, newintobject(PVbuffer[i]));
699 else
700 setlistitem(list, i, newstringobject((char *) PVbuffer[i]));
701 }
702
703 DEL(PVbuffer);
704
705 return list;
706}
707
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000708static struct methodlist cl_methods[] = {
709 {"AddParam", cl_AddParam},
710 {"OpenCompressor", cl_OpenCompressor},
711 {"OpenDecompressor", cl_OpenDecompressor},
Sjoerd Mullender384f2481992-09-29 16:43:43 +0000712 {"QueryParams", cl_QueryParams},
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000713 {NULL, NULL} /* Sentinel */
714};
715
716void
717initcl()
718{
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +0000719 object *m, *d;
720
721 m = initmodule("cl", cl_methods);
722 d = getmoduledict(m);
723
724 ClError = newstringobject("cl.error");
725 if (ClError == NULL || dictinsert(d, "error", ClError) != 0)
726 fatal("can't define cl.error");
727
728 (void) clSetErrorHandler(cl_ErrorHandler);
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000729}