blob: 2b9607b64cc32b0dc11440ed03a5e784b30a0e9b [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 Rossum9b86e1f1993-02-16 16:10:02 +00008 def init(self, filename, title, *args):
Guido van Rossum9ee7e151992-08-25 12:29:30 +00009 try:
10 self.vin = VFile.VinFile().init(filename)
11 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()
23 return self
24
25 def close(self):
26 self.vin.close()
27 if self.wid > 0:
28 gl.winclose(self.wid)
29
30 def rewind(self):
31 self.vin.rewind()
32 self.reset()
33
34 def getinfo(self):
35 return self.vin.getinfo()
36
37 # Internal
38 def reset(self):
39 if self.wid > 0:
40 gl.winset(self.wid)
41 gl.clear()
42 self.vin.initcolormap()
Guido van Rossum9ee7e151992-08-25 12:29:30 +000043 self.qindex = 0
Guido van Rossum9ee7e151992-08-25 12:29:30 +000044
45 def show(self):
46 if self.wid < 0:
47 gl.foreground()
48 gl.prefsize(self.vin.width, self.vin.height)
49 self.wid = gl.winopen(self.title)
50 gl.clear()
51 self.vin.initcolormap()
Guido van Rossum9ee7e151992-08-25 12:29:30 +000052 gl.winset(self.wid)
Guido van Rossum9b86e1f1993-02-16 16:10:02 +000053 if self.qindex >= self.qsize:
Guido van Rossum00ffea31992-09-07 15:09:31 +000054 self.vin.clear()
Guido van Rossum9ee7e151992-08-25 12:29:30 +000055 return
Guido van Rossum9b86e1f1993-02-16 16:10:02 +000056 dt, d, cd = self.vin.getrandomframe(self.qindex)
Guido van Rossum9ee7e151992-08-25 12:29:30 +000057 self.vin.showframe(d, cd)
58
59 def redraw(self, wid):
60 if wid == self.wid >= 0:
61 gl.winset(self.wid)
62 gl.reshapeviewport()
Guido van Rossum00ffea31992-09-07 15:09:31 +000063 self.vin.clear()
Guido van Rossum9ee7e151992-08-25 12:29:30 +000064 self.show()
65
66 def get(self):
Guido van Rossum9b86e1f1993-02-16 16:10:02 +000067 if self.qindex >= self.qsize:
68 return None
69 if self.qindex > 0:
70 prevt, ds, cs = \
71 self.vin.getrandomframeheader(self.qindex-1)
72 else:
73 prevt = 0
74 t, data, cdata = self.vin.getrandomframe(self.qindex)
Guido van Rossum9ee7e151992-08-25 12:29:30 +000075 self.qindex = self.qindex + 1
Guido van Rossum9b86e1f1993-02-16 16:10:02 +000076 return t-prevt, data, cdata
Guido van Rossum9ee7e151992-08-25 12:29:30 +000077
78 def backup(self):
79 if self.qindex == 0:
80 return 0
81 self.qindex = self.qindex - 1
82 return 1
83
Guido van Rossum9b86e1f1993-02-16 16:10:02 +000084 def seek(self, i):
85 if not 0 <= i <= self.qsize:
86 return 0
87 self.qindex = i
88 return 1
89
Guido van Rossum9ee7e151992-08-25 12:29:30 +000090 def tell(self):
Guido van Rossum9b86e1f1993-02-16 16:10:02 +000091 return self.qindex
Guido van Rossum9ee7e151992-08-25 12:29:30 +000092
93 def qsizes(self):
Guido van Rossum9b86e1f1993-02-16 16:10:02 +000094 return self.qindex, self.qsize - self.qindex
95
96 def qinfo(self):
97 return 0, self.qindex, self.qsize
Guido van Rossum9ee7e151992-08-25 12:29:30 +000098
99
100class OutputViewer:
101
102 def init(self, filename, title, qsize):
103 try:
104 self.vout = VFile.VoutFile().init(filename)
105 except (EOFError, VFile.Error):
106 raise IOError, 'bad video output file'
107 if not title:
108 title = os.path.split(filename)[1]
109 self.filename = filename
110 self.title = title
111 self.qsize = qsize
112 gl.foreground()
113 self.wid = -1
114 self.reset()
115 return self
116
117 def close(self):
118 while self.queue:
119 self.flushq()
120 self.vout.close()
121 if self.wid > 0:
122 gl.winclose(self.wid)
123
124 def rewind(self):
125 info = self.vout.getinfo()
126 self.vout.close()
127 self.vout = VFile.VoutFile().init(self.filename)
128 self.vout.setinfo(info)
129 self.reset()
130
131 def getinfo(self):
132 return self.vout.getinfo()
133
134 def setinfo(self, info):
135 if info == self.getinfo(): return # No change
136 self.vout.setinfo(info)
137 if self.wid > 0:
138 gl.winclose(self.wid)
139 self.wid = -1
140
141 # Internal
142 def reset(self):
143 if self.wid > 0:
144 gl.winset(self.wid)
145 gl.clear()
146 self.vout.initcolormap()
147 self.queue = []
148 self.spares = []
149 self.written = 0
150 self.lastt = 0
151
152 # Internal
153 def flushq(self):
154 if self.written == 0:
155 self.vout.writeheader()
156 dt, d, cd = self.queue[0]
157 self.lastt = self.lastt + dt
158 self.vout.writeframe(self.lastt, d, cd)
159 del self.queue[0]
160 self.written = self.written + 1
161
162 def show(self):
163 if self.wid < 0:
164 gl.foreground()
165 gl.prefsize(self.vout.width, self.vout.height)
166 self.wid = gl.winopen(self.title)
167 gl.clear()
168 self.vout.initcolormap()
169 gl.winset(self.wid)
170 if not self.queue:
Guido van Rossum00ffea31992-09-07 15:09:31 +0000171 self.vout.clear()
Guido van Rossum9ee7e151992-08-25 12:29:30 +0000172 return
173 dt, d, cd = self.queue[-1]
174 self.vout.showframe(d, cd)
175
176 def redraw(self, wid):
177 if wid == self.wid >= 0:
178 gl.winset(self.wid)
179 gl.reshapeviewport()
Guido van Rossum00ffea31992-09-07 15:09:31 +0000180 self.vout.clear()
Guido van Rossum9ee7e151992-08-25 12:29:30 +0000181 self.show()
182
183 def backup(self):
184 if len(self.queue) < 1: return 0
185 self.spares.insert(0, self.queue[-1])
186 del self.queue[-1]
187 return 1
188
189 def forward(self):
190 if not self.spares: return 0
191 self.queue.append(self.spares[0])
192 del self.spares[0]
193 return 1
194
195 def put(self, item):
196 self.queue.append(item)
197 self.spares = []
198 while len(self.queue) > self.qsize:
199 self.flushq()
200
Guido van Rossum9b86e1f1993-02-16 16:10:02 +0000201 def seek(self, i):
202 i = i - self.written
203 if not 0 <= i <= len(self.queue) + len(self.spares):
204 return 0
205 while i < len(self.queue):
206 if not self.backup():
207 return 0
208 while i > len(self.queue):
209 if not self.forward():
210 return 0
211 return 1
212
213 def trunc(self):
214 del self.spares[:]
215
Guido van Rossum9ee7e151992-08-25 12:29:30 +0000216 def tell(self):
217 return self.written + len(self.queue)
218
219 def qsizes(self):
220 return len(self.queue), len(self.spares)
221
Guido van Rossum9b86e1f1993-02-16 16:10:02 +0000222 def qinfo(self):
223 first = self.written
224 pos = first + len(self.queue)
225 last = pos + len(self.spares)
226 return first, pos, last
227
Guido van Rossum9ee7e151992-08-25 12:29:30 +0000228
229def test():
230 import sys
231 a = InputViewer().init(sys.argv[1], '')
232 b = OutputViewer().init(sys.argv[2], '')
233 b.setinfo(a.getinfo())
234
235 while 1:
236 a.show()
237 data = a.get()
238 if data is None:
239 break
240 b.put(data)
241 b.show()
242
243 while a.backup():
244 data = a.get()
245 b.put(data)
246 b.show()
247 if a.backup(): a.show()
248
249 while 1:
250 data = a.get()
251 if data is None:
252 break
253 b.put(data)
254 b.show()
255 a.show()
256
257 b.close()