diff --git a/Demo/sgi/video/VFile.py b/Demo/sgi/video/VFile.py index 9e1eb36b2f0..c61ac04a031 100755 --- a/Demo/sgi/video/VFile.py +++ b/Demo/sgi/video/VFile.py @@ -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' diff --git a/Demo/sgi/video/Vedit.py b/Demo/sgi/video/Vedit.py index 4d763b02554..d5ef365ae27 100755 --- a/Demo/sgi/video/Vedit.py +++ b/Demo/sgi/video/Vedit.py @@ -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: diff --git a/Demo/sgi/video/VeditForm.fd b/Demo/sgi/video/VeditForm.fd index 0f1359d5142..ba59de4d4fd 100644 --- a/Demo/sgi/video/VeditForm.fd +++ b/Demo/sgi/video/VeditForm.fd @@ -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 diff --git a/Demo/sgi/video/Viewer.py b/Demo/sgi/video/Viewer.py index 2a7b2ebb5ed..2b9607b64cc 100755 --- a/Demo/sgi/video/Viewer.py +++ b/Demo/sgi/video/Viewer.py @@ -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