3 # Edit CMIF movies interactively -- copy one or more files to an output file
8 # - convert between formats (grey, rgb, rgb8, ...)
10 # - cut out a given area of the image
11 # - change time base (a la Vtime)
26 watchcursor
.defwatch(WATCH
)
31 opts
, args
= getopt
.getopt(sys
.argv
[1:], 'q:')
34 qsize
= string
.atoi(a
)
37 ed
.open_input(args
[0])
39 ed
.open_output(args
[1])
46 def __init__(self
, qsize
):
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
)
57 def do_event(self
, dev
, val
):
58 if dev
== DEVICE
.REDRAW
:
65 gl
.winset(self
.form
.window
)
66 gl
.setcursor(WATCH
, 0, 0)
69 gl
.winset(self
.form
.window
)
70 gl
.setcursor(ARROW
, 0, 0)
75 if self
.vin
== None and self
.vout
== None:
76 self
.err('Please open input and output files first')
78 return self
.icheck() and self
.ocheck()
83 self
.err('Please open an input file first')
90 self
.err('Please open an output file first')
95 def cb_in_new(self
, *args
):
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
)
102 def cb_in_close(self
, *args
):
106 def cb_in_skip(self
, *args
):
107 if not self
.icheck(): return
108 if not self
.vin
.get(): self
.err('End of input file')
111 def cb_in_back(self
, *args
):
112 if not self
.icheck(): return
113 if not self
.vin
.backup(): self
.err('Begin of input file')
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())
123 if not self
.vin
.seek(i
):
124 self
.err('Input seek failed')
127 def cb_in_rewind(self
, *args
):
128 if not self
.icheck(): return
133 def cb_copy(self
, *args
):
134 if not self
.iocheck(): return
135 data
= self
.vin
.get()
137 self
.err('End of input file')
140 if self
.vout
.getinfo() <> self
.vin
.getinfo():
141 print 'Copying info...'
142 self
.vout
.setinfo(self
.vin
.getinfo())
143 if self
.vin
.format
== 'compress':
144 self
.vout
.setcompressheader(\
145 self
.vin
.getcompressheader())
150 def cb_uncopy(self
, *args
):
151 if not self
.iocheck(): return
152 if not self
.vout
.backup():
153 self
.err('Output buffer exhausted')
156 if not self
.vin
.backup():
157 self
.err('Begin of input file')
162 def cb_out_new(self
, *args
):
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
)
169 def cb_out_close(self
, *args
):
173 def cb_out_skip(self
, *args
):
174 if not self
.ocheck(): return
175 if not self
.vout
.forward(): self
.err('Output buffer exhausted')
178 def cb_out_back(self
, *args
):
179 if not self
.ocheck(): return
180 if not self
.vout
.backup(): self
.err('Output buffer exhausted')
183 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())
191 if not self
.vout
.seek(i
):
192 self
.err('Output seek failed')
195 def cb_out_trunc(self
, *arcs
):
196 if not self
.ocheck(): return
200 def cb_out_rewind(self
, *args
):
201 if not self
.ocheck(): return
206 def cb_quit(self
, *args
):
212 def open_input(self
, filename
):
213 self
.ifile
= filename
214 basename
= os
.path
.split(filename
)[1]
215 title
= 'in: ' + basename
217 vin
= Viewer
.InputViewer(filename
, title
)
219 self
.err('Can\'t open input file', filename
)
223 self
.in_file
.label
= basename
226 def close_input(self
):
229 self
.msg('Closing input file...')
234 self
.in_file
.label
= '(none)'
241 def open_output(self
, filename
):
242 self
.ofile
= filename
243 basename
= os
.path
.split(filename
)[1]
244 title
= 'out: ' + basename
246 vout
= Viewer
.OutputViewer(filename
, \
249 self
.err('Can\'t open output file', filename
)
253 self
.out_file
.label
= basename
255 self
.vout
.setinfo(self
.vin
.getinfo())
258 def close_output(self
):
261 self
.msg('Closing output file...')
266 self
.out_file
.label
= '(none)'
274 def msg(self
, *args
):
275 str = string
.strip(string
.join(args
))
276 self
.msg_area
.label
= str
278 def err(self
, *args
):
280 apply(self
.msg
, args
)
282 def format(self
, io
):
283 v
= getattr(self
, 'v' + io
)
285 left
= right
= pos
= 0
287 left
, pos
, right
= v
.qinfo()
288 getattr(self
, io
+ '_info1').label
= `left`
289 getattr(self
, io
+ '_info2').label
= `pos`
290 getattr(self
, io
+ '_info3').label
= `right`
291 sl
= getattr(self
, io
+ '_slider')
292 self
.form
.freeze_form()
293 sl
.set_slider_bounds(left
, right
)
294 sl
.set_slider_value(pos
)
295 self
.form
.unfreeze_form()
300 except KeyboardInterrupt: