]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
VFile.py: fix bogus getrandomframe().
authorGuido van Rossum <guido@python.org>
Tue, 16 Feb 1993 16:10:02 +0000 (16:10 +0000)
committerGuido van Rossum <guido@python.org>
Tue, 16 Feb 1993 16:10:02 +0000 (16:10 +0000)
Vedit.py, VeditForm.fd: added scroll bar, Trunc, layout rearrangement.
Viewer.py: added random access, qinfo() function.

Demo/sgi/video/VFile.py
Demo/sgi/video/Vedit.py
Demo/sgi/video/VeditForm.fd
Demo/sgi/video/Viewer.py

index 9e1eb36b2f0bb8e39c1900fafb173e1f89c51f03..c61ac04a031928584dc0452a1d9665391940b390 100755 (executable)
@@ -978,8 +978,8 @@ class RandomVinFile(BasicVinFile):
 
        def getrandomframe(self, i):
                t, ds, cs = self.getrandomframeheader(i)
-               data, cdata = self.getnextframedata()
-               return t, ds, cs
+               data, cdata = self.getnextframedata(ds, cs)
+               return t, data, cdata
 
        def getrandomframeheader(self, i):
                if i < 0: raise ValueError, 'negative frame index'
index 4d763b0255430e5ac232e63d5f630a341a0cb6ff..d5ef365ae27e710ff0b1962a2fdcaf894762406f 100755 (executable)
@@ -19,6 +19,11 @@ import flp
 import Viewer
 import getopt
 import string
+import watchcursor
+
+ARROW = 0
+WATCH = 1
+watchcursor.defwatch(WATCH)
 
 
 def main():
@@ -57,6 +62,14 @@ class Editor:
                        if self.vout:
                                self.vout.redraw(val)
 
+       def busy(self):
+               gl.winset(self.form.window)
+               gl.setcursor(WATCH, 0, 0)
+
+       def ready(self):
+               gl.winset(self.form.window)
+               gl.setcursor(ARROW, 0, 0)
+
 
        def iocheck(self):
                self.msg('')
@@ -98,7 +111,18 @@ class Editor:
 
        def cb_in_back(self, *args):
                if not self.icheck(): return
-               if not self.vin.backup(): self.err('Input buffer exhausted')
+               if not self.vin.backup(): self.err('Begin of input file')
+               self.ishow()
+
+       def cb_in_slider(self, *args):
+               if not self.icheck(): return
+               left, pos, right = self.vin.qinfo()
+               i = int(self.in_slider.get_slider_value())
+               i = max(i, left)
+               i = min(i, right)
+               if i == pos: return
+               if not self.vin.seek(i):
+                       self.err('Input seek failed')
                self.ishow()
 
        def cb_in_rewind(self, *args):
@@ -128,7 +152,7 @@ class Editor:
                        return
                self.oshow()
                if not self.vin.backup():
-                       self.err('Input buffer exhausted')
+                       self.err('Begin of input file')
                        return
                self.ishow()
 
@@ -154,6 +178,23 @@ class Editor:
                if not self.vout.backup(): self.err('Output buffer exhausted')
                self.oshow()
 
+       def cb_out_slider(self, *args):
+               if not self.ocheck(): return
+               i = int(self.out_slider.get_slider_value())
+               left, pos, right = self.vout.qinfo()
+               i = int(self.out_slider.get_slider_value())
+               i = max(i, left)
+               i = min(i, right)
+               if i == pos: return
+               if not self.vout.seek(i):
+                       self.err('Output seek failed')
+               self.oshow()
+
+       def cb_out_trunc(self, *arcs):
+               if not self.ocheck(): return
+               self.vout.trunc()
+               self.oshow()
+
        def cb_out_rewind(self, *args):
                if not self.ocheck(): return
                self.vout.rewind()
@@ -171,8 +212,7 @@ class Editor:
                basename = os.path.split(filename)[1]
                title = 'in: ' + basename
                try:
-                       vin = Viewer.InputViewer().init(filename, \
-                               title, self.qsize)
+                       vin = Viewer.InputViewer().init(filename, title)
                except:
                        self.err('Can\'t open input file', filename)
                        return
@@ -183,8 +223,10 @@ class Editor:
 
        def close_input(self):
                if self.vin:
+                       self.busy()
                        self.msg('Closing input file...')
                        self.vin.close()
+                       self.ready()
                self.msg('')
                self.vin = None
                self.in_file.label = '(none)'
@@ -213,8 +255,10 @@ class Editor:
 
        def close_output(self):
                if self.vout:
+                       self.busy()
                        self.msg('Closing output file...')
                        self.vout.close()
+                       self.ready()
                self.msg('')
                self.vout = None
                self.out_file.label = '(none)'
@@ -238,13 +282,15 @@ class Editor:
                if v == None:
                        left = right = pos = 0
                else:
-                       left, right = v.qsizes()
-                       pos = v.tell()
-                       left = pos - left
-                       right = pos + right
+                       left, pos, right = v.qinfo()
                getattr(self, io + '_info1').label = `left`
                getattr(self, io + '_info2').label = `pos`
                getattr(self, io + '_info3').label = `right`
+               sl = getattr(self, io + '_slider')
+               sl.freeze_object()
+               sl.set_slider_bounds(left, right)
+               sl.set_slider_value(pos)
+               sl.unfreeze_object()
 
 
 try:
index 0f1359d5142bfb33736929879027aeed6b417f40..ba59de4d4fd6e9fc38be8f6b260feb52cacedb9b 100644 (file)
@@ -7,14 +7,14 @@ Number of forms: 1
 
 =============== FORM ===============
 Name: form
-Width: 480.000000
-Height: 290.000000
-Number of Objects: 23
+Width: 510.000000
+Height: 350.000000
+Number of Objects: 28
 
 --------------------
 class: 1
 type: 1
-box: 0.000000 0.000000 480.000000 290.000000
+box: 0.000000 0.000000 510.000000 350.000000
 boxtype: 1
 colors: 47 47
 alignment: 4
@@ -26,10 +26,55 @@ name:
 callback: 
 argument: 
 
+--------------------
+class: 1
+type: 6
+box: 10.000000 130.000000 240.000000 209.999985
+boxtype: 6
+colors: 47 47
+alignment: 4
+style: 0
+size: 11.000000
+lcol: 0
+label: 
+name: 
+callback: 
+argument: 
+
+--------------------
+class: 1
+type: 6
+box: 260.000000 130.000000 240.000000 209.999985
+boxtype: 6
+colors: 47 47
+alignment: 4
+style: 0
+size: 11.000000
+lcol: 0
+label: 
+name: 
+callback: 
+argument: 
+
+--------------------
+class: 2
+type: 0
+box: 10.000000 10.000000 430.000000 30.000000
+boxtype: 6
+colors: 47 47
+alignment: 4
+style: 0
+size: 11.000000
+lcol: 0
+label: CMIF Video Editor, by Guido van Rossum
+name: msg_area
+callback: 
+argument: 
+
 --------------------
 class: 11
 type: 4
-box: 180.000000 70.000000 120.000000 40.000000
+box: 200.000000 90.000000 120.000000 30.000000
 boxtype: 1
 colors: 47 47
 alignment: 4
@@ -44,7 +89,7 @@ argument: 0
 --------------------
 class: 11
 type: 4
-box: 90.000000 50.000000 60.000000 60.000000
+box: 210.000000 220.000000 30.000000 30.000000
 boxtype: 1
 colors: 47 47
 alignment: 4
@@ -59,14 +104,14 @@ argument: 0
 --------------------
 class: 11
 type: 0
-box: 10.000000 10.000000 140.000000 30.000000
+box: 20.000000 140.000000 220.000000 30.000000
 boxtype: 1
 colors: 47 47
 alignment: 4
 style: 0
 size: 11.000000
 lcol: 0
-label: Rewind input
+label: Rewind
 name: 
 callback: cb_in_rewind
 argument: 0
@@ -74,14 +119,14 @@ argument: 0
 --------------------
 class: 11
 type: 0
-box: 330.000000 10.000000 140.000000 30.000000
+box: 270.000000 140.000000 100.000000 30.000000
 boxtype: 1
 colors: 47 47
 alignment: 4
 style: 0
 size: 11.000000
 lcol: 0
-label: Clear output
+label: Reset
 name: 
 callback: cb_out_rewind
 argument: 0
@@ -89,14 +134,14 @@ argument: 0
 --------------------
 class: 11
 type: 0
-box: 10.000000 210.000000 80.000000 30.000000
+box: 20.000000 260.000000 160.000000 30.000000
 boxtype: 1
 colors: 47 47
 alignment: 4
 style: 0
 size: 11.000000
 lcol: 0
-label: Input file...
+label: New input file...
 name: 
 callback: cb_in_new
 argument: 0
@@ -104,14 +149,14 @@ argument: 0
 --------------------
 class: 11
 type: 0
-box: 330.000000 210.000000 80.000000 30.000000
+box: 330.000000 260.000000 160.000000 30.000000
 boxtype: 1
 colors: 47 47
 alignment: 4
 style: 0
 size: 11.000000
 lcol: 0
-label: Output file...
+label: New output file...
 name: 
 callback: cb_out_new
 argument: 0
@@ -119,7 +164,7 @@ argument: 0
 --------------------
 class: 2
 type: 0
-box: 10.000000 170.000000 140.000000 30.000000
+box: 20.000000 300.000000 220.000000 30.000000
 boxtype: 6
 colors: 47 47
 alignment: 4
@@ -134,7 +179,7 @@ argument:
 --------------------
 class: 2
 type: 0
-box: 330.000000 170.000000 140.000000 30.000000
+box: 270.000000 300.000000 220.000000 30.000000
 boxtype: 6
 colors: 47 47
 alignment: 4
@@ -146,25 +191,10 @@ name: out_file
 callback: 
 argument: 
 
---------------------
-class: 2
-type: 0
-box: 10.000000 130.000000 30.000000 30.000000
-boxtype: 6
-colors: 47 47
-alignment: 4
-style: 0
-size: 8.000000
-lcol: 0
-label: 
-name: in_info1
-callback: 
-argument: 
-
 --------------------
 class: 11
 type: 0
-box: 170.000000 210.000000 140.000000 30.000000
+box: 450.000000 10.000000 50.000000 30.000000
 boxtype: 1
 colors: 47 47
 alignment: 4
@@ -179,7 +209,7 @@ argument: 0
 --------------------
 class: 11
 type: 4
-box: 330.000000 50.000000 60.000000 60.000000
+box: 270.000000 220.000000 30.000000 30.000000
 boxtype: 1
 colors: 47 47
 alignment: 4
@@ -194,7 +224,7 @@ argument: 0
 --------------------
 class: 11
 type: 4
-box: 10.000000 50.000000 60.000000 60.000000
+box: 20.000000 220.000000 30.000000 30.000000
 boxtype: 1
 colors: 47 47
 alignment: 4
@@ -209,7 +239,7 @@ argument: 0
 --------------------
 class: 11
 type: 4
-box: 410.000000 50.000000 60.000000 60.000000
+box: 460.000000 220.000000 30.000000 30.000000
 boxtype: 1
 colors: 47 47
 alignment: 4
@@ -224,7 +254,7 @@ argument: 0
 --------------------
 class: 11
 type: 4
-box: 180.000000 20.000000 120.000000 40.000000
+box: 200.000000 50.000000 120.000000 30.000000
 boxtype: 1
 colors: 47 47
 alignment: 4
@@ -239,7 +269,7 @@ argument: 0
 --------------------
 class: 11
 type: 0
-box: 100.000000 210.000000 50.000000 30.000000
+box: 190.000000 260.000000 50.000000 30.000000
 boxtype: 1
 colors: 47 47
 alignment: 4
@@ -254,7 +284,7 @@ argument: 0
 --------------------
 class: 11
 type: 0
-box: 420.000000 210.000000 50.000000 30.000000
+box: 270.000000 260.000000 50.000000 30.000000
 boxtype: 1
 colors: 47 47
 alignment: 4
@@ -266,25 +296,55 @@ name:
 callback: cb_out_close
 argument: 0
 
+--------------------
+class: 21
+type: 1
+box: 60.000000 220.000000 140.000000 30.000000
+boxtype: 2
+colors: 47 47
+alignment: 1
+style: 0
+size: 11.000000
+lcol: 0
+label: 
+name: in_slider
+callback: cb_in_slider
+argument: 0
+
+--------------------
+class: 21
+type: 1
+box: 310.000000 220.000000 140.000000 30.000000
+boxtype: 2
+colors: 47 47
+alignment: 1
+style: 0
+size: 11.000000
+lcol: 0
+label: 
+name: out_slider
+callback: cb_out_slider
+argument: 0
+
 --------------------
 class: 2
 type: 0
-box: 10.000000 250.000000 460.000000 30.000000
+box: 20.000000 180.000000 30.000000 30.000000
 boxtype: 6
 colors: 47 47
 alignment: 4
 style: 0
-size: 11.000000
+size: 8.000000
 lcol: 0
-label: CMIF Video Editor, by Guido van Rossum
-name: msg_area
+label: 
+name: in_info1
 callback: 
 argument: 
 
 --------------------
 class: 2
 type: 0
-box: 50.000000 130.000000 60.000004 30.000000
+box: 100.000000 180.000000 60.000004 30.000000
 boxtype: 6
 colors: 47 47
 alignment: 4
@@ -299,7 +359,7 @@ argument:
 --------------------
 class: 2
 type: 0
-box: 120.000000 130.000000 30.000000 30.000000
+box: 210.000000 180.000000 30.000000 30.000000
 boxtype: 6
 colors: 47 47
 alignment: 4
@@ -314,7 +374,7 @@ argument:
 --------------------
 class: 2
 type: 0
-box: 330.000000 130.000000 30.000000 30.000000
+box: 270.000000 180.000000 30.000000 30.000000
 boxtype: 6
 colors: 47 47
 alignment: 4
@@ -329,7 +389,7 @@ argument:
 --------------------
 class: 2
 type: 0
-box: 370.000000 130.000000 60.000004 30.000000
+box: 350.000000 180.000000 60.000004 30.000000
 boxtype: 6
 colors: 47 47
 alignment: 4
@@ -344,7 +404,7 @@ argument:
 --------------------
 class: 2
 type: 0
-box: 440.000000 130.000000 30.000000 30.000000
+box: 460.000000 180.000000 30.000000 30.000000
 boxtype: 6
 colors: 47 47
 alignment: 4
@@ -356,5 +416,20 @@ name: out_info3
 callback: 
 argument: 
 
+--------------------
+class: 11
+type: 0
+box: 390.000000 140.000000 100.000000 30.000000
+boxtype: 1
+colors: 47 47
+alignment: 4
+style: 0
+size: 11.000000
+lcol: 0
+label: Truncate
+name: 
+callback: cb_out_trunc
+argument: 0
+
 ==============================
 create_the_forms
index 2a7b2ebb5ed7cefa20415b4b0e88c222dd7d963d..2b9607b64cc32b0dc11440ed03a5e784b30a0e9b 100755 (executable)
@@ -5,16 +5,17 @@ import os
 
 class InputViewer:
 
-       def init(self, filename, title, qsize):
+       def init(self, filename, title, *args):
                try:
                        self.vin = VFile.VinFile().init(filename)
                except (EOFError, VFile.Error):
                        raise IOError, 'bad video input file'
+               self.vin.warmcache()
                if not title:
                        title = os.path.split(filename)[1]
                self.filename = filename
                self.title = title
-               self.qsize = qsize
+               self.qsize = len(self.vin.index)
                gl.foreground()
                gl.prefsize(self.vin.width, self.vin.height)
                self.wid = -1
@@ -39,27 +40,7 @@ class InputViewer:
                        gl.winset(self.wid)
                        gl.clear()
                        self.vin.initcolormap()
-               self.queue = []
                self.qindex = 0
-               self.lost = 0
-               self.lastt = 0
-               self.eofread = 0
-
-       # Internal
-       def fillq(self):
-               if self.qindex < len(self.queue) or self.eofread: return
-               try:
-                       t, d, cd = self.vin.getnextframe()
-               except EOFError:
-                       self.eofread = 1
-                       return
-               dt = t - self.lastt
-               self.lastt = t
-               self.queue.append(dt, d, cd)
-               while len(self.queue) > self.qsize:
-                       del self.queue[0]
-                       self.qindex = self.qindex - 1
-                       self.lost = self.lost + 1
 
        def show(self):
                if self.wid < 0:
@@ -68,12 +49,11 @@ class InputViewer:
                        self.wid = gl.winopen(self.title)
                        gl.clear()
                        self.vin.initcolormap()
-               self.fillq()
                gl.winset(self.wid)
-               if self.qindex >= len(self.queue):
+               if self.qindex >= self.qsize:
                        self.vin.clear()
                        return
-               dt, d, cd = self.queue[self.qindex]
+               dt, d, cd = self.vin.getrandomframe(self.qindex)
                self.vin.showframe(d, cd)
 
        def redraw(self, wid):
@@ -84,13 +64,16 @@ class InputViewer:
                        self.show()
 
        def get(self):
-               if self.qindex >= len(self.queue):
-                       self.fillq()
-                       if self.eofread:
-                               return None
-               item = self.queue[self.qindex]
+               if self.qindex >= self.qsize:
+                       return None
+               if self.qindex > 0:
+                       prevt, ds, cs = \
+                                 self.vin.getrandomframeheader(self.qindex-1)
+               else:
+                       prevt = 0
+               t, data, cdata = self.vin.getrandomframe(self.qindex)
                self.qindex = self.qindex + 1
-               return item
+               return t-prevt, data, cdata
 
        def backup(self):
                if self.qindex == 0:
@@ -98,11 +81,20 @@ class InputViewer:
                self.qindex = self.qindex - 1
                return 1
 
+       def seek(self, i):
+               if not 0 <= i <= self.qsize:
+                       return 0
+               self.qindex = i
+               return 1
+
        def tell(self):
-               return self.lost + self.qindex
+               return self.qindex
 
        def qsizes(self):
-               return self.qindex, len(self.queue) - self.qindex
+               return self.qindex, self.qsize - self.qindex
+
+       def qinfo(self):
+               return 0, self.qindex, self.qsize
 
 
 class OutputViewer:
@@ -206,12 +198,33 @@ class OutputViewer:
                while len(self.queue) > self.qsize:
                        self.flushq()
 
+       def seek(self, i):
+               i = i - self.written
+               if not 0 <= i <= len(self.queue) + len(self.spares):
+                       return 0
+               while i < len(self.queue):
+                       if not self.backup():
+                               return 0
+               while i > len(self.queue):
+                       if not self.forward():
+                               return 0
+               return 1
+
+       def trunc(self):
+               del self.spares[:]
+
        def tell(self):
                return self.written + len(self.queue)
 
        def qsizes(self):
                return len(self.queue), len(self.spares)
 
+       def qinfo(self):
+               first = self.written
+               pos = first + len(self.queue)
+               last = pos + len(self.spares)
+               return first, pos, last
+
 
 def test():
        import sys