/***********************************************************
Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
The Netherlands.

                        All Rights Reserved

Permission to use, copy, modify, and distribute this software and its
documentation for any purpose and without fee is hereby granted,
provided that the above copyright notice appear in all copies and that
both that copyright notice and this permission notice appear in
supporting documentation, and that the names of Stichting Mathematisch
Centrum or CWI or Corporation for National Research Initiatives or
CNRI not be used in advertising or publicity pertaining to
distribution of the software without specific, written prior
permission.

While CWI is the initial source for this software, a modified version
is made available by the Corporation for National Research Initiatives
(CNRI) at the Internet address ftp://ftp.python.org.

STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.

******************************************************************/


/* Cl objects */

#define CLDEBUG

#include <stdarg.h>
#include <cl.h>
#include "allobjects.h"
#include "modsupport.h"		/* For getargs() etc. */
#include "ceval.h"		/* For call_object() */

typedef struct {
	OB_HEAD
	int ob_isCompressor;	/* Compressor or Decompressor */
	CL_Handle ob_compressorHdl;
	int *ob_paramtypes;
	int ob_nparams;
} clobject;

static object *ClError;		/* exception cl.error */

static int error_handler_called = 0;

/*
 * We want to use the function prototypes that are available in the C
 * compiler on the SGI.  Because of that, we need to declare the first
 * argument of the compressor and decompressor methods as "object *",
 * even though they are really "clobject *".  Therefore we cast the
 * argument to the proper type using this macro.
 */
#define SELF	((clobject *) self)

/********************************************************************
			  Utility routines.
********************************************************************/
static void
cl_ErrorHandler(CL_Handle handle, int code, const char *fmt, ...)
{
	va_list ap;
	char errbuf[BUFSIZ];	/* hopefully big enough */
	char *p;

	if (err_occurred())	/* don't change existing error */
		return;
	error_handler_called = 1;
	va_start(ap, fmt);
	vsprintf(errbuf, fmt, ap);
	va_end(ap);
	p = &errbuf[strlen(errbuf) - 1]; /* swat the line feed */
	if (*p == '\n')
		*p = 0;
	err_setstr(ClError, errbuf);
}

/*
 * This assumes that params are always in the range 0 to some maximum.
 */
static int
param_type_is_float(clobject *self, int param)
{
	int bufferlength;
	int ret;

	if (self->ob_paramtypes == NULL) {
		error_handler_called = 0;
		bufferlength = clQueryParams(self->ob_compressorHdl, 0, 0);
		if (error_handler_called)
			return -1;

		self->ob_paramtypes = NEW(int, bufferlength);
		if (self->ob_paramtypes == NULL)
			return -1;
		self->ob_nparams = bufferlength / 2;

		(void) clQueryParams(self->ob_compressorHdl, self->ob_paramtypes, bufferlength);
		if (error_handler_called) {
			DEL(self->ob_paramtypes);
			self->ob_paramtypes = NULL;
			return -1;
		}
	}

	if (param < 0 || param >= self->ob_nparams)
		return -1;

	if (self->ob_paramtypes[param*2 + 1] == CL_FLOATING_ENUM_VALUE ||
	    self->ob_paramtypes[param*2 + 1] == CL_FLOATING_RANGE_VALUE)
		return 1;
	else
		return 0;
}

/********************************************************************
	       Single image compression/decompression.
********************************************************************/
static object *
cl_CompressImage(object *self, object *args)
{
	int compressionScheme, width, height, originalFormat;
	float compressionRatio;
	int frameBufferSize, compressedBufferSize;
	char *frameBuffer;
	object *compressedBuffer;

	if (!getargs(args, "(iiiifs#)", &compressionScheme, &width, &height,
		     &originalFormat, &compressionRatio, &frameBuffer,
		     &frameBufferSize))
		return NULL;

 retry:
	compressedBuffer = newsizedstringobject(NULL, frameBufferSize);
	if (compressedBuffer == NULL)
		return NULL;

	compressedBufferSize = frameBufferSize;
	error_handler_called = 0;
	if (clCompressImage(compressionScheme, width, height, originalFormat,
			    compressionRatio, (void *) frameBuffer,
			    &compressedBufferSize,
			    (void *) getstringvalue(compressedBuffer))
	    == FAILURE) {
		DECREF(compressedBuffer);
		if (!error_handler_called)
			err_setstr(ClError, "clCompressImage failed");
		return NULL;
	}

	if (compressedBufferSize > frameBufferSize) {
		frameBufferSize = compressedBufferSize;
		DECREF(compressedBuffer);
		goto retry;
	}

	if (compressedBufferSize < frameBufferSize)
		if (resizestring(&compressedBuffer, compressedBufferSize))
			return NULL;

	return compressedBuffer;
}

static object *
cl_DecompressImage(object *self, object *args)
{
	int compressionScheme, width, height, originalFormat;
	char *compressedBuffer;
	int compressedBufferSize, frameBufferSize;
	object *frameBuffer;

	if (!getargs(args, "(iiiis#)", &compressionScheme, &width, &height,
		     &originalFormat, &compressedBuffer,
		     &compressedBufferSize))
		return NULL;

	frameBufferSize = width * height * CL_BytesPerPixel(originalFormat);

	frameBuffer = newsizedstringobject(NULL, frameBufferSize);
	if (frameBuffer == NULL)
		return NULL;

	error_handler_called = 0;
	if (clDecompressImage(compressionScheme, width, height, originalFormat,
			      compressedBufferSize, compressedBuffer,
			      (void *) getstringvalue(frameBuffer)) == FAILURE) {
		DECREF(frameBuffer);
		if (!error_handler_called)
			err_setstr(ClError, "clDecompressImage failed");
		return NULL;
	}

	return frameBuffer;
}

/********************************************************************
		Sequential compression/decompression.
********************************************************************/
#define CheckCompressor(self)	if ((self)->ob_compressorHdl == NULL) { \
					err_setstr(RuntimeError, "(de)compressor not active"); \
					return NULL; \
				}

static object *
doClose(clobject *self, object *args, int (*close_func)(CL_Handle))
{
	CheckCompressor(self);

	if (!getnoarg(args))
		return NULL;

	error_handler_called = 0;
	if ((*close_func)(self->ob_compressorHdl) == FAILURE) {
		if (!error_handler_called)
			err_setstr(ClError, "close failed");
		return NULL;
	}

	self->ob_compressorHdl = NULL;

	if (self->ob_paramtypes)
		DEL(self->ob_paramtypes);
	self->ob_paramtypes = NULL;

	INCREF(None);
	return None;
}

static object *
clm_CloseCompressor(object *self, object *args)
{
	return doClose(SELF, args, clCloseCompressor);
}

static object *
clm_CloseDecompressor(object *self, object *args)
{
	return doClose(SELF, args, clCloseDecompressor);
}

static object *
clm_Compress(object *self, object *args)
{
	int numberOfFrames;
	int frameBufferSize, compressedBufferSize, size;
	char *frameBuffer;
	object *data;

	CheckCompressor(SELF);

	if (!getargs(args, "(is#)", &numberOfFrames, &frameBuffer, &frameBufferSize))
		return NULL;

	error_handler_called = 0;
	size = clGetParam(SELF->ob_compressorHdl, CL_COMPRESSED_BUFFER_SIZE);
	compressedBufferSize = size;
	if (error_handler_called)
		return NULL;

	data = newsizedstringobject(NULL, size);
	if (data == NULL)
		return NULL;

	error_handler_called = 0;
	if (clCompress(SELF->ob_compressorHdl, numberOfFrames,
		       (void *) frameBuffer, &compressedBufferSize,
		       (void *) getstringvalue(data)) == FAILURE) {
		DECREF(data);
		if (!error_handler_called)
			err_setstr(ClError, "compress failed");
		return NULL;
	}

	if (compressedBufferSize < size)
		if (resizestring(&data, compressedBufferSize))
			return NULL;

	if (compressedBufferSize > size) {
		/* we didn't get all "compressed" data */
		DECREF(data);
		err_setstr(ClError, "compressed data is more than fitted");
		return NULL;
	}

	return data;
}

static object *
clm_Decompress(object *self, object *args)
{
	object *data;
	int numberOfFrames;
	char *compressedData;
	int compressedDataSize, dataSize;

	CheckCompressor(SELF);

	if (!getargs(args, "(is#)", &numberOfFrames, &compressedData,
		     &compressedDataSize))
		return NULL;

	error_handler_called = 0;
	dataSize = clGetParam(SELF->ob_compressorHdl, CL_FRAME_BUFFER_SIZE);
	if (error_handler_called)
		return NULL;

	data = newsizedstringobject(NULL, dataSize);
	if (data == NULL)
		return NULL;

	error_handler_called = 0;
	if (clDecompress(SELF->ob_compressorHdl, numberOfFrames,
			 compressedDataSize, (void *) compressedData,
			 (void *) getstringvalue(data)) == FAILURE) {
		DECREF(data);
		if (!error_handler_called)
			err_setstr(ClError, "decompress failed");
		return NULL;
	}

	return data;
}

static object *
doParams(clobject *self, object *args, int (*func)(CL_Handle, int *, int),
	 int modified)
{
	object *list, *v;
	int *PVbuffer;
	int length;
	int i;
	float number;
	
	CheckCompressor(self);

	if (!getargs(args, "O", &list))
		return NULL;
	if (!is_listobject(list)) {
		err_badarg();
		return NULL;
	}
	length = getlistsize(list);
	PVbuffer = NEW(int, length);
	if (PVbuffer == NULL)
		return err_nomem();
	for (i = 0; i < length; i++) {
		v = getlistitem(list, i);
		if (is_floatobject(v)) {
			number = getfloatvalue(v);
			PVbuffer[i] = CL_TypeIsInt(number);
		} else if (is_intobject(v)) {
			PVbuffer[i] = getintvalue(v);
			if ((i & 1) &&
			    param_type_is_float(self, PVbuffer[i-1]) > 0) {
				number = PVbuffer[i];
				PVbuffer[i] = CL_TypeIsInt(number);
			}
		} else {
			DEL(PVbuffer);
			err_badarg();
			return NULL;
		}
	}

	error_handler_called = 0;
	(*func)(self->ob_compressorHdl, PVbuffer, length);
	if (error_handler_called) {
		DEL(PVbuffer);
		return NULL;
	}

	if (modified) {
		for (i = 0; i < length; i++) {
			if ((i & 1) &&
			    param_type_is_float(self, PVbuffer[i-1]) > 0) {
				number = CL_TypeIsFloat(PVbuffer[i]);
				v = newfloatobject(number);
			} else
				v = newintobject(PVbuffer[i]);
			setlistitem(list, i, v);
		}
	}

	DEL(PVbuffer);

	INCREF(None);
	return None;
}

static object *
clm_GetParams(object *self, object *args)
{
	return doParams(SELF, args, clGetParams, 1);
}

static object *
clm_SetParams(object *self, object *args)
{
	return doParams(SELF, args, clSetParams, 0);
}

static object *
do_get(clobject *self, object *args, int (*func)(CL_Handle, int))
{
	int paramID, value;
	float fvalue;

	CheckCompressor(self);

	if (!getargs(args, "i", &paramID))
		return NULL;

	error_handler_called = 0;
	value = (*func)(self->ob_compressorHdl, paramID);
	if (error_handler_called)
		return NULL;

	if (param_type_is_float(self, paramID) > 0) {
		fvalue = CL_TypeIsFloat(value);
		return newfloatobject(fvalue);
	}

	return newintobject(value);
}

static object *
clm_GetParam(object *self, object *args)
{
	return do_get(SELF, args, clGetParam);
}

static object *
clm_GetDefault(object *self, object *args)
{
	return do_get(SELF, args, clGetDefault);
}

static object *
clm_SetParam(object *self, object *args)
{
	int paramID, value;
	float fvalue;

	CheckCompressor(SELF);

	if (!getargs(args, "(ii)", &paramID, &value)) {
		err_clear();
		if (!getargs(args, "(if)", &paramID, &fvalue)) {
			err_clear();
			err_setstr(TypeError, "bad argument list (format '(ii)' or '(if)')");
			return NULL;
		}
		value = CL_TypeIsInt(fvalue);
	} else {
		if (param_type_is_float(SELF, paramID) > 0) {
			fvalue = value;
			value = CL_TypeIsInt(fvalue);
		}
	}

 	error_handler_called = 0;
	value = clSetParam(SELF->ob_compressorHdl, paramID, value);
	if (error_handler_called)
		return NULL;

	if (param_type_is_float(SELF, paramID) > 0)
		return newfloatobject(CL_TypeIsFloat(value));
	else
		return newintobject(value);
}

static object *
clm_GetParamID(object *self, object *args)
{
	char *name;
	int value;

	CheckCompressor(SELF);

	if (!getargs(args, "s", &name))
		return NULL;

	error_handler_called = 0;
	value = clGetParamID(SELF->ob_compressorHdl, name);
	if (value == FAILURE) {
		if (!error_handler_called)
			err_setstr(ClError, "getparamid failed");
		return NULL;
	}

	return newintobject(value);
}

static object *
clm_QueryParams(object *self, object *args)
{
	int bufferlength;
	int *PVbuffer;
	object *list;
	int i;

	CheckCompressor(SELF);

	if (!getnoarg(args))
		return NULL;

	error_handler_called = 0;
	bufferlength = clQueryParams(SELF->ob_compressorHdl, 0, 0);
	if (error_handler_called)
		return NULL;

	PVbuffer = NEW(int, bufferlength);
	if (PVbuffer == NULL)
		return err_nomem();

	bufferlength = clQueryParams(SELF->ob_compressorHdl, PVbuffer,
				     bufferlength);
	if (error_handler_called) {
		DEL(PVbuffer);
		return NULL;
	}

	list = newlistobject(bufferlength);
	if (list == NULL) {
		DEL(PVbuffer);
		return NULL;
	}

	for (i = 0; i < bufferlength; i++) {
		if (i & 1)
			setlistitem(list, i, newintobject(PVbuffer[i]));
		else if (PVbuffer[i] == 0) {
			INCREF(None);
			setlistitem(list, i, None);
		} else
			setlistitem(list, i, newstringobject((char *) PVbuffer[i]));
	}

	DEL(PVbuffer);

	return list;
}

static object *
clm_GetMinMax(object *self, object *args)
{
	int param, min, max;
	float fmin, fmax;

	CheckCompressor(SELF);

	if (!getargs(args, "i", &param))
		return NULL;

	clGetMinMax(SELF->ob_compressorHdl, param, &min, &max);

	if (param_type_is_float(SELF, param) > 0) {
		fmin = CL_TypeIsFloat(min);
		fmax = CL_TypeIsFloat(max);
		return mkvalue("(ff)", fmin, fmax);
	}

	return mkvalue("(ii)", min, max);
}

static object *
clm_GetName(object *self, object *args)
{
	int param;
	char *name;

	CheckCompressor(SELF);

	if (!getargs(args, "i", &param))
		return NULL;

	error_handler_called = 0;
	name = clGetName(SELF->ob_compressorHdl, param);
	if (name == NULL || error_handler_called) {
		if (!error_handler_called)
			err_setstr(ClError, "getname failed");
		return NULL;
	}

	return newstringobject(name);
}

static object *
clm_QuerySchemeFromHandle(object *self, object *args)
{
	CheckCompressor(SELF);

	if (!getnoarg(args))
		return NULL;

	return newintobject(clQuerySchemeFromHandle(SELF->ob_compressorHdl));
}

static object *
clm_ReadHeader(object *self, object *args)
{
	char *header;
	int headerSize;

	CheckCompressor(SELF);

	if (!getargs(args, "s#", &header, &headerSize))
		return NULL;

	return newintobject(clReadHeader(SELF->ob_compressorHdl,
					 headerSize, header));
}

static struct methodlist compressor_methods[] = {
	{"close",		clm_CloseCompressor}, /* alias */
	{"CloseCompressor",	clm_CloseCompressor},
	{"Compress",		clm_Compress},
	{"GetDefault",		clm_GetDefault},
	{"GetMinMax",		clm_GetMinMax},
	{"GetName",		clm_GetName},
	{"GetParam",		clm_GetParam},
	{"GetParamID",		clm_GetParamID},
	{"GetParams",		clm_GetParams},
	{"QueryParams",		clm_QueryParams},
	{"QuerySchemeFromHandle",clm_QuerySchemeFromHandle},
	{"SetParam",		clm_SetParam},
	{"SetParams",		clm_SetParams},
	{NULL,			NULL}		/* sentinel */
};

static struct methodlist decompressor_methods[] = {
	{"close",		clm_CloseDecompressor},	/* alias */
	{"CloseDecompressor",	clm_CloseDecompressor},
	{"Decompress",		clm_Decompress},
	{"GetDefault",		clm_GetDefault},
	{"GetMinMax",		clm_GetMinMax},
	{"GetName",		clm_GetName},
	{"GetParam",		clm_GetParam},
	{"GetParamID",		clm_GetParamID},
	{"GetParams",		clm_GetParams},
	{"ReadHeader",		clm_ReadHeader},
	{"QueryParams",		clm_QueryParams},
	{"QuerySchemeFromHandle",clm_QuerySchemeFromHandle},
	{"SetParam",		clm_SetParam},
	{"SetParams",		clm_SetParams},
	{NULL,			NULL}		/* sentinel */
};

static void
cl_dealloc(object *self)
{
	if (SELF->ob_compressorHdl) {
		if (SELF->ob_isCompressor)
			clCloseCompressor(SELF->ob_compressorHdl);
		else
			clCloseDecompressor(SELF->ob_compressorHdl);
	}
	DEL(self);
}

static object *
cl_getattr(object *self, char *name)
{
	if (SELF->ob_isCompressor)
		return findmethod(compressor_methods, self, name);
	else
		return findmethod(decompressor_methods, self, name);
}

static typeobject Cltype = {
	OB_HEAD_INIT(&Typetype)
	0,			/*ob_size*/
	"cl",			/*tp_name*/
	sizeof(clobject),	/*tp_size*/
	0,			/*tp_itemsize*/
	/* methods */
	(destructor)cl_dealloc,	/*tp_dealloc*/
	0,			/*tp_print*/
	(getattrfunc)cl_getattr, /*tp_getattr*/
	0,			/*tp_setattr*/
	0,			/*tp_compare*/
	0,			/*tp_repr*/
	0,			/*tp_as_number*/
	0,			/*tp_as_sequence*/
	0,			/*tp_as_mapping*/
};

static object *
doOpen(object *self, object *args, int (*open_func)(int, CL_Handle *),
       int iscompressor)
{
	int scheme;
	clobject *new;

	if (!getargs(args, "i", &scheme))
		return NULL;

	new = NEWOBJ(clobject, &Cltype);
	if (new == NULL)
		return NULL;

	new->ob_compressorHdl = NULL;
	new->ob_isCompressor = iscompressor;
	new->ob_paramtypes = NULL;

	error_handler_called = 0;
	if ((*open_func)(scheme, &new->ob_compressorHdl) == FAILURE) {
		DECREF(new);
		if (!error_handler_called)
			err_setstr(ClError, "Open(De)Compressor failed");
		return NULL;
	}
	return (object *)new;
}

static object *
cl_OpenCompressor(object *self, object *args)
{
	return doOpen(self, args, clOpenCompressor, 1);
}

static object *
cl_OpenDecompressor(object *self, object *args)
{
	return doOpen(self, args, clOpenDecompressor, 0);
}

static object *
cl_QueryScheme(object *self, object *args)
{
	char *header;
	int headerlen;
	int scheme;

	if (!getargs(args, "s#", &header, &headerlen))
		return NULL;

	scheme = clQueryScheme(header);
	if (scheme < 0) {
		err_setstr(ClError, "unknown compression scheme");
		return NULL;
	}

	return newintobject(scheme);
}

static object *
cl_QueryMaxHeaderSize(object *self, object *args)
{
	int scheme;

	if (!getargs(args, "i", &scheme))
		return NULL;

	return newintobject(clQueryMaxHeaderSize(scheme));
}

static object *
cl_QueryAlgorithms(object *self, object *args)
{
	int algorithmMediaType;
	int bufferlength;
	int *PVbuffer;
	object *list;
	int i;

	if (!getargs(args, "i", &algorithmMediaType))
		return NULL;

	error_handler_called = 0;
	bufferlength = clQueryAlgorithms(algorithmMediaType, 0, 0);
	if (error_handler_called)
		return NULL;

	PVbuffer = NEW(int, bufferlength);
	if (PVbuffer == NULL)
		return err_nomem();

	bufferlength = clQueryAlgorithms(algorithmMediaType, PVbuffer,
				     bufferlength);
	if (error_handler_called) {
		DEL(PVbuffer);
		return NULL;
	}

	list = newlistobject(bufferlength);
	if (list == NULL) {
		DEL(PVbuffer);
		return NULL;
	}

	for (i = 0; i < bufferlength; i++) {
		if (i & 1)
			setlistitem(list, i, newintobject(PVbuffer[i]));
		else if (PVbuffer[i] == 0) {
			INCREF(None);
			setlistitem(list, i, None);
		} else
			setlistitem(list, i, newstringobject((char *) PVbuffer[i]));
	}

	DEL(PVbuffer);

	return list;
}

static object *
cl_QuerySchemeFromName(object *self, object *args)
{
	int algorithmMediaType;
	char *name;
	int scheme;

	if (!getargs(args, "(is)", &algorithmMediaType, &name))
		return NULL;

	error_handler_called = 0;
	scheme = clQuerySchemeFromName(algorithmMediaType, name);
	if (error_handler_called) {
		err_setstr(ClError, "unknown compression scheme");
		return NULL;
	}

	return newintobject(scheme);
}

static object *
cl_GetAlgorithmName(object *self, object *args)
{
	int scheme;
	char *name;

	if (!getargs(args, "i", &scheme))
		return NULL;

	name = clGetAlgorithmName(scheme);
	if (name == 0) {
		err_setstr(ClError, "unknown compression scheme");
		return NULL;
	}

	return newstringobject(name);
}

static object *
do_set(object *self, object *args, int (*func)(int, int, int))
{
	int scheme, paramID, value;
	float fvalue;
	int is_float = 0;

	if (!getargs(args, "(iii)", &scheme, &paramID, &value)) {
		err_clear();
		if (!getargs(args, "(iif)", &scheme, &paramID, &fvalue)) {
			err_clear();
			err_setstr(TypeError, "bad argument list (format '(iii)' or '(iif)')");
			return NULL;
		}
		value = CL_TypeIsInt(fvalue);
		is_float = 1;
	} else {
		/* check some parameters which we know to be floats */
		switch (scheme) {
		case CL_COMPRESSION_RATIO:
		case CL_SPEED:
			fvalue = value;
			value = CL_TypeIsInt(fvalue);
			is_float = 1;
			break;
		}
	}

 	error_handler_called = 0;
	value = (*func)(scheme, paramID, value);
	if (error_handler_called)
		return NULL;

	if (is_float)
		return newfloatobject(CL_TypeIsFloat(value));
	else
		return newintobject(value);
}

static object *
cl_SetDefault(object *self, object *args)
{
	return do_set(self, args, clSetDefault);
}

static object *
cl_SetMin(object *self, object *args)
{
	return do_set(self, args, clSetMin);
}

static object *
cl_SetMax(object *self, object *args)
{
	return do_set(self, args, clSetMax);
}

#define func(name, type)	\
		static object *cl_##name(object *self, object *args) \
		{ \
			int x; \
			if (!getargs(args, "i", &x)) return NULL; \
			return new##type##object(CL_##name(x)); \
		}

#define func2(name, type)	\
		static object *cl_##name(object *self, object *args) \
		{ \
			int a1, a2; \
			if (!getargs(args, "(ii)", &a1, &a2)) return NULL; \
			return new##type##object(CL_##name(a1, a2)); \
		}

func(BytesPerSample,int)
func(BytesPerPixel,int)
func(AudioFormatName,string)
func(VideoFormatName,string)
func(AlgorithmNumber,int)
func(AlgorithmType,int)
func2(Algorithm,int)
func(ParamNumber,int)
func(ParamType,int)
func2(ParamID,int)

#ifdef CLDEBUG
static object *
cvt_type(object *self, object *args)
{
	int number;
	float fnumber;

	if (getargs(args, "i", &number))
		return newfloatobject(CL_TypeIsFloat(number));
	else {
		err_clear();
		if (getargs(args, "f", &fnumber))
			return newintobject(CL_TypeIsInt(fnumber));
		return NULL;
	}
}
#endif

static struct methodlist cl_methods[] = {
	{"CompressImage",	cl_CompressImage},
	{"DecompressImage",	cl_DecompressImage},
	{"GetAlgorithmName",	cl_GetAlgorithmName},
	{"OpenCompressor",	cl_OpenCompressor},
	{"OpenDecompressor",	cl_OpenDecompressor},
	{"QueryAlgorithms",	cl_QueryAlgorithms},
	{"QueryMaxHeaderSize",	cl_QueryMaxHeaderSize},
	{"QueryScheme",		cl_QueryScheme},
	{"QuerySchemeFromName",	cl_QuerySchemeFromName},
	{"SetDefault",		cl_SetDefault},
	{"SetMax",		cl_SetMax},
	{"SetMin",		cl_SetMin},
	{"BytesPerSample",	cl_BytesPerSample},
	{"BytesPerPixel",	cl_BytesPerPixel},
	{"AudioFormatName",	cl_AudioFormatName},
	{"VideoFormatName",	cl_VideoFormatName},
	{"AlgorithmNumber",	cl_AlgorithmNumber},
	{"AlgorithmType",	cl_AlgorithmType},
	{"Algorithm",		cl_Algorithm},
	{"ParamNumber",		cl_ParamNumber},
	{"ParamType",		cl_ParamType},
	{"ParamID",		cl_ParamID},
#ifdef CLDEBUG
	{"cvt_type",		cvt_type},
#endif
	{NULL,			NULL} /* Sentinel */
};

#ifdef CL_JPEG_SOFTWARE
#define IRIX_5_3_LIBRARY
#endif

void
initcl()
{
	object *m, *d;

	m = initmodule("cl", cl_methods);
	d = getmoduledict(m);

	ClError = newstringobject("cl.error");
	(void) dictinsert(d, "error", ClError);

	(void) dictinsert(d, "MAX_NUMBER_OF_ORIGINAL_FORMATS",
			  newintobject(CL_MAX_NUMBER_OF_ORIGINAL_FORMATS));
	(void) dictinsert(d, "MONO", newintobject(CL_MONO));
	(void) dictinsert(d, "STEREO_INTERLEAVED",
			  newintobject(CL_STEREO_INTERLEAVED));
	(void) dictinsert(d, "RGB", newintobject(CL_RGB));
	(void) dictinsert(d, "RGBX", newintobject(CL_RGBX));
	(void) dictinsert(d, "RGBA", newintobject(CL_RGBA));
	(void) dictinsert(d, "RGB332", newintobject(CL_RGB332));
	(void) dictinsert(d, "GRAYSCALE", newintobject(CL_GRAYSCALE));
	(void) dictinsert(d, "Y", newintobject(CL_Y));
	(void) dictinsert(d, "YUV", newintobject(CL_YUV));
	(void) dictinsert(d, "YCbCr", newintobject(CL_YCbCr));
	(void) dictinsert(d, "YUV422", newintobject(CL_YUV422));
	(void) dictinsert(d, "YCbCr422", newintobject(CL_YCbCr422));
	(void) dictinsert(d, "YUV422HC", newintobject(CL_YUV422HC));
	(void) dictinsert(d, "YCbCr422HC", newintobject(CL_YCbCr422HC));
	(void) dictinsert(d, "YUV422DC", newintobject(CL_YUV422DC));
	(void) dictinsert(d, "YCbCr422DC", newintobject(CL_YCbCr422DC));
	(void) dictinsert(d, "RGB8", newintobject(CL_RGB8));
	(void) dictinsert(d, "BEST_FIT", newintobject(CL_BEST_FIT));
	(void) dictinsert(d, "MAX_NUMBER_OF_AUDIO_ALGORITHMS",
			  newintobject(CL_MAX_NUMBER_OF_AUDIO_ALGORITHMS));
	(void) dictinsert(d, "MAX_NUMBER_OF_VIDEO_ALGORITHMS",
			  newintobject(CL_MAX_NUMBER_OF_VIDEO_ALGORITHMS));
	(void) dictinsert(d, "AUDIO", newintobject(CL_AUDIO));
	(void) dictinsert(d, "VIDEO", newintobject(CL_VIDEO));
	(void) dictinsert(d, "UNKNOWN_SCHEME",
			  newintobject(CL_UNKNOWN_SCHEME));
	(void) dictinsert(d, "UNCOMPRESSED_AUDIO",
			  newintobject(CL_UNCOMPRESSED_AUDIO));
	(void) dictinsert(d, "G711_ULAW", newintobject(CL_G711_ULAW));
	(void) dictinsert(d, "ULAW", newintobject(CL_ULAW));
	(void) dictinsert(d, "G711_ALAW", newintobject(CL_G711_ALAW));
	(void) dictinsert(d, "ALAW", newintobject(CL_ALAW));
	(void) dictinsert(d, "AWARE_MPEG_AUDIO",
			  newintobject(CL_AWARE_MPEG_AUDIO));
	(void) dictinsert(d, "AWARE_MULTIRATE",
			  newintobject(CL_AWARE_MULTIRATE));
	(void) dictinsert(d, "UNCOMPRESSED", newintobject(CL_UNCOMPRESSED));
	(void) dictinsert(d, "UNCOMPRESSED_VIDEO",
			  newintobject(CL_UNCOMPRESSED_VIDEO));
	(void) dictinsert(d, "RLE", newintobject(CL_RLE));
	(void) dictinsert(d, "JPEG", newintobject(CL_JPEG));
#ifdef IRIX_5_3_LIBRARY
	(void) dictinsert(d, "JPEG_SOFTWARE", newintobject(CL_JPEG_SOFTWARE));
#endif
	(void) dictinsert(d, "MPEG_VIDEO", newintobject(CL_MPEG_VIDEO));
	(void) dictinsert(d, "MVC1", newintobject(CL_MVC1));
	(void) dictinsert(d, "RTR", newintobject(CL_RTR));
	(void) dictinsert(d, "RTR1", newintobject(CL_RTR1));
	(void) dictinsert(d, "HDCC", newintobject(CL_HDCC));
	(void) dictinsert(d, "MVC2", newintobject(CL_MVC2));
	(void) dictinsert(d, "RLE24", newintobject(CL_RLE24));
	(void) dictinsert(d, "MAX_NUMBER_OF_PARAMS",
			  newintobject(CL_MAX_NUMBER_OF_PARAMS));
	(void) dictinsert(d, "IMAGE_WIDTH", newintobject(CL_IMAGE_WIDTH));
	(void) dictinsert(d, "IMAGE_HEIGHT", newintobject(CL_IMAGE_HEIGHT));
	(void) dictinsert(d, "ORIGINAL_FORMAT",
			  newintobject(CL_ORIGINAL_FORMAT));
	(void) dictinsert(d, "INTERNAL_FORMAT",
			  newintobject(CL_INTERNAL_FORMAT));
	(void) dictinsert(d, "COMPONENTS", newintobject(CL_COMPONENTS));
	(void) dictinsert(d, "BITS_PER_COMPONENT",
			  newintobject(CL_BITS_PER_COMPONENT));
	(void) dictinsert(d, "FRAME_RATE", newintobject(CL_FRAME_RATE));
	(void) dictinsert(d, "COMPRESSION_RATIO",
			  newintobject(CL_COMPRESSION_RATIO));
	(void) dictinsert(d, "EXACT_COMPRESSION_RATIO",
			  newintobject(CL_EXACT_COMPRESSION_RATIO));
	(void) dictinsert(d, "FRAME_BUFFER_SIZE",
			  newintobject(CL_FRAME_BUFFER_SIZE));
	(void) dictinsert(d, "COMPRESSED_BUFFER_SIZE",
			  newintobject(CL_COMPRESSED_BUFFER_SIZE));
	(void) dictinsert(d, "BLOCK_SIZE", newintobject(CL_BLOCK_SIZE));
	(void) dictinsert(d, "PREROLL", newintobject(CL_PREROLL));
	(void) dictinsert(d, "FRAME_TYPE", newintobject(CL_FRAME_TYPE));
	(void) dictinsert(d, "ALGORITHM_ID", newintobject(CL_ALGORITHM_ID));
	(void) dictinsert(d, "ALGORITHM_VERSION",
			  newintobject(CL_ALGORITHM_VERSION));
	(void) dictinsert(d, "ORIENTATION", newintobject(CL_ORIENTATION));
	(void) dictinsert(d, "NUMBER_OF_FRAMES",
			  newintobject(CL_NUMBER_OF_FRAMES));
	(void) dictinsert(d, "SPEED", newintobject(CL_SPEED));
	(void) dictinsert(d, "LAST_FRAME_INDEX",
			  newintobject(CL_LAST_FRAME_INDEX));
#ifdef IRIX_5_3_LIBRARY
	(void) dictinsert(d, "ENABLE_IMAGEINFO",
			  newintobject(CL_ENABLE_IMAGEINFO));
	(void) dictinsert(d, "INTERNAL_IMAGE_WIDTH",
			  newintobject(CL_INTERNAL_IMAGE_WIDTH));
	(void) dictinsert(d, "INTERNAL_IMAGE_HEIGHT",
			  newintobject(CL_INTERNAL_IMAGE_HEIGHT));
#endif
	(void) dictinsert(d, "NUMBER_OF_PARAMS",
			  newintobject(CL_NUMBER_OF_PARAMS));
#ifdef IRIX_5_3_LIBRARY
	(void) dictinsert(d, "MVC2_LUMA_THRESHOLD",
			  newintobject(CL_MVC2_LUMA_THRESHOLD));
	(void) dictinsert(d, "MVC2_CHROMA_THRESHOLD",
			  newintobject(CL_MVC2_CHROMA_THRESHOLD));
	(void) dictinsert(d, "MVC2_EDGE_THRESHOLD",
			  newintobject(CL_MVC2_EDGE_THRESHOLD));
	(void) dictinsert(d, "MVC2_BLENDING", newintobject(CL_MVC2_BLENDING));
	(void) dictinsert(d, "MVC2_BLENDING_OFF",
			  newintobject(CL_MVC2_BLENDING_OFF));
	(void) dictinsert(d, "MVC2_BLENDING_ON",
			  newintobject(CL_MVC2_BLENDING_ON));
	(void) dictinsert(d, "JPEG_QUALITY_FACTOR",
			  newintobject(CL_JPEG_QUALITY_FACTOR));
	(void) dictinsert(d, "JPEG_STREAM_HEADERS",
			  newintobject(CL_JPEG_STREAM_HEADERS));
	(void) dictinsert(d, "JPEG_QUANTIZATION_TABLES",
			  newintobject(CL_JPEG_QUANTIZATION_TABLES));
	(void) dictinsert(d, "JPEG_NUM_PARAMS",
			  newintobject(CL_JPEG_NUM_PARAMS));
	(void) dictinsert(d, "RTR_QUALITY_LEVEL",
			  newintobject(CL_RTR_QUALITY_LEVEL));
	(void) dictinsert(d, "HDCC_TILE_THRESHOLD",
			  newintobject(CL_HDCC_TILE_THRESHOLD));
	(void) dictinsert(d, "HDCC_SAMPLES_PER_TILE",
			  newintobject(CL_HDCC_SAMPLES_PER_TILE));
#endif
	(void) dictinsert(d, "END_OF_SEQUENCE",
			  newintobject(CL_END_OF_SEQUENCE));
	(void) dictinsert(d, "CHANNEL_POLICY",
			  newintobject(CL_CHANNEL_POLICY));
	(void) dictinsert(d, "NOISE_MARGIN", newintobject(CL_NOISE_MARGIN));
	(void) dictinsert(d, "BITRATE_POLICY",
			  newintobject(CL_BITRATE_POLICY));
	(void) dictinsert(d, "BITRATE_TARGET",
			  newintobject(CL_BITRATE_TARGET));
	(void) dictinsert(d, "LAYER", newintobject(CL_LAYER));
	(void) dictinsert(d, "ENUM_VALUE", newintobject(CL_ENUM_VALUE));
	(void) dictinsert(d, "RANGE_VALUE", newintobject(CL_RANGE_VALUE));
	(void) dictinsert(d, "FLOATING_ENUM_VALUE",
			  newintobject(CL_FLOATING_ENUM_VALUE));
	(void) dictinsert(d, "FLOATING_RANGE_VALUE",
			  newintobject(CL_FLOATING_RANGE_VALUE));
	(void) dictinsert(d, "DECOMPRESSOR", newintobject(CL_DECOMPRESSOR));
	(void) dictinsert(d, "COMPRESSOR", newintobject(CL_COMPRESSOR));
	(void) dictinsert(d, "CODEC", newintobject(CL_CODEC));
	(void) dictinsert(d, "NONE", newintobject(CL_NONE));
#ifdef IRIX_5_3_LIBRARY
	(void) dictinsert(d, "BUF_FRAME", newintobject(CL_BUF_FRAME));
	(void) dictinsert(d, "BUF_DATA", newintobject(CL_BUF_DATA));
#endif
#ifdef CL_FRAME
	(void) dictinsert(d, "FRAME", newintobject(CL_FRAME));
	(void) dictinsert(d, "DATA", newintobject(CL_DATA));
#endif
	(void) dictinsert(d, "NONE", newintobject(CL_NONE));
	(void) dictinsert(d, "KEYFRAME", newintobject(CL_KEYFRAME));
	(void) dictinsert(d, "INTRA", newintobject(CL_INTRA));
	(void) dictinsert(d, "PREDICTED", newintobject(CL_PREDICTED));
	(void) dictinsert(d, "BIDIRECTIONAL", newintobject(CL_BIDIRECTIONAL));
	(void) dictinsert(d, "TOP_DOWN", newintobject(CL_TOP_DOWN));
	(void) dictinsert(d, "BOTTOM_UP", newintobject(CL_BOTTOM_UP));
#ifdef IRIX_5_3_LIBRARY
	(void) dictinsert(d, "CONTINUOUS_BLOCK",
			  newintobject(CL_CONTINUOUS_BLOCK));
	(void) dictinsert(d, "CONTINUOUS_NONBLOCK",
			  newintobject(CL_CONTINUOUS_NONBLOCK));
	(void) dictinsert(d, "EXTERNAL_DEVICE",
			  newintobject((long)CL_EXTERNAL_DEVICE));
#endif
	(void) dictinsert(d, "AWCMP_STEREO", newintobject(AWCMP_STEREO));
	(void) dictinsert(d, "AWCMP_JOINT_STEREO",
			  newintobject(AWCMP_JOINT_STEREO));
	(void) dictinsert(d, "AWCMP_INDEPENDENT",
			  newintobject(AWCMP_INDEPENDENT));
	(void) dictinsert(d, "AWCMP_FIXED_RATE",
			  newintobject(AWCMP_FIXED_RATE));
	(void) dictinsert(d, "AWCMP_CONST_QUAL",
			  newintobject(AWCMP_CONST_QUAL));
	(void) dictinsert(d, "AWCMP_LOSSLESS", newintobject(AWCMP_LOSSLESS));
	(void) dictinsert(d, "AWCMP_MPEG_LAYER_I",
			  newintobject(AWCMP_MPEG_LAYER_I));
	(void) dictinsert(d, "AWCMP_MPEG_LAYER_II",
			  newintobject(AWCMP_MPEG_LAYER_II));
	(void) dictinsert(d, "HEADER_START_CODE",
			  newintobject(CL_HEADER_START_CODE));
	(void) dictinsert(d, "BAD_NO_BUFFERSPACE",
			  newintobject(CL_BAD_NO_BUFFERSPACE));
	(void) dictinsert(d, "BAD_PVBUFFER", newintobject(CL_BAD_PVBUFFER));
	(void) dictinsert(d, "BAD_BUFFERLENGTH_NEG",
			  newintobject(CL_BAD_BUFFERLENGTH_NEG));
	(void) dictinsert(d, "BAD_BUFFERLENGTH_ODD",
			  newintobject(CL_BAD_BUFFERLENGTH_ODD));
	(void) dictinsert(d, "BAD_PARAM", newintobject(CL_BAD_PARAM));
	(void) dictinsert(d, "BAD_COMPRESSION_SCHEME",
			  newintobject(CL_BAD_COMPRESSION_SCHEME));
	(void) dictinsert(d, "BAD_COMPRESSOR_HANDLE",
			  newintobject(CL_BAD_COMPRESSOR_HANDLE));
	(void) dictinsert(d, "BAD_COMPRESSOR_HANDLE_POINTER",
			  newintobject(CL_BAD_COMPRESSOR_HANDLE_POINTER));
	(void) dictinsert(d, "BAD_BUFFER_HANDLE",
			  newintobject(CL_BAD_BUFFER_HANDLE));
	(void) dictinsert(d, "BAD_BUFFER_QUERY_SIZE",
			  newintobject(CL_BAD_BUFFER_QUERY_SIZE));
	(void) dictinsert(d, "JPEG_ERROR", newintobject(CL_JPEG_ERROR));
	(void) dictinsert(d, "BAD_FRAME_SIZE",
			  newintobject(CL_BAD_FRAME_SIZE));
	(void) dictinsert(d, "PARAM_OUT_OF_RANGE",
			  newintobject(CL_PARAM_OUT_OF_RANGE));
	(void) dictinsert(d, "ADDED_ALGORITHM_ERROR",
			  newintobject(CL_ADDED_ALGORITHM_ERROR));
	(void) dictinsert(d, "BAD_ALGORITHM_TYPE",
			  newintobject(CL_BAD_ALGORITHM_TYPE));
	(void) dictinsert(d, "BAD_ALGORITHM_NAME",
			  newintobject(CL_BAD_ALGORITHM_NAME));
	(void) dictinsert(d, "BAD_BUFFERING", newintobject(CL_BAD_BUFFERING));
	(void) dictinsert(d, "BUFFER_NOT_CREATED",
			  newintobject(CL_BUFFER_NOT_CREATED));
	(void) dictinsert(d, "BAD_BUFFER_EXISTS",
			  newintobject(CL_BAD_BUFFER_EXISTS));
	(void) dictinsert(d, "BAD_INTERNAL_FORMAT",
			  newintobject(CL_BAD_INTERNAL_FORMAT));
	(void) dictinsert(d, "BAD_BUFFER_POINTER",
			  newintobject(CL_BAD_BUFFER_POINTER));
	(void) dictinsert(d, "FRAME_BUFFER_SIZE_ZERO",
			  newintobject(CL_FRAME_BUFFER_SIZE_ZERO));
	(void) dictinsert(d, "BAD_STREAM_HEADER",
			  newintobject(CL_BAD_STREAM_HEADER));
	(void) dictinsert(d, "BAD_LICENSE", newintobject(CL_BAD_LICENSE));
	(void) dictinsert(d, "AWARE_ERROR", newintobject(CL_AWARE_ERROR));
	(void) dictinsert(d, "BAD_BUFFER_SIZE_POINTER",
			  newintobject(CL_BAD_BUFFER_SIZE_POINTER));
	(void) dictinsert(d, "BAD_BUFFER_SIZE",
			  newintobject(CL_BAD_BUFFER_SIZE));
	(void) dictinsert(d, "BAD_BUFFER_TYPE",
			  newintobject(CL_BAD_BUFFER_TYPE));
	(void) dictinsert(d, "BAD_HEADER_SIZE",
			  newintobject(CL_BAD_HEADER_SIZE));
	(void) dictinsert(d, "BAD_FUNCTION_POINTER",
			  newintobject(CL_BAD_FUNCTION_POINTER));
	(void) dictinsert(d, "BAD_SCHEME_POINTER",
			  newintobject(CL_BAD_SCHEME_POINTER));
	(void) dictinsert(d, "BAD_STRING_POINTER",
			  newintobject(CL_BAD_STRING_POINTER));
	(void) dictinsert(d, "BAD_MIN_GT_MAX",
			  newintobject(CL_BAD_MIN_GT_MAX));
	(void) dictinsert(d, "BAD_INITIAL_VALUE",
			  newintobject(CL_BAD_INITIAL_VALUE));
	(void) dictinsert(d, "BAD_PARAM_ID_POINTER",
			  newintobject(CL_BAD_PARAM_ID_POINTER));
	(void) dictinsert(d, "BAD_PARAM_TYPE",
			  newintobject(CL_BAD_PARAM_TYPE));
	(void) dictinsert(d, "BAD_TEXT_STRING_PTR",
			  newintobject(CL_BAD_TEXT_STRING_PTR));
	(void) dictinsert(d, "BAD_FUNCTIONALITY",
			  newintobject(CL_BAD_FUNCTIONALITY));
	(void) dictinsert(d, "BAD_NUMBER_OF_BLOCKS",
			  newintobject(CL_BAD_NUMBER_OF_BLOCKS));
	(void) dictinsert(d, "BAD_BLOCK_SIZE",
			  newintobject(CL_BAD_BLOCK_SIZE));
	(void) dictinsert(d, "BAD_POINTER", newintobject(CL_BAD_POINTER));
	(void) dictinsert(d, "BAD_BOARD", newintobject(CL_BAD_BOARD));
	(void) dictinsert(d, "MVC2_ERROR", newintobject(CL_MVC2_ERROR));
#ifdef IRIX_5_3_LIBRARY
	(void) dictinsert(d, "NEXT_NOT_AVAILABLE",
			  newintobject(CL_NEXT_NOT_AVAILABLE));
	(void) dictinsert(d, "SCHEME_BUSY", newintobject(CL_SCHEME_BUSY));
	(void) dictinsert(d, "SCHEME_NOT_AVAILABLE",
			  newintobject(CL_SCHEME_NOT_AVAILABLE));
#endif
#ifdef CL_LUMA_THRESHOLD
	/* backward compatibility */
	(void) dictinsert(d, "LUMA_THRESHOLD",
			  newintobject(CL_LUMA_THRESHOLD));
	(void) dictinsert(d, "CHROMA_THRESHOLD",
			  newintobject(CL_CHROMA_THRESHOLD));
	(void) dictinsert(d, "EDGE_THRESHOLD",
			  newintobject(CL_EDGE_THRESHOLD));
	(void) dictinsert(d, "BLENDING", newintobject(CL_BLENDING));
	(void) dictinsert(d, "QUALITY_FACTOR",
			  newintobject(CL_QUALITY_FACTOR));
	(void) dictinsert(d, "STREAM_HEADERS",
			  newintobject(CL_STREAM_HEADERS));
	(void) dictinsert(d, "QUALITY_LEVEL", newintobject(CL_QUALITY_LEVEL));
	(void) dictinsert(d, "TILE_THRESHOLD",
			  newintobject(CL_TILE_THRESHOLD));
	(void) dictinsert(d, "SAMPLES_PER_TILE",
			  newintobject(CL_SAMPLES_PER_TILE));
#endif

	if (err_occurred())
		fatal("can't initialize module cl");

	(void) clSetErrorHandler(cl_ErrorHandler);
}
