blob: 60ef49fabebf0330b7d702b9b00314afc142701a [file] [log] [blame]
Guido van Rossumf06ee5f1996-11-27 19:52:01 +00001#! /usr/bin/env python
Guido van Rossum9ee7e151992-08-25 12:29:30 +00002
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)
Guido van Rossum21a3ff91993-12-17 15:11:41 +000035 ed = Editor(qsize)
Guido van Rossum9ee7e151992-08-25 12:29:30 +000036 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
Guido van Rossum21a3ff91993-12-17 15:11:41 +000046 def __init__(self, qsize):
Guido van Rossum9ee7e151992-08-25 12:29:30 +000047 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)
Guido van Rossum9ee7e151992-08-25 12:29:30 +000056
Guido van Rossuma8993cf1992-12-14 12:43:19 +000057 def do_event(self, dev, val):
Guido van Rossum9ee7e151992-08-25 12:29:30 +000058 if dev == DEVICE.REDRAW:
59 if self.vin:
60 self.vin.redraw(val)
61 if self.vout:
62 self.vout.redraw(val)
63
Guido van Rossum9b86e1f1993-02-16 16:10:02 +000064 def busy(self):
65 gl.winset(self.form.window)
66 gl.setcursor(WATCH, 0, 0)
67
68 def ready(self):
69 gl.winset(self.form.window)
70 gl.setcursor(ARROW, 0, 0)
71
Guido van Rossum9ee7e151992-08-25 12:29:30 +000072
73 def iocheck(self):
74 self.msg('')
75 if self.vin == None and self.vout == None:
76 self.err('Please open input and output files first')
77 return 0
78 return self.icheck() and self.ocheck()
79
80 def icheck(self):
81 self.msg('')
82 if self.vin == None:
83 self.err('Please open an input file first')
84 return 0
85 return 1
86
87 def ocheck(self):
88 self.msg('')
89 if self.vout == None:
90 self.err('Please open an output file first')
91 return 0
92 return 1
93
94
Guido van Rossuma8993cf1992-12-14 12:43:19 +000095 def cb_in_new(self, *args):
Guido van Rossum9ee7e151992-08-25 12:29:30 +000096 self.msg('')
97 hd, tl = os.path.split(self.ifile)
98 filename = fl.file_selector('Input video file', hd, '', tl)
99 if not filename: return
100 self.open_input(filename)
101
Guido van Rossuma8993cf1992-12-14 12:43:19 +0000102 def cb_in_close(self, *args):
Guido van Rossum9ee7e151992-08-25 12:29:30 +0000103 self.msg('')
104 self.close_input()
105
Guido van Rossuma8993cf1992-12-14 12:43:19 +0000106 def cb_in_skip(self, *args):
Guido van Rossum9ee7e151992-08-25 12:29:30 +0000107 if not self.icheck(): return
108 if not self.vin.get(): self.err('End of input file')
109 self.ishow()
110
Guido van Rossuma8993cf1992-12-14 12:43:19 +0000111 def cb_in_back(self, *args):
Guido van Rossum9ee7e151992-08-25 12:29:30 +0000112 if not self.icheck(): return
Guido van Rossum9b86e1f1993-02-16 16:10:02 +0000113 if not self.vin.backup(): self.err('Begin of input file')
114 self.ishow()
115
116 def cb_in_slider(self, *args):
117 if not self.icheck(): return
118 left, pos, right = self.vin.qinfo()
119 i = int(self.in_slider.get_slider_value())
120 i = max(i, left)
121 i = min(i, right)
122 if i == pos: return
123 if not self.vin.seek(i):
124 self.err('Input seek failed')
Guido van Rossum9ee7e151992-08-25 12:29:30 +0000125 self.ishow()
126
Guido van Rossuma8993cf1992-12-14 12:43:19 +0000127 def cb_in_rewind(self, *args):
Guido van Rossum9ee7e151992-08-25 12:29:30 +0000128 if not self.icheck(): return
129 self.vin.rewind()
130 self.ishow()
131
132
Guido van Rossuma8993cf1992-12-14 12:43:19 +0000133 def cb_copy(self, *args):
Guido van Rossum9ee7e151992-08-25 12:29:30 +0000134 if not self.iocheck(): return
135 data = self.vin.get()
Guido van Rossuma4311111992-08-25 13:53:10 +0000136 if not data:
137 self.err('End of input file')
138 self.ishow()
139 return
140 if self.vout.getinfo() <> self.vin.getinfo():
141 print 'Copying info...'
142 self.vout.setinfo(self.vin.getinfo())
Jack Jansendbf71b71993-09-28 15:29:18 +0000143 if self.vin.format == 'compress':
144 self.vout.setcompressheader(\
145 self.vin.getcompressheader())
Guido van Rossuma4311111992-08-25 13:53:10 +0000146 self.vout.put(data)
147 self.oshow()
Guido van Rossum9ee7e151992-08-25 12:29:30 +0000148 self.ishow()
149
Guido van Rossuma8993cf1992-12-14 12:43:19 +0000150 def cb_uncopy(self, *args):
Guido van Rossum9ee7e151992-08-25 12:29:30 +0000151 if not self.iocheck(): return
152 if not self.vout.backup():
153 self.err('Output buffer exhausted')
154 return
155 self.oshow()
156 if not self.vin.backup():
Guido van Rossum9b86e1f1993-02-16 16:10:02 +0000157 self.err('Begin of input file')
Guido van Rossum9ee7e151992-08-25 12:29:30 +0000158 return
159 self.ishow()
160
161
Guido van Rossuma8993cf1992-12-14 12:43:19 +0000162 def cb_out_new(self, *args):
Guido van Rossum9ee7e151992-08-25 12:29:30 +0000163 self.msg('')
164 hd, tl = os.path.split(self.ofile)
165 filename = fl.file_selector('Output video file', hd, '', tl)
166 if not filename: return
167 self.open_output(filename)
168
Guido van Rossuma8993cf1992-12-14 12:43:19 +0000169 def cb_out_close(self, *args):
Guido van Rossum9ee7e151992-08-25 12:29:30 +0000170 self.msg('')
171 self.close_output()
172
Guido van Rossuma8993cf1992-12-14 12:43:19 +0000173 def cb_out_skip(self, *args):
Guido van Rossum9ee7e151992-08-25 12:29:30 +0000174 if not self.ocheck(): return
175 if not self.vout.forward(): self.err('Output buffer exhausted')
176 self.oshow()
177
Guido van Rossuma8993cf1992-12-14 12:43:19 +0000178 def cb_out_back(self, *args):
Guido van Rossum9ee7e151992-08-25 12:29:30 +0000179 if not self.ocheck(): return
180 if not self.vout.backup(): self.err('Output buffer exhausted')
181 self.oshow()
182
Guido van Rossum9b86e1f1993-02-16 16:10:02 +0000183 def cb_out_slider(self, *args):
184 if not self.ocheck(): return
185 i = int(self.out_slider.get_slider_value())
186 left, pos, right = self.vout.qinfo()
187 i = int(self.out_slider.get_slider_value())
188 i = max(i, left)
189 i = min(i, right)
190 if i == pos: return
191 if not self.vout.seek(i):
192 self.err('Output seek failed')
193 self.oshow()
194
195 def cb_out_trunc(self, *arcs):
196 if not self.ocheck(): return
197 self.vout.trunc()
198 self.oshow()
199
Guido van Rossuma8993cf1992-12-14 12:43:19 +0000200 def cb_out_rewind(self, *args):
Guido van Rossum9ee7e151992-08-25 12:29:30 +0000201 if not self.ocheck(): return
202 self.vout.rewind()
203 self.oshow()
204
205
Guido van Rossuma8993cf1992-12-14 12:43:19 +0000206 def cb_quit(self, *args):
Guido van Rossum9ee7e151992-08-25 12:29:30 +0000207 self.close_input()
208 self.close_output()
209 sys.exit(0)
210
211
212 def open_input(self, filename):
213 self.ifile = filename
214 basename = os.path.split(filename)[1]
215 title = 'in: ' + basename
216 try:
Guido van Rossum21a3ff91993-12-17 15:11:41 +0000217 vin = Viewer.InputViewer(filename, title)
Guido van Rossum9ee7e151992-08-25 12:29:30 +0000218 except:
219 self.err('Can\'t open input file', filename)
220 return
221 self.close_input()
222 self.vin = vin
223 self.in_file.label = basename
224 self.ishow()
225
226 def close_input(self):
227 if self.vin:
Guido van Rossum9b86e1f1993-02-16 16:10:02 +0000228 self.busy()
Guido van Rossum9ee7e151992-08-25 12:29:30 +0000229 self.msg('Closing input file...')
230 self.vin.close()
Guido van Rossum9b86e1f1993-02-16 16:10:02 +0000231 self.ready()
Guido van Rossum9ee7e151992-08-25 12:29:30 +0000232 self.msg('')
233 self.vin = None
234 self.in_file.label = '(none)'
235 self.format('in')
236
237 def ishow(self):
238 self.vin.show()
239 self.format('in')
240
241 def open_output(self, filename):
242 self.ofile = filename
243 basename = os.path.split(filename)[1]
244 title = 'out: ' + basename
245 try:
Guido van Rossum21a3ff91993-12-17 15:11:41 +0000246 vout = Viewer.OutputViewer(filename, \
Guido van Rossum9ee7e151992-08-25 12:29:30 +0000247 title, self.qsize)
248 except:
249 self.err('Can\'t open output file', filename)
250 return
251 self.close_output()
252 self.vout = vout
253 self.out_file.label = basename
254 if self.vin:
255 self.vout.setinfo(self.vin.getinfo())
256 self.oshow()
257
258 def close_output(self):
259 if self.vout:
Guido van Rossum9b86e1f1993-02-16 16:10:02 +0000260 self.busy()
Guido van Rossum9ee7e151992-08-25 12:29:30 +0000261 self.msg('Closing output file...')
262 self.vout.close()
Guido van Rossum9b86e1f1993-02-16 16:10:02 +0000263 self.ready()
Guido van Rossum9ee7e151992-08-25 12:29:30 +0000264 self.msg('')
265 self.vout = None
266 self.out_file.label = '(none)'
267 self.format('out')
268
269 def oshow(self):
270 self.vout.show()
271 self.format('out')
272
273
274 def msg(self, *args):
275 str = string.strip(string.join(args))
276 self.msg_area.label = str
277
278 def err(self, *args):
279 gl.ringbell()
280 apply(self.msg, args)
281
282 def format(self, io):
283 v = getattr(self, 'v' + io)
284 if v == None:
285 left = right = pos = 0
286 else:
Guido van Rossum9b86e1f1993-02-16 16:10:02 +0000287 left, pos, right = v.qinfo()
Guido van Rossum9ee7e151992-08-25 12:29:30 +0000288 getattr(self, io + '_info1').label = `left`
289 getattr(self, io + '_info2').label = `pos`
290 getattr(self, io + '_info3').label = `right`
Guido van Rossum9b86e1f1993-02-16 16:10:02 +0000291 sl = getattr(self, io + '_slider')
Guido van Rossumca1c8761993-12-28 21:27:23 +0000292 self.form.freeze_form()
Guido van Rossum9b86e1f1993-02-16 16:10:02 +0000293 sl.set_slider_bounds(left, right)
294 sl.set_slider_value(pos)
Guido van Rossumca1c8761993-12-28 21:27:23 +0000295 self.form.unfreeze_form()
Guido van Rossum9ee7e151992-08-25 12:29:30 +0000296
Guido van Rossume0be2b31992-09-01 14:45:57 +0000297
298try:
299 main()
300except KeyboardInterrupt:
301 print '[Interrupt]'