blob: 07cba54cec181f41ea746d92a5824f51732bb106 [file] [log] [blame]
Guido van Rossum9ee7e151992-08-25 12:29:30 +00001import gl, GL
2import VFile
3import os
4
5
6class InputViewer:
7
Guido van Rossum21a3ff91993-12-17 15:11:41 +00008 def __init__(self, filename, title, *args):
Guido van Rossum9ee7e151992-08-25 12:29:30 +00009 try:
Guido van Rossum21a3ff91993-12-17 15:11:41 +000010 self.vin = VFile.VinFile(filename)
Guido van Rossum9ee7e151992-08-25 12:29:30 +000011 except (EOFError, VFile.Error):
12 raise IOError, 'bad video input file'
Guido van Rossum9b86e1f1993-02-16 16:10:02 +000013 self.vin.warmcache()
Guido van Rossum9ee7e151992-08-25 12:29:30 +000014 if not title:
15 title = os.path.split(filename)[1]
16 self.filename = filename
17 self.title = title
Guido van Rossum9b86e1f1993-02-16 16:10:02 +000018 self.qsize = len(self.vin.index)
Guido van Rossum9ee7e151992-08-25 12:29:30 +000019 gl.foreground()
20 gl.prefsize(self.vin.width, self.vin.height)
21 self.wid = -1
22 self.reset()
Guido van Rossum9ee7e151992-08-25 12:29:30 +000023
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()
Guido van Rossum9ee7e151992-08-25 12:29:30 +000042 self.qindex = 0
Guido van Rossum9ee7e151992-08-25 12:29:30 +000043
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()
Guido van Rossum9ee7e151992-08-25 12:29:30 +000051 gl.winset(self.wid)
Guido van Rossum9b86e1f1993-02-16 16:10:02 +000052 if self.qindex >= self.qsize:
Guido van Rossum00ffea31992-09-07 15:09:31 +000053 self.vin.clear()
Guido van Rossum9ee7e151992-08-25 12:29:30 +000054 return
Guido van Rossum9b86e1f1993-02-16 16:10:02 +000055 dt, d, cd = self.vin.getrandomframe(self.qindex)
Guido van Rossum9ee7e151992-08-25 12:29:30 +000056 self.vin.showframe(d, cd)
57
58 def redraw(self, wid):
59 if wid == self.wid >= 0:
60 gl.winset(self.wid)
61 gl.reshapeviewport()
Guido van Rossum00ffea31992-09-07 15:09:31 +000062 self.vin.clear()
Guido van Rossum9ee7e151992-08-25 12:29:30 +000063 self.show()
64
65 def get(self):
Guido van Rossum9b86e1f1993-02-16 16:10:02 +000066 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)
Guido van Rossum9ee7e151992-08-25 12:29:30 +000074 self.qindex = self.qindex + 1
Guido van Rossum9b86e1f1993-02-16 16:10:02 +000075 return t-prevt, data, cdata
Guido van Rossum9ee7e151992-08-25 12:29:30 +000076
77 def backup(self):
78 if self.qindex == 0:
79 return 0
80 self.qindex = self.qindex - 1
81 return 1
82
Guido van Rossum9b86e1f1993-02-16 16:10:02 +000083 def seek(self, i):
84 if not 0 <= i <= self.qsize:
85 return 0
86 self.qindex = i
87 return 1
88
Guido van Rossum9ee7e151992-08-25 12:29:30 +000089 def tell(self):
Guido van Rossum9b86e1f1993-02-16 16:10:02 +000090 return self.qindex
Guido van Rossum9ee7e151992-08-25 12:29:30 +000091
92 def qsizes(self):
Guido van Rossum9b86e1f1993-02-16 16:10:02 +000093 return self.qindex, self.qsize - self.qindex
94
95 def qinfo(self):
96 return 0, self.qindex, self.qsize
Guido van Rossum9ee7e151992-08-25 12:29:30 +000097
98
99class OutputViewer:
100
Guido van Rossum21a3ff91993-12-17 15:11:41 +0000101 def __init__(self, filename, title, qsize):
Guido van Rossum9ee7e151992-08-25 12:29:30 +0000102 try:
Guido van Rossum21a3ff91993-12-17 15:11:41 +0000103 self.vout = VFile.VoutFile(filename)
Guido van Rossum9ee7e151992-08-25 12:29:30 +0000104 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()
Guido van Rossum9ee7e151992-08-25 12:29:30 +0000114
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)
121
122 def rewind(self):
123 info = self.vout.getinfo()
124 self.vout.close()
Guido van Rossum21a3ff91993-12-17 15:11:41 +0000125 self.vout = VFile.VoutFile(self.filename)
Guido van Rossum9ee7e151992-08-25 12:29:30 +0000126 self.vout.setinfo(info)
127 self.reset()
128
129 def getinfo(self):
130 return self.vout.getinfo()
131
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
138
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
149
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
159
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:
Guido van Rossum00ffea31992-09-07 15:09:31 +0000169 self.vout.clear()
Guido van Rossum9ee7e151992-08-25 12:29:30 +0000170 return
171 dt, d, cd = self.queue[-1]
172 self.vout.showframe(d, cd)
173
174 def redraw(self, wid):
175 if wid == self.wid >= 0:
176 gl.winset(self.wid)
177 gl.reshapeviewport()
Guido van Rossum00ffea31992-09-07 15:09:31 +0000178 self.vout.clear()
Guido van Rossum9ee7e151992-08-25 12:29:30 +0000179 self.show()
180
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
186
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
192
193 def put(self, item):
194 self.queue.append(item)
195 self.spares = []
196 while len(self.queue) > self.qsize:
197 self.flushq()
198
Guido van Rossum9b86e1f1993-02-16 16:10:02 +0000199 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
210
211 def trunc(self):
212 del self.spares[:]
213
Guido van Rossum9ee7e151992-08-25 12:29:30 +0000214 def tell(self):
215 return self.written + len(self.queue)
216
217 def qsizes(self):
218 return len(self.queue), len(self.spares)
219
Guido van Rossum9b86e1f1993-02-16 16:10:02 +0000220 def qinfo(self):
221 first = self.written
222 pos = first + len(self.queue)
223 last = pos + len(self.spares)
224 return first, pos, last
225
Guido van Rossum9ee7e151992-08-25 12:29:30 +0000226
227def test():
228 import sys
Guido van Rossum21a3ff91993-12-17 15:11:41 +0000229 a = InputViewer(sys.argv[1], '')
230 b = OutputViewer(sys.argv[2], '')
Guido van Rossum9ee7e151992-08-25 12:29:30 +0000231 b.setinfo(a.getinfo())
232
233 while 1:
234 a.show()
235 data = a.get()
236 if data is None:
237 break
238 b.put(data)
239 b.show()
240
241 while a.backup():
242 data = a.get()
243 b.put(data)
244 b.show()
245 if a.backup(): a.show()
246
247 while 1:
248 data = a.get()
249 if data is None:
250 break
251 b.put(data)
252 b.show()
253 a.show()
254
255 b.close()