]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
CL.py, clmodule.c: Adapted to new CL library. Lots of new methods.
authorSjoerd Mullender <sjoerd@acm.org>
Thu, 4 Feb 1993 16:43:28 +0000 (16:43 +0000)
committerSjoerd Mullender <sjoerd@acm.org>
Thu, 4 Feb 1993 16:43:28 +0000 (16:43 +0000)
aifc.py: Several small improvements.  Use new methods from CL module.

Lib/aifc.py
Lib/irix5/CL.py
Lib/plat-irix5/CL.py
Modules/clmodule.c

index 706bba8242516c79ec1c5124ff2e39244ccf902f..63849a1b0e133a636602c7798dccd07672fa067d 100644 (file)
@@ -356,6 +356,7 @@ class Aifc_read():
        # _ssnd_seek_needed -- 1 iff positioned correctly in audio
        #               file for readframes()
        # _ssnd_chunk -- instantiation of a chunk class for the SSND chunk
+       # _framesize -- size of one frame in the file
        def initfp(self, file):
                self._file = file
                self._version = 0
@@ -497,24 +498,15 @@ class Aifc_read():
                if self._ssnd_seek_needed:
                        self._ssnd_chunk.rewind()
                        dummy = self._ssnd_chunk.read(8)
-                       pos = self._soundpos * self._nchannels * self._sampwidth
-                       if self._decomp:
-                               if self._comptype in ('ULAW', 'ALAW'):
-                                       pos = pos / 2
+                       pos = self._soundpos * self._framesize
                        if pos:
                                self._ssnd_chunk.setpos(pos + 8)
                        self._ssnd_seek_needed = 0
                if nframes == 0:
                        return ''
-               size = nframes * self._nchannels * self._sampwidth
-               if self._decomp:
-                       if self._comptype in ('ULAW', 'ALAW'):
-                               size = size / 2
-               data = self._ssnd_chunk.read(size)
+               data = self._ssnd_chunk.read(nframes * self._framesize)
                if self._decomp and data:
-                       params = [CL.FRAME_BUFFER_SIZE, len(data) * 2, \
-                                 CL.COMPRESSED_BUFFER_SIZE, len(data)]
-                       self._decomp.SetParams(params)
+                       self._decomp.SetParam(CL.FRAME_BUFFER_SIZE, len(data) * 2)
                        data = self._decomp.Decompress(len(data) / self._nchannels, data)
                self._soundpos = self._soundpos + len(data) / (self._nchannels * self._sampwidth)
                return data
@@ -530,6 +522,7 @@ class Aifc_read():
                self._sampwidth = _convert1(sampwidth, _sampwidthlist)
                framerate = _read_float(chunk)
                self._framerate = _convert1(framerate, _frameratelist)
+               self._framesize = self._nchannels * self._sampwidth
                if self._aifc:
                        #DEBUG: SGI's soundeditor produces a bad size :-(
                        kludge = 0
@@ -555,8 +548,10 @@ class Aifc_read():
                                        raise Error, 'cannot read compressed AIFF-C files'
                                if self._comptype == 'ULAW':
                                        scheme = CL.G711_ULAW
+                                       self._framesize = self._framesize / 2
                                elif self._comptype == 'ALAW':
                                        scheme = CL.G711_ALAW
+                                       self._framesize = self._framesize / 2
                                else:
                                        raise Error, 'unsupported compression type'
                                self._decomp = cl.OpenDecompressor(scheme)
@@ -643,6 +638,7 @@ class Aifc_write():
        def setnchannels(self, nchannels):
                if self._nframeswritten:
                        raise Error, 'cannot change parameters after starting to write'
+               dummy = _convert(nchannels, _nchannelslist)
                self._nchannels = nchannels
 
        def getnchannels(self):
@@ -653,6 +649,7 @@ class Aifc_write():
        def setsampwidth(self, sampwidth):
                if self._nframeswritten:
                        raise Error, 'cannot change parameters after starting to write'
+               dummy = _convert2(sampwidth, _sampwidthlist)
                self._sampwidth = sampwidth
 
        def getsampwidth(self):
@@ -663,6 +660,7 @@ class Aifc_write():
        def setframerate(self, framerate):
                if self._nframeswritten:
                        raise Error, 'cannot change parameters after starting to write'
+               dummy = _convert2(framerate, _frameratelist)
                self._framerate = framerate
 
        def getframerate(self):
@@ -702,6 +700,9 @@ class Aifc_write():
                        raise Error, 'cannot change parameters after starting to write'
                if comptype not in ('NONE', 'ULAW', 'ALAW'):
                        raise Error, 'unsupported compression type'
+               dummy = _convert2(nchannels, _nchannelslist)
+               dummy = _convert2(sampwidth, _sampwidthlist)
+               dummy = _convert2(framerate, _frameratelist)
                self._nchannels = nchannels
                self._sampwidth = sampwidth
                self._framerate = framerate
@@ -755,9 +756,9 @@ class Aifc_write():
                        self._write_header(len(data))
                nframes = len(data) / (self._sampwidth * self._nchannels)
                if self._comp:
-                       params = [CL.FRAME_BUFFER_SIZE, len(data), \
-                                 CL.COMPRESSED_BUFFER_SIZE, len(data)]
-                       self._comp.SetParams(params)
+                       self._comp.SetParam(CL.FRAME_BUFFER_SIZE, len(data))
+                       self._comp.SetParam(CL.COMPRESSED_BUFFER_SIZE, \
+                                 len(data))
                        data = self._comp.Compress(nframes, data)
                self._file.write(data)
                self._nframeswritten = self._nframeswritten + nframes
@@ -803,7 +804,9 @@ class Aifc_write():
                        self._comp = cl.OpenCompressor(scheme)
                        params = [CL.ORIGINAL_FORMAT, 0, \
                                  CL.BITS_PER_COMPONENT, 0, \
-                                 CL.FRAME_RATE, self._framerate]
+                                 CL.FRAME_RATE, self._framerate, \
+                                 CL.FRAME_BUFFER_SIZE, 100, \
+                                 CL.COMPRESSED_BUFFER_SIZE, 100]
                        if self._nchannels == AL.MONO:
                                params[1] = CL.MONO
                        else:
@@ -815,6 +818,8 @@ class Aifc_write():
                        else:
                                params[3] = 24
                        self._comp.SetParams(params)
+                       # the compressor produces a header which we ignore
+                       dummy = self._comp.Compress(0, '')
                self._file.write('FORM')
                if not self._nframes:
                        self._nframes = initlength / (self._nchannels * self._sampwidth)
@@ -836,7 +841,7 @@ class Aifc_write():
                        self._file.write('AIFF')
                self._file.write('COMM')
                _write_long(self._file, commlength)
-               _write_short(self._file, self._nchannels)
+               _write_short(self._file, _convert2(self._nchannels, _nchannelslist))
                self._nframes_pos = self._file.tell()
                _write_long(self._file, self._nframes)
                _write_short(self._file, _convert2(self._sampwidth, _sampwidthlist))
index c64f0887bfda02a802993972ce8bfd6e20dab5d1..41c56e0cca73459dbe1b8d19fc590ff6162c0243 100755 (executable)
@@ -1,17 +1,18 @@
 #
 # cl.h - Compression Library typedefs and prototypes
 #
+#   01/07/92   Cleanup by Brian Knittel
 #   02/18/92   Original Version by Brian Knittel
 #
 
 #
 # originalFormat parameter values
 #
-MAX_NUMBER_OF_ORIGINAL_FORMATS = (32)
+MAX_NUMBER_OF_ORIGINAL_FORMATS = 32
 
 # Audio
-MONO = (0)
-STEREO_INTERLEAVED = (1)
+MONO = 0
+STEREO_INTERLEAVED = 1
 
 # Video 
 # YUV is defined to be the same thing as YCrCb (luma and two chroma components).
@@ -21,152 +22,215 @@ STEREO_INTERLEAVED = (1)
 #      vertically in addition to horizontally, and is packed the same as 
 #      422 except that U & V are not valid on the second line.
 #
-RGB = (0)
-RGBX = (1)
-RGBA = (2)
-RGB332 = (3)
+RGB = 0
+RGBX = 1
+RGBA = 2
+RGB332 = 3
+
+GRAYSCALE = 4
+Y = 4
+YUV = 5        
+YCbCr = 5      
+YUV422 = 6                             # 4:2:2 sampling
+YCbCr422 = 6                           # 4:2:2 sampling
+YUV422HC = 7                           # 4:1:1 sampling
+YCbCr422HC = 7                         # 4:1:1 sampling
+YUV422DC = 7                           # 4:1:1 sampling
+YCbCr422DC = 7                         # 4:1:1 sampling
+
+BEST_FIT = -1  
+
+def BytesPerSample(s):
+       if s in (MONO, YUV):
+               return 2
+       elif s == STEREO_INTERLEAVED:
+               return 4
+       else:
+               return 0
+
+def BytesPerPixel(f):
+       if f in (RGB, YUV):
+               return 3
+       elif f in (RGBX, RGBA):
+               return 4
+       elif f in (RGB332, GRAYSCALE):
+               return 1
+       else:
+               return 2
+
+def AudioFormatName(f):
+       if f == MONO:
+               return 'MONO'
+       elif f == STEREO_INTERLEAVED:
+               return 'STEREO_INTERLEAVED'
+       else:
+               return 'Not a valid format'
+
+def VideoFormatName(f):
+       if f == RGB:
+               return 'RGB'
+       elif f == RGBX:
+               return 'RGBX'
+       elif f == RGBA:
+               return 'RGBA'
+       elif f == RGB332:
+               return 'RGB332'
+       elif f == GRAYSCALE:
+               return 'GRAYSCALE'
+       elif f == YUV:
+               return 'YUV'
+       elif f == YUV422:
+               return 'YUV422'
+       elif f == YUV422DC:
+               return 'YUV422DC'
+       else:
+               return 'Not a valid format'
+
+MAX_NUMBER_OF_AUDIO_ALGORITHMS = 32
+MAX_NUMBER_OF_VIDEO_ALGORITHMS = 32
 
-GRAYSCALE = (4)
-Y = (4)
-YUV = (5)      
-YCbCr = (5)    
-YUV422 = (6)   # 4:2:2 sampling
-YCbCr422 = (6) # 4:2:2 sampling
-YUV422HC = (7) # 4:1:1 sampling
-YCbCr422HC = (7)       # 4:1:1 sampling
+#
+# Algorithm types
+#
+AUDIO = 0
+VIDEO = 1
 
-MAX_NUMBER_OF_AUDIO_ALGORITHMS = (32)
-MAX_NUMBER_OF_VIDEO_ALGORITHMS = (32)
+def AlgorithmNumber(scheme):
+       return scheme & 0x7fff
+def AlgorithmType(scheme):
+       return (scheme >> 15) & 1
+def Algorithm(type, n):
+       return n | ((type & 1) << 15)
 
 #
 # "compressionScheme" argument values
 #
-UNCOMPRESSED_AUDIO = (0)
-G711_ULAW = (1)
-ULAW = (1)
-G711_ALAW = (2)
-ALAW = (2)
-G722 = (3)
+UNKNOWN_SCHEME = -1
+
+UNCOMPRESSED_AUDIO = Algorithm(AUDIO, 0)
+G711_ULAW = Algorithm(AUDIO, 1)
+ULAW = Algorithm(AUDIO, 1)
+G711_ALAW = Algorithm(AUDIO, 2)
+ALAW = Algorithm(AUDIO, 2)
+AWARE_MPEG_AUDIO = Algorithm(AUDIO, 3)
+AWARE_MULTIRATE = Algorithm(AUDIO, 4)
     
-UNCOMPRESSED = (MAX_NUMBER_OF_AUDIO_ALGORITHMS + 0)
-UNCOMPRESSED_VIDEO = (MAX_NUMBER_OF_AUDIO_ALGORITHMS + 0)
-RLE = (MAX_NUMBER_OF_AUDIO_ALGORITHMS + 1)
-JPEG = (MAX_NUMBER_OF_AUDIO_ALGORITHMS + 2)
-MPEG_VIDEO = (MAX_NUMBER_OF_AUDIO_ALGORITHMS + 3)
-MVC1 = (MAX_NUMBER_OF_AUDIO_ALGORITHMS + 4)
-RTR = (MAX_NUMBER_OF_AUDIO_ALGORITHMS + 5)
-RTR1 = (MAX_NUMBER_OF_AUDIO_ALGORITHMS + 5)
+UNCOMPRESSED = Algorithm(VIDEO, 0)
+UNCOMPRESSED_VIDEO = Algorithm(VIDEO, 0)
+RLE = Algorithm(VIDEO, 1)
+JPEG = Algorithm(VIDEO, 2)
+MPEG_VIDEO = Algorithm(VIDEO, 3)
+MVC1 = Algorithm(VIDEO, 4)
+RTR = Algorithm(VIDEO, 5)
+RTR1 = Algorithm(VIDEO, 5)
 
 #
 # Parameters
 #
-MAX_NUMBER_OF_PARAMS = (256)
+MAX_NUMBER_OF_PARAMS = 256
 # Default Parameters
-IMAGE_WIDTH = (0)
-IMAGE_HEIGHT = (1) 
-ORIGINAL_FORMAT = (2)
-INTERNAL_FORMAT = (3)
-COMPONENTS = (4)
-BITS_PER_COMPONENT = (5)
-FRAME_RATE = (6)
-COMPRESSION_RATIO = (7)
-EXACT_COMPRESSION_RATIO = (8)
-FRAME_BUFFER_SIZE = (9) 
-COMPRESSED_BUFFER_SIZE = (10)
-BLOCK_SIZE = (11)
-PREROLL = (12)
-UNIQUE = (13)
-FRAME_TYPE = (14)
-OVERWRITE_MODE = (15)
-NUMBER_OF_PARAMS = (16)
+IMAGE_WIDTH = 0
+IMAGE_HEIGHT = 1 
+ORIGINAL_FORMAT = 2
+INTERNAL_FORMAT = 3
+COMPONENTS = 4
+BITS_PER_COMPONENT = 5
+FRAME_RATE = 6
+COMPRESSION_RATIO = 7
+EXACT_COMPRESSION_RATIO = 8
+FRAME_BUFFER_SIZE = 9 
+COMPRESSED_BUFFER_SIZE = 10
+BLOCK_SIZE = 11
+PREROLL = 12
+FRAME_TYPE = 13
+ALGORITHM_ID = 14
+ALGORITHM_VERSION = 15
+ORIENTATION = 16
+NUMBER_OF_FRAMES = 17
+SPEED = 18
+LAST_FRAME_INDEX = 19
+NUMBER_OF_PARAMS = 20
 
 # JPEG Specific Parameters
-QUALITY_FACTOR = (NUMBER_OF_PARAMS + 0)
+QUALITY_FACTOR = NUMBER_OF_PARAMS + 0
 
 # MPEG Specific Parameters
-SPEED = (NUMBER_OF_PARAMS + 0)
-ACTUAL_FRAME_INDEX = (NUMBER_OF_PARAMS + 1)
+END_OF_SEQUENCE = NUMBER_OF_PARAMS + 0
 
 # RTR Specific Parameters
-QUALITY_LEVEL = (NUMBER_OF_PARAMS + 0)
-
-# #define      clTypeIsFloat(v)        (*(float *)&(v))
-# #define      clTypeIsLong(v)         (*(long *)&(v))
-# 
-# RATIO_1 = (65536.0)
-# #define clFloatToRatio(f)    ((long)((float)(f) * RATIO_1))
-# #define clRatioToFloat(f)    ((float)(f) / RATIO_1)
-# RATIO_SHIFT = (16)
-# #define clRatioMul(m, r)     ((m) * (r))
-# #define clRatioToLong(r)     ((r) >> RATIO_SHIFT)
-# #define clLongToRatio(r)     ((r) << RATIO_SHIFT)
+QUALITY_LEVEL = NUMBER_OF_PARAMS + 0
+ZOOM_X = NUMBER_OF_PARAMS + 1
+ZOOM_Y = NUMBER_OF_PARAMS + 2
 
 #
 # Parameter value types
 #
-ENUM_VALUE = (0) # only certain constant values are valid
-RANGE_VALUE = (1) # any value in a given range is valid
-FLOATING_ENUM_VALUE = (2) # only certain constant floating point values are valid
-FLOATING_RANGE_VALUE = (3) # any value in a given floating point range is valid
-POINTER = (4) # any legal pointer is valid
+ENUM_VALUE = 0                         # only certain constant values are valid
+RANGE_VALUE = 1                                # any value in a given range is valid
+FLOATING_ENUM_VALUE = 2                        # only certain constant floating point values are valid
+FLOATING_RANGE_VALUE = 3               # any value in a given floating point range is valid
 
 #
-# Algorithm types
+# Algorithm Functionality
 #
-AUDIO = (0)
-VIDEO = (1)
+DECOMPRESSOR = 1
+COMPRESSOR = 2
+CODEC = 3
 
 #
-# Algorithm Functionality
+# Buffer types
 #
-DECOMPRESSOR = (1)
-COMPRESSOR = (2)
-CODEC = (3)
+NONE = 0
+FRAME = 1
+DATA = 2
 
 #
-# Buffer types
+# Frame types
+#
+NONE = 0
+KEYFRAME = 1
+INTRA = 1
+PREDICTED = 2
+BIDIRECTIONAL = 3
+
+#
+# Orientations
 #
-NONE = (0)
-FRAME = (1)
-DATA = (2)
+TOP_DOWN = 0
+BOTTOM_UP = 1
+
+#
+# SGI Proprietaty Algorithm Header Start Code
+#
+HEADER_START_CODE = 0xc1C0DEC
 
 #
 # error codes
 #
-BAD_NOT_IMPLEMENTED = ( -1) # not impimented yet
-BAD_NO_BUFFERSPACE = ( -2) # no space for internal buffers
-BAD_BUFFER_NULL = ( -3) # null buffer pointer
-BAD_COUNT_NEG = ( -4) # negative count
-BAD_PVBUFFER = ( -5) # param/val buffer doesn't make sense
-BAD_BUFFERLENGTH_NEG = ( -6) # negative buffer length
-BAD_BUFFERLENGTH_ODD = ( -7) # odd length parameter/value buffer
-BAD_PARAM = ( -8) # invalid parameter
-BAD_COMPRESSION_SCHEME = ( -9) # compression scheme parameter invalid
-BAD_COMPRESSOR_HANDLE = (-10) # compression handle parameter invalid
-BAD_COMPRESSOR_HANDLE_POINTER = (-11) # compression handle pointer invalid
-BAD_BUFFER_HANDLE = (-12) # callback function invalid
-BAD_ALGORITHM_INFO = (-13) # algorithm info invalid
-BAD_CL_BAD_WIDTH_OR_HEIGHT = (-14) # compressor width or height invalid
-BAD_POINTER_FROM_CALLBACK_FUNCTION = (-15) # pointer from callback invalid
-JPEG_ERROR = (-16) # error from libjpeg
-NO_SEMAPHORE = (-17) # could not get semaphore
-BAD_WIDTH_OR_HEIGHT = (-18) # width or height invalid
-BAD_FRAME_COUNT = (-19) # frame count invalid
-BAD_FRAME_INDEX = (-20) # frame index invalid
-BAD_FRAME_BUFFER = (-21) # frame buffer pointer invalid
-BAD_FRAME_SIZE = (-22) # frame size invalid
-BAD_DATA_BUFFER = (-23) # data buffer pointer invalid
-BAD_DATA_SIZE = (-24) # data buffer size invalid
-BAD_TOTAL_NUMBER_OF_FRAMES = (-25) # total number of frames invalid
-BAD_IMAGE_FORMAT = (-26) # image format invalid
-BAD_BITS_PER_COMPONENT = (-27) # bits per component invalid
-BAD_FRAME_RATE = (-28) # frame rate invalid
-BAD_INSUFFICIENT_DATA_FROM_CALLBACK_FUNCTION = (-29) # insufficient data from callback invalid
-PARAM_OUT_OF_RANGE = (-30) # parameter out of range
-ADDED_ALGORITHM_ERROR = (-31) # added algorithm had a unique error
-BAD_ALGORITHM_TYPE = (-32) # bad algorithm type
-BAD_ALGORITHM_NAME = (-33) # bad algorithm name
-BAD_FRAME_INDEXING = (-34) # bad frame indexing
-BAD_BUFFERING = (-35) # bad buffering calls
-BUFFER_NOT_CREATED = (-36) # buffer not created
-BAD_BUFFER_EXISTS = (-37) # buffer already created
+
+BAD_NO_BUFFERSPACE =  -2               # no space for internal buffers
+BAD_PVBUFFER =  -3                     # param/val buffer doesn't make sense
+BAD_BUFFERLENGTH_NEG =  -4             # negative buffer length
+BAD_BUFFERLENGTH_ODD =  -5             # odd length parameter/value buffer
+BAD_PARAM =  -6                                # invalid parameter
+BAD_COMPRESSION_SCHEME =  -7           # compression scheme parameter invalid
+BAD_COMPRESSOR_HANDLE =  -8            # compression handle parameter invalid
+BAD_COMPRESSOR_HANDLE_POINTER = -9     # compression handle pointer invalid
+BAD_BUFFER_HANDLE = -10                        # buffer handle invalid
+BAD_BUFFER_QUERY_SIZE = -11            # buffer query size too large
+JPEG_ERROR = -12                       # error from libjpeg
+BAD_FRAME_SIZE = -13                   # frame size invalid
+PARAM_OUT_OF_RANGE = -14               # parameter out of range
+ADDED_ALGORITHM_ERROR = -15            # added algorithm had a unique error
+BAD_ALGORITHM_TYPE = -16               # bad algorithm type
+BAD_ALGORITHM_NAME = -17               # bad algorithm name
+BAD_BUFFERING = -18                    # bad buffering calls
+BUFFER_NOT_CREATED = -19               # buffer not created
+BAD_BUFFER_EXISTS = -20                        # buffer already created
+BAD_INTERNAL_FORMAT = -21              # invalid internal format
+BAD_BUFFER_POINTER = -22               # invalid buffer pointer
+FRAME_BUFFER_SIZE_ZERO = -23           # frame buffer has zero size
+BAD_STREAM_HEADER = -24                        # invalid stream header
+
+BAD_LICENSE = -25                      # netls license not valid
+AWARE_ERROR = -26                      # error from libawcmp
index c64f0887bfda02a802993972ce8bfd6e20dab5d1..41c56e0cca73459dbe1b8d19fc590ff6162c0243 100755 (executable)
@@ -1,17 +1,18 @@
 #
 # cl.h - Compression Library typedefs and prototypes
 #
+#   01/07/92   Cleanup by Brian Knittel
 #   02/18/92   Original Version by Brian Knittel
 #
 
 #
 # originalFormat parameter values
 #
-MAX_NUMBER_OF_ORIGINAL_FORMATS = (32)
+MAX_NUMBER_OF_ORIGINAL_FORMATS = 32
 
 # Audio
-MONO = (0)
-STEREO_INTERLEAVED = (1)
+MONO = 0
+STEREO_INTERLEAVED = 1
 
 # Video 
 # YUV is defined to be the same thing as YCrCb (luma and two chroma components).
@@ -21,152 +22,215 @@ STEREO_INTERLEAVED = (1)
 #      vertically in addition to horizontally, and is packed the same as 
 #      422 except that U & V are not valid on the second line.
 #
-RGB = (0)
-RGBX = (1)
-RGBA = (2)
-RGB332 = (3)
+RGB = 0
+RGBX = 1
+RGBA = 2
+RGB332 = 3
+
+GRAYSCALE = 4
+Y = 4
+YUV = 5        
+YCbCr = 5      
+YUV422 = 6                             # 4:2:2 sampling
+YCbCr422 = 6                           # 4:2:2 sampling
+YUV422HC = 7                           # 4:1:1 sampling
+YCbCr422HC = 7                         # 4:1:1 sampling
+YUV422DC = 7                           # 4:1:1 sampling
+YCbCr422DC = 7                         # 4:1:1 sampling
+
+BEST_FIT = -1  
+
+def BytesPerSample(s):
+       if s in (MONO, YUV):
+               return 2
+       elif s == STEREO_INTERLEAVED:
+               return 4
+       else:
+               return 0
+
+def BytesPerPixel(f):
+       if f in (RGB, YUV):
+               return 3
+       elif f in (RGBX, RGBA):
+               return 4
+       elif f in (RGB332, GRAYSCALE):
+               return 1
+       else:
+               return 2
+
+def AudioFormatName(f):
+       if f == MONO:
+               return 'MONO'
+       elif f == STEREO_INTERLEAVED:
+               return 'STEREO_INTERLEAVED'
+       else:
+               return 'Not a valid format'
+
+def VideoFormatName(f):
+       if f == RGB:
+               return 'RGB'
+       elif f == RGBX:
+               return 'RGBX'
+       elif f == RGBA:
+               return 'RGBA'
+       elif f == RGB332:
+               return 'RGB332'
+       elif f == GRAYSCALE:
+               return 'GRAYSCALE'
+       elif f == YUV:
+               return 'YUV'
+       elif f == YUV422:
+               return 'YUV422'
+       elif f == YUV422DC:
+               return 'YUV422DC'
+       else:
+               return 'Not a valid format'
+
+MAX_NUMBER_OF_AUDIO_ALGORITHMS = 32
+MAX_NUMBER_OF_VIDEO_ALGORITHMS = 32
 
-GRAYSCALE = (4)
-Y = (4)
-YUV = (5)      
-YCbCr = (5)    
-YUV422 = (6)   # 4:2:2 sampling
-YCbCr422 = (6) # 4:2:2 sampling
-YUV422HC = (7) # 4:1:1 sampling
-YCbCr422HC = (7)       # 4:1:1 sampling
+#
+# Algorithm types
+#
+AUDIO = 0
+VIDEO = 1
 
-MAX_NUMBER_OF_AUDIO_ALGORITHMS = (32)
-MAX_NUMBER_OF_VIDEO_ALGORITHMS = (32)
+def AlgorithmNumber(scheme):
+       return scheme & 0x7fff
+def AlgorithmType(scheme):
+       return (scheme >> 15) & 1
+def Algorithm(type, n):
+       return n | ((type & 1) << 15)
 
 #
 # "compressionScheme" argument values
 #
-UNCOMPRESSED_AUDIO = (0)
-G711_ULAW = (1)
-ULAW = (1)
-G711_ALAW = (2)
-ALAW = (2)
-G722 = (3)
+UNKNOWN_SCHEME = -1
+
+UNCOMPRESSED_AUDIO = Algorithm(AUDIO, 0)
+G711_ULAW = Algorithm(AUDIO, 1)
+ULAW = Algorithm(AUDIO, 1)
+G711_ALAW = Algorithm(AUDIO, 2)
+ALAW = Algorithm(AUDIO, 2)
+AWARE_MPEG_AUDIO = Algorithm(AUDIO, 3)
+AWARE_MULTIRATE = Algorithm(AUDIO, 4)
     
-UNCOMPRESSED = (MAX_NUMBER_OF_AUDIO_ALGORITHMS + 0)
-UNCOMPRESSED_VIDEO = (MAX_NUMBER_OF_AUDIO_ALGORITHMS + 0)
-RLE = (MAX_NUMBER_OF_AUDIO_ALGORITHMS + 1)
-JPEG = (MAX_NUMBER_OF_AUDIO_ALGORITHMS + 2)
-MPEG_VIDEO = (MAX_NUMBER_OF_AUDIO_ALGORITHMS + 3)
-MVC1 = (MAX_NUMBER_OF_AUDIO_ALGORITHMS + 4)
-RTR = (MAX_NUMBER_OF_AUDIO_ALGORITHMS + 5)
-RTR1 = (MAX_NUMBER_OF_AUDIO_ALGORITHMS + 5)
+UNCOMPRESSED = Algorithm(VIDEO, 0)
+UNCOMPRESSED_VIDEO = Algorithm(VIDEO, 0)
+RLE = Algorithm(VIDEO, 1)
+JPEG = Algorithm(VIDEO, 2)
+MPEG_VIDEO = Algorithm(VIDEO, 3)
+MVC1 = Algorithm(VIDEO, 4)
+RTR = Algorithm(VIDEO, 5)
+RTR1 = Algorithm(VIDEO, 5)
 
 #
 # Parameters
 #
-MAX_NUMBER_OF_PARAMS = (256)
+MAX_NUMBER_OF_PARAMS = 256
 # Default Parameters
-IMAGE_WIDTH = (0)
-IMAGE_HEIGHT = (1) 
-ORIGINAL_FORMAT = (2)
-INTERNAL_FORMAT = (3)
-COMPONENTS = (4)
-BITS_PER_COMPONENT = (5)
-FRAME_RATE = (6)
-COMPRESSION_RATIO = (7)
-EXACT_COMPRESSION_RATIO = (8)
-FRAME_BUFFER_SIZE = (9) 
-COMPRESSED_BUFFER_SIZE = (10)
-BLOCK_SIZE = (11)
-PREROLL = (12)
-UNIQUE = (13)
-FRAME_TYPE = (14)
-OVERWRITE_MODE = (15)
-NUMBER_OF_PARAMS = (16)
+IMAGE_WIDTH = 0
+IMAGE_HEIGHT = 1 
+ORIGINAL_FORMAT = 2
+INTERNAL_FORMAT = 3
+COMPONENTS = 4
+BITS_PER_COMPONENT = 5
+FRAME_RATE = 6
+COMPRESSION_RATIO = 7
+EXACT_COMPRESSION_RATIO = 8
+FRAME_BUFFER_SIZE = 9 
+COMPRESSED_BUFFER_SIZE = 10
+BLOCK_SIZE = 11
+PREROLL = 12
+FRAME_TYPE = 13
+ALGORITHM_ID = 14
+ALGORITHM_VERSION = 15
+ORIENTATION = 16
+NUMBER_OF_FRAMES = 17
+SPEED = 18
+LAST_FRAME_INDEX = 19
+NUMBER_OF_PARAMS = 20
 
 # JPEG Specific Parameters
-QUALITY_FACTOR = (NUMBER_OF_PARAMS + 0)
+QUALITY_FACTOR = NUMBER_OF_PARAMS + 0
 
 # MPEG Specific Parameters
-SPEED = (NUMBER_OF_PARAMS + 0)
-ACTUAL_FRAME_INDEX = (NUMBER_OF_PARAMS + 1)
+END_OF_SEQUENCE = NUMBER_OF_PARAMS + 0
 
 # RTR Specific Parameters
-QUALITY_LEVEL = (NUMBER_OF_PARAMS + 0)
-
-# #define      clTypeIsFloat(v)        (*(float *)&(v))
-# #define      clTypeIsLong(v)         (*(long *)&(v))
-# 
-# RATIO_1 = (65536.0)
-# #define clFloatToRatio(f)    ((long)((float)(f) * RATIO_1))
-# #define clRatioToFloat(f)    ((float)(f) / RATIO_1)
-# RATIO_SHIFT = (16)
-# #define clRatioMul(m, r)     ((m) * (r))
-# #define clRatioToLong(r)     ((r) >> RATIO_SHIFT)
-# #define clLongToRatio(r)     ((r) << RATIO_SHIFT)
+QUALITY_LEVEL = NUMBER_OF_PARAMS + 0
+ZOOM_X = NUMBER_OF_PARAMS + 1
+ZOOM_Y = NUMBER_OF_PARAMS + 2
 
 #
 # Parameter value types
 #
-ENUM_VALUE = (0) # only certain constant values are valid
-RANGE_VALUE = (1) # any value in a given range is valid
-FLOATING_ENUM_VALUE = (2) # only certain constant floating point values are valid
-FLOATING_RANGE_VALUE = (3) # any value in a given floating point range is valid
-POINTER = (4) # any legal pointer is valid
+ENUM_VALUE = 0                         # only certain constant values are valid
+RANGE_VALUE = 1                                # any value in a given range is valid
+FLOATING_ENUM_VALUE = 2                        # only certain constant floating point values are valid
+FLOATING_RANGE_VALUE = 3               # any value in a given floating point range is valid
 
 #
-# Algorithm types
+# Algorithm Functionality
 #
-AUDIO = (0)
-VIDEO = (1)
+DECOMPRESSOR = 1
+COMPRESSOR = 2
+CODEC = 3
 
 #
-# Algorithm Functionality
+# Buffer types
 #
-DECOMPRESSOR = (1)
-COMPRESSOR = (2)
-CODEC = (3)
+NONE = 0
+FRAME = 1
+DATA = 2
 
 #
-# Buffer types
+# Frame types
+#
+NONE = 0
+KEYFRAME = 1
+INTRA = 1
+PREDICTED = 2
+BIDIRECTIONAL = 3
+
+#
+# Orientations
 #
-NONE = (0)
-FRAME = (1)
-DATA = (2)
+TOP_DOWN = 0
+BOTTOM_UP = 1
+
+#
+# SGI Proprietaty Algorithm Header Start Code
+#
+HEADER_START_CODE = 0xc1C0DEC
 
 #
 # error codes
 #
-BAD_NOT_IMPLEMENTED = ( -1) # not impimented yet
-BAD_NO_BUFFERSPACE = ( -2) # no space for internal buffers
-BAD_BUFFER_NULL = ( -3) # null buffer pointer
-BAD_COUNT_NEG = ( -4) # negative count
-BAD_PVBUFFER = ( -5) # param/val buffer doesn't make sense
-BAD_BUFFERLENGTH_NEG = ( -6) # negative buffer length
-BAD_BUFFERLENGTH_ODD = ( -7) # odd length parameter/value buffer
-BAD_PARAM = ( -8) # invalid parameter
-BAD_COMPRESSION_SCHEME = ( -9) # compression scheme parameter invalid
-BAD_COMPRESSOR_HANDLE = (-10) # compression handle parameter invalid
-BAD_COMPRESSOR_HANDLE_POINTER = (-11) # compression handle pointer invalid
-BAD_BUFFER_HANDLE = (-12) # callback function invalid
-BAD_ALGORITHM_INFO = (-13) # algorithm info invalid
-BAD_CL_BAD_WIDTH_OR_HEIGHT = (-14) # compressor width or height invalid
-BAD_POINTER_FROM_CALLBACK_FUNCTION = (-15) # pointer from callback invalid
-JPEG_ERROR = (-16) # error from libjpeg
-NO_SEMAPHORE = (-17) # could not get semaphore
-BAD_WIDTH_OR_HEIGHT = (-18) # width or height invalid
-BAD_FRAME_COUNT = (-19) # frame count invalid
-BAD_FRAME_INDEX = (-20) # frame index invalid
-BAD_FRAME_BUFFER = (-21) # frame buffer pointer invalid
-BAD_FRAME_SIZE = (-22) # frame size invalid
-BAD_DATA_BUFFER = (-23) # data buffer pointer invalid
-BAD_DATA_SIZE = (-24) # data buffer size invalid
-BAD_TOTAL_NUMBER_OF_FRAMES = (-25) # total number of frames invalid
-BAD_IMAGE_FORMAT = (-26) # image format invalid
-BAD_BITS_PER_COMPONENT = (-27) # bits per component invalid
-BAD_FRAME_RATE = (-28) # frame rate invalid
-BAD_INSUFFICIENT_DATA_FROM_CALLBACK_FUNCTION = (-29) # insufficient data from callback invalid
-PARAM_OUT_OF_RANGE = (-30) # parameter out of range
-ADDED_ALGORITHM_ERROR = (-31) # added algorithm had a unique error
-BAD_ALGORITHM_TYPE = (-32) # bad algorithm type
-BAD_ALGORITHM_NAME = (-33) # bad algorithm name
-BAD_FRAME_INDEXING = (-34) # bad frame indexing
-BAD_BUFFERING = (-35) # bad buffering calls
-BUFFER_NOT_CREATED = (-36) # buffer not created
-BAD_BUFFER_EXISTS = (-37) # buffer already created
+
+BAD_NO_BUFFERSPACE =  -2               # no space for internal buffers
+BAD_PVBUFFER =  -3                     # param/val buffer doesn't make sense
+BAD_BUFFERLENGTH_NEG =  -4             # negative buffer length
+BAD_BUFFERLENGTH_ODD =  -5             # odd length parameter/value buffer
+BAD_PARAM =  -6                                # invalid parameter
+BAD_COMPRESSION_SCHEME =  -7           # compression scheme parameter invalid
+BAD_COMPRESSOR_HANDLE =  -8            # compression handle parameter invalid
+BAD_COMPRESSOR_HANDLE_POINTER = -9     # compression handle pointer invalid
+BAD_BUFFER_HANDLE = -10                        # buffer handle invalid
+BAD_BUFFER_QUERY_SIZE = -11            # buffer query size too large
+JPEG_ERROR = -12                       # error from libjpeg
+BAD_FRAME_SIZE = -13                   # frame size invalid
+PARAM_OUT_OF_RANGE = -14               # parameter out of range
+ADDED_ALGORITHM_ERROR = -15            # added algorithm had a unique error
+BAD_ALGORITHM_TYPE = -16               # bad algorithm type
+BAD_ALGORITHM_NAME = -17               # bad algorithm name
+BAD_BUFFERING = -18                    # bad buffering calls
+BUFFER_NOT_CREATED = -19               # buffer not created
+BAD_BUFFER_EXISTS = -20                        # buffer already created
+BAD_INTERNAL_FORMAT = -21              # invalid internal format
+BAD_BUFFER_POINTER = -22               # invalid buffer pointer
+FRAME_BUFFER_SIZE_ZERO = -23           # frame buffer has zero size
+BAD_STREAM_HEADER = -24                        # invalid stream header
+
+BAD_LICENSE = -25                      # netls license not valid
+AWARE_ERROR = -26                      # error from libawcmp
index 7a27a8852af4d72e17deacda9d62ff62a9043253..0aeb29632f77e5ce1d980a7b353e361ac9a16890 100644 (file)
@@ -45,7 +45,7 @@ static int error_handler_called = 0;
                          Utility routines.
 ********************************************************************/
 static void
-cl_ErrorHandler(long errnum, const char *fmt, ...)
+cl_ErrorHandler(CL_Handle handle, int code, const char *fmt, ...)
 {
        va_list ap;
        char errbuf[BUFSIZ];    /* hopefully big enough */
@@ -68,10 +68,10 @@ cl_ErrorHandler(long errnum, const char *fmt, ...)
  * This is not very efficient.
  */
 static int
-param_type_is_float(CL_Handle comp, long param)
+param_type_is_float(CL_Handle comp, int param)
 {
-       long bufferlength;
-       long *PVbuffer;
+       int bufferlength;
+       int *PVbuffer;
        int ret;
 
        error_handler_called = 0;
@@ -82,7 +82,7 @@ param_type_is_float(CL_Handle comp, long param)
        if (param < 0 || param >= bufferlength / 2)
                return -1;
 
-       PVbuffer = NEW(long, bufferlength);
+       PVbuffer = NEW(int, bufferlength);
        if (PVbuffer == NULL)
                return -1;
 
@@ -110,9 +110,9 @@ static object *
 cl_CompressImage(self, args)
        object *self, *args;
 {
-       long compressionScheme, width, height, originalFormat;
+       int compressionScheme, width, height, originalFormat;
        float compressionRatio;
-       long frameBufferSize, compressedBufferSize;
+       int frameBufferSize, compressedBufferSize;
        char *frameBuffer;
        object *compressedBuffer;
 
@@ -156,9 +156,9 @@ static object *
 cl_DecompressImage(self, args)
        object *self, *args;
 {
-       long compressionScheme, width, height, originalFormat;
+       int compressionScheme, width, height, originalFormat;
        char *compressedBuffer;
-       long compressedBufferSize, frameBufferSize;
+       int compressedBufferSize, frameBufferSize;
        object *frameBuffer;
 
        if (!getargs(args, "(iiiis#i)", &compressionScheme, &width, &height,
@@ -197,7 +197,7 @@ static object *
 doClose(self, args, close_func)
        clobject *self;
        object *args;
-       long (*close_func) PROTO((CL_Handle));
+       int (*close_func) PROTO((CL_Handle));
 {
        CheckCompressor(self);
 
@@ -238,10 +238,10 @@ clm_Compress(self, args)
        clobject *self;
        object *args;
 {
-       long numberOfFrames;
-       long frameBufferSize, compressedBufferSize;
+       int numberOfFrames;
+       int frameBufferSize, compressedBufferSize;
        char *frameBuffer;
-       long PVbuf[2];
+       int PVbuf[2];
        object *data;
 
        CheckCompressor(self);
@@ -291,11 +291,11 @@ clm_Decompress(self, args)
        clobject *self;
        object *args;
 {
-       long PVbuf[2];
+       int PVbuf[2];
        object *data;
-       long numberOfFrames;
+       int numberOfFrames;
        char *compressedData;
-       long compressedDataSize;
+       int compressedDataSize;
 
        CheckCompressor(self);
 
@@ -331,13 +331,14 @@ static object *
 doParams(self, args, func, modified)
        clobject *self;
        object *args;
-       void (*func)(CL_Handle, long *, long);
+       void (*func)(CL_Handle, int *, int);
        int modified;
 {
        object *list, *v;
-       long *PVbuffer;
-       long length;
+       int *PVbuffer;
+       int length;
        int i;
+       float number;
        
        CheckCompressor(self);
 
@@ -348,14 +349,15 @@ doParams(self, args, func, modified)
                return NULL;
        }
        length = getlistsize(list);
-       PVbuffer = NEW(long, length);
+       PVbuffer = NEW(int, length);
        if (PVbuffer == NULL)
                return err_nomem();
        for (i = 0; i < length; i++) {
                v = getlistitem(list, i);
-               if (is_floatobject(v))
-                       PVbuffer[i] = clFloatToRatio(getfloatvalue(v));
-               else if (is_intobject(v))
+               if (is_floatobject(v)) {
+                       number = getfloatvalue(v);
+                       PVbuffer[i] = CL_TypeIsInt(number);
+               } else if (is_intobject(v))
                        PVbuffer[i] = getintvalue(v);
                else {
                        DEL(PVbuffer);
@@ -371,10 +373,12 @@ doParams(self, args, func, modified)
 
        if (modified) {
                for (i = 0; i < length; i++) {
-                       v = getlistitem(list, i);
-                       if (is_floatobject(v))
-                               v = newfloatobject(clRatioToFloat(PVbuffer[i]));
-                       else
+                       if ((i & 1) &&
+                           param_type_is_float(self->ob_compressorHdl,
+                                               PVbuffer[i-1]) > 0) {
+                               number = CL_TypeIsFloat(PVbuffer[i]);
+                               v = newfloatobject(number);
+                       } else
                                v = newintobject(PVbuffer[i]);
                        setlistitem(list, i, v);
                }
@@ -399,7 +403,98 @@ clm_SetParams(self, args)
        clobject *self;
        object *args;
 {
-       return doParams(self, args, clSetParams, 1);
+       return doParams(self, args, clSetParams, 0);
+}
+
+static object *
+do_get(self, args, func)
+       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->ob_compressorHdl, paramID) > 0) {
+               fvalue = CL_TypeIsFloat(value);
+               return newfloatobject(fvalue);
+       }
+
+       return newintobject(value);
+}
+
+static object *
+clm_GetParam(self, args)
+       clobject *self;
+       object *args;
+{
+       return do_get(self, args, clGetParam);
+}
+
+static object *
+clm_GetDefault(self, args)
+       clobject *self;
+       object *args;
+{
+       return do_get(self, args, clGetDefault);
+}
+
+static object *
+do_set(self, args, func)
+       clobject *self;
+       object *args;
+       int (*func)(CL_Handle, int, int);
+{
+       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);
+       }
+
+       error_handler_called = 0;
+       value = (*func)(self->ob_compressorHdl, paramID, value);
+       if (error_handler_called)
+               return NULL;
+
+       if (param_type_is_float(self->ob_compressorHdl, paramID) > 0)
+               return newfloatobject(CL_TypeIsFloat(value));
+       else
+               return newintobject(value);
+}
+
+static object *
+clm_SetParam(self, args)
+       clobject *self;
+       object *args;
+{
+       return do_set(self, args, clSetParam);
+}
+
+static object *
+clm_SetDefault(self, args)
+       clobject *self;
+       object *args;
+{
+       return do_set(self, args, clSetDefault);
 }
 
 static object *
@@ -408,7 +503,7 @@ clm_GetParamID(self, args)
        object *args;
 {
        char *name;
-       long value;
+       int value;
 
        CheckCompressor(self);
 
@@ -431,8 +526,8 @@ clm_QueryParams(self, args)
        clobject *self;
        object *args;
 {
-       long bufferlength;
-       long *PVbuffer;
+       int bufferlength;
+       int *PVbuffer;
        object *list;
        int i;
 
@@ -446,7 +541,7 @@ clm_QueryParams(self, args)
        if (error_handler_called)
                return NULL;
 
-       PVbuffer = NEW(long, bufferlength);
+       PVbuffer = NEW(int, bufferlength);
        if (PVbuffer == NULL)
                return err_nomem();
 
@@ -483,8 +578,8 @@ clm_GetMinMax(self, args)
        clobject *self;
        object *args;
 {
-       long param, min, max;
-       double fmin, fmax;
+       int param, min, max;
+       float fmin, fmax;
 
        CheckCompressor(self);
 
@@ -494,20 +589,36 @@ clm_GetMinMax(self, args)
        clGetMinMax(self->ob_compressorHdl, param, &min, &max);
 
        if (param_type_is_float(self->ob_compressorHdl, param) > 0) {
-               fmin = clRatioToFloat(min);
-               fmax = clRatioToFloat(max);
+               fmin = CL_TypeIsFloat(min);
+               fmax = CL_TypeIsFloat(max);
                return mkvalue("(ff)", fmin, fmax);
        }
 
        return mkvalue("(ii)", min, max);
 }
 
+static object *
+clm_SetMin(self, args)
+       clobject *self;
+       object *args;
+{
+       return do_set(self, args, clSetMin);
+}
+
+static object *
+clm_SetMax(self, args)
+       clobject *self;
+       object *args;
+{
+       return do_set(self, args, clSetMax);
+}
+
 static object *
 clm_GetName(self, args)
        clobject *self;
        object *args;
 {
-       long param;
+       int param;
        char *name;
 
        CheckCompressor(self);
@@ -527,29 +638,20 @@ clm_GetName(self, args)
 }
 
 static object *
-clm_GetDefault(self, args)
+clm_ReadHeader(self, args)
        clobject *self;
        object *args;
 {
-       long param, value;
-       double fvalue;
+       char *header;
+       int headerSize;
 
        CheckCompressor(self);
 
-       if (!getargs(args, "i", &param))
-               return NULL;
-
-       error_handler_called = 0;
-       value = clGetDefault(self->ob_compressorHdl, param);
-       if (error_handler_called)
+       if (!getargs(args, "s#", &header, &headerSize))
                return NULL;
 
-       if (param_type_is_float(self->ob_compressorHdl, param) > 0) {
-               fvalue = clRatioToFloat(value);
-               return newfloatobject(fvalue);
-       }
-
-       return newintobject(value);
+       return newintobject(clReadHeader(self->ob_compressorHdl,
+                                        headerSize, header));
 }
 
 static struct methodlist compressor_methods[] = {
@@ -559,9 +661,14 @@ static struct methodlist compressor_methods[] = {
        {"GetDefault",          clm_GetDefault},
        {"GetMinMax",           clm_GetMinMax},
        {"GetName",             clm_GetName},
+       {"GetParam",            clm_GetParam},
        {"GetParamID",          clm_GetParamID},
        {"GetParams",           clm_GetParams},
        {"QueryParams",         clm_QueryParams},
+       {"SetDefault",          clm_SetDefault},
+       {"SetMax",              clm_SetMax},
+       {"SetMin",              clm_SetMin},
+       {"SetParam",            clm_SetParam},
        {"SetParams",           clm_SetParams},
        {NULL,                  NULL}           /* sentinel */
 };
@@ -573,9 +680,15 @@ static struct methodlist decompressor_methods[] = {
        {"GetDefault",          clm_GetDefault},
        {"GetMinMax",           clm_GetMinMax},
        {"GetName",             clm_GetName},
+       {"GetParam",            clm_GetParam},
        {"GetParamID",          clm_GetParamID},
        {"GetParams",           clm_GetParams},
+       {"ReadHeader",          clm_ReadHeader},
        {"QueryParams",         clm_QueryParams},
+       {"SetDefault",          clm_SetDefault},
+       {"SetMax",              clm_SetMax},
+       {"SetMin",              clm_SetMin},
+       {"SetParam",            clm_SetParam},
        {"SetParams",           clm_SetParams},
        {NULL,                  NULL}           /* sentinel */
 };
@@ -625,10 +738,10 @@ static typeobject Cltype = {
 static object *
 doOpen(self, args, open_func, iscompressor)
        object *self, *args;
-       long (*open_func) PROTO((long, CL_Handle *));
+       int (*open_func) PROTO((int, CL_Handle *));
        int iscompressor;
 {
-       long scheme;
+       int scheme;
        clobject *new;
 
        if (!getargs(args, "i", &scheme))
@@ -665,11 +778,138 @@ cl_OpenDecompressor(self, args)
        return doOpen(self, args, clOpenDecompressor, 0);
 }
 
+static object *
+cl_QueryScheme(self, args)
+       object *self, *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(self, args)
+       object *self, *args;
+{
+       int scheme;
+
+       if (!getargs(args, "i", &scheme))
+               return NULL;
+
+       return newintobject(clQueryMaxHeaderSize(scheme));
+}
+
+static object *
+cl_QueryAlgorithms(self, args)
+       object *self, *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(self, args)
+       object *self, *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(self, args)
+       object *self, *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 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},
        {NULL,                  NULL} /* Sentinel */
 };