Bump version to 0.9.1.
[python/dscho.git] / Demo / sgi / video / Viewer.py
blob07cba54cec181f41ea746d92a5824f51732bb106
1 import gl, GL
2 import VFile
3 import os
6 class InputViewer:
8 def __init__(self, filename, title, *args):
9 try:
10 self.vin = VFile.VinFile(filename)
11 except (EOFError, VFile.Error):
12 raise IOError, 'bad video input file'
13 self.vin.warmcache()
14 if not title:
15 title = os.path.split(filename)[1]
16 self.filename = filename
17 self.title = title
18 self.qsize = len(self.vin.index)
19 gl.foreground()
20 gl.prefsize(self.vin.width, self.vin.height)
21 self.wid = -1
22 self.reset()
24 def close(self):
25 self.vin.close()
26 if self.wid > 0:
27 gl.winclose(self.wid)
29 def rewind(self):
30 self.vin.rewind()
31 self.reset()
33 def getinfo(self):
34 return self.vin.getinfo()
36 # Internal
37 def reset(self):
38 if self.wid > 0:
39 gl.winset(self.wid)
40 gl.clear()
41 self.vin.initcolormap()
42 self.qindex = 0
44 def show(self):
45 if self.wid < 0:
46 gl.foreground()
47 gl.prefsize(self.vin.width, self.vin.height)
48 self.wid = gl.winopen(self.title)
49 gl.clear()
50 self.vin.initcolormap()
51 gl.winset(self.wid)
52 if self.qindex >= self.qsize:
53 self.vin.clear()
54 return
55 dt, d, cd = self.vin.getrandomframe(self.qindex)
56 self.vin.showframe(d, cd)
58 def redraw(self, wid):
59 if wid == self.wid >= 0:
60 gl.winset(self.wid)
61 gl.reshapeviewport()
62 self.vin.clear()
63 self.show()
65 def get(self):
66 if self.qindex >= self.qsize:
67 return None
68 if self.qindex > 0:
69 prevt, ds, cs = \
70 self.vin.getrandomframeheader(self.qindex-1)
71 else:
72 prevt = 0
73 t, data, cdata = self.vin.getrandomframe(self.qindex)
74 self.qindex = self.qindex + 1
75 return t-prevt, data, cdata
77 def backup(self):
78 if self.qindex == 0:
79 return 0
80 self.qindex = self.qindex - 1
81 return 1
83 def seek(self, i):
84 if not 0 <= i <= self.qsize:
85 return 0
86 self.qindex = i
87 return 1
89 def tell(self):
90 return self.qindex
92 def qsizes(self):
93 return self.qindex, self.qsize - self.qindex
95 def qinfo(self):
96 return 0, self.qindex, self.qsize
99 class OutputViewer:
101 def __init__(self, filename, title, qsize):
102 try:
103 self.vout = VFile.VoutFile(filename)
104 except (EOFError, VFile.Error):
105 raise IOError, 'bad video output file'
106 if not title:
107 title = os.path.split(filename)[1]
108 self.filename = filename
109 self.title = title
110 self.qsize = qsize
111 gl.foreground()
112 self.wid = -1
113 self.reset()
115 def close(self):
116 while self.queue:
117 self.flushq()
118 self.vout.close()
119 if self.wid > 0:
120 gl.winclose(self.wid)
122 def rewind(self):
123 info = self.vout.getinfo()
124 self.vout.close()
125 self.vout = VFile.VoutFile(self.filename)
126 self.vout.setinfo(info)
127 self.reset()
129 def getinfo(self):
130 return self.vout.getinfo()
132 def setinfo(self, info):
133 if info == self.getinfo(): return # No change
134 self.vout.setinfo(info)
135 if self.wid > 0:
136 gl.winclose(self.wid)
137 self.wid = -1
139 # Internal
140 def reset(self):
141 if self.wid > 0:
142 gl.winset(self.wid)
143 gl.clear()
144 self.vout.initcolormap()
145 self.queue = []
146 self.spares = []
147 self.written = 0
148 self.lastt = 0
150 # Internal
151 def flushq(self):
152 if self.written == 0:
153 self.vout.writeheader()
154 dt, d, cd = self.queue[0]
155 self.lastt = self.lastt + dt
156 self.vout.writeframe(self.lastt, d, cd)
157 del self.queue[0]
158 self.written = self.written + 1
160 def show(self):
161 if self.wid < 0:
162 gl.foreground()
163 gl.prefsize(self.vout.width, self.vout.height)
164 self.wid = gl.winopen(self.title)
165 gl.clear()
166 self.vout.initcolormap()
167 gl.winset(self.wid)
168 if not self.queue:
169 self.vout.clear()
170 return
171 dt, d, cd = self.queue[-1]
172 self.vout.showframe(d, cd)
174 def redraw(self, wid):
175 if wid == self.wid >= 0:
176 gl.winset(self.wid)
177 gl.reshapeviewport()
178 self.vout.clear()
179 self.show()
181 def backup(self):
182 if len(self.queue) < 1: return 0
183 self.spares.insert(0, self.queue[-1])
184 del self.queue[-1]
185 return 1
187 def forward(self):
188 if not self.spares: return 0
189 self.queue.append(self.spares[0])
190 del self.spares[0]
191 return 1
193 def put(self, item):
194 self.queue.append(item)
195 self.spares = []
196 while len(self.queue) > self.qsize:
197 self.flushq()
199 def seek(self, i):
200 i = i - self.written
201 if not 0 <= i <= len(self.queue) + len(self.spares):
202 return 0
203 while i < len(self.queue):
204 if not self.backup():
205 return 0
206 while i > len(self.queue):
207 if not self.forward():
208 return 0
209 return 1
211 def trunc(self):
212 del self.spares[:]
214 def tell(self):
215 return self.written + len(self.queue)
217 def qsizes(self):
218 return len(self.queue), len(self.spares)
220 def qinfo(self):
221 first = self.written
222 pos = first + len(self.queue)
223 last = pos + len(self.spares)
224 return first, pos, last
227 def test():
228 import sys
229 a = InputViewer(sys.argv[1], '')
230 b = OutputViewer(sys.argv[2], '')
231 b.setinfo(a.getinfo())
233 while 1:
234 a.show()
235 data = a.get()
236 if data is None:
237 break
238 b.put(data)
239 b.show()
241 while a.backup():
242 data = a.get()
243 b.put(data)
244 b.show()
245 if a.backup(): a.show()
247 while 1:
248 data = a.get()
249 if data is None:
250 break
251 b.put(data)
252 b.show()
253 a.show()
255 b.close()