]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
VFile: The Entry-Indigo trick doesn't work on 4.0.1 hosts.
authorGuido van Rossum <guido@python.org>
Tue, 8 Sep 1992 15:04:01 +0000 (15:04 +0000)
committerGuido van Rossum <guido@python.org>
Tue, 8 Sep 1992 15:04:01 +0000 (15:04 +0000)
VFile: RandomVinFile can now write the cache to the file.
Vinfo: use the cached index if present and print a message whether it's there.

Demo/sgi/video/VFile.py
Demo/sgi/video/Vinfo.py

index e5aea418888755f933e495071a9539c1a83ea506..1516464cfc8844914fc5472d6162369d69337cab 100755 (executable)
@@ -324,13 +324,14 @@ class Displayer(VideoParams):
                        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 @@ class BasicVinFile(VideoParams):
                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 @@ class RandomVinFile(BasicVinFile):
 
        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):
index cfda32a76ff1d9f888f72e6496cf9685a4cf11e6..cf89a8d397dd62e67945acda60f3b9733bd1630e 100755 (executable)
@@ -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')