diff --git a/Demo/sgi/video/VFile.py b/Demo/sgi/video/VFile.py index e5aea4188887..1516464cfc88 100755 --- a/Demo/sgi/video/VFile.py +++ b/Demo/sgi/video/VFile.py @@ -324,13 +324,14 @@ def initcolormap(self): gl.RGBcolor(200, 200, 200) # XXX rather light grey gl.clear() return - if self.format == 'rgb8' and is_entry_indigo(): - gl.RGBmode() - gl.gconfig() - gl.RGBcolor(200, 200, 200) # XXX rather light grey - gl.clear() - gl.pixmode(GL.PM_SIZE, 8) - return +## XXX Unfortunately this doesn't work on IRIX 4.0.1... +## if self.format == 'rgb8' and is_entry_indigo(): +## gl.RGBmode() +## gl.gconfig() +## gl.RGBcolor(200, 200, 200) # XXX rather light grey +## gl.clear() +## gl.pixmode(GL.PM_SIZE, 8) +## return gl.cmode() gl.gconfig() self.skipchrom = 0 @@ -756,7 +757,7 @@ def skipnextframedata(self, ds, cs): self.framecount = self.framecount + 1 -# Derived class implementing random access +# Derived class implementing random access and index cached in the file class RandomVinFile(BasicVinFile): @@ -767,12 +768,58 @@ def initfp(self, fp, filename): def warmcache(self): if len(self.index) == 0: - self.rewind() - while 1: - try: dummy = self.skipnextframe() - except EOFError: break + try: + self.readcache() + except Error: + self.buildcache() else: print '[RandomVinFile.warmcache(): too late]' + self.rewind() + + def buildcache(self): + self.index = [] + self.rewind() + while 1: + try: dummy = self.skipnextframe() + except EOFError: break + self.rewind() + + def writecache(self): + # Raises IOerror if the file is not seekable & writable! + import marshal + if len(self.index) == 0: + self.buildcache() + if len(self.index) == 0: + raise Error, self.filename + ': No frames' + self.fp.seek(0, 2) + self.fp.write('\n/////CMIF/////\n') + pos = self.fp.tell() + data = `pos` + data = '\n-*-*-CMIF-*-*-\n' + data + ' '*(15-len(data)) + '\n' + try: + marshal.dump(self.index, self.fp) + self.fp.write(data) + self.fp.flush() + finally: + self.rewind() + + def readcache(self): + # Raises Error if there is no cache in the file + import marshal + if len(self.index) <> 0: + raise CallError + self.fp.seek(-32, 2) + data = self.fp.read() + if data[:16] <> '\n-*-*-CMIF-*-*-\n' or data[-1:] <> '\n': + self.rewind() + raise Error, self.filename + ': No cache' + pos = eval(data[16:-1]) + self.fp.seek(pos) + try: + self.index = marshal.load(self.fp) + except TypeError: + self.rewind() + raise Error, self.filename + ': Bad cache' self.rewind() def getnextframeheader(self): diff --git a/Demo/sgi/video/Vinfo.py b/Demo/sgi/video/Vinfo.py index cfda32a76ff1..cf89a8d397dd 100755 --- a/Demo/sgi/video/Vinfo.py +++ b/Demo/sgi/video/Vinfo.py @@ -54,7 +54,7 @@ def main(): def process(filename): try: - vin = VFile.VinFile().init(filename) + vin = VFile.RandomVinFile().init(filename) except IOError, msg: sys.stderr.write(filename + ': I/O error: ' + `msg` + '\n') return 1 @@ -71,6 +71,12 @@ def process(filename): vin.close() return + try: + vin.readcache() + print '[Using cached index]' + except VFile.Error: + print '[Constructing index on the fly]' + if not short: if delta: print 'Frame time deltas:', @@ -83,11 +89,12 @@ def process(filename): datasize = 0 while 1: try: - t, data, cdata = vin.getnextframe() + t, ds, cs = vin.getnextframeheader() + vin.skipnextframedata(ds, cs) except EOFError: break - datasize = datasize + len(data) - if cdata: datasize = datasize + len(cdata) + datasize = datasize + ds + if cs: datasize = datasize + cs if not short: if n%8 == 0: sys.stdout.write('\n')