import gl, GL import VFile import os class InputViewer: def __init__(self, filename, title, *args): try: self.vin = VFile.VinFile(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 = len(self.vin.index) gl.foreground() gl.prefsize(self.vin.width, self.vin.height) self.wid = -1 self.reset() def close(self): self.vin.close() if self.wid > 0: gl.winclose(self.wid) def rewind(self): self.vin.rewind() self.reset() def getinfo(self): return self.vin.getinfo() # Internal def reset(self): if self.wid > 0: gl.winset(self.wid) gl.clear() self.vin.initcolormap() self.qindex = 0 def show(self): if self.wid < 0: gl.foreground() gl.prefsize(self.vin.width, self.vin.height) self.wid = gl.winopen(self.title) gl.clear() self.vin.initcolormap() gl.winset(self.wid) if self.qindex >= self.qsize: self.vin.clear() return dt, d, cd = self.vin.getrandomframe(self.qindex) self.vin.showframe(d, cd) def redraw(self, wid): if wid == self.wid >= 0: gl.winset(self.wid) gl.reshapeviewport() self.vin.clear() self.show() def get(self): 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 t-prevt, data, cdata def backup(self): if self.qindex == 0: return 0 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.qindex def qsizes(self): return self.qindex, self.qsize - self.qindex def qinfo(self): return 0, self.qindex, self.qsize class OutputViewer: def __init__(self, filename, title, qsize): try: self.vout = VFile.VoutFile(filename) except (EOFError, VFile.Error): raise IOError, 'bad video output file' if not title: title = os.path.split(filename)[1] self.filename = filename self.title = title self.qsize = qsize gl.foreground() self.wid = -1 self.reset() def close(self): while self.queue: self.flushq() self.vout.close() if self.wid > 0: gl.winclose(self.wid) def rewind(self): info = self.vout.getinfo() self.vout.close() self.vout = VFile.VoutFile(self.filename) self.vout.setinfo(info) self.reset() def getinfo(self): return self.vout.getinfo() def setinfo(self, info): if info == self.getinfo(): return # No change self.vout.setinfo(info) if self.wid > 0: gl.winclose(self.wid) self.wid = -1 # Internal def reset(self): if self.wid > 0: gl.winset(self.wid) gl.clear() self.vout.initcolormap() self.queue = [] self.spares = [] self.written = 0 self.lastt = 0 # Internal def flushq(self): if self.written == 0: self.vout.writeheader() dt, d, cd = self.queue[0] self.lastt = self.lastt + dt self.vout.writeframe(self.lastt, d, cd) del self.queue[0] self.written = self.written + 1 def show(self): if self.wid < 0: gl.foreground() gl.prefsize(self.vout.width, self.vout.height) self.wid = gl.winopen(self.title) gl.clear() self.vout.initcolormap() gl.winset(self.wid) if not self.queue: self.vout.clear() return dt, d, cd = self.queue[-1] self.vout.showframe(d, cd) def redraw(self, wid): if wid == self.wid >= 0: gl.winset(self.wid) gl.reshapeviewport() self.vout.clear() self.show() def backup(self): if len(self.queue) < 1: return 0 self.spares.insert(0, self.queue[-1]) del self.queue[-1] return 1 def forward(self): if not self.spares: return 0 self.queue.append(self.spares[0]) del self.spares[0] return 1 def put(self, item): self.queue.append(item) self.spares = [] 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 a = InputViewer(sys.argv[1], '') b = OutputViewer(sys.argv[2], '') b.setinfo(a.getinfo()) while 1: a.show() data = a.get() if data is None: break b.put(data) b.show() while a.backup(): data = a.get() b.put(data) b.show() if a.backup(): a.show() while 1: data = a.get() if data is None: break b.put(data) b.show() a.show() b.close()