]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
- VFile: moved decompression code to VideoParams (so it is also
authorJack Jansen <jack.jansen@cwi.nl>
Tue, 28 Sep 1993 16:46:15 +0000 (16:46 +0000)
committerJack Jansen <jack.jansen@cwi.nl>
Tue, 28 Sep 1993 16:46:15 +0000 (16:46 +0000)
  useable via VinFile).
- Vcopy: now allows decompression of 'compress' movies.

Demo/sgi/video/VFile.py
Demo/sgi/video/Vcopy.py

index bc7e68efcadc05bf62b9817dd60c49bb2aa71831..2c99183ea7a5df2b812a1a007df19d1e7351950d 100755 (executable)
@@ -202,6 +202,7 @@ class VideoParams:
                self.offset = 0         # colormap index offset (XXX ???)
                self.chrompack = 0      # set if separate chrominance data
                self.setderived()
+               self.decompressor = None
                return self
 
        # Freeze the parameters (disallow changes)
@@ -333,6 +334,31 @@ class VideoParams:
                size = (size * self.bpp + 7) / 8
                return size
 
+       # Decompress a possibly compressed frame. This method is here
+       # since you sometimes want to use it on a VFile instance and sometimes
+       # on a Displayer instance.
+       #
+       # XXXX This should also handle jpeg. Actually, the whole mechanism
+       # should be much more of 'ihave/iwant' style, also allowing you to
+       # read, say, greyscale images from a color movie.
+       
+       def decompress(self, data):
+               if self.format <> 'compress':
+                       return data
+               if not self.decompressor:
+                       import cl, CL
+                       scheme = cl.QueryScheme(self.compressheader)
+                       self.decompressor = cl.OpenDecompressor(scheme)
+                       headersize = self.decompressor.ReadHeader(self.compressheader)
+                       width = self.decompressor.GetParam(CL.IMAGE_WIDTH)
+                       height = self.decompressor.GetParam(CL.IMAGE_HEIGHT)
+                       params = [CL.ORIGINAL_FORMAT, CL.RGBX, \
+                                 CL.ORIENTATION, CL.BOTTOM_UP, \
+                                 CL.FRAME_BUFFER_SIZE, width*height*CL.BytesPerPixel(CL.RGBX)]
+                       self.decompressor.SetParams(params)
+               data = self.decompressor.Decompress(1, data)
+               return data
+
 
 # Class to display video frames in a window.
 # It is the caller's responsibility to ensure that the correct window
@@ -360,7 +386,6 @@ class Displayer(VideoParams):
                self.color0 = None      # magic, used by clearto()
                self.fixcolor0 = 0      # don't need to fix color0
                self.mustunpack = (not support_packed_pixels())
-               self.decompressor = None
                return self
 
        # setinfo() must reset some internal flags
@@ -390,18 +415,7 @@ class Displayer(VideoParams):
                        data, width, height, bytes = jpeg.decompress(data)
                        pmsize = bytes*8
                elif self.format == 'compress':
-                       if not self.decompressor:
-                               import cl, CL
-                               scheme = cl.QueryScheme(self.compressheader)
-                               self.decompressor = cl.OpenDecompressor(scheme)
-                               headersize = self.decompressor.ReadHeader(self.compressheader)
-                               width = self.decompressor.GetParam(CL.IMAGE_WIDTH)
-                               height = self.decompressor.GetParam(CL.IMAGE_HEIGHT)
-                               params = [CL.ORIGINAL_FORMAT, CL.RGBX, \
-                                         CL.ORIENTATION, CL.BOTTOM_UP, \
-                                         CL.FRAME_BUFFER_SIZE, width*height*CL.BytesPerPixel(CL.RGBX)]
-                               self.decompressor.SetParams(params)
-                       data = self.decompressor.Decompress(1, data)
+                       data = self.decompress(data)
                elif self.format in ('mono', 'grey4'):
                        if self.mustunpack:
                                if self.format == 'mono':
index e8d4f5523018ef9e48aa534335c29be65031cc9f..ef26f558122cfa033bc74b08370397013323ccbc 100755 (executable)
@@ -173,11 +173,25 @@ def process(infilename, outfilename):
 
        scale = 0
        flip = 0
+       decompress = 0
 
+       vinfmt = vin.format
+       if vinfmt == 'compress':
+               if not newtype or newtype == 'compress':
+                       # compressed->compressed: copy compression header
+                       vout.setcompressheader(vin.getcompressheader())
+               else:
+                       # compressed->something else: go via rgb-24
+                       decompress = 1
+                       vinfmt = 'rgb'
+       elif newtype == 'compress':
+               # something else->compressed: not implemented
+               sys.stderr.write('Sorry, conversion to compressed not yet implemented\n')
+               return 1
        if newtype:
                vout.setformat(newtype)
                try:
-                       convert = imgconv.getconverter(vin.format, vout.format)
+                       convert = imgconv.getconverter(vinfmt, vout.format)
                except imgconv.error, msg:
                        sys.stderr.write(str(msg) + '\n')
                        return 1
@@ -236,6 +250,8 @@ def process(infilename, outfilename):
                        tin, data, cdata = vin.getnextframe()
                except EOFError:
                        break
+               if decompress:
+                       data = vin.decompress(data)
                nin = nin + 1
                if regen:
                        tout = nin * regen