blob: d5ef365ae27e710ff0b1962a2fdcaf894762406f [file] [log] [blame]
Guido van Rossum9ee7e151992-08-25 12:29:30 +00001#! /ufs/guido/bin/sgi/python
2
3# Edit CMIF movies interactively -- copy one or more files to an output file
4
5
Guido van Rossuma4311111992-08-25 13:53:10 +00006# XXX To do:
Guido van Rossum9ee7e151992-08-25 12:29:30 +00007#
8# - convert between formats (grey, rgb, rgb8, ...)
9# - change size
10# - cut out a given area of the image
11# - change time base (a la Vtime)
Guido van Rossum9ee7e151992-08-25 12:29:30 +000012
13
14import sys
15import os
16import gl, GL, DEVICE
17import fl, FL
18import flp
19import Viewer
20import getopt
21import string
Guido van Rossum9b86e1f1993-02-16 16:10:02 +000022import watchcursor
23
24ARROW = 0
25WATCH = 1
26watchcursor.defwatch(WATCH)
Guido van Rossum9ee7e151992-08-25 12:29:30 +000027
28
29def main():
Guido van Rossuma4311111992-08-25 13:53:10 +000030 qsize = 40
Guido van Rossum9ee7e151992-08-25 12:29:30 +000031 opts, args = getopt.getopt(sys.argv[1:], 'q:')
32 for o, a in opts:
33 if o == '-q':
34 qsize = string.atoi(a)
35 ed = Editor().init(qsize)
36 if args[0:]:
37 ed.open_input(args[0])
38 if args[1:]:
39 ed.open_output(args[1])
40 while 1:
41 dummy = fl.do_forms()
42
43
44class Editor:
45
46 def init(self, qsize):
47 self.qsize = qsize
48 self.vin = None
49 self.vout = None
50 self.ifile = ''
51 self.ofile = ''
52 formdef = flp.parse_form('VeditForm', 'form')
53 flp.create_full_form(self, formdef)
54 self.form.show_form(FL.PLACE_SIZE, FL.TRUE, 'Vedit')
55 fl.set_event_call_back(self.do_event)
56 return self
57
Guido van Rossuma8993cf1992-12-14 12:43:19 +000058 def do_event(self, dev, val):
Guido van Rossum9ee7e151992-08-25 12:29:30 +000059 if dev == DEVICE.REDRAW:
60 if self.vin:
61 self.vin.redraw(val)
62 if self.vout:
63 self.vout.redraw(val)
64
Guido van Rossum9b86e1f1993-02-16 16:10:02 +000065 def busy(self):
66 gl.winset(self.form.window)
67 gl.setcursor(WATCH, 0, 0)
68
69 def ready(self):
70 gl.winset(self.form.window)
71 gl.setcursor(ARROW, 0, 0)
72
Guido van Rossum9ee7e151992-08-25 12:29:30 +000073
74 def iocheck(self):
75 self.msg('')
76 if self.vin == None and self.vout == None:
77 self.err('Please open input and output files first')
78 return 0
79 return self.icheck() and self.ocheck()
80
81 def icheck(self):
82 self.msg('')
83 if self.vin == None:
84 self.err('Please open an input file first')
85 return 0
86 return 1
87
88 def ocheck(self):
89 self.msg('')
90 if self.vout == None:
91 self.err('Please open an output file first')
92 return 0
93 return 1
94
95
Guido van Rossuma8993cf1992-12-14 12:43:19 +000096 def cb_in_new(self, *args):
Guido van Rossum9ee7e151992-08-25 12:29:30 +000097 self.msg('')
98 hd, tl = os.path.split(self.ifile)
99 filename = fl.file_selector('Input video file', hd, '', tl)
100 if not filename: return
101 self.open_input(filename)
102
Guido van Rossuma8993cf1992-12-14 12:43:19 +0000103 def cb_in_close(self, *args):
Guido van Rossum9ee7e151992-08-25 12:29:30 +0000104 self.msg('')
105 self.close_input()
106
Guido van Rossuma8993cf1992-12-14 12:43:19 +0000107 def cb_in_skip(self, *args):
Guido van Rossum9ee7e151992-08-25 12:29:30 +0000108 if not self.icheck(): return
109 if not self.vin.get(): self.err('End of input file')
110 self.ishow()
111
Guido van Rossuma8993cf1992-12-14 12:43:19 +0000112 def cb_in_back(self, *args):
Guido van Rossum9ee7e151992-08-25 12:29:30 +0000113 if not self.icheck(): return
Guido van Rossum9b86e1f1993-02-16 16:10:02 +0000114 if not self.vin.backup(): self.err('Begin of input file')
115 self.ishow()
116
117 def cb_in_slider(self, *args):
118 if not self.icheck(): return
119 left, pos, right = self.vin.qinfo()
120 i = int(self.in_slider.get_slider_value())
121 i = max(i, left)
122 i = min(i, right)
123 if i == pos: return
124 if not self.vin.seek(i):
125 self.err('Input seek failed')
Guido van Rossum9ee7e151992-08-25 12:29:30 +0000126 self.ishow()
127
Guido van Rossuma8993cf1992-12-14 12:43:19 +0000128 def cb_in_rewind(self, *args):
Guido van Rossum9ee7e151992-08-25 12:29:30 +0000129 if not self.icheck(): return
130 self.vin.rewind()
131 self.ishow()
132
133
Guido van Rossuma8993cf1992-12-14 12:43:19 +0000134 def cb_copy(self, *args):
Guido van Rossum9ee7e151992-08-25 12:29:30 +0000135 if not self.iocheck(): return
136 data = self.vin.get()
Guido van Rossuma4311111992-08-25 13:53:10 +0000137 if not data:
138 self.err('End of input file')
139 self.ishow()
140 return
141 if self.vout.getinfo() <> self.vin.getinfo():
142 print 'Copying info...'
143 self.vout.setinfo(self.vin.getinfo())
144 self.vout.put(data)
145 self.oshow()
Guido van Rossum9ee7e151992-08-25 12:29:30 +0000146 self.ishow()
147
Guido van Rossuma8993cf1992-12-14 12:43:19 +0000148 def cb_uncopy(self, *args):
Guido van Rossum9ee7e151992-08-25 12:29:30 +0000149 if not self.iocheck(): return
150 if not self.vout.backup():
151 self.err('Output buffer exhausted')
152 return
153 self.oshow()
154 if not self.vin.backup():
Guido van Rossum9b86e1f1993-02-16 16:10:02 +0000155 self.err('Begin of input file')
Guido van Rossum9ee7e151992-08-25 12:29:30 +0000156 return
157 self.ishow()
158
159
Guido van Rossuma8993cf1992-12-14 12:43:19 +0000160 def cb_out_new(self, *args):
Guido van Rossum9ee7e151992-08-25 12:29:30 +0000161 self.msg('')
162 hd, tl = os.path.split(self.ofile)
163 filename = fl.file_selector('Output video file', hd, '', tl)
164 if not filename: return
165 self.open_output(filename)
166
Guido van Rossuma8993cf1992-12-14 12:43:19 +0000167 def cb_out_close(self, *args):
Guido van Rossum9ee7e151992-08-25 12:29:30 +0000168 self.msg('')
169 self.close_output()
170
Guido van Rossuma8993cf1992-12-14 12:43:19 +0000171 def cb_out_skip(self, *args):
Guido van Rossum9ee7e151992-08-25 12:29:30 +0000172 if not self.ocheck(): return
173 if not self.vout.forward(): self.err('Output buffer exhausted')
174 self.oshow()
175
Guido van Rossuma8993cf1992-12-14 12:43:19 +0000176 def cb_out_back(self, *args):
Guido van Rossum9ee7e151992-08-25 12:29:30 +0000177 if not self.ocheck(): return
178 if not self.vout.backup(): self.err('Output buffer exhausted')
179 self.oshow()
180
Guido van Rossum9b86e1f1993-02-16 16:10:02 +0000181 def cb_out_slider(self, *args):
182 if not self.ocheck(): return
183 i = int(self.out_slider.get_slider_value())
184 left, pos, right = self.vout.qinfo()
185 i = int(self.out_slider.get_slider_value())
186 i = max(i, left)
187 i = min(i, right)
188 if i == pos: return
189 if not self.vout.seek(i):
190 self.err('Output seek failed')
191 self.oshow()
192
193 def cb_out_trunc(self, *arcs):
194 if not self.ocheck(): return
195 self.vout.trunc()
196 self.oshow()
197
Guido van Rossuma8993cf1992-12-14 12:43:19 +0000198 def cb_out_rewind(self, *args):
Guido van Rossum9ee7e151992-08-25 12:29:30 +0000199 if not self.ocheck(): return
200 self.vout.rewind()
201 self.oshow()
202
203
Guido van Rossuma8993cf1992-12-14 12:43:19 +0000204 def cb_quit(self, *args):
Guido van Rossum9ee7e151992-08-25 12:29:30 +0000205 self.close_input()
206 self.close_output()
207 sys.exit(0)
208
209
210 def open_input(self, filename):
211 self.ifile = filename
212 basename = os.path.split(filename)[1]
213 title = 'in: ' + basename
214 try:
Guido van Rossum9b86e1f1993-02-16 16:10:02 +0000215 vin = Viewer.InputViewer().init(filename, title)
Guido van Rossum9ee7e151992-08-25 12:29:30 +0000216 except:
217 self.err('Can\'t open input file', filename)
218 return
219 self.close_input()
220 self.vin = vin
221 self.in_file.label = basename
222 self.ishow()
223
224 def close_input(self):
225 if self.vin:
Guido van Rossum9b86e1f1993-02-16 16:10:02 +0000226 self.busy()
Guido van Rossum9ee7e151992-08-25 12:29:30 +0000227 self.msg('Closing input file...')
228 self.vin.close()
Guido van Rossum9b86e1f1993-02-16 16:10:02 +0000229 self.ready()
Guido van Rossum9ee7e151992-08-25 12:29:30 +0000230 self.msg('')
231 self.vin = None
232 self.in_file.label = '(none)'
233 self.format('in')
234
235 def ishow(self):
236 self.vin.show()
237 self.format('in')
238
239 def open_output(self, filename):
240 self.ofile = filename
241 basename = os.path.split(filename)[1]
242 title = 'out: ' + basename
243 try:
244 vout = Viewer.OutputViewer().init(filename, \
245 title, self.qsize)
246 except:
247 self.err('Can\'t open output file', filename)
248 return
249 self.close_output()
250 self.vout = vout
251 self.out_file.label = basename
252 if self.vin:
253 self.vout.setinfo(self.vin.getinfo())
254 self.oshow()
255
256 def close_output(self):
257 if self.vout:
Guido van Rossum9b86e1f1993-02-16 16:10:02 +0000258 self.busy()
Guido van Rossum9ee7e151992-08-25 12:29:30 +0000259 self.msg('Closing output file...')
260 self.vout.close()
Guido van Rossum9b86e1f1993-02-16 16:10:02 +0000261 self.ready()
Guido van Rossum9ee7e151992-08-25 12:29:30 +0000262 self.msg('')
263 self.vout = None
264 self.out_file.label = '(none)'
265 self.format('out')
266
267 def oshow(self):
268 self.vout.show()
269 self.format('out')
270
271
272 def msg(self, *args):
273 str = string.strip(string.join(args))
274 self.msg_area.label = str
275
276 def err(self, *args):
277 gl.ringbell()
278 apply(self.msg, args)
279
280 def format(self, io):
281 v = getattr(self, 'v' + io)
282 if v == None:
283 left = right = pos = 0
284 else:
Guido van Rossum9b86e1f1993-02-16 16:10:02 +0000285 left, pos, right = v.qinfo()
Guido van Rossum9ee7e151992-08-25 12:29:30 +0000286 getattr(self, io + '_info1').label = `left`
287 getattr(self, io + '_info2').label = `pos`
288 getattr(self, io + '_info3').label = `right`
Guido van Rossum9b86e1f1993-02-16 16:10:02 +0000289 sl = getattr(self, io + '_slider')
290 sl.freeze_object()
291 sl.set_slider_bounds(left, right)
292 sl.set_slider_value(pos)
293 sl.unfreeze_object()
Guido van Rossum9ee7e151992-08-25 12:29:30 +0000294
Guido van Rossume0be2b31992-09-01 14:45:57 +0000295
296try:
297 main()
298except KeyboardInterrupt:
299 print '[Interrupt]'