]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Added 24 bit RGB capture
authorJack Jansen <jack.jansen@cwi.nl>
Tue, 8 Jun 1993 12:52:41 +0000 (12:52 +0000)
committerJack Jansen <jack.jansen@cwi.nl>
Tue, 8 Jun 1993 12:52:41 +0000 (12:52 +0000)
Added JPEG capture
Added multiple-speed VCR sync and single-step VCR sync
VCR sync recorded movies get correct timestamps
Added (still non-functional) 24-bit picture scaling

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

index 0a0ced1b6c47fb8ba3e97d885ad6dfa390f5677a..68d50d2ad32fb3b92d1dade596d6e1099330fb71 100755 (executable)
@@ -45,9 +45,9 @@ def main():
 StopCapture = 'StopCapture'
 
 VideoFormatLabels = ['Video off', 'rgb8', 'grey8', 'grey4', 'grey2', \
-         'grey2 dith', 'mono dith', 'mono thresh']
+         'grey2 dith', 'mono dith', 'mono thresh', 'rgb24', 'rgb24-jpeg']
 VideoFormats = ['', 'rgb8', 'grey', 'grey4', 'grey2', \
-         'grey2', 'mono', 'mono']
+         'grey2', 'mono', 'mono', 'rgb', 'jpeg']
 
 VideoModeLabels = ['Continuous', 'Burst', 'Single frame', 'VCR sync']
 [VM_CONT, VM_BURST, VM_SINGLE, VM_VCR] = range(1, 5)
@@ -56,11 +56,17 @@ AudioFormatLabels = ['Audio off', \
          '16 bit mono', '16 bit stereo', '8 bit mono', '8 bit stereo']
 [A_OFF, A_16_MONO, A_16_STEREO, A_8_MONO, A_8_STEREO] = range(1, 6)
 
+VcrSpeedLabels = ['normal', '1/3', '1/5', '1/10', '1/30', 'single-step']
+VcrSpeeds = [None, 5, 4, 3, 2, 1, 0]
+
+RgbSizeLabels = ['full', 'quarter', 'sixteenth']
+
 class VideoBagOfTricks:
 
        # Init/close stuff
 
        def init(self):
+               self.window = None
                formdef = flp.parse_form('VbForm', 'form')
                flp.create_full_form(self, formdef)
                self.g_cont.hide_object()
@@ -119,6 +125,15 @@ class VideoBagOfTricks:
                self.in_nframes.set_input('0')
                self.in_nframes_vcr.set_input('1')
                self.in_rate_vcr.set_input('1')
+               self.c_vcrspeed.clear_choice()
+               for label in VcrSpeedLabels:
+                       self.c_vcrspeed.addto_choice(label)
+               self.c_vcrspeed.set_choice(4)
+               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
                # Audio defaults
                self.aout = None
                self.aport = None
@@ -174,6 +189,17 @@ class VideoBagOfTricks:
                gl.qdevice(DEVICE.WINQUIT)
                gl.qdevice(DEVICE.WINSHUT)
 
+       def optfullsizewindow(self):
+               if not self.window:
+                       return
+               gl.winset(self.window)
+               if not self.use_24:
+                       gl.winconstraints()
+                       return
+               gl.prefsize(self.maxx, self.maxy)
+               gl.winconstraints()
+               self.bindvideo()
+
        def bindvideo(self):
                if not self.video: return
                x, y = gl.getsize()
@@ -287,6 +313,14 @@ class VideoBagOfTricks:
        def cb_rate_vcr(self, *args):
                pass
 
+       def cb_vcrspeed(self, *args):
+               pass
+
+       def cb_rgb24_size(self, *args):
+               i = self.c_rgb24_size.get_choice()
+               if i:
+                       self.rgb24_size = i
+
        # Audio controls: format, file
 
        def cb_aformat(self, *args):
@@ -318,7 +352,7 @@ class VideoBagOfTricks:
                elif self.vmode == VM_BURST:
                        self.burst_capture()
                elif self.vmode == VM_SINGLE:
-                       self.single_capture()
+                       self.single_capture(None, None)
                elif self.vmode == VM_VCR:
                        self.vcr_capture()
 
@@ -338,6 +372,9 @@ class VideoBagOfTricks:
                self.setwatch()
                gl.winset(self.window)
                x, y = gl.getsize()
+               if self.use_24:
+                       fl.show_message('Sorry, no 24 bit continuous capture yet', '', '')
+                       return
                vformat = SV.RGB8_FRAMES
                nframes = self.getint(self.in_nframes, 0)
                if nframes == 0:
@@ -424,7 +461,7 @@ class VideoBagOfTricks:
                        self.reset()
                self.b_capture.label = saved_label
 
-       def single_capture(self):
+       def single_capture(self, stepfunc, timecode):
                self.open_if_closed()
                self.init_cont()
                while 1:
@@ -434,11 +471,32 @@ class VideoBagOfTricks:
                        except sv.error:
                                pass
                        sgi.nap(1)
-               data = cd.InterleaveFields(1)
+                       if stepfunc:            # This might step the video
+                               d=stepfunc()    # to the next frame
+               if not self.use_24:
+                       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
+                       else:
+                               raise 'Kaboo! Kaboo!'
+                       if self.use_jpeg:
+                               import jpeg
+                               data = jpeg.compress(data, x, y, 4)
                cd.UnlockCaptureData()
                self.end_cont()
-               t = (self.nframes+1) * (1000/25)
-               return self.write_frame(t, data)
+               if timecode == None:
+                       timecode = (self.nframes+1) * (1000/25)
+               return self.write_frame(timecode, data)
 
        def vcr_capture(self):
                if not self.vcr:
@@ -462,9 +520,15 @@ class VideoBagOfTricks:
                self.open_if_closed()
                rate = self.getint(self.in_rate_vcr, 1)
                rate = max(rate, 1)
+               vcrspeed = self.c_vcrspeed.get_choice()
+               vcrspeed = VcrSpeeds[vcrspeed]
+               if vcrspeed == 0:
+                       stepfunc = self.vcr.step
+               else:
+                       stepfunc = None
                self.speed_factor = rate
-               addr = self.vcr.sense()
-               if not self.single_capture():
+               addr = start_addr = self.vcr.sense()
+               if not self.single_capture(None, 0):
                        return
                print 'captured %02d:%02d:%02d:%02d' % self.vcr.addr2tc(addr)
                count = self.getint(self.in_nframes_vcr, 1) - 1
@@ -477,7 +541,7 @@ class VideoBagOfTricks:
                                        rate = rate - (here - addr)
                                addr = here
                        return
-               if not self.vcr.fwdshuttle(2):  # one tenth speed
+               if not self.vcr.fwdshuttle(vcrspeed):   # one tenth speed
                        self.vcr_error('fwd shuttle failed')
                        return
                cycle = 0
@@ -494,7 +558,9 @@ class VideoBagOfTricks:
                                        print 'frame' + 's'*(here-addr-1 <> 1)
                                cycle = (cycle+1) % rate
                                if cycle == 0:
-                                       if not self.single_capture():
+                                       tc = (here-start_addr)*40
+                                       if not self.single_capture(stepfunc, \
+                                                 tc):
                                                break
                                        print 'captured %02d:%02d:%02d:%02d' \
                                                  % self.vcr.addr2tc(here)
@@ -516,7 +582,10 @@ class VideoBagOfTricks:
                else:
                        self.rate = 2
                x, y = self.vout.getsize()
-               info = (SV.RGB8_FRAMES, x, y, qsize, self.rate)
+               if self.use_24:
+                       info = (SV.YUV411_FRAMES, x, y, qsize, self.rate)
+               else:
+                       info = (SV.RGB8_FRAMES, x, y, qsize, self.rate)
                info2 = self.video.InitContinuousCapture(info)
                if info2 <> info:
                        # XXX This is really only debug info
@@ -558,6 +627,13 @@ class VideoBagOfTricks:
                self.rgb = (format[:3] == 'rgb')
                self.mono = (format == 'mono')
                self.grey = (format[:4] == 'grey')
+               self.use_24 = (format in ('rgb', 'jpeg'))
+               # Does not work.... if self.use_24:
+               if 0:
+                       self.g_rgb24.show_object()
+               else:
+                       self.g_rgb24.hide_object()
+               self.use_jpeg = (format == 'jpeg')
                self.mono_use_thresh = (label == 'mono thresh')
                s = format[4:]
                if s:
@@ -576,6 +652,7 @@ class VideoBagOfTricks:
                        elif self.greybits == -2:
                                convertor = imageop.dither2grey2
                self.convertor = convertor
+               self.optfullsizewindow()
 
        def get_aformat(self):
                self.reset()
@@ -597,6 +674,11 @@ class VideoBagOfTricks:
                self.close_video()
                gl.winset(self.window)
                x, y = gl.getsize()
+               if self.use_24:
+                       if self.rgb24_size == 2:
+                               x, y = x/2, y/2
+                       elif self.rgb24_size == 4:
+                               x, y = x/4, y/4
                vout = VFile.VoutFile().init(self.vfile)
                vout.setformat(self.vformat)
                vout.setsize(x, y)
index ef58488b870f4bd44524153e5afe2941ce2ccd2b..8c2c166e904b7e92d8304adad4ebc081b58d6662 100644 (file)
@@ -9,7 +9,7 @@ Number of forms: 1
 Name: form
 Width: 450.000000
 Height: 240.000000
-Number of Objects: 33
+Number of Objects: 37
 
 --------------------
 class: 1
@@ -239,7 +239,7 @@ argument:
 --------------------
 class: 31
 type: 2
-box: 220.000000 170.000000 100.000000 30.000000
+box: 220.000000 130.000000 100.000000 30.000000
 boxtype: 2
 colors: 13 5
 alignment: 0
@@ -284,7 +284,7 @@ argument:
 --------------------
 class: 31
 type: 1
-box: 220.000000 170.000000 100.000000 30.000000
+box: 220.000000 130.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 110.000000 100.000000 30.000000
+box: 220.000000 70.000000 100.000000 30.000000
 boxtype: 2
 colors: 13 5
 alignment: 0
@@ -344,7 +344,7 @@ argument:
 --------------------
 class: 31
 type: 2
-box: 250.000000 170.000000 40.000000 30.000000
+box: 250.000000 130.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 170.000000 30.000000 30.000000
+box: 220.000000 130.000000 30.000000 30.000000
 boxtype: 0
 colors: 47 47
 alignment: 2
@@ -374,7 +374,7 @@ argument:
 --------------------
 class: 2
 type: 0
-box: 290.000000 170.000000 30.000000 30.000000
+box: 290.000000 130.000000 30.000000 30.000000
 boxtype: 0
 colors: 47 47
 alignment: 2
@@ -389,7 +389,7 @@ argument:
 --------------------
 class: 13
 type: 0
-box: 220.000000 110.000000 100.000000 30.000000
+box: 220.000000 70.000000 100.000000 30.000000
 boxtype: 0
 colors: 7 3
 alignment: 4
@@ -451,7 +451,7 @@ class: 10000
 type: 0
 box: 0.000000 0.000000 0.000000 0.000000
 boxtype: 0
-colors: 1147496041 1852404841
+colors: 640 235
 alignment: 4
 style: 0
 size: 11.000000
@@ -464,7 +464,7 @@ argument:
 --------------------
 class: 31
 type: 2
-box: 220.000000 110.000000 100.000000 30.000000
+box: 220.000000 70.000000 100.000000 30.000000
 boxtype: 2
 colors: 13 5
 alignment: 0
@@ -479,7 +479,7 @@ argument: 0
 --------------------
 class: 31
 type: 2
-box: 220.000000 170.000000 100.000000 30.000000
+box: 220.000000 130.000000 100.000000 30.000000
 boxtype: 2
 colors: 13 5
 alignment: 0
@@ -491,12 +491,72 @@ name: in_rate_vcr
 callback: cb_rate_vcr
 argument: 0
 
+--------------------
+class: 42
+type: 0
+box: 220.000000 10.000000 100.000000 30.000000
+boxtype: 5
+colors: 7 0
+alignment: 0
+style: 0
+size: 11.000000
+lcol: 0
+label: VCR speed:
+name: c_vcrspeed
+callback: cb_vcrspeed
+argument: 0
+
 --------------------
 class: 20000
 type: 0
 box: 0.000000 0.000000 0.000000 0.000000
 boxtype: 0
-colors: 544171552 1331849829
+colors: 640 235
+alignment: 4
+style: 0
+size: 11.000000
+lcol: 0
+label: 
+name: 
+callback: 
+argument: 
+
+--------------------
+class: 10000
+type: 0
+box: 0.000000 0.000000 0.000000 0.000000
+boxtype: 0
+colors: 58720287 33751040
+alignment: 4
+style: 0
+size: 11.000000
+lcol: 0
+label: 
+name: g_rgb24
+callback: 
+argument: 
+
+--------------------
+class: 42
+type: 0
+box: 260.000000 200.000000 60.000000 30.000000
+boxtype: 5
+colors: 7 0
+alignment: 2
+style: 0
+size: 11.000000
+lcol: 0
+label: Size:
+name: c_rgb24_size
+callback: cb_rgb24_size
+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: 11.000000