Files for 2.1b1 distribution.
[python/dscho.git] / Demo / sgi / video / Vedit.py
blob60ef49fabebf0330b7d702b9b00314afc142701a
1 #! /usr/bin/env python
3 # Edit CMIF movies interactively -- copy one or more files to an output file
6 # XXX To do:
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)
14 import sys
15 import os
16 import gl, GL, DEVICE
17 import fl, FL
18 import flp
19 import Viewer
20 import getopt
21 import string
22 import watchcursor
24 ARROW = 0
25 WATCH = 1
26 watchcursor.defwatch(WATCH)
29 def main():
30 qsize = 40
31 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(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()
44 class Editor:
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)
57 def do_event(self, dev, val):
58 if dev == DEVICE.REDRAW:
59 if self.vin:
60 self.vin.redraw(val)
61 if self.vout:
62 self.vout.redraw(val)
64 def busy(self):
65 gl.winset(self.form.window)
66 gl.setcursor(WATCH, 0, 0)
68 def ready(self):
69 gl.winset(self.form.window)
70 gl.setcursor(ARROW, 0, 0)
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()
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
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
95 def cb_in_new(self, *args):
96 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)
102 def cb_in_close(self, *args):
103 self.msg('')
104 self.close_input()
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')
109 self.ishow()
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')
114 self.ishow()
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')
125 self.ishow()
127 def cb_in_rewind(self, *args):
128 if not self.icheck(): return
129 self.vin.rewind()
130 self.ishow()
133 def cb_copy(self, *args):
134 if not self.iocheck(): return
135 data = self.vin.get()
136 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())
143 if self.vin.format == 'compress':
144 self.vout.setcompressheader(\
145 self.vin.getcompressheader())
146 self.vout.put(data)
147 self.oshow()
148 self.ishow()
150 def cb_uncopy(self, *args):
151 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():
157 self.err('Begin of input file')
158 return
159 self.ishow()
162 def cb_out_new(self, *args):
163 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)
169 def cb_out_close(self, *args):
170 self.msg('')
171 self.close_output()
173 def cb_out_skip(self, *args):
174 if not self.ocheck(): return
175 if not self.vout.forward(): self.err('Output buffer exhausted')
176 self.oshow()
178 def cb_out_back(self, *args):
179 if not self.ocheck(): return
180 if not self.vout.backup(): self.err('Output buffer exhausted')
181 self.oshow()
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())
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()
195 def cb_out_trunc(self, *arcs):
196 if not self.ocheck(): return
197 self.vout.trunc()
198 self.oshow()
200 def cb_out_rewind(self, *args):
201 if not self.ocheck(): return
202 self.vout.rewind()
203 self.oshow()
206 def cb_quit(self, *args):
207 self.close_input()
208 self.close_output()
209 sys.exit(0)
212 def open_input(self, filename):
213 self.ifile = filename
214 basename = os.path.split(filename)[1]
215 title = 'in: ' + basename
216 try:
217 vin = Viewer.InputViewer(filename, title)
218 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()
226 def close_input(self):
227 if self.vin:
228 self.busy()
229 self.msg('Closing input file...')
230 self.vin.close()
231 self.ready()
232 self.msg('')
233 self.vin = None
234 self.in_file.label = '(none)'
235 self.format('in')
237 def ishow(self):
238 self.vin.show()
239 self.format('in')
241 def open_output(self, filename):
242 self.ofile = filename
243 basename = os.path.split(filename)[1]
244 title = 'out: ' + basename
245 try:
246 vout = Viewer.OutputViewer(filename, \
247 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()
258 def close_output(self):
259 if self.vout:
260 self.busy()
261 self.msg('Closing output file...')
262 self.vout.close()
263 self.ready()
264 self.msg('')
265 self.vout = None
266 self.out_file.label = '(none)'
267 self.format('out')
269 def oshow(self):
270 self.vout.show()
271 self.format('out')
274 def msg(self, *args):
275 str = string.strip(string.join(args))
276 self.msg_area.label = str
278 def err(self, *args):
279 gl.ringbell()
280 apply(self.msg, args)
282 def format(self, io):
283 v = getattr(self, 'v' + io)
284 if v == None:
285 left = right = pos = 0
286 else:
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()
298 try:
299 main()
300 except KeyboardInterrupt:
301 print '[Interrupt]'