blob: 2a7b2ebb5ed7cefa20415b4b0e88c222dd7d963d [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):
Guido van Rossum00ffea31992-09-07 15:09:31 +000074 self.vin.clear()
Guido van Rossum9ee7e151992-08-25 12:29:30 +000075 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()
Guido van Rossum00ffea31992-09-07 15:09:31 +000083 self.vin.clear()
Guido van Rossum9ee7e151992-08-25 12:29:30 +000084 self.show()
85
86 def get(self):
87 if self.qindex >= len(self.queue):
88 self.fillq()
89 if self.eofread:
90 return None
91 item = self.queue[self.qindex]
92 self.qindex = self.qindex + 1
93 return item
94
95 def backup(self):
96 if self.qindex == 0:
97 return 0
98 self.qindex = self.qindex - 1
99 return 1
100
101 def tell(self):
102 return self.lost + self.qindex
103
104 def qsizes(self):
105 return self.qindex, len(self.queue) - self.qindex
106
107
108class OutputViewer:
109
110 def init(self, filename, title, qsize):
111 try:
112 self.vout = VFile.VoutFile().init(filename)
113 except (EOFError, VFile.Error):
114 raise IOError, 'bad video output file'
115 if not title:
116 title = os.path.split(filename)[1]
117 self.filename = filename
118 self.title = title
119 self.qsize = qsize
120 gl.foreground()
121 self.wid = -1
122 self.reset()
123 return self
124
125 def close(self):
126 while self.queue:
127 self.flushq()
128 self.vout.close()
129 if self.wid > 0:
130 gl.winclose(self.wid)
131
132 def rewind(self):
133 info = self.vout.getinfo()
134 self.vout.close()
135 self.vout = VFile.VoutFile().init(self.filename)
136 self.vout.setinfo(info)
137 self.reset()
138
139 def getinfo(self):
140 return self.vout.getinfo()
141
142 def setinfo(self, info):
143 if info == self.getinfo(): return # No change
144 self.vout.setinfo(info)
145 if self.wid > 0:
146 gl.winclose(self.wid)
147 self.wid = -1
148
149 # Internal
150 def reset(self):
151 if self.wid > 0:
152 gl.winset(self.wid)
153 gl.clear()
154 self.vout.initcolormap()
155 self.queue = []
156 self.spares = []
157 self.written = 0
158 self.lastt = 0
159
160 # Internal
161 def flushq(self):
162 if self.written == 0:
163 self.vout.writeheader()
164 dt, d, cd = self.queue[0]
165 self.lastt = self.lastt + dt
166 self.vout.writeframe(self.lastt, d, cd)
167 del self.queue[0]
168 self.written = self.written + 1
169
170 def show(self):
171 if self.wid < 0:
172 gl.foreground()
173 gl.prefsize(self.vout.width, self.vout.height)
174 self.wid = gl.winopen(self.title)
175 gl.clear()
176 self.vout.initcolormap()
177 gl.winset(self.wid)
178 if not self.queue:
Guido van Rossum00ffea31992-09-07 15:09:31 +0000179 self.vout.clear()
Guido van Rossum9ee7e151992-08-25 12:29:30 +0000180 return
181 dt, d, cd = self.queue[-1]
182 self.vout.showframe(d, cd)
183
184 def redraw(self, wid):
185 if wid == self.wid >= 0:
186 gl.winset(self.wid)
187 gl.reshapeviewport()
Guido van Rossum00ffea31992-09-07 15:09:31 +0000188 self.vout.clear()
Guido van Rossum9ee7e151992-08-25 12:29:30 +0000189 self.show()
190
191 def backup(self):
192 if len(self.queue) < 1: return 0
193 self.spares.insert(0, self.queue[-1])
194 del self.queue[-1]
195 return 1
196
197 def forward(self):
198 if not self.spares: return 0
199 self.queue.append(self.spares[0])
200 del self.spares[0]
201 return 1
202
203 def put(self, item):
204 self.queue.append(item)
205 self.spares = []
206 while len(self.queue) > self.qsize:
207 self.flushq()
208
209 def tell(self):
210 return self.written + len(self.queue)
211
212 def qsizes(self):
213 return len(self.queue), len(self.spares)
214
215
216def test():
217 import sys
218 a = InputViewer().init(sys.argv[1], '')
219 b = OutputViewer().init(sys.argv[2], '')
220 b.setinfo(a.getinfo())
221
222 while 1:
223 a.show()
224 data = a.get()
225 if data is None:
226 break
227 b.put(data)
228 b.show()
229
230 while a.backup():
231 data = a.get()
232 b.put(data)
233 b.show()
234 if a.backup(): a.show()
235
236 while 1:
237 data = a.get()
238 if data is None:
239 break
240 b.put(data)
241 b.show()
242 a.show()
243
244 b.close()