blob: 5b9cd014d8601b1ce10de4641f6ad31b9f24cb84 [file] [log] [blame]
Guido van Rossum094a9de1991-12-03 16:50:00 +00001# VFile -- two classes for Video Files.
2# VinFile -- for video input.
3# VoutFile -- for video output.
4
5import sys
6import gl
7import GL
Guido van Rossum444339d1991-12-03 16:52:40 +00008import colorsys
Guido van Rossum094a9de1991-12-03 16:50:00 +00009
10Error = 'VFile.Error' # Exception
11
Guido van Rossum2080b341992-02-28 15:59:23 +000012# Missing from GL.py:
13DMRGB = 0
14
Guido van Rossum58b38cc1992-02-11 14:45:43 +000015MAXMAP = 4096 - 256
16
Guido van Rossum444339d1991-12-03 16:52:40 +000017def conv_grey(l,x,y): return colorsys.yiq_to_rgb(l,0,0)
18def conv_yiq (y,i,q): return colorsys.yiq_to_rgb(y, (i-0.5)*1.2, q-0.5)
19def conv_hls (l,h,s): return colorsys.hls_to_rgb(h,l,s)
20def conv_hsv (v,h,s): return colorsys.hsv_to_rgb(h,s,v)
21def conv_rgb (r,g,b):
Guido van Rossum58b38cc1992-02-11 14:45:43 +000022 raise Error, 'Attempt to make RGB colormap'
Guido van Rossum2080b341992-02-28 15:59:23 +000023def conv_rgb8(rgb,d1,d2):
24 rgb = int(rgb*255.0)
25 r = (rgb >> 5) & 0x07
26 g = (rgb ) & 0x07
27 b = (rgb >> 3) & 0x03
28 return (r/7.0, g/7.0, b/3.0)
Guido van Rossum094a9de1991-12-03 16:50:00 +000029
30# Class VinFile represents a video file used for input.
31#
32# It has the following methods:
33# init(filename)
34# initfp(fp, filename)
35# rewind()
Guido van Rossum7268c931992-08-18 21:11:18 +000036# getnextframe()
37# skipnextframe()
38# (and many more)
Guido van Rossum094a9de1991-12-03 16:50:00 +000039#
40# The following read-only data members provide public information:
41# version
42# filename
43# width, height
44# packfactor
Guido van Rossum444339d1991-12-03 16:52:40 +000045# c0bits, c1bits, c2bits, chrompack
46# offset
47# format
Guido van Rossum094a9de1991-12-03 16:50:00 +000048#
49# These writable data members provide additional parametrization:
Guido van Rossum58b38cc1992-02-11 14:45:43 +000050# magnify
Guido van Rossum094a9de1991-12-03 16:50:00 +000051# xorigin, yorigin
Guido van Rossum2080b341992-02-28 15:59:23 +000052# fallback
Guido van Rossum094a9de1991-12-03 16:50:00 +000053
Guido van Rossum7ff90ef1992-08-18 14:16:21 +000054class VinFile:
Guido van Rossum094a9de1991-12-03 16:50:00 +000055
56 # init() and initfp() raise Error if the header is bad.
57 # init() raises whatever open() raises if the file can't be opened.
58
59 def init(self, filename):
Guido van Rossum58b38cc1992-02-11 14:45:43 +000060 if filename == '-':
Guido van Rossum094a9de1991-12-03 16:50:00 +000061 return self.initfp(sys.stdin, filename)
62 return self.initfp(open(filename, 'r'), filename)
63
Guido van Rossum7ff90ef1992-08-18 14:16:21 +000064 def initfp(self, fp, filename):
Guido van Rossum094a9de1991-12-03 16:50:00 +000065 self.colormapinited = 0
66 self.magnify = 1.0
67 self.xorigin = self.yorigin = 0
Guido van Rossum2080b341992-02-28 15:59:23 +000068 self.fallback = 1
69 self.skipchrom = 0
Guido van Rossum094a9de1991-12-03 16:50:00 +000070 self.fp = fp
71 self.filename = filename
72 #
73 line = self.fp.readline()
Guido van Rossum58b38cc1992-02-11 14:45:43 +000074 if line == 'CMIF video 1.0\n':
Guido van Rossum094a9de1991-12-03 16:50:00 +000075 self.version = 1.0
Guido van Rossum58b38cc1992-02-11 14:45:43 +000076 elif line == 'CMIF video 2.0\n':
Guido van Rossum094a9de1991-12-03 16:50:00 +000077 self.version = 2.0
Guido van Rossum58b38cc1992-02-11 14:45:43 +000078 elif line == 'CMIF video 3.0\n':
Guido van Rossum444339d1991-12-03 16:52:40 +000079 self.version = 3.0
Guido van Rossum094a9de1991-12-03 16:50:00 +000080 else:
81 raise Error, self.filename + ': bad video format'
82 #
83 if self.version < 2.0:
Guido van Rossum444339d1991-12-03 16:52:40 +000084 self.c0bits, self.c1bits, self.c2bits = 8, 0, 0
Guido van Rossum094a9de1991-12-03 16:50:00 +000085 self.chrompack = 0
Guido van Rossum444339d1991-12-03 16:52:40 +000086 self.offset = 0
87 self.format = 'grey'
Guido van Rossum58b38cc1992-02-11 14:45:43 +000088 elif self.version == 2.0:
Guido van Rossum094a9de1991-12-03 16:50:00 +000089 line = self.fp.readline()
90 try:
Guido van Rossum444339d1991-12-03 16:52:40 +000091 self.c0bits, self.c1bits, self.c2bits, \
Guido van Rossum094a9de1991-12-03 16:50:00 +000092 self.chrompack = eval(line[:-1])
Guido van Rossum444339d1991-12-03 16:52:40 +000093 if self.c1bits or self.c2bits:
Guido van Rossum58b38cc1992-02-11 14:45:43 +000094 self.format = 'yiq'
Guido van Rossum444339d1991-12-03 16:52:40 +000095 else:
Guido van Rossum58b38cc1992-02-11 14:45:43 +000096 self.format = 'grey'
Guido van Rossum444339d1991-12-03 16:52:40 +000097 self.offset = 0
Guido van Rossum094a9de1991-12-03 16:50:00 +000098 except:
Guido van Rossum58b38cc1992-02-11 14:45:43 +000099 raise Error, \
100 self.filename + ': bad 2.0 color info'
101 elif self.version == 3.0:
Guido van Rossum444339d1991-12-03 16:52:40 +0000102 line = self.fp.readline()
103 try:
Guido van Rossum58b38cc1992-02-11 14:45:43 +0000104 self.format, rest = eval(line[:-1])
105 if self.format == 'rgb':
Guido van Rossum2080b341992-02-28 15:59:23 +0000106 self.offset = 0
107 self.c0bits = 0
108 self.c1bits = 0
109 self.c2bits = 0
110 self.chrompack = 0
Guido van Rossum58b38cc1992-02-11 14:45:43 +0000111 elif self.format == 'grey':
112 self.offset = 0
113 self.c0bits = rest
114 self.c1bits = self.c2bits = \
Guido van Rossum444339d1991-12-03 16:52:40 +0000115 self.chrompack = 0
Guido van Rossum58b38cc1992-02-11 14:45:43 +0000116 else:
117 self.c0bits,self.c1bits,self.c2bits,\
118 self.chrompack,self.offset = rest
Guido van Rossum444339d1991-12-03 16:52:40 +0000119 except:
Guido van Rossum58b38cc1992-02-11 14:45:43 +0000120 raise Error, \
121 self.filename + ': bad 3.0 color info'
Guido van Rossum444339d1991-12-03 16:52:40 +0000122
123 try:
Guido van Rossum58b38cc1992-02-11 14:45:43 +0000124 self.convcolor = eval('conv_'+self.format)
Guido van Rossum444339d1991-12-03 16:52:40 +0000125 except:
Guido van Rossum58b38cc1992-02-11 14:45:43 +0000126 raise Error, \
127 self.filename + ': unknown colorsys ' + self.format
Guido van Rossum094a9de1991-12-03 16:50:00 +0000128 #
129 line = self.fp.readline()
130 try:
131 x = eval(line[:-1])
Guido van Rossum58b38cc1992-02-11 14:45:43 +0000132 if self.version > 1.0 or len(x) == 3:
Guido van Rossum094a9de1991-12-03 16:50:00 +0000133 self.width, self.height, self.packfactor = x
Guido van Rossum58b38cc1992-02-11 14:45:43 +0000134 if self.packfactor == 0:
135 self.format = 'rgb'
Guido van Rossum094a9de1991-12-03 16:50:00 +0000136 else:
137 sef.width, self.height = x
138 self.packfactor = 2
139 except:
140 raise Error, self.filename + ': bad (w,h,pf) info'
Guido van Rossum2080b341992-02-28 15:59:23 +0000141 self.frameno = 0
142 self.framecache = []
143 self.hascache = 0
Guido van Rossum094a9de1991-12-03 16:50:00 +0000144 #
145 return self
146
Guido van Rossum2080b341992-02-28 15:59:23 +0000147 def warmcache(self):
148 if self.hascache: return
149 n = 0
150 try:
151 while 1:
152 void = self.skipnextframe()
153 n = n + 1
154 except EOFError:
155 pass
156 if not self.hascache:
157 raise Error, 'Cannot warm cache'
158
Guido van Rossumbc0eb991992-08-18 17:00:51 +0000159 def close(self):
160 self.fp.close()
161 self.fp = None
162
Guido van Rossum2080b341992-02-28 15:59:23 +0000163
164 #
165 # getinfo returns all info pertaining to a film. The returned tuple
166 # can be passed to VoutFile.setinfo()
167 #
168 def getinfo(self):
169 return (self.format, self.width, self.height, self.packfactor,\
170 self.c0bits, self.c1bits, self.c2bits, self.offset, \
171 self.chrompack)
172
Guido van Rossum094a9de1991-12-03 16:50:00 +0000173 # rewind() raises Error if the header is bad (which can only
174 # happen if the file was written to since opened).
175
176 def rewind(self):
177 self.fp.seek(0)
178 x = self.initfp(self.fp, self.filename)
179
Guido van Rossum2080b341992-02-28 15:59:23 +0000180 def position(self):
181 if self.frameno >= len(self.framecache):
182 raise EOFError
183 self.fp.seek(self.framecache[self.frameno][0])
184
Guido van Rossum094a9de1991-12-03 16:50:00 +0000185 # getnextframe() raises EOFError (built-in) if there is no next frame,
186 # or if the next frame is broken.
187 # So to getnextframeheader(), getnextframedata() and skipnextframe().
188
189 def getnextframe(self):
190 time, size, chromsize = self.getnextframeheader()
191 data, chromdata = self.getnextframedata(size, chromsize)
192 return time, data, chromdata
193
194 def getnextframedata(self, (size, chromsize)):
Guido van Rossum2080b341992-02-28 15:59:23 +0000195 if self.hascache:
196 self.position()
197 self.frameno = self.frameno + 1
Guido van Rossum094a9de1991-12-03 16:50:00 +0000198 data = self.fp.read(size)
199 if len(data) <> size: raise EOFError
200 if chromsize:
201 chromdata = self.fp.read(chromsize)
202 if len(chromdata) <> chromsize: raise EOFError
203 else:
204 chromdata = None
205 #
206 return data, chromdata
207
208 def skipnextframe(self):
209 time, size, chromsize = self.getnextframeheader()
210 self.skipnextframedata(size, chromsize)
211 return time
212
213 def skipnextframedata(self, (size, chromsize)):
Guido van Rossum2080b341992-02-28 15:59:23 +0000214 if self.hascache:
215 self.frameno = self.frameno + 1
216 return
Guido van Rossum094a9de1991-12-03 16:50:00 +0000217 # Note that this won't raise EOFError for a partial frame.
218 try:
Guido van Rossum58b38cc1992-02-11 14:45:43 +0000219 self.fp.seek(size + chromsize, 1) # Relative seek
Guido van Rossum094a9de1991-12-03 16:50:00 +0000220 except:
221 # Assume it's a pipe -- read the data to discard it
Guido van Rossum58b38cc1992-02-11 14:45:43 +0000222 dummy = self.fp.read(size + chromsize)
Guido van Rossum094a9de1991-12-03 16:50:00 +0000223
224 def getnextframeheader(self):
Guido van Rossum2080b341992-02-28 15:59:23 +0000225 if self.hascache:
226 if self.frameno >= len(self.framecache):
227 raise EOFError
228 return self.framecache[self.frameno][1]
Guido van Rossum094a9de1991-12-03 16:50:00 +0000229 line = self.fp.readline()
230 if not line:
Guido van Rossum2080b341992-02-28 15:59:23 +0000231 self.hascache = 1
Guido van Rossum094a9de1991-12-03 16:50:00 +0000232 raise EOFError
233 #
234 w, h, pf = self.width, self.height, self.packfactor
235 try:
236 x = eval(line[:-1])
237 if type(x) in (type(0), type(0.0)):
238 time = x
Guido van Rossum58b38cc1992-02-11 14:45:43 +0000239 if pf == 0:
Guido van Rossum094a9de1991-12-03 16:50:00 +0000240 size = w * h * 4
241 else:
242 size = (w/pf) * (h/pf)
Guido van Rossum58b38cc1992-02-11 14:45:43 +0000243 elif len(x) == 2:
Guido van Rossum094a9de1991-12-03 16:50:00 +0000244 time, size = x
245 cp = self.chrompack
246 if cp:
247 cw = (w + cp - 1) / cp
248 ch = (h + cp - 1) / cp
249 chromsize = 2 * cw * ch
250 else:
251 chromsize = 0
252 else:
253 time, size, chromsize = x
254 except:
255 raise Error, self.filename + ': bad frame header'
Guido van Rossum2080b341992-02-28 15:59:23 +0000256 cdata = (self.fp.tell(), (time, size, chromsize))
257 self.framecache.append(cdata)
Guido van Rossum094a9de1991-12-03 16:50:00 +0000258 return time, size, chromsize
259
260 def shownextframe(self):
261 time, data, chromdata = self.getnextframe()
262 self.showframe(data, chromdata)
263 return time
264
265 def showframe(self, (data, chromdata)):
266 w, h, pf = self.width, self.height, self.packfactor
Guido van Rossum444339d1991-12-03 16:52:40 +0000267 if not self.colormapinited:
268 self.initcolormap()
Guido van Rossum094a9de1991-12-03 16:50:00 +0000269 factor = self.magnify
270 if pf: factor = factor * pf
Guido van Rossum2080b341992-02-28 15:59:23 +0000271 if chromdata and not self.skipchrom:
Guido van Rossum094a9de1991-12-03 16:50:00 +0000272 cp = self.chrompack
273 cw = (w+cp-1)/cp
274 ch = (h+cp-1)/cp
275 gl.rectzoom(factor*cp, factor*cp)
276 gl.pixmode(GL.PM_SIZE, 16)
Guido van Rossum444339d1991-12-03 16:52:40 +0000277 gl.writemask(self.mask - ((1 << self.c0bits) - 1))
Guido van Rossum094a9de1991-12-03 16:50:00 +0000278 gl.lrectwrite(self.xorigin, self.yorigin, \
279 self.xorigin + cw - 1, self.yorigin + ch - 1, \
280 chromdata)
281 #
282 if pf:
Guido van Rossum444339d1991-12-03 16:52:40 +0000283 gl.writemask((1 << self.c0bits) - 1)
Guido van Rossum094a9de1991-12-03 16:50:00 +0000284 gl.pixmode(GL.PM_SIZE, 8)
285 gl.rectzoom(factor, factor)
286 w = w/pf
287 h = h/pf
288 gl.lrectwrite(self.xorigin, self.yorigin, \
289 self.xorigin + w - 1, self.yorigin + h - 1, data)
290
291 def initcolormap(self):
Guido van Rossum094a9de1991-12-03 16:50:00 +0000292 self.colormapinited = 1
Guido van Rossum58b38cc1992-02-11 14:45:43 +0000293 if self.format == 'rgb':
294 gl.RGBmode()
295 gl.gconfig()
296 return
297 gl.cmode()
298 gl.gconfig()
Guido van Rossum2080b341992-02-28 15:59:23 +0000299 self.skipchrom = 0
Guido van Rossum58b38cc1992-02-11 14:45:43 +0000300 sys.stderr.write('Initializing color map...')
Guido van Rossum2080b341992-02-28 15:59:23 +0000301 self.initcmap()
Guido van Rossum58b38cc1992-02-11 14:45:43 +0000302 sys.stderr.write(' Done.\n')
Guido van Rossum444339d1991-12-03 16:52:40 +0000303 if self.offset == 0:
Guido van Rossum58b38cc1992-02-11 14:45:43 +0000304 gl.color(0x800)
Guido van Rossum2080b341992-02-28 15:59:23 +0000305 gl.clear()
Guido van Rossum58b38cc1992-02-11 14:45:43 +0000306 self.mask = 0x7ff
Guido van Rossum444339d1991-12-03 16:52:40 +0000307 else:
Guido van Rossum58b38cc1992-02-11 14:45:43 +0000308 self.mask = 0xfff
Guido van Rossum444339d1991-12-03 16:52:40 +0000309 gl.clear()
Guido van Rossum094a9de1991-12-03 16:50:00 +0000310
311
Guido van Rossum2080b341992-02-28 15:59:23 +0000312 def initcmap(self):
313 maxbits = gl.getgdesc(GL.GD_BITS_NORM_SNG_CMODE)
314 if maxbits > 11:
315 maxbits = 11
316 c0bits, c1bits, c2bits = self.c0bits, self.c1bits, self.c2bits
317 if c0bits+c1bits+c2bits > maxbits:
318 if self.fallback and c0bits < maxbits:
319 # Cannot display film in this mode, use mono
320 self.skipchrom = 1
321 c1bits = c2bits = 0
322 self.convcolor = conv_grey
Guido van Rossum094a9de1991-12-03 16:50:00 +0000323 else:
Guido van Rossum2080b341992-02-28 15:59:23 +0000324 raise Error, 'Sorry, '+`maxbits`+ \
325 ' bits max on this machine'
326 maxc0 = 1 << c0bits
327 maxc1 = 1 << c1bits
328 maxc2 = 1 << c2bits
329 if self.offset == 0 and maxbits == 11:
330 offset = 2048
331 else:
332 offset = self.offset
333 if maxbits <> 11:
334 offset = offset & ((1<<maxbits)-1)
335 #for i in range(512, MAXMAP):
336 # gl.mapcolor(i, 0, 0, 0)
337 #void = gl.qtest() # Should be gl.gflush()
338 for c0 in range(maxc0):
339 c0v = c0/float(maxc0-1)
340 for c1 in range(maxc1):
341 if maxc1 == 1:
342 c1v = 0
Guido van Rossum094a9de1991-12-03 16:50:00 +0000343 else:
Guido van Rossum2080b341992-02-28 15:59:23 +0000344 c1v = c1/float(maxc1-1)
345 for c2 in range(maxc2):
346 if maxc2 == 1:
347 c2v = 0
348 else:
349 c2v = c2/float(maxc2-1)
350 index = offset + c0 + (c1<<c0bits) + \
351 (c2 << (c0bits+c1bits))
352 rv, gv, bv = self.convcolor( \
353 c0v, c1v, c2v)
354 r, g, b = int(rv*255.0), \
355 int(gv*255.0), int(bv*255.0)
356 if index < MAXMAP:
357 gl.mapcolor(index, r, g, b)
358 void = gl.gflush()
Guido van Rossum094a9de1991-12-03 16:50:00 +0000359
Guido van Rossum2080b341992-02-28 15:59:23 +0000360#
361# A set of routines to grab images from windows
362#
363def grab_rgb(w, h, pf):
364 if gl.getdisplaymode() <> DMRGB:
365 raise Error, 'Sorry, can only grab rgb in single-buf rgbmode'
366 if pf <> 1 and pf <> 0:
367 raise Error, 'Sorry, only grab with packfactor=1'
368 return gl.lrectread(0, 0, w-1, h-1), None
369
370def grab_rgb8(w, h, pf):
371 if gl.getdisplaymode() <> DMRGB:
372 raise Error, 'Sorry, can only grab rgb in single-buf rgbmode'
373 if pf <> 1 and pf <> 0:
374 raise Error, 'Sorry, can only grab with packfactor=1'
375 r = gl.getgdesc(GL.GD_BITS_NORM_SNG_RED)
376 g = gl.getgdesc(GL.GD_BITS_NORM_SNG_GREEN)
377 b = gl.getgdesc(GL.GD_BITS_NORM_SNG_BLUE)
378 if (r,g,b) <> (3,3,2):
379 raise Error, 'Sorry, can only grab rgb8 on 8-bit Indigo'
380 # Dirty Dirty here. Set buffer to cmap mode, grab image and set it back
381 gl.cmode()
382 gl.gconfig()
383 gl.pixmode(GL.PM_SIZE, 8)
384 data = gl.lrectread(0, 0, w-1, h-1)
385 data = data[:w*h] # BUG FIX for python lrectread
386 gl.RGBmode()
387 gl.gconfig()
388 gl.pixmode(GL.PM_SIZE, 32)
389 return data, None
390
391def grab_grey(w, h, pf):
392 raise Error, 'Sorry, grabbing grey not implemented'
Guido van Rossum094a9de1991-12-03 16:50:00 +0000393
Guido van Rossum2080b341992-02-28 15:59:23 +0000394def grab_yiq(w, h, pf):
395 raise Error, 'Sorry, grabbing yiq not implemented'
396
397def grab_hls(w, h, pf):
398 raise Error, 'Sorry, grabbing hls not implemented'
399
400def grab_hsv(w, h, pf):
401 raise Error, 'Sorry, grabbing hsv not implemented'
402
403#
404# The class VoutFile is not as well-designed (and tested) as VinFile.
405# Notably it will accept almost any garbage and write it to the video
406# output file
407#
Guido van Rossum7ff90ef1992-08-18 14:16:21 +0000408class VoutFile:
Guido van Rossum2080b341992-02-28 15:59:23 +0000409 def init(self, filename):
410 if filename == '-':
411 return self.initfp(sys.stdout, filename)
412 else:
413 return self.initfp(open(filename,'w'), filename)
414
415 def initfp(self, fp, filename):
416 self.fp = fp
417 self.format = 'grey'
418 self.width = self.height = 0
419 self.packfactor = 1
420 self.c0bits = 8
421 self.c1bits = self.c2bits = 0
422 self.offset = 0
423 self.chrompack = 0
424 self.headerwritten = 0
425 return self
426
427 def close(self):
428 self.fp.close()
Guido van Rossumbc0eb991992-08-18 17:00:51 +0000429 x = self.initfp(None, None)
Guido van Rossum2080b341992-02-28 15:59:23 +0000430
431 def setinfo(self, values):
432 self.format, self.width, self.height, self.packfactor,\
433 self.c0bits, self.c1bits, self.c2bits, self.offset, \
434 self.chrompack = values
435
436 def writeheader(self):
437 self.headerwritten = 1
438 if self.format == 'rgb':
439 self.packfactor = 0
440 elif self.packfactor == 0:
441 self.packfactor = 1
442 self.fp.write('CMIF video 3.0\n')
443 if self.format == 'rgb':
444 data = ('rgb', 0)
445 elif self.format == 'grey':
446 data = ('grey', 0)
447 else:
448 data = (self.format, (self.c0bits, self.c1bits, \
449 self.c2bits, self.chrompack, self.offset))
450 self.fp.write(`data`+'\n')
451 data = (self.width, self.height, self.packfactor)
452 self.fp.write(`data`+'\n')
453 try:
454 self._grabber = eval('grab_' + self.format)
455 except:
456 raise Error, 'unknown colorsys: ' + self.format
457
458 def writeframeheader(self, data):
459 if not self.headerwritten:
460 raise Error, 'Writing frame data before header'
461 # XXXX Should we sanity check here?
462 self.fp.write(`data`+'\n')
463
464 def writeframedata(self, data, chromdata):
465 # XXXX Check sizes here
466 self.fp.write(data)
467 if chromdata:
468 self.fp.write(chromdata)
469
470 def writeframe(self, time, data, chromdata):
471 if chromdata:
472 clen = len(chromdata)
473 else:
474 clen = 0
475 self.writeframeheader((time, len(data), clen))
476 self.writeframedata(data, chromdata)
477
478 def grabframe(self):
479 return self._grabber(self.width, self.height, self.packfactor)
480
Guido van Rossum094a9de1991-12-03 16:50:00 +0000481def test():
Guido van Rossum58b38cc1992-02-11 14:45:43 +0000482 import sys, time
Guido van Rossum094a9de1991-12-03 16:50:00 +0000483 filename = 'film.video'
484 if sys.argv[1:]: filename = sys.argv[1]
485 vin = VinFile().init(filename)
Guido van Rossum58b38cc1992-02-11 14:45:43 +0000486 print 'File: ', filename
Guido van Rossum444339d1991-12-03 16:52:40 +0000487 print 'Version: ', vin.version
Guido van Rossum58b38cc1992-02-11 14:45:43 +0000488 print 'Size: ', vin.width, 'x', vin.height
489 print 'Pack: ', vin.packfactor, '; chrom:', vin.chrompack
490 print 'Bits: ', vin.c0bits, vin.c1bits, vin.c2bits
491 print 'Format: ', vin.format
492 print 'Offset: ', vin.offset
Guido van Rossum094a9de1991-12-03 16:50:00 +0000493 gl.foreground()
494 gl.prefsize(vin.width, vin.height)
Guido van Rossum58b38cc1992-02-11 14:45:43 +0000495 wid = gl.winopen(filename)
496 vin.initcolormap()
497 t0 = time.millitimer()
498 while 1:
499 try:
500 t, data, chromdata = vin.getnextframe()
501 except EOFError:
502 break
503 dt = t + t0 - time.millitimer()
504 if dt > 0:
505 time.millisleep(dt)
506 vin.showframe(data, chromdata)
507 print 'Done.'
508 time.sleep(2)
Guido van Rossum2080b341992-02-28 15:59:23 +0000509