blob: 43a67c816f0054d0cd45431979d195d9bcbed7ee [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())
Jack Jansendbf71b71993-09-28 15:29:18 +0000144 if self.vin.format == 'compress':
145 self.vout.setcompressheader(\
146 self.vin.getcompressheader())
Guido van Rossuma4311111992-08-25 13:53:10 +0000147 self.vout.put(data)
148 self.oshow()
Guido van Rossum9ee7e151992-08-25 12:29:30 +0000149 self.ishow()
150
Guido van Rossuma8993cf1992-12-14 12:43:19 +0000151 def cb_uncopy(self, *args):
Guido van Rossum9ee7e151992-08-25 12:29:30 +0000152 if not self.iocheck(): return
153 if not self.vout.backup():
154 self.err('Output buffer exhausted')
155 return
156 self.oshow()
157 if not self.vin.backup():
Guido van Rossum9b86e1f1993-02-16 16:10:02 +0000158 self.err('Begin of input file')
Guido van Rossum9ee7e151992-08-25 12:29:30 +0000159 return
160 self.ishow()
161
162
Guido van Rossuma8993cf1992-12-14 12:43:19 +0000163 def cb_out_new(self, *args):
Guido van Rossum9ee7e151992-08-25 12:29:30 +0000164 self.msg('')
165 hd, tl = os.path.split(self.ofile)
166 filename = fl.file_selector('Output video file', hd, '', tl)
167 if not filename: return
168 self.open_output(filename)
169
Guido van Rossuma8993cf1992-12-14 12:43:19 +0000170 def cb_out_close(self, *args):
Guido van Rossum9ee7e151992-08-25 12:29:30 +0000171 self.msg('')
172 self.close_output()
173
Guido van Rossuma8993cf1992-12-14 12:43:19 +0000174 def cb_out_skip(self, *args):
Guido van Rossum9ee7e151992-08-25 12:29:30 +0000175 if not self.ocheck(): return
176 if not self.vout.forward(): self.err('Output buffer exhausted')
177 self.oshow()
178
Guido van Rossuma8993cf1992-12-14 12:43:19 +0000179 def cb_out_back(self, *args):
Guido van Rossum9ee7e151992-08-25 12:29:30 +0000180 if not self.ocheck(): return
181 if not self.vout.backup(): self.err('Output buffer exhausted')
182 self.oshow()
183
Guido van Rossum9b86e1f1993-02-16 16:10:02 +0000184 def cb_out_slider(self, *args):
185 if not self.ocheck(): return
186 i = int(self.out_slider.get_slider_value())
187 left, pos, right = self.vout.qinfo()
188 i = int(self.out_slider.get_slider_value())
189 i = max(i, left)
190 i = min(i, right)
191 if i == pos: return
192 if not self.vout.seek(i):
193 self.err('Output seek failed')
194 self.oshow()
195
196 def cb_out_trunc(self, *arcs):
197 if not self.ocheck(): return
198 self.vout.trunc()
199 self.oshow()
200
Guido van Rossuma8993cf1992-12-14 12:43:19 +0000201 def cb_out_rewind(self, *args):
Guido van Rossum9ee7e151992-08-25 12:29:30 +0000202 if not self.ocheck(): return
203 self.vout.rewind()
204 self.oshow()
205
206
Guido van Rossuma8993cf1992-12-14 12:43:19 +0000207 def cb_quit(self, *args):
Guido van Rossum9ee7e151992-08-25 12:29:30 +0000208 self.close_input()
209 self.close_output()
210 sys.exit(0)
211
212
213 def open_input(self, filename):
214 self.ifile = filename
215 basename = os.path.split(filename)[1]
216 title = 'in: ' + basename
217 try:
Guido van Rossum9b86e1f1993-02-16 16:10:02 +0000218 vin = Viewer.InputViewer().init(filename, title)
Guido van Rossum9ee7e151992-08-25 12:29:30 +0000219 except:
220 self.err('Can\'t open input file', filename)
221 return
222 self.close_input()
223 self.vin = vin
224 self.in_file.label = basename
225 self.ishow()
226
227 def close_input(self):
228 if self.vin:
Guido van Rossum9b86e1f1993-02-16 16:10:02 +0000229 self.busy()
Guido van Rossum9ee7e151992-08-25 12:29:30 +0000230 self.msg('Closing input file...')
231 self.vin.close()
Guido van Rossum9b86e1f1993-02-16 16:10:02 +0000232 self.ready()
Guido van Rossum9ee7e151992-08-25 12:29:30 +0000233 self.msg('')
234 self.vin = None
235 self.in_file.label = '(none)'
236 self.format('in')
237
238 def ishow(self):
239 self.vin.show()
240 self.format('in')
241
242 def open_output(self, filename):
243 self.ofile = filename
244 basename = os.path.split(filename)[1]
245 title = 'out: ' + basename
246 try:
247 vout = Viewer.OutputViewer().init(filename, \
248 title, self.qsize)
249 except:
250 self.err('Can\'t open output file', filename)
251 return
252 self.close_output()
253 self.vout = vout
254 self.out_file.label = basename
255 if self.vin:
256 self.vout.setinfo(self.vin.getinfo())
257 self.oshow()
258
259 def close_output(self):
260 if self.vout:
Guido van Rossum9b86e1f1993-02-16 16:10:02 +0000261 self.busy()
Guido van Rossum9ee7e151992-08-25 12:29:30 +0000262 self.msg('Closing output file...')
263 self.vout.close()
Guido van Rossum9b86e1f1993-02-16 16:10:02 +0000264 self.ready()
Guido van Rossum9ee7e151992-08-25 12:29:30 +0000265 self.msg('')
266 self.vout = None
267 self.out_file.label = '(none)'
268 self.format('out')
269
270 def oshow(self):
271 self.vout.show()
272 self.format('out')
273
274
275 def msg(self, *args):
276 str = string.strip(string.join(args))
277 self.msg_area.label = str
278
279 def err(self, *args):
280 gl.ringbell()
281 apply(self.msg, args)
282
283 def format(self, io):
284 v = getattr(self, 'v' + io)
285 if v == None:
286 left = right = pos = 0
287 else:
Guido van Rossum9b86e1f1993-02-16 16:10:02 +0000288 left, pos, right = v.qinfo()
Guido van Rossum9ee7e151992-08-25 12:29:30 +0000289 getattr(self, io + '_info1').label = `left`
290 getattr(self, io + '_info2').label = `pos`
291 getattr(self, io + '_info3').label = `right`
Guido van Rossum9b86e1f1993-02-16 16:10:02 +0000292 sl = getattr(self, io + '_slider')
293 sl.freeze_object()
294 sl.set_slider_bounds(left, right)
295 sl.set_slider_value(pos)
296 sl.unfreeze_object()
Guido van Rossum9ee7e151992-08-25 12:29:30 +0000297
Guido van Rossume0be2b31992-09-01 14:45:57 +0000298
299try:
300 main()
301except KeyboardInterrupt:
302 print '[Interrupt]'