blob: 6203562952d9f35c75c6e1da79d7303253aa30a8 [file] [log] [blame]
Guido van Rossum9ee7e151992-08-25 12:29:30 +00001import gl, GL
2import VFile
3import os
4
5
6class InputViewer:
7
8 def init(self, filename, title, qsize):
9 try:
10 self.vin = VFile.VinFile().init(filename)
11 except (EOFError, VFile.Error):
12 raise IOError, 'bad video input file'
13 if not title:
14 title = os.path.split(filename)[1]
15 self.filename = filename
16 self.title = title
17 self.qsize = qsize
18 gl.foreground()
19 gl.prefsize(self.vin.width, self.vin.height)
20 self.wid = -1
21 self.reset()
22 return self
23
24 def close(self):
25 self.vin.close()
26 if self.wid > 0:
27 gl.winclose(self.wid)
28
29 def rewind(self):
30 self.vin.rewind()
31 self.reset()
32
33 def getinfo(self):
34 return self.vin.getinfo()
35
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.queue = []
43 self.qindex = 0
44 self.lost = 0
45 self.lastt = 0
46 self.eofread = 0
47
48 # Internal
49 def fillq(self):
50 if self.qindex < len(self.queue) or self.eofread: return
51 try:
52 t, d, cd = self.vin.getnextframe()
53 except EOFError:
54 self.eofread = 1
55 return
56 dt = t - self.lastt
57 self.lastt = t
58 self.queue.append(dt, d, cd)
59 while len(self.queue) > self.qsize:
60 del self.queue[0]
61 self.qindex = self.qindex - 1
62 self.lost = self.lost + 1
63
64 def show(self):
65 if self.wid < 0:
66 gl.foreground()
67 gl.prefsize(self.vin.width, self.vin.height)
68 self.wid = gl.winopen(self.title)
69 gl.clear()
70 self.vin.initcolormap()
71 self.fillq()
72 gl.winset(self.wid)
73 if self.qindex >= len(self.queue):
74 gl.clear()
75 return
76 dt, d, cd = self.queue[self.qindex]
77 self.vin.showframe(d, cd)
78
79 def redraw(self, wid):
80 if wid == self.wid >= 0:
81 gl.winset(self.wid)
82 gl.reshapeviewport()
83 self.show()
84
85 def get(self):
86 if self.qindex >= len(self.queue):
87 self.fillq()
88 if self.eofread:
89 return None
90 item = self.queue[self.qindex]
91 self.qindex = self.qindex + 1
92 return item
93
94 def backup(self):
95 if self.qindex == 0:
96 return 0
97 self.qindex = self.qindex - 1
98 return 1
99
100 def tell(self):
101 return self.lost + self.qindex
102
103 def qsizes(self):
104 return self.qindex, len(self.queue) - self.qindex
105
106
107class OutputViewer:
108
109 def init(self, filename, title, qsize):
110 try:
111 self.vout = VFile.VoutFile().init(filename)
112 except (EOFError, VFile.Error):
113 raise IOError, 'bad video output file'
114 if not title:
115 title = os.path.split(filename)[1]
116 self.filename = filename
117 self.title = title
118 self.qsize = qsize
119 gl.foreground()
120 self.wid = -1
121 self.reset()
122 return self
123
124 def close(self):
125 while self.queue:
126 self.flushq()
127 self.vout.close()
128 if self.wid > 0:
129 gl.winclose(self.wid)
130
131 def rewind(self):
132 info = self.vout.getinfo()
133 self.vout.close()
134 self.vout = VFile.VoutFile().init(self.filename)
135 self.vout.setinfo(info)
136 self.reset()
137
138 def getinfo(self):
139 return self.vout.getinfo()
140
141 def setinfo(self, info):
142 if info == self.getinfo(): return # No change
143 self.vout.setinfo(info)
144 if self.wid > 0:
145 gl.winclose(self.wid)
146 self.wid = -1
147
148 # Internal
149 def reset(self):
150 if self.wid > 0:
151 gl.winset(self.wid)
152 gl.clear()
153 self.vout.initcolormap()
154 self.queue = []
155 self.spares = []
156 self.written = 0
157 self.lastt = 0
158
159 # Internal
160 def flushq(self):
161 if self.written == 0:
162 self.vout.writeheader()
163 dt, d, cd = self.queue[0]
164 self.lastt = self.lastt + dt
165 self.vout.writeframe(self.lastt, d, cd)
166 del self.queue[0]
167 self.written = self.written + 1
168
169 def show(self):
170 if self.wid < 0:
171 gl.foreground()
172 gl.prefsize(self.vout.width, self.vout.height)
173 self.wid = gl.winopen(self.title)
174 gl.clear()
175 self.vout.initcolormap()
176 gl.winset(self.wid)
177 if not self.queue:
178 gl.clear()
179 return
180 dt, d, cd = self.queue[-1]
181 self.vout.showframe(d, cd)
182
183 def redraw(self, wid):
184 if wid == self.wid >= 0:
185 gl.winset(self.wid)
186 gl.reshapeviewport()
187 self.show()
188
189 def backup(self):
190 if len(self.queue) < 1: return 0
191 self.spares.insert(0, self.queue[-1])
192 del self.queue[-1]
193 return 1
194
195 def forward(self):
196 if not self.spares: return 0
197 self.queue.append(self.spares[0])
198 del self.spares[0]
199 return 1
200
201 def put(self, item):
202 self.queue.append(item)
203 self.spares = []
204 while len(self.queue) > self.qsize:
205 self.flushq()
206
207 def tell(self):
208 return self.written + len(self.queue)
209
210 def qsizes(self):
211 return len(self.queue), len(self.spares)
212
213
214def test():
215 import sys
216 a = InputViewer().init(sys.argv[1], '')
217 b = OutputViewer().init(sys.argv[2], '')
218 b.setinfo(a.getinfo())
219
220 while 1:
221 a.show()
222 data = a.get()
223 if data is None:
224 break
225 b.put(data)
226 b.show()
227
228 while a.backup():
229 data = a.get()
230 b.put(data)
231 b.show()
232 if a.backup(): a.show()
233
234 while 1:
235 data = a.get()
236 if data is None:
237 break
238 b.put(data)
239 b.show()
240 a.show()
241
242 b.close()