blob: b48815e5d963bdfe25c9b6f01c4fa83e60002c0e [file] [log] [blame]
Sjoerd Mullenderc4315491992-09-23 14:53:00 +00001/***********************************************************
Guido van Rossum524b5881995-01-04 19:10:35 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Sjoerd Mullenderc4315491992-09-23 14:53:00 +00004
5 All Rights Reserved
6
Guido van Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Sjoerd Mullenderc4315491992-09-23 14:53:00 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Sjoerd Mullenderc4315491992-09-23 14:53:00 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Sjoerd Mullenderc4315491992-09-23 14:53:00 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Sjoerd Mullenderc4315491992-09-23 14:53:00 +000029
30******************************************************************/
31
32
33/* Cl objects */
34
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +000035#define CLDEBUG
36
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +000037#include <stdarg.h>
Sjoerd Mullenderc4315491992-09-23 14:53:00 +000038#include <cl.h>
Roger E. Massee474fb31997-01-17 16:00:02 +000039#include "Python.h"
Sjoerd Mullenderc4315491992-09-23 14:53:00 +000040
41typedef struct {
Roger E. Massee474fb31997-01-17 16:00:02 +000042 PyObject_HEAD
Sjoerd Mullenderc4315491992-09-23 14:53:00 +000043 int ob_isCompressor; /* Compressor or Decompressor */
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +000044 CL_Handle ob_compressorHdl;
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +000045 int *ob_paramtypes;
46 int ob_nparams;
Sjoerd Mullenderc4315491992-09-23 14:53:00 +000047} clobject;
48
Roger E. Massee474fb31997-01-17 16:00:02 +000049static PyObject *ClError; /* exception cl.error */
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +000050
51static int error_handler_called = 0;
52
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +000053/*
54 * We want to use the function prototypes that are available in the C
55 * compiler on the SGI. Because of that, we need to declare the first
56 * argument of the compressor and decompressor methods as "object *",
57 * even though they are really "clobject *". Therefore we cast the
58 * argument to the proper type using this macro.
59 */
60#define SELF ((clobject *) self)
61
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +000062/********************************************************************
63 Utility routines.
64********************************************************************/
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +000065static void
Sjoerd Mullender3a997271993-02-04 16:43:28 +000066cl_ErrorHandler(CL_Handle handle, int code, const char *fmt, ...)
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +000067{
68 va_list ap;
69 char errbuf[BUFSIZ]; /* hopefully big enough */
Sjoerd Mullender384f2481992-09-29 16:43:43 +000070 char *p;
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +000071
Roger E. Massee474fb31997-01-17 16:00:02 +000072 if (PyErr_Occurred()) /* don't change existing error */
Sjoerd Mullender384f2481992-09-29 16:43:43 +000073 return;
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +000074 error_handler_called = 1;
75 va_start(ap, fmt);
76 vsprintf(errbuf, fmt, ap);
77 va_end(ap);
Sjoerd Mullender384f2481992-09-29 16:43:43 +000078 p = &errbuf[strlen(errbuf) - 1]; /* swat the line feed */
79 if (*p == '\n')
80 *p = 0;
Roger E. Massee474fb31997-01-17 16:00:02 +000081 PyErr_SetString(ClError, errbuf);
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +000082}
83
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +000084/*
85 * This assumes that params are always in the range 0 to some maximum.
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +000086 */
87static int
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +000088param_type_is_float(clobject *self, int param)
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +000089{
Sjoerd Mullender3a997271993-02-04 16:43:28 +000090 int bufferlength;
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +000091
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +000092 if (self->ob_paramtypes == NULL) {
93 error_handler_called = 0;
94 bufferlength = clQueryParams(self->ob_compressorHdl, 0, 0);
95 if (error_handler_called)
96 return -1;
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +000097
Roger E. Massee474fb31997-01-17 16:00:02 +000098 self->ob_paramtypes = PyMem_NEW(int, bufferlength);
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +000099 if (self->ob_paramtypes == NULL)
100 return -1;
101 self->ob_nparams = bufferlength / 2;
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000102
Roger E. Massee474fb31997-01-17 16:00:02 +0000103 (void) clQueryParams(self->ob_compressorHdl,
104 self->ob_paramtypes, bufferlength);
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000105 if (error_handler_called) {
Roger E. Massee474fb31997-01-17 16:00:02 +0000106 PyMem_DEL(self->ob_paramtypes);
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000107 self->ob_paramtypes = NULL;
108 return -1;
109 }
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000110 }
111
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000112 if (param < 0 || param >= self->ob_nparams)
113 return -1;
114
115 if (self->ob_paramtypes[param*2 + 1] == CL_FLOATING_ENUM_VALUE ||
116 self->ob_paramtypes[param*2 + 1] == CL_FLOATING_RANGE_VALUE)
117 return 1;
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000118 else
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000119 return 0;
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000120}
121
122/********************************************************************
123 Single image compression/decompression.
124********************************************************************/
Roger E. Massee474fb31997-01-17 16:00:02 +0000125static PyObject *
126cl_CompressImage(PyObject *self, PyObject *args)
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000127{
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000128 int compressionScheme, width, height, originalFormat;
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000129 float compressionRatio;
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000130 int frameBufferSize, compressedBufferSize;
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000131 char *frameBuffer;
Roger E. Massee474fb31997-01-17 16:00:02 +0000132 PyObject *compressedBuffer;
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000133
Roger E. Massee474fb31997-01-17 16:00:02 +0000134 if (!PyArg_Parse(args, "(iiiifs#)", &compressionScheme,
135 &width, &height,
136 &originalFormat, &compressionRatio, &frameBuffer,
137 &frameBufferSize))
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000138 return NULL;
139
Roger E. Massee474fb31997-01-17 16:00:02 +0000140 retry:
141 compressedBuffer = PyString_FromStringAndSize(NULL, frameBufferSize);
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000142 if (compressedBuffer == NULL)
143 return NULL;
144
145 compressedBufferSize = frameBufferSize;
146 error_handler_called = 0;
147 if (clCompressImage(compressionScheme, width, height, originalFormat,
148 compressionRatio, (void *) frameBuffer,
149 &compressedBufferSize,
Roger E. Massee474fb31997-01-17 16:00:02 +0000150 (void *) PyString_AsString(compressedBuffer))
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000151 == FAILURE) {
Roger E. Massee474fb31997-01-17 16:00:02 +0000152 Py_DECREF(compressedBuffer);
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000153 if (!error_handler_called)
Roger E. Massee474fb31997-01-17 16:00:02 +0000154 PyErr_SetString(ClError, "clCompressImage failed");
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000155 return NULL;
156 }
157
158 if (compressedBufferSize > frameBufferSize) {
159 frameBufferSize = compressedBufferSize;
Roger E. Massee474fb31997-01-17 16:00:02 +0000160 Py_DECREF(compressedBuffer);
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000161 goto retry;
162 }
163
164 if (compressedBufferSize < frameBufferSize)
Roger E. Massee474fb31997-01-17 16:00:02 +0000165 if (_PyString_Resize(&compressedBuffer, compressedBufferSize))
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000166 return NULL;
167
168 return compressedBuffer;
169}
170
Roger E. Massee474fb31997-01-17 16:00:02 +0000171static PyObject *
172cl_DecompressImage(PyObject *self, PyObject *args)
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000173{
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000174 int compressionScheme, width, height, originalFormat;
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000175 char *compressedBuffer;
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000176 int compressedBufferSize, frameBufferSize;
Roger E. Massee474fb31997-01-17 16:00:02 +0000177 PyObject *frameBuffer;
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000178
Roger E. Massee474fb31997-01-17 16:00:02 +0000179 if (!PyArg_Parse(args, "(iiiis#)", &compressionScheme, &width, &height,
180 &originalFormat, &compressedBuffer,
181 &compressedBufferSize))
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000182 return NULL;
183
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000184 frameBufferSize = width * height * CL_BytesPerPixel(originalFormat);
185
Roger E. Massee474fb31997-01-17 16:00:02 +0000186 frameBuffer = PyString_FromStringAndSize(NULL, frameBufferSize);
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000187 if (frameBuffer == NULL)
188 return NULL;
189
190 error_handler_called = 0;
191 if (clDecompressImage(compressionScheme, width, height, originalFormat,
192 compressedBufferSize, compressedBuffer,
Roger E. Massee474fb31997-01-17 16:00:02 +0000193 (void *) PyString_AsString(frameBuffer))
194 == FAILURE) {
195 Py_DECREF(frameBuffer);
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000196 if (!error_handler_called)
Roger E. Massee474fb31997-01-17 16:00:02 +0000197 PyErr_SetString(ClError, "clDecompressImage failed");
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000198 return NULL;
199 }
200
201 return frameBuffer;
202}
203
204/********************************************************************
205 Sequential compression/decompression.
206********************************************************************/
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000207#define CheckCompressor(self) if ((self)->ob_compressorHdl == NULL) { \
Roger E. Massee474fb31997-01-17 16:00:02 +0000208 PyErr_SetString(PyExc_RuntimeError, "(de)compressor not active"); \
209 return NULL; \
210}
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000211
Roger E. Massee474fb31997-01-17 16:00:02 +0000212static PyObject *
213doClose(clobject *self, PyObject *args, int (*close_func)(CL_Handle))
Sjoerd Mullender37f17b71992-09-25 10:28:20 +0000214{
215 CheckCompressor(self);
216
Roger E. Massee474fb31997-01-17 16:00:02 +0000217 if (!PyArg_NoArgs(args))
Sjoerd Mullender37f17b71992-09-25 10:28:20 +0000218 return NULL;
219
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000220 error_handler_called = 0;
Sjoerd Mullender384f2481992-09-29 16:43:43 +0000221 if ((*close_func)(self->ob_compressorHdl) == FAILURE) {
Sjoerd Mullender37f17b71992-09-25 10:28:20 +0000222 if (!error_handler_called)
Roger E. Massee474fb31997-01-17 16:00:02 +0000223 PyErr_SetString(ClError, "close failed");
Sjoerd Mullender37f17b71992-09-25 10:28:20 +0000224 return NULL;
225 }
226
227 self->ob_compressorHdl = NULL;
228
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000229 if (self->ob_paramtypes)
Roger E. Massee474fb31997-01-17 16:00:02 +0000230 PyMem_DEL(self->ob_paramtypes);
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000231 self->ob_paramtypes = NULL;
232
Roger E. Massee474fb31997-01-17 16:00:02 +0000233 Py_INCREF(Py_None);
234 return Py_None;
Sjoerd Mullender37f17b71992-09-25 10:28:20 +0000235}
236
Roger E. Massee474fb31997-01-17 16:00:02 +0000237static PyObject *
238clm_CloseCompressor(PyObject *self, PyObject *args)
Sjoerd Mullender37f17b71992-09-25 10:28:20 +0000239{
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000240 return doClose(SELF, args, clCloseCompressor);
Sjoerd Mullender37f17b71992-09-25 10:28:20 +0000241}
242
Roger E. Massee474fb31997-01-17 16:00:02 +0000243static PyObject *
244clm_CloseDecompressor(PyObject *self, PyObject *args)
Sjoerd Mullender384f2481992-09-29 16:43:43 +0000245{
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000246 return doClose(SELF, args, clCloseDecompressor);
Sjoerd Mullender384f2481992-09-29 16:43:43 +0000247}
248
Roger E. Massee474fb31997-01-17 16:00:02 +0000249static PyObject *
250clm_Compress(PyObject *self, PyObject *args)
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000251{
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000252 int numberOfFrames;
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000253 int frameBufferSize, compressedBufferSize, size;
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000254 char *frameBuffer;
Roger E. Massee474fb31997-01-17 16:00:02 +0000255 PyObject *data;
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000256
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000257 CheckCompressor(SELF);
Sjoerd Mullender37f17b71992-09-25 10:28:20 +0000258
Roger E. Massee474fb31997-01-17 16:00:02 +0000259 if (!PyArg_Parse(args, "(is#)", &numberOfFrames,
260 &frameBuffer, &frameBufferSize))
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000261 return NULL;
262
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000263 error_handler_called = 0;
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000264 size = clGetParam(SELF->ob_compressorHdl, CL_COMPRESSED_BUFFER_SIZE);
265 compressedBufferSize = size;
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000266 if (error_handler_called)
267 return NULL;
268
Roger E. Massee474fb31997-01-17 16:00:02 +0000269 data = PyString_FromStringAndSize(NULL, size);
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000270 if (data == NULL)
271 return NULL;
272
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +0000273 error_handler_called = 0;
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000274 if (clCompress(SELF->ob_compressorHdl, numberOfFrames,
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000275 (void *) frameBuffer, &compressedBufferSize,
Roger E. Massee474fb31997-01-17 16:00:02 +0000276 (void *) PyString_AsString(data)) == FAILURE) {
277 Py_DECREF(data);
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000278 if (!error_handler_called)
Roger E. Massee474fb31997-01-17 16:00:02 +0000279 PyErr_SetString(ClError, "compress failed");
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +0000280 return NULL;
281 }
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000282
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000283 if (compressedBufferSize < size)
Roger E. Massee474fb31997-01-17 16:00:02 +0000284 if (_PyString_Resize(&data, compressedBufferSize))
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000285 return NULL;
286
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000287 if (compressedBufferSize > size) {
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000288 /* we didn't get all "compressed" data */
Roger E. Massee474fb31997-01-17 16:00:02 +0000289 Py_DECREF(data);
290 PyErr_SetString(ClError,
291 "compressed data is more than fitted");
Sjoerd Mullender384f2481992-09-29 16:43:43 +0000292 return NULL;
293 }
294
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +0000295 return data;
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000296}
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000297
Roger E. Massee474fb31997-01-17 16:00:02 +0000298static PyObject *
299clm_Decompress(PyObject *self, PyObject *args)
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000300{
Roger E. Massee474fb31997-01-17 16:00:02 +0000301 PyObject *data;
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000302 int numberOfFrames;
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000303 char *compressedData;
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000304 int compressedDataSize, dataSize;
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000305
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000306 CheckCompressor(SELF);
Sjoerd Mullender37f17b71992-09-25 10:28:20 +0000307
Roger E. Massee474fb31997-01-17 16:00:02 +0000308 if (!PyArg_Parse(args, "(is#)", &numberOfFrames, &compressedData,
309 &compressedDataSize))
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000310 return NULL;
311
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000312 error_handler_called = 0;
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000313 dataSize = clGetParam(SELF->ob_compressorHdl, CL_FRAME_BUFFER_SIZE);
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000314 if (error_handler_called)
315 return NULL;
316
Roger E. Massee474fb31997-01-17 16:00:02 +0000317 data = PyString_FromStringAndSize(NULL, dataSize);
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000318 if (data == NULL)
319 return NULL;
320
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +0000321 error_handler_called = 0;
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000322 if (clDecompress(SELF->ob_compressorHdl, numberOfFrames,
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000323 compressedDataSize, (void *) compressedData,
Roger E. Massee474fb31997-01-17 16:00:02 +0000324 (void *) PyString_AsString(data)) == FAILURE) {
325 Py_DECREF(data);
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000326 if (!error_handler_called)
Roger E. Massee474fb31997-01-17 16:00:02 +0000327 PyErr_SetString(ClError, "decompress failed");
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +0000328 return NULL;
329 }
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000330
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +0000331 return data;
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000332}
333
Roger E. Massee474fb31997-01-17 16:00:02 +0000334static PyObject *
335doParams(clobject *self, PyObject *args, int (*func)(CL_Handle, int *, int),
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000336 int modified)
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000337{
Roger E. Massee474fb31997-01-17 16:00:02 +0000338 PyObject *list, *v;
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000339 int *PVbuffer;
340 int length;
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000341 int i;
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000342 float number;
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000343
Sjoerd Mullender37f17b71992-09-25 10:28:20 +0000344 CheckCompressor(self);
345
Roger E. Massee474fb31997-01-17 16:00:02 +0000346 if (!PyArg_Parse(args, "O", &list))
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000347 return NULL;
Roger E. Massee474fb31997-01-17 16:00:02 +0000348 if (!PyList_Check(list)) {
349 PyErr_BadArgument();
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000350 return NULL;
351 }
Roger E. Massee474fb31997-01-17 16:00:02 +0000352 length = PyList_Size(list);
353 PVbuffer = PyMem_NEW(int, length);
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000354 if (PVbuffer == NULL)
Roger E. Massee474fb31997-01-17 16:00:02 +0000355 return PyErr_NoMemory();
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000356 for (i = 0; i < length; i++) {
Roger E. Massee474fb31997-01-17 16:00:02 +0000357 v = PyList_GetItem(list, i);
358 if (PyFloat_Check(v)) {
359 number = PyFloat_AsDouble(v);
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000360 PVbuffer[i] = CL_TypeIsInt(number);
Roger E. Massee474fb31997-01-17 16:00:02 +0000361 } else if (PyInt_Check(v)) {
362 PVbuffer[i] = PyInt_AsLong(v);
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000363 if ((i & 1) &&
364 param_type_is_float(self, PVbuffer[i-1]) > 0) {
365 number = PVbuffer[i];
366 PVbuffer[i] = CL_TypeIsInt(number);
367 }
368 } else {
Roger E. Massee474fb31997-01-17 16:00:02 +0000369 PyMem_DEL(PVbuffer);
370 PyErr_BadArgument();
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000371 return NULL;
372 }
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000373 }
374
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +0000375 error_handler_called = 0;
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000376 (*func)(self->ob_compressorHdl, PVbuffer, length);
Sjoerd Mullenderf64992e1993-08-03 15:11:36 +0000377 if (error_handler_called) {
Roger E. Massee474fb31997-01-17 16:00:02 +0000378 PyMem_DEL(PVbuffer);
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +0000379 return NULL;
Sjoerd Mullenderf64992e1993-08-03 15:11:36 +0000380 }
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000381
382 if (modified) {
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000383 for (i = 0; i < length; i++) {
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000384 if ((i & 1) &&
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000385 param_type_is_float(self, PVbuffer[i-1]) > 0) {
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000386 number = CL_TypeIsFloat(PVbuffer[i]);
Roger E. Massee474fb31997-01-17 16:00:02 +0000387 v = PyFloat_FromDouble(number);
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000388 } else
Roger E. Massee474fb31997-01-17 16:00:02 +0000389 v = PyInt_FromLong(PVbuffer[i]);
390 PyList_SetItem(list, i, v);
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000391 }
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000392 }
393
Roger E. Massee474fb31997-01-17 16:00:02 +0000394 PyMem_DEL(PVbuffer);
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000395
Roger E. Massee474fb31997-01-17 16:00:02 +0000396 Py_INCREF(Py_None);
397 return Py_None;
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000398}
399
Roger E. Massee474fb31997-01-17 16:00:02 +0000400static PyObject *
401clm_GetParams(PyObject *self, PyObject *args)
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000402{
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000403 return doParams(SELF, args, clGetParams, 1);
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000404}
405
Roger E. Massee474fb31997-01-17 16:00:02 +0000406static PyObject *
407clm_SetParams(PyObject *self, PyObject *args)
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000408{
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000409 return doParams(SELF, args, clSetParams, 0);
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000410}
411
Roger E. Massee474fb31997-01-17 16:00:02 +0000412static PyObject *
413do_get(clobject *self, PyObject *args, int (*func)(CL_Handle, int))
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000414{
415 int paramID, value;
416 float fvalue;
417
418 CheckCompressor(self);
419
Roger E. Massee474fb31997-01-17 16:00:02 +0000420 if (!PyArg_Parse(args, "i", &paramID))
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000421 return NULL;
422
423 error_handler_called = 0;
424 value = (*func)(self->ob_compressorHdl, paramID);
425 if (error_handler_called)
426 return NULL;
427
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000428 if (param_type_is_float(self, paramID) > 0) {
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000429 fvalue = CL_TypeIsFloat(value);
Roger E. Massee474fb31997-01-17 16:00:02 +0000430 return PyFloat_FromDouble(fvalue);
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000431 }
432
Roger E. Massee474fb31997-01-17 16:00:02 +0000433 return PyInt_FromLong(value);
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000434}
435
Roger E. Massee474fb31997-01-17 16:00:02 +0000436static PyObject *
437clm_GetParam(PyObject *self, PyObject *args)
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000438{
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000439 return do_get(SELF, args, clGetParam);
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000440}
441
Roger E. Massee474fb31997-01-17 16:00:02 +0000442static PyObject *
443clm_GetDefault(PyObject *self, PyObject *args)
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000444{
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000445 return do_get(SELF, args, clGetDefault);
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000446}
447
Roger E. Massee474fb31997-01-17 16:00:02 +0000448static PyObject *
449clm_SetParam(PyObject *self, PyObject *args)
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000450{
451 int paramID, value;
452 float fvalue;
453
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000454 CheckCompressor(SELF);
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000455
Roger E. Massee474fb31997-01-17 16:00:02 +0000456 if (!PyArg_Parse(args, "(ii)", &paramID, &value)) {
457 PyErr_Clear();
458 if (!PyArg_Parse(args, "(if)", &paramID, &fvalue)) {
459 PyErr_Clear();
460 PyErr_SetString(PyExc_TypeError,
461 "bad argument list (format '(ii)' or '(if)')");
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000462 return NULL;
463 }
464 value = CL_TypeIsInt(fvalue);
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000465 } else {
466 if (param_type_is_float(SELF, paramID) > 0) {
467 fvalue = value;
468 value = CL_TypeIsInt(fvalue);
469 }
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000470 }
471
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000472 error_handler_called = 0;
473 value = clSetParam(SELF->ob_compressorHdl, paramID, value);
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000474 if (error_handler_called)
475 return NULL;
476
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000477 if (param_type_is_float(SELF, paramID) > 0)
Roger E. Massee474fb31997-01-17 16:00:02 +0000478 return PyFloat_FromDouble(CL_TypeIsFloat(value));
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000479 else
Roger E. Massee474fb31997-01-17 16:00:02 +0000480 return PyInt_FromLong(value);
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000481}
482
Roger E. Massee474fb31997-01-17 16:00:02 +0000483static PyObject *
484clm_GetParamID(PyObject *self, PyObject *args)
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000485{
486 char *name;
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000487 int value;
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000488
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000489 CheckCompressor(SELF);
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000490
Roger E. Massee474fb31997-01-17 16:00:02 +0000491 if (!PyArg_Parse(args, "s", &name))
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000492 return NULL;
493
494 error_handler_called = 0;
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000495 value = clGetParamID(SELF->ob_compressorHdl, name);
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000496 if (value == FAILURE) {
497 if (!error_handler_called)
Roger E. Massee474fb31997-01-17 16:00:02 +0000498 PyErr_SetString(ClError, "getparamid failed");
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000499 return NULL;
500 }
501
Roger E. Massee474fb31997-01-17 16:00:02 +0000502 return PyInt_FromLong(value);
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000503}
504
Roger E. Massee474fb31997-01-17 16:00:02 +0000505static PyObject *
506clm_QueryParams(PyObject *self, PyObject *args)
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000507{
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000508 int bufferlength;
509 int *PVbuffer;
Roger E. Massee474fb31997-01-17 16:00:02 +0000510 PyObject *list;
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000511 int i;
512
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000513 CheckCompressor(SELF);
Sjoerd Mullender37f17b71992-09-25 10:28:20 +0000514
Roger E. Massee474fb31997-01-17 16:00:02 +0000515 if (!PyArg_NoArgs(args))
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000516 return NULL;
517
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +0000518 error_handler_called = 0;
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000519 bufferlength = clQueryParams(SELF->ob_compressorHdl, 0, 0);
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +0000520 if (error_handler_called)
521 return NULL;
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000522
Roger E. Massee474fb31997-01-17 16:00:02 +0000523 PVbuffer = PyMem_NEW(int, bufferlength);
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000524 if (PVbuffer == NULL)
Roger E. Massee474fb31997-01-17 16:00:02 +0000525 return PyErr_NoMemory();
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000526
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000527 bufferlength = clQueryParams(SELF->ob_compressorHdl, PVbuffer,
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000528 bufferlength);
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +0000529 if (error_handler_called) {
Roger E. Massee474fb31997-01-17 16:00:02 +0000530 PyMem_DEL(PVbuffer);
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +0000531 return NULL;
532 }
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000533
Roger E. Massee474fb31997-01-17 16:00:02 +0000534 list = PyList_New(bufferlength);
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000535 if (list == NULL) {
Roger E. Massee474fb31997-01-17 16:00:02 +0000536 PyMem_DEL(PVbuffer);
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000537 return NULL;
538 }
539
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +0000540 for (i = 0; i < bufferlength; i++) {
541 if (i & 1)
Roger E. Massee474fb31997-01-17 16:00:02 +0000542 PyList_SetItem(list, i, PyInt_FromLong(PVbuffer[i]));
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000543 else if (PVbuffer[i] == 0) {
Roger E. Massee474fb31997-01-17 16:00:02 +0000544 Py_INCREF(Py_None);
545 PyList_SetItem(list, i, Py_None);
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000546 } else
Roger E. Massee474fb31997-01-17 16:00:02 +0000547 PyList_SetItem(list, i,
548 PyString_FromString((char *) PVbuffer[i]));
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +0000549 }
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000550
Roger E. Massee474fb31997-01-17 16:00:02 +0000551 PyMem_DEL(PVbuffer);
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000552
553 return list;
554}
555
Roger E. Massee474fb31997-01-17 16:00:02 +0000556static PyObject *
557clm_GetMinMax(PyObject *self, PyObject *args)
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000558{
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000559 int param, min, max;
560 float fmin, fmax;
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000561
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000562 CheckCompressor(SELF);
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000563
Roger E. Massee474fb31997-01-17 16:00:02 +0000564 if (!PyArg_Parse(args, "i", &param))
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000565 return NULL;
566
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000567 clGetMinMax(SELF->ob_compressorHdl, param, &min, &max);
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000568
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000569 if (param_type_is_float(SELF, param) > 0) {
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000570 fmin = CL_TypeIsFloat(min);
571 fmax = CL_TypeIsFloat(max);
Roger E. Massee474fb31997-01-17 16:00:02 +0000572 return Py_BuildValue("(ff)", fmin, fmax);
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000573 }
574
Roger E. Massee474fb31997-01-17 16:00:02 +0000575 return Py_BuildValue("(ii)", min, max);
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000576}
577
Roger E. Massee474fb31997-01-17 16:00:02 +0000578static PyObject *
579clm_GetName(PyObject *self, PyObject *args)
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000580{
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000581 int param;
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000582 char *name;
583
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000584 CheckCompressor(SELF);
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000585
Roger E. Massee474fb31997-01-17 16:00:02 +0000586 if (!PyArg_Parse(args, "i", &param))
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000587 return NULL;
588
589 error_handler_called = 0;
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000590 name = clGetName(SELF->ob_compressorHdl, param);
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000591 if (name == NULL || error_handler_called) {
592 if (!error_handler_called)
Roger E. Massee474fb31997-01-17 16:00:02 +0000593 PyErr_SetString(ClError, "getname failed");
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000594 return NULL;
595 }
596
Roger E. Massee474fb31997-01-17 16:00:02 +0000597 return PyString_FromString(name);
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000598}
599
Roger E. Massee474fb31997-01-17 16:00:02 +0000600static PyObject *
601clm_QuerySchemeFromHandle(PyObject *self, PyObject *args)
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000602{
603 CheckCompressor(SELF);
604
Roger E. Massee474fb31997-01-17 16:00:02 +0000605 if (!PyArg_NoArgs(args))
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000606 return NULL;
607
Roger E. Massee474fb31997-01-17 16:00:02 +0000608 return PyInt_FromLong(clQuerySchemeFromHandle(SELF->ob_compressorHdl));
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000609}
610
Roger E. Massee474fb31997-01-17 16:00:02 +0000611static PyObject *
612clm_ReadHeader(PyObject *self, PyObject *args)
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000613{
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000614 char *header;
615 int headerSize;
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000616
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000617 CheckCompressor(SELF);
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000618
Roger E. Massee474fb31997-01-17 16:00:02 +0000619 if (!PyArg_Parse(args, "s#", &header, &headerSize))
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000620 return NULL;
621
Roger E. Massee474fb31997-01-17 16:00:02 +0000622 return PyInt_FromLong(clReadHeader(SELF->ob_compressorHdl,
623 headerSize, header));
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000624}
625
Roger E. Massee474fb31997-01-17 16:00:02 +0000626static PyMethodDef compressor_methods[] = {
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000627 {"close", clm_CloseCompressor}, /* alias */
Sjoerd Mullender384f2481992-09-29 16:43:43 +0000628 {"CloseCompressor", clm_CloseCompressor},
629 {"Compress", clm_Compress},
Sjoerd Mullender384f2481992-09-29 16:43:43 +0000630 {"GetDefault", clm_GetDefault},
631 {"GetMinMax", clm_GetMinMax},
632 {"GetName", clm_GetName},
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000633 {"GetParam", clm_GetParam},
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000634 {"GetParamID", clm_GetParamID},
Sjoerd Mullender384f2481992-09-29 16:43:43 +0000635 {"GetParams", clm_GetParams},
636 {"QueryParams", clm_QueryParams},
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000637 {"QuerySchemeFromHandle",clm_QuerySchemeFromHandle},
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000638 {"SetParam", clm_SetParam},
Sjoerd Mullender384f2481992-09-29 16:43:43 +0000639 {"SetParams", clm_SetParams},
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000640 {NULL, NULL} /* sentinel */
641};
642
Roger E. Massee474fb31997-01-17 16:00:02 +0000643static PyMethodDef decompressor_methods[] = {
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000644 {"close", clm_CloseDecompressor}, /* alias */
Sjoerd Mullender384f2481992-09-29 16:43:43 +0000645 {"CloseDecompressor", clm_CloseDecompressor},
646 {"Decompress", clm_Decompress},
647 {"GetDefault", clm_GetDefault},
648 {"GetMinMax", clm_GetMinMax},
649 {"GetName", clm_GetName},
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000650 {"GetParam", clm_GetParam},
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000651 {"GetParamID", clm_GetParamID},
Sjoerd Mullender384f2481992-09-29 16:43:43 +0000652 {"GetParams", clm_GetParams},
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000653 {"ReadHeader", clm_ReadHeader},
Sjoerd Mullender384f2481992-09-29 16:43:43 +0000654 {"QueryParams", clm_QueryParams},
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000655 {"QuerySchemeFromHandle",clm_QuerySchemeFromHandle},
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000656 {"SetParam", clm_SetParam},
Sjoerd Mullender384f2481992-09-29 16:43:43 +0000657 {"SetParams", clm_SetParams},
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000658 {NULL, NULL} /* sentinel */
659};
660
661static void
Roger E. Massee474fb31997-01-17 16:00:02 +0000662cl_dealloc(PyObject *self)
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000663{
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000664 if (SELF->ob_compressorHdl) {
665 if (SELF->ob_isCompressor)
666 clCloseCompressor(SELF->ob_compressorHdl);
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000667 else
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000668 clCloseDecompressor(SELF->ob_compressorHdl);
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000669 }
Roger E. Massee474fb31997-01-17 16:00:02 +0000670 PyMem_DEL(self);
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000671}
672
Roger E. Massee474fb31997-01-17 16:00:02 +0000673static PyObject *
674cl_getattr(PyObject *self, char *name)
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000675{
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000676 if (SELF->ob_isCompressor)
Roger E. Massee474fb31997-01-17 16:00:02 +0000677 return Py_FindMethod(compressor_methods, self, name);
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000678 else
Roger E. Massee474fb31997-01-17 16:00:02 +0000679 return Py_FindMethod(decompressor_methods, self, name);
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000680}
681
Roger E. Massee474fb31997-01-17 16:00:02 +0000682static PyTypeObject Cltype = {
683 PyObject_HEAD_INIT(&PyType_Type)
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000684 0, /*ob_size*/
685 "cl", /*tp_name*/
686 sizeof(clobject), /*tp_size*/
687 0, /*tp_itemsize*/
688 /* methods */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000689 (destructor)cl_dealloc, /*tp_dealloc*/
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000690 0, /*tp_print*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000691 (getattrfunc)cl_getattr, /*tp_getattr*/
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000692 0, /*tp_setattr*/
693 0, /*tp_compare*/
694 0, /*tp_repr*/
695 0, /*tp_as_number*/
696 0, /*tp_as_sequence*/
697 0, /*tp_as_mapping*/
698};
699
Roger E. Massee474fb31997-01-17 16:00:02 +0000700static PyObject *
701doOpen(PyObject *self, PyObject *args, int (*open_func)(int, CL_Handle *),
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000702 int iscompressor)
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000703{
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000704 int scheme;
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000705 clobject *new;
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000706
Roger E. Massee474fb31997-01-17 16:00:02 +0000707 if (!PyArg_Parse(args, "i", &scheme))
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000708 return NULL;
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000709
Roger E. Massee474fb31997-01-17 16:00:02 +0000710 new = PyObject_NEW(clobject, &Cltype);
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000711 if (new == NULL)
712 return NULL;
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000713
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000714 new->ob_compressorHdl = NULL;
715 new->ob_isCompressor = iscompressor;
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000716 new->ob_paramtypes = NULL;
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000717
718 error_handler_called = 0;
719 if ((*open_func)(scheme, &new->ob_compressorHdl) == FAILURE) {
Roger E. Massee474fb31997-01-17 16:00:02 +0000720 Py_DECREF(new);
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000721 if (!error_handler_called)
Roger E. Massee474fb31997-01-17 16:00:02 +0000722 PyErr_SetString(ClError, "Open(De)Compressor failed");
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000723 return NULL;
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000724 }
Roger E. Massee474fb31997-01-17 16:00:02 +0000725 return (PyObject *)new;
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000726}
727
Roger E. Massee474fb31997-01-17 16:00:02 +0000728static PyObject *
729cl_OpenCompressor(PyObject *self, PyObject *args)
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000730{
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000731 return doOpen(self, args, clOpenCompressor, 1);
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000732}
733
Roger E. Massee474fb31997-01-17 16:00:02 +0000734static PyObject *
735cl_OpenDecompressor(PyObject *self, PyObject *args)
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000736{
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000737 return doOpen(self, args, clOpenDecompressor, 0);
Sjoerd Mullender384f2481992-09-29 16:43:43 +0000738}
739
Roger E. Massee474fb31997-01-17 16:00:02 +0000740static PyObject *
741cl_QueryScheme(PyObject *self, PyObject *args)
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000742{
743 char *header;
744 int headerlen;
745 int scheme;
746
Roger E. Massee474fb31997-01-17 16:00:02 +0000747 if (!PyArg_Parse(args, "s#", &header, &headerlen))
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000748 return NULL;
749
750 scheme = clQueryScheme(header);
751 if (scheme < 0) {
Roger E. Massee474fb31997-01-17 16:00:02 +0000752 PyErr_SetString(ClError, "unknown compression scheme");
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000753 return NULL;
754 }
755
Roger E. Massee474fb31997-01-17 16:00:02 +0000756 return PyInt_FromLong(scheme);
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000757}
758
Roger E. Massee474fb31997-01-17 16:00:02 +0000759static PyObject *
760cl_QueryMaxHeaderSize(PyObject *self, PyObject *args)
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000761{
762 int scheme;
763
Roger E. Massee474fb31997-01-17 16:00:02 +0000764 if (!PyArg_Parse(args, "i", &scheme))
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000765 return NULL;
766
Roger E. Massee474fb31997-01-17 16:00:02 +0000767 return PyInt_FromLong(clQueryMaxHeaderSize(scheme));
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000768}
769
Roger E. Massee474fb31997-01-17 16:00:02 +0000770static PyObject *
771cl_QueryAlgorithms(PyObject *self, PyObject *args)
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000772{
773 int algorithmMediaType;
774 int bufferlength;
775 int *PVbuffer;
Roger E. Massee474fb31997-01-17 16:00:02 +0000776 PyObject *list;
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000777 int i;
778
Roger E. Massee474fb31997-01-17 16:00:02 +0000779 if (!PyArg_Parse(args, "i", &algorithmMediaType))
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000780 return NULL;
781
782 error_handler_called = 0;
783 bufferlength = clQueryAlgorithms(algorithmMediaType, 0, 0);
784 if (error_handler_called)
785 return NULL;
786
Roger E. Massee474fb31997-01-17 16:00:02 +0000787 PVbuffer = PyMem_NEW(int, bufferlength);
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000788 if (PVbuffer == NULL)
Roger E. Massee474fb31997-01-17 16:00:02 +0000789 return PyErr_NoMemory();
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000790
791 bufferlength = clQueryAlgorithms(algorithmMediaType, PVbuffer,
Roger E. Massee474fb31997-01-17 16:00:02 +0000792 bufferlength);
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000793 if (error_handler_called) {
Roger E. Massee474fb31997-01-17 16:00:02 +0000794 PyMem_DEL(PVbuffer);
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000795 return NULL;
796 }
797
Roger E. Massee474fb31997-01-17 16:00:02 +0000798 list = PyList_New(bufferlength);
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000799 if (list == NULL) {
Roger E. Massee474fb31997-01-17 16:00:02 +0000800 PyMem_DEL(PVbuffer);
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000801 return NULL;
802 }
803
804 for (i = 0; i < bufferlength; i++) {
805 if (i & 1)
Roger E. Massee474fb31997-01-17 16:00:02 +0000806 PyList_SetItem(list, i, PyInt_FromLong(PVbuffer[i]));
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000807 else if (PVbuffer[i] == 0) {
Roger E. Massee474fb31997-01-17 16:00:02 +0000808 Py_INCREF(Py_None);
809 PyList_SetItem(list, i, Py_None);
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000810 } else
Roger E. Massee474fb31997-01-17 16:00:02 +0000811 PyList_SetItem(list, i,
812 PyString_FromString((char *) PVbuffer[i]));
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000813 }
814
Roger E. Massee474fb31997-01-17 16:00:02 +0000815 PyMem_DEL(PVbuffer);
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000816
817 return list;
818}
819
Roger E. Massee474fb31997-01-17 16:00:02 +0000820static PyObject *
821cl_QuerySchemeFromName(PyObject *self, PyObject *args)
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000822{
823 int algorithmMediaType;
824 char *name;
825 int scheme;
826
Roger E. Massee474fb31997-01-17 16:00:02 +0000827 if (!PyArg_Parse(args, "(is)", &algorithmMediaType, &name))
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000828 return NULL;
829
830 error_handler_called = 0;
831 scheme = clQuerySchemeFromName(algorithmMediaType, name);
832 if (error_handler_called) {
Roger E. Massee474fb31997-01-17 16:00:02 +0000833 PyErr_SetString(ClError, "unknown compression scheme");
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000834 return NULL;
835 }
836
Roger E. Massee474fb31997-01-17 16:00:02 +0000837 return PyInt_FromLong(scheme);
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000838}
839
Roger E. Massee474fb31997-01-17 16:00:02 +0000840static PyObject *
841cl_GetAlgorithmName(PyObject *self, PyObject *args)
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000842{
843 int scheme;
844 char *name;
845
Roger E. Massee474fb31997-01-17 16:00:02 +0000846 if (!PyArg_Parse(args, "i", &scheme))
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000847 return NULL;
848
849 name = clGetAlgorithmName(scheme);
850 if (name == 0) {
Roger E. Massee474fb31997-01-17 16:00:02 +0000851 PyErr_SetString(ClError, "unknown compression scheme");
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000852 return NULL;
853 }
854
Roger E. Massee474fb31997-01-17 16:00:02 +0000855 return PyString_FromString(name);
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000856}
857
Roger E. Massee474fb31997-01-17 16:00:02 +0000858static PyObject *
859do_set(PyObject *self, PyObject *args, int (*func)(int, int, int))
Sjoerd Mullender22e44cd1993-02-17 09:11:14 +0000860{
861 int scheme, paramID, value;
862 float fvalue;
863 int is_float = 0;
864
Roger E. Massee474fb31997-01-17 16:00:02 +0000865 if (!PyArg_Parse(args, "(iii)", &scheme, &paramID, &value)) {
866 PyErr_Clear();
867 if (!PyArg_Parse(args, "(iif)", &scheme, &paramID, &fvalue)) {
868 PyErr_Clear();
869 PyErr_SetString(PyExc_TypeError,
870 "bad argument list (format '(iii)' or '(iif)')");
Sjoerd Mullender22e44cd1993-02-17 09:11:14 +0000871 return NULL;
872 }
873 value = CL_TypeIsInt(fvalue);
874 is_float = 1;
875 } else {
876 /* check some parameters which we know to be floats */
877 switch (scheme) {
878 case CL_COMPRESSION_RATIO:
879 case CL_SPEED:
880 fvalue = value;
881 value = CL_TypeIsInt(fvalue);
882 is_float = 1;
883 break;
884 }
885 }
886
887 error_handler_called = 0;
888 value = (*func)(scheme, paramID, value);
889 if (error_handler_called)
890 return NULL;
891
892 if (is_float)
Roger E. Massee474fb31997-01-17 16:00:02 +0000893 return PyFloat_FromDouble(CL_TypeIsFloat(value));
Sjoerd Mullender22e44cd1993-02-17 09:11:14 +0000894 else
Roger E. Massee474fb31997-01-17 16:00:02 +0000895 return PyInt_FromLong(value);
Sjoerd Mullender22e44cd1993-02-17 09:11:14 +0000896}
897
Roger E. Massee474fb31997-01-17 16:00:02 +0000898static PyObject *
899cl_SetDefault(PyObject *self, PyObject *args)
Sjoerd Mullender22e44cd1993-02-17 09:11:14 +0000900{
901 return do_set(self, args, clSetDefault);
902}
903
Roger E. Massee474fb31997-01-17 16:00:02 +0000904static PyObject *
905cl_SetMin(PyObject *self, PyObject *args)
Sjoerd Mullender22e44cd1993-02-17 09:11:14 +0000906{
907 return do_set(self, args, clSetMin);
908}
909
Roger E. Massee474fb31997-01-17 16:00:02 +0000910static PyObject *
911cl_SetMax(PyObject *self, PyObject *args)
Sjoerd Mullender22e44cd1993-02-17 09:11:14 +0000912{
913 return do_set(self, args, clSetMax);
914}
915
Roger E. Massee474fb31997-01-17 16:00:02 +0000916#define func(name, handler) \
917static PyObject *cl_##name(PyObject *self, PyObject *args) \
918{ \
919 int x; \
920 if (!PyArg_Parse(args, "i", &x)) return NULL; \
921 return Py##handler(CL_##name(x)); \
922}
Sjoerd Mullender3db845b1995-05-17 11:16:52 +0000923
Roger E. Massee474fb31997-01-17 16:00:02 +0000924#define func2(name, handler) \
925static PyObject *cl_##name(PyObject *self, PyObject *args) \
926{ \
927 int a1, a2; \
928 if (!PyArg_Parse(args, "(ii)", &a1, &a2)) return NULL; \
929 return Py##handler(CL_##name(a1, a2)); \
930}
Sjoerd Mullender3db845b1995-05-17 11:16:52 +0000931
Roger E. Massee474fb31997-01-17 16:00:02 +0000932func(BytesPerSample, Int_FromLong)
933func(BytesPerPixel, Int_FromLong)
934func(AudioFormatName, String_FromString)
935func(VideoFormatName, String_FromString)
936func(AlgorithmNumber, Int_FromLong)
937func(AlgorithmType, Int_FromLong)
938func2(Algorithm, Int_FromLong)
939func(ParamNumber, Int_FromLong)
940func(ParamType, Int_FromLong)
941func2(ParamID, Int_FromLong)
Sjoerd Mullender3db845b1995-05-17 11:16:52 +0000942
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000943#ifdef CLDEBUG
Roger E. Massee474fb31997-01-17 16:00:02 +0000944 static PyObject *
945cvt_type(PyObject *self, PyObject *args)
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000946{
947 int number;
948 float fnumber;
949
Roger E. Massee474fb31997-01-17 16:00:02 +0000950 if (PyArg_Parse(args, "i", &number))
951 return PyFloat_FromDouble(CL_TypeIsFloat(number));
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000952 else {
Roger E. Massee474fb31997-01-17 16:00:02 +0000953 PyErr_Clear();
954 if (PyArg_Parse(args, "f", &fnumber))
955 return PyInt_FromLong(CL_TypeIsInt(fnumber));
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000956 return NULL;
957 }
958}
959#endif
960
Roger E. Massee474fb31997-01-17 16:00:02 +0000961static PyMethodDef cl_methods[] = {
Sjoerd Mullender8dd054d1992-12-14 13:17:29 +0000962 {"CompressImage", cl_CompressImage},
963 {"DecompressImage", cl_DecompressImage},
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000964 {"GetAlgorithmName", cl_GetAlgorithmName},
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000965 {"OpenCompressor", cl_OpenCompressor},
966 {"OpenDecompressor", cl_OpenDecompressor},
Sjoerd Mullender3a997271993-02-04 16:43:28 +0000967 {"QueryAlgorithms", cl_QueryAlgorithms},
968 {"QueryMaxHeaderSize", cl_QueryMaxHeaderSize},
969 {"QueryScheme", cl_QueryScheme},
970 {"QuerySchemeFromName", cl_QuerySchemeFromName},
Sjoerd Mullender22e44cd1993-02-17 09:11:14 +0000971 {"SetDefault", cl_SetDefault},
972 {"SetMax", cl_SetMax},
973 {"SetMin", cl_SetMin},
Sjoerd Mullender3db845b1995-05-17 11:16:52 +0000974 {"BytesPerSample", cl_BytesPerSample},
975 {"BytesPerPixel", cl_BytesPerPixel},
976 {"AudioFormatName", cl_AudioFormatName},
977 {"VideoFormatName", cl_VideoFormatName},
978 {"AlgorithmNumber", cl_AlgorithmNumber},
979 {"AlgorithmType", cl_AlgorithmType},
980 {"Algorithm", cl_Algorithm},
981 {"ParamNumber", cl_ParamNumber},
982 {"ParamType", cl_ParamType},
983 {"ParamID", cl_ParamID},
Sjoerd Mullender4e2a4271993-02-16 11:55:17 +0000984#ifdef CLDEBUG
985 {"cvt_type", cvt_type},
986#endif
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000987 {NULL, NULL} /* Sentinel */
988};
989
Sjoerd Mullender3db845b1995-05-17 11:16:52 +0000990#ifdef CL_JPEG_SOFTWARE
991#define IRIX_5_3_LIBRARY
992#endif
993
Sjoerd Mullenderc4315491992-09-23 14:53:00 +0000994void
995initcl()
996{
Roger E. Massee474fb31997-01-17 16:00:02 +0000997 PyObject *m, *d;
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +0000998
Roger E. Massee474fb31997-01-17 16:00:02 +0000999 m = Py_InitModule("cl", cl_methods);
1000 d = PyModule_GetDict(m);
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +00001001
Roger E. Massee474fb31997-01-17 16:00:02 +00001002 ClError = PyString_FromString("cl.error");
1003 (void) PyDict_SetItemString(d, "error", ClError);
Sjoerd Mullender3db845b1995-05-17 11:16:52 +00001004
Roger E. Massee474fb31997-01-17 16:00:02 +00001005 (void) PyDict_SetItemString(d, "MAX_NUMBER_OF_ORIGINAL_FORMATS",
1006 PyInt_FromLong(CL_MAX_NUMBER_OF_ORIGINAL_FORMATS));
1007 (void) PyDict_SetItemString(d, "MONO", PyInt_FromLong(CL_MONO));
1008 (void) PyDict_SetItemString(d, "STEREO_INTERLEAVED",
1009 PyInt_FromLong(CL_STEREO_INTERLEAVED));
1010 (void) PyDict_SetItemString(d, "RGB", PyInt_FromLong(CL_RGB));
1011 (void) PyDict_SetItemString(d, "RGBX", PyInt_FromLong(CL_RGBX));
1012 (void) PyDict_SetItemString(d, "RGBA", PyInt_FromLong(CL_RGBA));
1013 (void) PyDict_SetItemString(d, "RGB332", PyInt_FromLong(CL_RGB332));
1014 (void) PyDict_SetItemString(d, "GRAYSCALE",
1015 PyInt_FromLong(CL_GRAYSCALE));
1016 (void) PyDict_SetItemString(d, "Y", PyInt_FromLong(CL_Y));
1017 (void) PyDict_SetItemString(d, "YUV", PyInt_FromLong(CL_YUV));
1018 (void) PyDict_SetItemString(d, "YCbCr", PyInt_FromLong(CL_YCbCr));
1019 (void) PyDict_SetItemString(d, "YUV422", PyInt_FromLong(CL_YUV422));
1020 (void) PyDict_SetItemString(d, "YCbCr422",
1021 PyInt_FromLong(CL_YCbCr422));
1022 (void) PyDict_SetItemString(d, "YUV422HC",
1023 PyInt_FromLong(CL_YUV422HC));
1024 (void) PyDict_SetItemString(d, "YCbCr422HC",
1025 PyInt_FromLong(CL_YCbCr422HC));
1026 (void) PyDict_SetItemString(d, "YUV422DC",
1027 PyInt_FromLong(CL_YUV422DC));
1028 (void) PyDict_SetItemString(d, "YCbCr422DC",
1029 PyInt_FromLong(CL_YCbCr422DC));
1030 (void) PyDict_SetItemString(d, "RGB8", PyInt_FromLong(CL_RGB8));
1031 (void) PyDict_SetItemString(d, "BEST_FIT",
1032 PyInt_FromLong(CL_BEST_FIT));
1033 (void) PyDict_SetItemString(d, "MAX_NUMBER_OF_AUDIO_ALGORITHMS",
1034 PyInt_FromLong(CL_MAX_NUMBER_OF_AUDIO_ALGORITHMS));
1035 (void) PyDict_SetItemString(d, "MAX_NUMBER_OF_VIDEO_ALGORITHMS",
1036 PyInt_FromLong(CL_MAX_NUMBER_OF_VIDEO_ALGORITHMS));
1037 (void) PyDict_SetItemString(d, "AUDIO", PyInt_FromLong(CL_AUDIO));
1038 (void) PyDict_SetItemString(d, "VIDEO", PyInt_FromLong(CL_VIDEO));
1039 (void) PyDict_SetItemString(d, "UNKNOWN_SCHEME",
1040 PyInt_FromLong(CL_UNKNOWN_SCHEME));
1041 (void) PyDict_SetItemString(d, "UNCOMPRESSED_AUDIO",
1042 PyInt_FromLong(CL_UNCOMPRESSED_AUDIO));
1043 (void) PyDict_SetItemString(d, "G711_ULAW",
1044 PyInt_FromLong(CL_G711_ULAW));
1045 (void) PyDict_SetItemString(d, "ULAW", PyInt_FromLong(CL_ULAW));
1046 (void) PyDict_SetItemString(d, "G711_ALAW",
1047 PyInt_FromLong(CL_G711_ALAW));
1048 (void) PyDict_SetItemString(d, "ALAW", PyInt_FromLong(CL_ALAW));
1049 (void) PyDict_SetItemString(d, "AWARE_MPEG_AUDIO",
1050 PyInt_FromLong(CL_AWARE_MPEG_AUDIO));
1051 (void) PyDict_SetItemString(d, "AWARE_MULTIRATE",
1052 PyInt_FromLong(CL_AWARE_MULTIRATE));
1053 (void) PyDict_SetItemString(d, "UNCOMPRESSED",
1054 PyInt_FromLong(CL_UNCOMPRESSED));
1055 (void) PyDict_SetItemString(d, "UNCOMPRESSED_VIDEO",
1056 PyInt_FromLong(CL_UNCOMPRESSED_VIDEO));
1057 (void) PyDict_SetItemString(d, "RLE", PyInt_FromLong(CL_RLE));
1058 (void) PyDict_SetItemString(d, "JPEG", PyInt_FromLong(CL_JPEG));
Sjoerd Mullender3db845b1995-05-17 11:16:52 +00001059#ifdef IRIX_5_3_LIBRARY
Roger E. Massee474fb31997-01-17 16:00:02 +00001060 (void) PyDict_SetItemString(d, "JPEG_SOFTWARE",
1061 PyInt_FromLong(CL_JPEG_SOFTWARE));
Sjoerd Mullender3db845b1995-05-17 11:16:52 +00001062#endif
Roger E. Massee474fb31997-01-17 16:00:02 +00001063 (void) PyDict_SetItemString(d, "MPEG_VIDEO",
1064 PyInt_FromLong(CL_MPEG_VIDEO));
1065 (void) PyDict_SetItemString(d, "MVC1", PyInt_FromLong(CL_MVC1));
1066 (void) PyDict_SetItemString(d, "RTR", PyInt_FromLong(CL_RTR));
1067 (void) PyDict_SetItemString(d, "RTR1", PyInt_FromLong(CL_RTR1));
1068 (void) PyDict_SetItemString(d, "HDCC", PyInt_FromLong(CL_HDCC));
1069 (void) PyDict_SetItemString(d, "MVC2", PyInt_FromLong(CL_MVC2));
1070 (void) PyDict_SetItemString(d, "RLE24", PyInt_FromLong(CL_RLE24));
1071 (void) PyDict_SetItemString(d, "MAX_NUMBER_OF_PARAMS",
1072 PyInt_FromLong(CL_MAX_NUMBER_OF_PARAMS));
1073 (void) PyDict_SetItemString(d, "IMAGE_WIDTH",
1074 PyInt_FromLong(CL_IMAGE_WIDTH));
1075 (void) PyDict_SetItemString(d, "IMAGE_HEIGHT",
1076 PyInt_FromLong(CL_IMAGE_HEIGHT));
1077 (void) PyDict_SetItemString(d, "ORIGINAL_FORMAT",
1078 PyInt_FromLong(CL_ORIGINAL_FORMAT));
1079 (void) PyDict_SetItemString(d, "INTERNAL_FORMAT",
1080 PyInt_FromLong(CL_INTERNAL_FORMAT));
1081 (void) PyDict_SetItemString(d, "COMPONENTS",
1082 PyInt_FromLong(CL_COMPONENTS));
1083 (void) PyDict_SetItemString(d, "BITS_PER_COMPONENT",
1084 PyInt_FromLong(CL_BITS_PER_COMPONENT));
1085 (void) PyDict_SetItemString(d, "FRAME_RATE",
1086 PyInt_FromLong(CL_FRAME_RATE));
1087 (void) PyDict_SetItemString(d, "COMPRESSION_RATIO",
1088 PyInt_FromLong(CL_COMPRESSION_RATIO));
1089 (void) PyDict_SetItemString(d, "EXACT_COMPRESSION_RATIO",
1090 PyInt_FromLong(CL_EXACT_COMPRESSION_RATIO));
1091 (void) PyDict_SetItemString(d, "FRAME_BUFFER_SIZE",
1092 PyInt_FromLong(CL_FRAME_BUFFER_SIZE));
1093 (void) PyDict_SetItemString(d, "COMPRESSED_BUFFER_SIZE",
1094 PyInt_FromLong(CL_COMPRESSED_BUFFER_SIZE));
1095 (void) PyDict_SetItemString(d, "BLOCK_SIZE",
1096 PyInt_FromLong(CL_BLOCK_SIZE));
1097 (void) PyDict_SetItemString(d, "PREROLL", PyInt_FromLong(CL_PREROLL));
1098 (void) PyDict_SetItemString(d, "FRAME_TYPE",
1099 PyInt_FromLong(CL_FRAME_TYPE));
1100 (void) PyDict_SetItemString(d, "ALGORITHM_ID",
1101 PyInt_FromLong(CL_ALGORITHM_ID));
1102 (void) PyDict_SetItemString(d, "ALGORITHM_VERSION",
1103 PyInt_FromLong(CL_ALGORITHM_VERSION));
1104 (void) PyDict_SetItemString(d, "ORIENTATION",
1105 PyInt_FromLong(CL_ORIENTATION));
1106 (void) PyDict_SetItemString(d, "NUMBER_OF_FRAMES",
1107 PyInt_FromLong(CL_NUMBER_OF_FRAMES));
1108 (void) PyDict_SetItemString(d, "SPEED", PyInt_FromLong(CL_SPEED));
1109 (void) PyDict_SetItemString(d, "LAST_FRAME_INDEX",
1110 PyInt_FromLong(CL_LAST_FRAME_INDEX));
Sjoerd Mullender3db845b1995-05-17 11:16:52 +00001111#ifdef IRIX_5_3_LIBRARY
Roger E. Massee474fb31997-01-17 16:00:02 +00001112 (void) PyDict_SetItemString(d, "ENABLE_IMAGEINFO",
1113 PyInt_FromLong(CL_ENABLE_IMAGEINFO));
1114 (void) PyDict_SetItemString(d, "INTERNAL_IMAGE_WIDTH",
1115 PyInt_FromLong(CL_INTERNAL_IMAGE_WIDTH));
1116 (void) PyDict_SetItemString(d, "INTERNAL_IMAGE_HEIGHT",
1117 PyInt_FromLong(CL_INTERNAL_IMAGE_HEIGHT));
Sjoerd Mullender3db845b1995-05-17 11:16:52 +00001118#endif
Roger E. Massee474fb31997-01-17 16:00:02 +00001119 (void) PyDict_SetItemString(d, "NUMBER_OF_PARAMS",
1120 PyInt_FromLong(CL_NUMBER_OF_PARAMS));
Sjoerd Mullender3db845b1995-05-17 11:16:52 +00001121#ifdef IRIX_5_3_LIBRARY
Roger E. Massee474fb31997-01-17 16:00:02 +00001122 (void) PyDict_SetItemString(d, "MVC2_LUMA_THRESHOLD",
1123 PyInt_FromLong(CL_MVC2_LUMA_THRESHOLD));
1124 (void) PyDict_SetItemString(d, "MVC2_CHROMA_THRESHOLD",
1125 PyInt_FromLong(CL_MVC2_CHROMA_THRESHOLD));
1126 (void) PyDict_SetItemString(d, "MVC2_EDGE_THRESHOLD",
1127 PyInt_FromLong(CL_MVC2_EDGE_THRESHOLD));
1128 (void) PyDict_SetItemString(d, "MVC2_BLENDING",
1129 PyInt_FromLong(CL_MVC2_BLENDING));
1130 (void) PyDict_SetItemString(d, "MVC2_BLENDING_OFF",
1131 PyInt_FromLong(CL_MVC2_BLENDING_OFF));
1132 (void) PyDict_SetItemString(d, "MVC2_BLENDING_ON",
1133 PyInt_FromLong(CL_MVC2_BLENDING_ON));
1134 (void) PyDict_SetItemString(d, "JPEG_QUALITY_FACTOR",
1135 PyInt_FromLong(CL_JPEG_QUALITY_FACTOR));
1136 (void) PyDict_SetItemString(d, "JPEG_STREAM_HEADERS",
1137 PyInt_FromLong(CL_JPEG_STREAM_HEADERS));
1138 (void) PyDict_SetItemString(d, "JPEG_QUANTIZATION_TABLES",
1139 PyInt_FromLong(CL_JPEG_QUANTIZATION_TABLES));
1140 (void) PyDict_SetItemString(d, "JPEG_NUM_PARAMS",
1141 PyInt_FromLong(CL_JPEG_NUM_PARAMS));
1142 (void) PyDict_SetItemString(d, "RTR_QUALITY_LEVEL",
1143 PyInt_FromLong(CL_RTR_QUALITY_LEVEL));
1144 (void) PyDict_SetItemString(d, "HDCC_TILE_THRESHOLD",
1145 PyInt_FromLong(CL_HDCC_TILE_THRESHOLD));
1146 (void) PyDict_SetItemString(d, "HDCC_SAMPLES_PER_TILE",
1147 PyInt_FromLong(CL_HDCC_SAMPLES_PER_TILE));
Sjoerd Mullender3db845b1995-05-17 11:16:52 +00001148#endif
Roger E. Massee474fb31997-01-17 16:00:02 +00001149 (void) PyDict_SetItemString(d, "END_OF_SEQUENCE",
1150 PyInt_FromLong(CL_END_OF_SEQUENCE));
1151 (void) PyDict_SetItemString(d, "CHANNEL_POLICY",
1152 PyInt_FromLong(CL_CHANNEL_POLICY));
1153 (void) PyDict_SetItemString(d, "NOISE_MARGIN",
1154 PyInt_FromLong(CL_NOISE_MARGIN));
1155 (void) PyDict_SetItemString(d, "BITRATE_POLICY",
1156 PyInt_FromLong(CL_BITRATE_POLICY));
1157 (void) PyDict_SetItemString(d, "BITRATE_TARGET",
1158 PyInt_FromLong(CL_BITRATE_TARGET));
1159 (void) PyDict_SetItemString(d, "LAYER", PyInt_FromLong(CL_LAYER));
1160 (void) PyDict_SetItemString(d, "ENUM_VALUE",
1161 PyInt_FromLong(CL_ENUM_VALUE));
1162 (void) PyDict_SetItemString(d, "RANGE_VALUE",
1163 PyInt_FromLong(CL_RANGE_VALUE));
1164 (void) PyDict_SetItemString(d, "FLOATING_ENUM_VALUE",
1165 PyInt_FromLong(CL_FLOATING_ENUM_VALUE));
1166 (void) PyDict_SetItemString(d, "FLOATING_RANGE_VALUE",
1167 PyInt_FromLong(CL_FLOATING_RANGE_VALUE));
1168 (void) PyDict_SetItemString(d, "DECOMPRESSOR",
1169 PyInt_FromLong(CL_DECOMPRESSOR));
1170 (void) PyDict_SetItemString(d, "COMPRESSOR",
1171 PyInt_FromLong(CL_COMPRESSOR));
1172 (void) PyDict_SetItemString(d, "CODEC", PyInt_FromLong(CL_CODEC));
1173 (void) PyDict_SetItemString(d, "NONE", PyInt_FromLong(CL_NONE));
Sjoerd Mullender3db845b1995-05-17 11:16:52 +00001174#ifdef IRIX_5_3_LIBRARY
Roger E. Massee474fb31997-01-17 16:00:02 +00001175 (void) PyDict_SetItemString(d, "BUF_FRAME",
1176 PyInt_FromLong(CL_BUF_FRAME));
1177 (void) PyDict_SetItemString(d, "BUF_DATA",
1178 PyInt_FromLong(CL_BUF_DATA));
Sjoerd Mullender3db845b1995-05-17 11:16:52 +00001179#endif
1180#ifdef CL_FRAME
Roger E. Massee474fb31997-01-17 16:00:02 +00001181 (void) PyDict_SetItemString(d, "FRAME", PyInt_FromLong(CL_FRAME));
1182 (void) PyDict_SetItemString(d, "DATA", PyInt_FromLong(CL_DATA));
Sjoerd Mullender3db845b1995-05-17 11:16:52 +00001183#endif
Roger E. Massee474fb31997-01-17 16:00:02 +00001184 (void) PyDict_SetItemString(d, "NONE", PyInt_FromLong(CL_NONE));
1185 (void) PyDict_SetItemString(d, "KEYFRAME",
1186 PyInt_FromLong(CL_KEYFRAME));
1187 (void) PyDict_SetItemString(d, "INTRA", PyInt_FromLong(CL_INTRA));
1188 (void) PyDict_SetItemString(d, "PREDICTED",
1189 PyInt_FromLong(CL_PREDICTED));
1190 (void) PyDict_SetItemString(d, "BIDIRECTIONAL",
1191 PyInt_FromLong(CL_BIDIRECTIONAL));
1192 (void) PyDict_SetItemString(d, "TOP_DOWN",
1193 PyInt_FromLong(CL_TOP_DOWN));
1194 (void) PyDict_SetItemString(d, "BOTTOM_UP",
1195 PyInt_FromLong(CL_BOTTOM_UP));
Sjoerd Mullender3db845b1995-05-17 11:16:52 +00001196#ifdef IRIX_5_3_LIBRARY
Roger E. Massee474fb31997-01-17 16:00:02 +00001197 (void) PyDict_SetItemString(d, "CONTINUOUS_BLOCK",
1198 PyInt_FromLong(CL_CONTINUOUS_BLOCK));
1199 (void) PyDict_SetItemString(d, "CONTINUOUS_NONBLOCK",
1200 PyInt_FromLong(CL_CONTINUOUS_NONBLOCK));
1201 (void) PyDict_SetItemString(d, "EXTERNAL_DEVICE",
1202 PyInt_FromLong((long)CL_EXTERNAL_DEVICE));
Sjoerd Mullender3db845b1995-05-17 11:16:52 +00001203#endif
Roger E. Massee474fb31997-01-17 16:00:02 +00001204 (void) PyDict_SetItemString(d, "AWCMP_STEREO",
1205 PyInt_FromLong(AWCMP_STEREO));
1206 (void) PyDict_SetItemString(d, "AWCMP_JOINT_STEREO",
1207 PyInt_FromLong(AWCMP_JOINT_STEREO));
1208 (void) PyDict_SetItemString(d, "AWCMP_INDEPENDENT",
1209 PyInt_FromLong(AWCMP_INDEPENDENT));
1210 (void) PyDict_SetItemString(d, "AWCMP_FIXED_RATE",
1211 PyInt_FromLong(AWCMP_FIXED_RATE));
1212 (void) PyDict_SetItemString(d, "AWCMP_CONST_QUAL",
1213 PyInt_FromLong(AWCMP_CONST_QUAL));
1214 (void) PyDict_SetItemString(d, "AWCMP_LOSSLESS",
1215 PyInt_FromLong(AWCMP_LOSSLESS));
1216 (void) PyDict_SetItemString(d, "AWCMP_MPEG_LAYER_I",
1217 PyInt_FromLong(AWCMP_MPEG_LAYER_I));
1218 (void) PyDict_SetItemString(d, "AWCMP_MPEG_LAYER_II",
1219 PyInt_FromLong(AWCMP_MPEG_LAYER_II));
1220 (void) PyDict_SetItemString(d, "HEADER_START_CODE",
1221 PyInt_FromLong(CL_HEADER_START_CODE));
1222 (void) PyDict_SetItemString(d, "BAD_NO_BUFFERSPACE",
1223 PyInt_FromLong(CL_BAD_NO_BUFFERSPACE));
1224 (void) PyDict_SetItemString(d, "BAD_PVBUFFER",
1225 PyInt_FromLong(CL_BAD_PVBUFFER));
1226 (void) PyDict_SetItemString(d, "BAD_BUFFERLENGTH_NEG",
1227 PyInt_FromLong(CL_BAD_BUFFERLENGTH_NEG));
1228 (void) PyDict_SetItemString(d, "BAD_BUFFERLENGTH_ODD",
1229 PyInt_FromLong(CL_BAD_BUFFERLENGTH_ODD));
1230 (void) PyDict_SetItemString(d, "BAD_PARAM",
1231 PyInt_FromLong(CL_BAD_PARAM));
1232 (void) PyDict_SetItemString(d, "BAD_COMPRESSION_SCHEME",
1233 PyInt_FromLong(CL_BAD_COMPRESSION_SCHEME));
1234 (void) PyDict_SetItemString(d, "BAD_COMPRESSOR_HANDLE",
1235 PyInt_FromLong(CL_BAD_COMPRESSOR_HANDLE));
1236 (void) PyDict_SetItemString(d, "BAD_COMPRESSOR_HANDLE_POINTER",
1237 PyInt_FromLong(CL_BAD_COMPRESSOR_HANDLE_POINTER));
1238 (void) PyDict_SetItemString(d, "BAD_BUFFER_HANDLE",
1239 PyInt_FromLong(CL_BAD_BUFFER_HANDLE));
1240 (void) PyDict_SetItemString(d, "BAD_BUFFER_QUERY_SIZE",
1241 PyInt_FromLong(CL_BAD_BUFFER_QUERY_SIZE));
1242 (void) PyDict_SetItemString(d, "JPEG_ERROR",
1243 PyInt_FromLong(CL_JPEG_ERROR));
1244 (void) PyDict_SetItemString(d, "BAD_FRAME_SIZE",
1245 PyInt_FromLong(CL_BAD_FRAME_SIZE));
1246 (void) PyDict_SetItemString(d, "PARAM_OUT_OF_RANGE",
1247 PyInt_FromLong(CL_PARAM_OUT_OF_RANGE));
1248 (void) PyDict_SetItemString(d, "ADDED_ALGORITHM_ERROR",
1249 PyInt_FromLong(CL_ADDED_ALGORITHM_ERROR));
1250 (void) PyDict_SetItemString(d, "BAD_ALGORITHM_TYPE",
1251 PyInt_FromLong(CL_BAD_ALGORITHM_TYPE));
1252 (void) PyDict_SetItemString(d, "BAD_ALGORITHM_NAME",
1253 PyInt_FromLong(CL_BAD_ALGORITHM_NAME));
1254 (void) PyDict_SetItemString(d, "BAD_BUFFERING",
1255 PyInt_FromLong(CL_BAD_BUFFERING));
1256 (void) PyDict_SetItemString(d, "BUFFER_NOT_CREATED",
1257 PyInt_FromLong(CL_BUFFER_NOT_CREATED));
1258 (void) PyDict_SetItemString(d, "BAD_BUFFER_EXISTS",
1259 PyInt_FromLong(CL_BAD_BUFFER_EXISTS));
1260 (void) PyDict_SetItemString(d, "BAD_INTERNAL_FORMAT",
1261 PyInt_FromLong(CL_BAD_INTERNAL_FORMAT));
1262 (void) PyDict_SetItemString(d, "BAD_BUFFER_POINTER",
1263 PyInt_FromLong(CL_BAD_BUFFER_POINTER));
1264 (void) PyDict_SetItemString(d, "FRAME_BUFFER_SIZE_ZERO",
1265 PyInt_FromLong(CL_FRAME_BUFFER_SIZE_ZERO));
1266 (void) PyDict_SetItemString(d, "BAD_STREAM_HEADER",
1267 PyInt_FromLong(CL_BAD_STREAM_HEADER));
1268 (void) PyDict_SetItemString(d, "BAD_LICENSE",
1269 PyInt_FromLong(CL_BAD_LICENSE));
1270 (void) PyDict_SetItemString(d, "AWARE_ERROR",
1271 PyInt_FromLong(CL_AWARE_ERROR));
1272 (void) PyDict_SetItemString(d, "BAD_BUFFER_SIZE_POINTER",
1273 PyInt_FromLong(CL_BAD_BUFFER_SIZE_POINTER));
1274 (void) PyDict_SetItemString(d, "BAD_BUFFER_SIZE",
1275 PyInt_FromLong(CL_BAD_BUFFER_SIZE));
1276 (void) PyDict_SetItemString(d, "BAD_BUFFER_TYPE",
1277 PyInt_FromLong(CL_BAD_BUFFER_TYPE));
1278 (void) PyDict_SetItemString(d, "BAD_HEADER_SIZE",
1279 PyInt_FromLong(CL_BAD_HEADER_SIZE));
1280 (void) PyDict_SetItemString(d, "BAD_FUNCTION_POINTER",
1281 PyInt_FromLong(CL_BAD_FUNCTION_POINTER));
1282 (void) PyDict_SetItemString(d, "BAD_SCHEME_POINTER",
1283 PyInt_FromLong(CL_BAD_SCHEME_POINTER));
1284 (void) PyDict_SetItemString(d, "BAD_STRING_POINTER",
1285 PyInt_FromLong(CL_BAD_STRING_POINTER));
1286 (void) PyDict_SetItemString(d, "BAD_MIN_GT_MAX",
1287 PyInt_FromLong(CL_BAD_MIN_GT_MAX));
1288 (void) PyDict_SetItemString(d, "BAD_INITIAL_VALUE",
1289 PyInt_FromLong(CL_BAD_INITIAL_VALUE));
1290 (void) PyDict_SetItemString(d, "BAD_PARAM_ID_POINTER",
1291 PyInt_FromLong(CL_BAD_PARAM_ID_POINTER));
1292 (void) PyDict_SetItemString(d, "BAD_PARAM_TYPE",
1293 PyInt_FromLong(CL_BAD_PARAM_TYPE));
1294 (void) PyDict_SetItemString(d, "BAD_TEXT_STRING_PTR",
1295 PyInt_FromLong(CL_BAD_TEXT_STRING_PTR));
1296 (void) PyDict_SetItemString(d, "BAD_FUNCTIONALITY",
1297 PyInt_FromLong(CL_BAD_FUNCTIONALITY));
1298 (void) PyDict_SetItemString(d, "BAD_NUMBER_OF_BLOCKS",
1299 PyInt_FromLong(CL_BAD_NUMBER_OF_BLOCKS));
1300 (void) PyDict_SetItemString(d, "BAD_BLOCK_SIZE",
1301 PyInt_FromLong(CL_BAD_BLOCK_SIZE));
1302 (void) PyDict_SetItemString(d, "BAD_POINTER",
1303 PyInt_FromLong(CL_BAD_POINTER));
1304 (void) PyDict_SetItemString(d, "BAD_BOARD",
1305 PyInt_FromLong(CL_BAD_BOARD));
1306 (void) PyDict_SetItemString(d, "MVC2_ERROR",
1307 PyInt_FromLong(CL_MVC2_ERROR));
Sjoerd Mullender3db845b1995-05-17 11:16:52 +00001308#ifdef IRIX_5_3_LIBRARY
Roger E. Massee474fb31997-01-17 16:00:02 +00001309 (void) PyDict_SetItemString(d, "NEXT_NOT_AVAILABLE",
1310 PyInt_FromLong(CL_NEXT_NOT_AVAILABLE));
1311 (void) PyDict_SetItemString(d, "SCHEME_BUSY",
1312 PyInt_FromLong(CL_SCHEME_BUSY));
1313 (void) PyDict_SetItemString(d, "SCHEME_NOT_AVAILABLE",
1314 PyInt_FromLong(CL_SCHEME_NOT_AVAILABLE));
Sjoerd Mullender3db845b1995-05-17 11:16:52 +00001315#endif
1316#ifdef CL_LUMA_THRESHOLD
1317 /* backward compatibility */
Roger E. Massee474fb31997-01-17 16:00:02 +00001318 (void) PyDict_SetItemString(d, "LUMA_THRESHOLD",
1319 PyInt_FromLong(CL_LUMA_THRESHOLD));
1320 (void) PyDict_SetItemString(d, "CHROMA_THRESHOLD",
1321 PyInt_FromLong(CL_CHROMA_THRESHOLD));
1322 (void) PyDict_SetItemString(d, "EDGE_THRESHOLD",
1323 PyInt_FromLong(CL_EDGE_THRESHOLD));
1324 (void) PyDict_SetItemString(d, "BLENDING",
1325 PyInt_FromLong(CL_BLENDING));
1326 (void) PyDict_SetItemString(d, "QUALITY_FACTOR",
1327 PyInt_FromLong(CL_QUALITY_FACTOR));
1328 (void) PyDict_SetItemString(d, "STREAM_HEADERS",
1329 PyInt_FromLong(CL_STREAM_HEADERS));
1330 (void) PyDict_SetItemString(d, "QUALITY_LEVEL",
1331 PyInt_FromLong(CL_QUALITY_LEVEL));
1332 (void) PyDict_SetItemString(d, "TILE_THRESHOLD",
1333 PyInt_FromLong(CL_TILE_THRESHOLD));
1334 (void) PyDict_SetItemString(d, "SAMPLES_PER_TILE",
1335 PyInt_FromLong(CL_SAMPLES_PER_TILE));
Sjoerd Mullender3db845b1995-05-17 11:16:52 +00001336#endif
1337
Roger E. Massee474fb31997-01-17 16:00:02 +00001338 if (PyErr_Occurred())
1339 Py_FatalError("can't initialize module cl");
Sjoerd Mullenderd53a4f31992-09-24 10:37:39 +00001340
1341 (void) clSetErrorHandler(cl_ErrorHandler);
Sjoerd Mullenderc4315491992-09-23 14:53:00 +00001342}