mirror of
https://github.com/python/cpython.git
synced 2024-12-01 05:45:40 +08:00
VFile.py: fix bogus getrandomframe().
Vedit.py, VeditForm.fd: added scroll bar, Trunc, layout rearrangement. Viewer.py: added random access, qinfo() function.
This commit is contained in:
parent
4e2a4278e8
commit
9b86e1f5f0
@ -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'
|
||||
|
@ -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:
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user