]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
VFile - Added support for creating compression lib movies
authorJack Jansen <jack.jansen@cwi.nl>
Fri, 23 Jul 1993 11:59:25 +0000 (11:59 +0000)
committerJack Jansen <jack.jansen@cwi.nl>
Fri, 23 Jul 1993 11:59:25 +0000 (11:59 +0000)
Vb, VbForm - Compression lib movie support
     Save settings in ~/.Vb_init

Demo/sgi/video/VFile.py
Demo/sgi/video/Vb.py
Demo/sgi/video/VbForm.fd

index 8e093b80cd683a61f2194104bc88fd7e91413aca..b3752991cfff53673199e1c1b767a5bbf574f9b7 100755 (executable)
@@ -304,6 +304,12 @@ class VideoParams:
                        self.c0bits, self.c1bits, self.c2bits, self.offset, \
                        self.chrompack)
 
+       def getcompressheader(self):
+               return self.compressheader
+
+       def setcompressheader(self, ch):
+               self.compressheader = ch
+
        # Write the relevant bits to stdout
 
        def printinfo(self):
@@ -765,6 +771,24 @@ def writefileheader(fp, values):
        #
        data = (width, height, packfactor)
        fp.write(`data`+'\n')
+       
+def writecompressfileheader(fp, cheader, values):
+       (format, width, height, packfactor, \
+               c0bits, c1bits, c2bits, offset, chrompack) = values
+       #
+       # Write identifying header
+       #
+       fp.write('CMIF video 3.1\n')
+       #
+       # Write color encoding info
+       #
+       data = (format, cheader)
+       fp.write(`data`+'\n')
+       #
+       # Write frame geometry info
+       #
+       data = (width, height, packfactor)
+       fp.write(`data`+'\n')
 
 
 # Basic class for reading CMIF video files
@@ -1058,7 +1082,11 @@ class BasicVoutFile(VideoParams):
 
        def writeheader(self):
                if self.frozen: raise CallError
-               writefileheader(self.fp, self.getinfo())
+               if self.format == 'compress':
+                       writecompressfileheader(self.fp, self.compressheader, \
+                                 self.getinfo())
+               else:
+                       writefileheader(self.fp, self.getinfo())
                self.freeze()
                self.atheader = 1
                self.framecount = 0
index 57e76ae3d877126c6e71196474e4a366f38458cb..c7e7fcc91b9794045758b9758d3e604c62f48b38 100755 (executable)
@@ -31,6 +31,11 @@ import VGrabber
 import imageop
 sys.path.append('/ufs/jack/src/av/vcr')
 import VCR
+try:
+       import cl
+       import CL
+except ImportError:
+       cl = None
 
 ARROW = 0
 WATCH = 1
@@ -46,9 +51,10 @@ def main():
 StopCapture = 'StopCapture'
 
 VideoFormatLabels = ['Video off', 'rgb8', 'grey8', 'grey4', 'grey2', \
-         'grey2 dith', 'mono dith', 'mono thresh', 'rgb24', 'rgb24-jpeg']
+         'grey2 dith', 'mono dith', 'mono thresh', 'rgb24', 'rgb24-jpeg', \
+         'compress']
 VideoFormats = ['', 'rgb8', 'grey', 'grey4', 'grey2', \
-         'grey2', 'mono', 'mono', 'rgb', 'jpeg']
+         'grey2', 'mono', 'mono', 'rgb', 'jpeg', 'compress']
 
 VideoModeLabels = ['Continuous', 'Burst', 'Single frame', 'VCR sync']
 [VM_CONT, VM_BURST, VM_SINGLE, VM_VCR] = range(1, 5)
@@ -62,6 +68,16 @@ VcrSpeeds = [None, 5, 4, 3, 2, 1, 0]
 
 RgbSizeLabels = ['full', 'quarter', 'sixteenth']
 
+# init file stuff:
+if os.environ.has_key('HOME'):
+       HOME=os.environ['HOME']
+else:
+       HOME='.'
+VB_INIT_FILE=HOME + '/.Vb_init'
+
+VB_INIT_KEYS=['vfile', 'vmode', 'mono_thresh', 'vformat', 'comp_scheme', \
+         'rgb24_size', 'afile', 'aformat']
+
 class VideoBagOfTricks:
 
        # Init/close stuff
@@ -70,14 +86,23 @@ class VideoBagOfTricks:
                self.window = None
                formdef = flp.parse_form('VbForm', 'form')
                flp.create_full_form(self, formdef)
-               self.g_cont.hide_object()
-               self.g_burst.hide_object()
-               self.g_single.hide_object()
-               self.g_vcr.hide_object()
                self.setdefaults()
+               if self.vmode <> VM_CONT:
+                       self.g_cont.hide_object()
+               if self.vmode <> VM_BURST:
+                       self.g_burst.hide_object()
+               if self.vmode <> VM_SINGLE:
+                       self.g_single.hide_object()
+               if self.vmode <> VM_VCR:
+                       self.g_vcr.hide_object()
+               if self.vformat <> 'compress':
+                       self.g_compress.hide_object()
+
                self.openvideo()
                self.makewindow()
                self.bindvideo()
+               if self.use_24:
+                       self.optfullsizewindow()
                self.showform()
                fl.set_event_call_back(self.do_event)
                return self
@@ -85,6 +110,7 @@ class VideoBagOfTricks:
        def close(self):
                self.close_video()
                self.close_audio()
+               self.savedefaults()
                raise SystemExit, 0
 
        def showform(self):
@@ -101,15 +127,56 @@ class VideoBagOfTricks:
                gl.prefposition(x1, x2, y1, y2)
                self.form.show_form(FL.PLACE_FREE, FL.TRUE, 'Vb Control')
 
-       def setdefaults(self):
-               self.vcr = None
-               self.vout = None
-               self.capturing = 0
+       def getdefaultdefaults(self):
                # Video defaults
                self.vfile = 'film.video'
                self.vmode = VM_CONT
                self.mono_thresh = 128
                self.vformat = 'rgb8'
+               self.comp_scheme = 'Uncompressed'
+               self.rgb24_size = 1
+               # Missing: drop, rate, maxmem, nframes, rate, vcrspeed
+               # Audio defaults:
+               self.afile = 'film.aiff'
+               self.aformat = A_OFF
+
+       def getdefaults(self):
+               self.getdefaultdefaults()
+               # XXXX Read defaults file and override.
+               try:
+                       fp = open(VB_INIT_FILE, 'r')
+               except IOError:
+                       print 'Vb: no init file'
+                       self.initcont = {}
+                       return
+               data = fp.read(1000000)
+               try:
+                       self.initcont = eval(data)
+               except:
+                       print 'Vb: Ill-formatted init file'
+                       self.initcont = {}
+               for k in self.initcont.keys():
+                       if hasattr(self, k):
+                               setattr(self, k, self.initcont[k])
+
+       def savedefaults(self):
+               newdb = {}
+               for k in VB_INIT_KEYS:
+                       newdb[k] = getattr(self, k)
+               if newdb <> self.initcont:
+                       try:
+                               fp = open(VB_INIT_FILE, 'w')
+                       except IOError:
+                               print 'Vb: Cannot create', VB_INIT_FILE
+                               return
+                       fp.write(`newdb`)
+                       fp.close()
+                       
+       def setdefaults(self):
+               self.getdefaults()
+               self.vcr = None
+               self.vout = None
+               self.capturing = 0
                self.c_vformat.clear_choice()
                for label in VideoFormatLabels:
                        self.c_vformat.addto_choice(label)
@@ -132,13 +199,21 @@ class VideoBagOfTricks:
                self.c_rgb24_size.clear_choice()
                for label in RgbSizeLabels:
                        self.c_rgb24_size.addto_choice(label)
-               self.c_rgb24_size.set_choice(1)
-               self.rgb24_size = 1
+               self.c_rgb24_size.set_choice(self.rgb24_size)
+               if cl:
+                       algs = cl.QueryAlgorithms(CL.VIDEO)
+                       self.all_comp_schemes = []
+                       for i in range(0, len(algs), 2):
+                               if algs[i+1] in (CL.COMPRESSOR, CL.CODEC):
+                                       self.all_comp_schemes.append(algs[i])
+                       self.c_cformat.clear_choice()
+                       for label in self.all_comp_schemes:
+                               self.c_cformat.addto_choice(label)
+                       i = self.all_comp_schemes.index(self.comp_scheme)
+                       self.c_cformat.set_choice(i+1)
                # Audio defaults
                self.aout = None
                self.aport = None
-               self.afile = 'film.aiff'
-               self.aformat = A_OFF
                self.c_aformat.clear_choice()
                for label in AudioFormatLabels:
                        self.c_aformat.addto_choice(label)
@@ -276,6 +351,11 @@ class VideoBagOfTricks:
                                                  `self.mono_thresh`, '')
                self.rebindvideo()
 
+       def cb_cformat(self, *args):
+               i = self.c_cformat.get_choice()
+               self.comp_scheme = self.all_comp_schemes[i-1]
+
+               
        def cb_vmode(self, *args):
                if self.vcr:
                        self.vcr = None
@@ -493,21 +573,33 @@ class VideoBagOfTricks:
                        data = cd.InterleaveFields(1)
                else:
                        x, y = self.vout.getsize()
-                       if self.rgb24_size == 1:
-                               data = cd.YUVtoRGB(1)
-                       elif self.rgb24_size == 2:
-                               data = cd.YUVtoRGB_quarter(1)
-                               x = x/2
-                               y = y/2
-                       elif self.rgb24_size == 3:
-                               data = cd.YUVtoRGB_sixteenth(1)
-                               x = x/4
-                               y = y/4
+                       if self.use_compress:
+                               if self.rgb24_size == 1:
+                                       data = cd.YUVtoYUV422DC(0)
+                               elif self.rgb24_size == 2:
+                                       data = cd.YUVtoYUV422DC_quarter(1)
+                                       x = x/2
+                                       y = y/2
+                               elif self.rgb24_size == 3:
+                                       data = cd.YUVtoYUV422DC_sixteenth(1)
+                                       x = x/4
+                                       y = y/4
                        else:
-                               raise 'Kaboo! Kaboo!'
+                               data = cd.YUVtoRGB(1)
+                               if self.maxx*self.maxy*4 <> len(data):
+                                       print 'maxx,maxy,exp,got=', self.maxx,
+                                       print self.maxy,self.maxx*self.maxy*4,
+                                       print len(data)
+                                       fl.showmessage('Wrong sized data')
+                                       return 0
+                               if self.rgb24_size <> 1:
+                                       data = imageop.scale(data, 4, \
+                                                 self.maxx, self.maxy, x, y)
                        if self.use_jpeg:
                                import jpeg
                                data = jpeg.compress(data, x, y, 4)
+                       if self.use_compress:
+                               data = self.compressor.Compress(1, data)
                cd.UnlockCaptureData()
                self.end_cont()
                if timecode == None:
@@ -520,7 +612,7 @@ class VideoBagOfTricks:
                                print 'Connecting to VCR ...'
                                self.vcr = VCR.VCR().init()
                                print 'Waiting for VCR to come online ...'
-                               self.vcr.wait()
+                               self.vcr.initvcr()
                                print 'Preparing VCR ...'
                                if not (self.vcr.fmmode('dnr') and \
                                          self.vcr.dmcontrol('digital slow')):
@@ -622,6 +714,10 @@ class VideoBagOfTricks:
                i = self.c_vformat.get_choice()
                label = VideoFormatLabels[i-1]
                format = VideoFormats[i-1]
+               if format == 'compress' and cl == None:
+                       fl.show_message('Sorry, no compression library support')
+                       format = ''
+                       label = 'Video off'
                self.vformat = format
                if self.vformat == '':
                        self.form.freeze_form()
@@ -639,18 +735,23 @@ class VideoBagOfTricks:
                        elif self.vmode == VM_SINGLE:
                                self.g_single.show_object()
                #
-               self.rgb = (format[:3] == 'rgb')
+               self.rgb = (format[:3] == 'rgb' or format == 'compress')
                self.mono = (format == 'mono')
                self.grey = (format[:4] == 'grey')
-               self.use_24 = (format in ('rgb', 'jpeg'))
-               if self.use_24 and 0: ### quarter/sixteenth decoding not impl.
+               self.use_24 = (format in ('rgb', 'jpeg', 'compress'))
+               if self.use_24:
                        self.g_rgb24.show_object()
                else:
                        self.g_rgb24.hide_object()
                self.use_jpeg = (format == 'jpeg')
                self.mono_use_thresh = (label == 'mono thresh')
+               self.use_compress = (format == 'compress')
+               if self.use_compress:
+                       self.g_compress.show_object()
+               else:
+                       self.g_compress.hide_object()
                s = format[4:]
-               if s:
+               if self.grey and s:
                        self.greybits = string.atoi(s)
                else:
                        self.greybits = 8
@@ -676,6 +777,16 @@ class VideoBagOfTricks:
                else:
                        self.g_audio.show_object()
 
+       def init_compressor(self, w, h):
+               self.compressor = None
+               scheme = cl.QuerySchemeFromName(CL.VIDEO, self.comp_scheme)
+               self.compressor = cl.OpenCompressor(scheme)
+               parambuf = [CL.IMAGE_WIDTH, w, \
+                         CL.IMAGE_HEIGHT, h, \
+                         CL.ORIGINAL_FORMAT, CL.YUV422DC]
+               self.compressor.SetParams(parambuf)
+               return self.compressor.Compress(0, '')
+
        def open_if_closed(self):
                if not self.vout:
                        self.open_video()
@@ -691,10 +802,13 @@ class VideoBagOfTricks:
                if self.use_24:
                        if self.rgb24_size == 2:
                                x, y = x/2, y/2
-                       elif self.rgb24_size == 4:
+                       elif self.rgb24_size == 3:
                                x, y = x/4, y/4
                vout = VFile.VoutFile().init(self.vfile)
                vout.setformat(self.vformat)
+               if self.vformat == 'compress':
+                       cheader = self.init_compressor(x, y)
+                       vout.setcompressheader(cheader)
                vout.setsize(x, y)
                if self.vmode == VM_BURST:
                        vout.setpf((1, -2))
@@ -743,6 +857,7 @@ class VideoBagOfTricks:
                                msg = 'disk full??'
                        fl.show_message('IOError', str(msg), '')
                self.vout = None
+               self.compressor = None
 
        # Watch cursor handling
 
index 8c2c166e904b7e92d8304adad4ebc081b58d6662..fd9759fb145a6c6d4b89bfd3302170c94809a0f4 100644 (file)
@@ -8,13 +8,13 @@ Number of forms: 1
 =============== FORM ===============
 Name: form
 Width: 450.000000
-Height: 240.000000
-Number of Objects: 37
+Height: 260.000000
+Number of Objects: 40
 
 --------------------
 class: 1
 type: 1
-box: 0.000000 0.000000 450.000000 240.000000
+box: 0.000000 0.000000 450.000000 260.000000
 boxtype: 1
 colors: 47 47
 alignment: 4
@@ -29,7 +29,7 @@ argument:
 --------------------
 class: 11
 type: 5
-box: 330.000000 130.000000 110.000015 60.000004
+box: 330.000000 150.000000 110.000015 60.000004
 boxtype: 1
 colors: 47 47
 alignment: 4
@@ -74,7 +74,7 @@ argument: 0
 --------------------
 class: 42
 type: 0
-box: 80.000000 200.000000 120.000000 30.000000
+box: 80.000000 220.000000 120.000000 30.000000
 boxtype: 5
 colors: 7 0
 alignment: 2
@@ -89,7 +89,7 @@ argument: 0
 --------------------
 class: 11
 type: 0
-box: 330.000000 200.000000 110.000000 30.000000
+box: 330.000000 220.000000 110.000000 30.000000
 boxtype: 1
 colors: 47 47
 alignment: 4
@@ -179,7 +179,7 @@ argument:
 --------------------
 class: 42
 type: 0
-box: 80.000000 160.000000 120.000000 30.000000
+box: 80.000000 180.000000 120.000000 30.000000
 boxtype: 5
 colors: 7 0
 alignment: 2
@@ -194,7 +194,7 @@ argument: 0
 --------------------
 class: 11
 type: 0
-box: 10.000000 110.000000 190.000000 30.000000
+box: 10.000000 90.000000 190.000000 30.000000
 boxtype: 1
 colors: 47 47
 alignment: 4
@@ -239,7 +239,7 @@ argument:
 --------------------
 class: 31
 type: 2
-box: 220.000000 130.000000 100.000000 30.000000
+box: 220.000000 150.000000 100.000000 30.000000
 boxtype: 2
 colors: 13 5
 alignment: 0
@@ -284,7 +284,7 @@ argument:
 --------------------
 class: 31
 type: 1
-box: 220.000000 130.000000 100.000000 30.000000
+box: 220.000000 150.000000 100.000000 30.000000
 boxtype: 2
 colors: 13 5
 alignment: 0
@@ -299,7 +299,7 @@ argument: 0
 --------------------
 class: 31
 type: 2
-box: 220.000000 70.000000 100.000000 30.000000
+box: 220.000000 90.000000 100.000000 30.000000
 boxtype: 2
 colors: 13 5
 alignment: 0
@@ -344,7 +344,7 @@ argument:
 --------------------
 class: 31
 type: 2
-box: 250.000000 130.000000 40.000000 30.000000
+box: 250.000000 150.000000 40.000000 30.000000
 boxtype: 2
 colors: 13 5
 alignment: 0
@@ -359,7 +359,7 @@ argument: 0
 --------------------
 class: 2
 type: 0
-box: 220.000000 130.000000 30.000000 30.000000
+box: 220.000000 150.000000 30.000000 30.000000
 boxtype: 0
 colors: 47 47
 alignment: 2
@@ -374,7 +374,7 @@ argument:
 --------------------
 class: 2
 type: 0
-box: 290.000000 130.000000 30.000000 30.000000
+box: 290.000000 150.000000 30.000000 30.000000
 boxtype: 0
 colors: 47 47
 alignment: 2
@@ -389,7 +389,7 @@ argument:
 --------------------
 class: 13
 type: 0
-box: 220.000000 70.000000 100.000000 30.000000
+box: 220.000000 90.000000 100.000000 30.000000
 boxtype: 0
 colors: 7 3
 alignment: 4
@@ -419,7 +419,7 @@ argument:
 --------------------
 class: 2
 type: 0
-box: 390.000000 90.000000 50.000000 30.000002
+box: 330.000000 90.000000 110.000000 30.000002
 boxtype: 2
 colors: 47 47
 alignment: 2
@@ -434,14 +434,14 @@ argument:
 --------------------
 class: 2
 type: 0
-box: 320.000000 90.000000 60.000000 30.000000
+box: 330.000000 120.000000 110.000000 30.000000
 boxtype: 0
 colors: 47 47
 alignment: 2
 style: 0
 size: 11.000000
 lcol: 0
-label: Frames:
+label: Frames done:
 name: 
 callback: 
 argument: 
@@ -464,14 +464,14 @@ argument:
 --------------------
 class: 31
 type: 2
-box: 220.000000 70.000000 100.000000 30.000000
+box: 220.000000 90.000000 100.000000 30.000000
 boxtype: 2
 colors: 13 5
 alignment: 0
 style: 0
 size: 11.000000
 lcol: 0
-label: Nr. of frames:
+label: # frames wtd:
 name: in_nframes_vcr
 callback: cb_nframes_vcr
 argument: 0
@@ -479,7 +479,7 @@ argument: 0
 --------------------
 class: 31
 type: 2
-box: 220.000000 130.000000 100.000000 30.000000
+box: 220.000000 150.000000 100.000000 30.000000
 boxtype: 2
 colors: 13 5
 alignment: 0
@@ -539,7 +539,7 @@ argument:
 --------------------
 class: 42
 type: 0
-box: 260.000000 200.000000 60.000000 30.000000
+box: 260.000000 220.000000 60.000000 30.000000
 boxtype: 5
 colors: 7 0
 alignment: 2
@@ -566,5 +566,50 @@ name:
 callback: 
 argument: 
 
+--------------------
+class: 10000
+type: 0
+box: 0.000000 0.000000 0.000000 0.000000
+boxtype: 0
+colors: 0 0
+alignment: 4
+style: 0
+size: 10.000000
+lcol: 0
+label: 
+name: g_compress
+callback: 
+argument: 
+
+--------------------
+class: 42
+type: 0
+box: 80.000000 140.000000 120.000000 30.000000
+boxtype: 5
+colors: 7 0
+alignment: 2
+style: 0
+size: 11.000000
+lcol: 0
+label: Scheme:
+name: c_cformat
+callback: cb_cformat
+argument: 0
+
+--------------------
+class: 20000
+type: 0
+box: 0.000000 0.000000 0.000000 0.000000
+boxtype: 0
+colors: 0 0
+alignment: 4
+style: 0
+size: 10.000000
+lcol: 0
+label: 
+name: 
+callback: 
+argument: 
+
 ==============================
 create_the_forms