From 72d73649ffdea4ef6038d3fc9417c860ac1ff4e4 Mon Sep 17 00:00:00 2001
From: Jack Jansen <jack.jansen@cwi.nl>
Date: Tue, 28 Sep 1993 16:46:15 +0000
Subject: - VFile: moved decompression code to VideoParams (so it is also  
 useable via VinFile). - Vcopy: now allows decompression of 'compress' movies.

---
 Demo/sgi/video/VFile.py | 40 +++++++++++++++++++++++++++-------------
 Demo/sgi/video/Vcopy.py | 18 +++++++++++++++++-
 2 files changed, 44 insertions(+), 14 deletions(-)

diff --git a/Demo/sgi/video/VFile.py b/Demo/sgi/video/VFile.py
index bc7e68e..2c99183e 100755
--- a/Demo/sgi/video/VFile.py
+++ b/Demo/sgi/video/VFile.py
@@ -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':
diff --git a/Demo/sgi/video/Vcopy.py b/Demo/sgi/video/Vcopy.py
index e8d4f55..ef26f55 100755
--- a/Demo/sgi/video/Vcopy.py
+++ b/Demo/sgi/video/Vcopy.py
@@ -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
-- 
cgit v0.12