mirror of
https://github.com/python/cpython
synced 2024-10-21 04:43:36 +00:00
VFile: The Entry-Indigo trick doesn't work on 4.0.1 hosts.
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.
This commit is contained in:
parent
3577113d83
commit
269b2a2eb7
|
@ -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):
|
||||
|
|
|
@ -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')
|
||||
|
|
Loading…
Reference in a new issue