blob: 4d763b0255430e5ac232e63d5f630a341a0cb6ff [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
22
23
24def main():
Guido van Rossuma4311111992-08-25 13:53:10 +000025 qsize = 40
Guido van Rossum9ee7e151992-08-25 12:29:30 +000026 opts, args = getopt.getopt(sys.argv[1:], 'q:')
27 for o, a in opts:
28 if o == '-q':
29 qsize = string.atoi(a)
30 ed = Editor().init(qsize)
31 if args[0:]:
32 ed.open_input(args[0])
33 if args[1:]:
34 ed.open_output(args[1])
35 while 1:
36 dummy = fl.do_forms()
37
38
39class Editor:
40
41 def init(self, qsize):
42 self.qsize = qsize
43 self.vin = None
44 self.vout = None
45 self.ifile = ''
46 self.ofile = ''
47 formdef = flp.parse_form('VeditForm', 'form')
48 flp.create_full_form(self, formdef)
49 self.form.show_form(FL.PLACE_SIZE, FL.TRUE, 'Vedit')
50 fl.set_event_call_back(self.do_event)
51 return self
52
Guido van Rossuma8993cf1992-12-14 12:43:19 +000053 def do_event(self, dev, val):
Guido van Rossum9ee7e151992-08-25 12:29:30 +000054 if dev == DEVICE.REDRAW:
55 if self.vin:
56 self.vin.redraw(val)
57 if self.vout:
58 self.vout.redraw(val)
59
60
61 def iocheck(self):
62 self.msg('')
63 if self.vin == None and self.vout == None:
64 self.err('Please open input and output files first')
65 return 0
66 return self.icheck() and self.ocheck()
67
68 def icheck(self):
69 self.msg('')
70 if self.vin == None:
71 self.err('Please open an input file first')
72 return 0
73 return 1
74
75 def ocheck(self):
76 self.msg('')
77 if self.vout == None:
78 self.err('Please open an output file first')
79 return 0
80 return 1
81
82
Guido van Rossuma8993cf1992-12-14 12:43:19 +000083 def cb_in_new(self, *args):
Guido van Rossum9ee7e151992-08-25 12:29:30 +000084 self.msg('')
85 hd, tl = os.path.split(self.ifile)
86 filename = fl.file_selector('Input video file', hd, '', tl)
87 if not filename: return
88 self.open_input(filename)
89
Guido van Rossuma8993cf1992-12-14 12:43:19 +000090 def cb_in_close(self, *args):
Guido van Rossum9ee7e151992-08-25 12:29:30 +000091 self.msg('')
92 self.close_input()
93
Guido van Rossuma8993cf1992-12-14 12:43:19 +000094 def cb_in_skip(self, *args):
Guido van Rossum9ee7e151992-08-25 12:29:30 +000095 if not self.icheck(): return
96 if not self.vin.get(): self.err('End of input file')
97 self.ishow()
98
Guido van Rossuma8993cf1992-12-14 12:43:19 +000099 def cb_in_back(self, *args):
Guido van Rossum9ee7e151992-08-25 12:29:30 +0000100 if not self.icheck(): return
101 if not self.vin.backup(): self.err('Input buffer exhausted')
102 self.ishow()
103
Guido van Rossuma8993cf1992-12-14 12:43:19 +0000104 def cb_in_rewind(self, *args):
Guido van Rossum9ee7e151992-08-25 12:29:30 +0000105 if not self.icheck(): return
106 self.vin.rewind()
107 self.ishow()
108
109
Guido van Rossuma8993cf1992-12-14 12:43:19 +0000110 def cb_copy(self, *args):
Guido van Rossum9ee7e151992-08-25 12:29:30 +0000111 if not self.iocheck(): return
112 data = self.vin.get()
Guido van Rossuma4311111992-08-25 13:53:10 +0000113 if not data:
114 self.err('End of input file')
115 self.ishow()
116 return
117 if self.vout.getinfo() <> self.vin.getinfo():
118 print 'Copying info...'
119 self.vout.setinfo(self.vin.getinfo())
120 self.vout.put(data)
121 self.oshow()
Guido van Rossum9ee7e151992-08-25 12:29:30 +0000122 self.ishow()
123
Guido van Rossuma8993cf1992-12-14 12:43:19 +0000124 def cb_uncopy(self, *args):
Guido van Rossum9ee7e151992-08-25 12:29:30 +0000125 if not self.iocheck(): return
126 if not self.vout.backup():
127 self.err('Output buffer exhausted')
128 return
129 self.oshow()
130 if not self.vin.backup():
131 self.err('Input buffer exhausted')
132 return
133 self.ishow()
134
135
Guido van Rossuma8993cf1992-12-14 12:43:19 +0000136 def cb_out_new(self, *args):
Guido van Rossum9ee7e151992-08-25 12:29:30 +0000137 self.msg('')
138 hd, tl = os.path.split(self.ofile)
139 filename = fl.file_selector('Output video file', hd, '', tl)
140 if not filename: return
141 self.open_output(filename)
142
Guido van Rossuma8993cf1992-12-14 12:43:19 +0000143 def cb_out_close(self, *args):
Guido van Rossum9ee7e151992-08-25 12:29:30 +0000144 self.msg('')
145 self.close_output()
146
Guido van Rossuma8993cf1992-12-14 12:43:19 +0000147 def cb_out_skip(self, *args):
Guido van Rossum9ee7e151992-08-25 12:29:30 +0000148 if not self.ocheck(): return
149 if not self.vout.forward(): self.err('Output buffer exhausted')
150 self.oshow()
151
Guido van Rossuma8993cf1992-12-14 12:43:19 +0000152 def cb_out_back(self, *args):
Guido van Rossum9ee7e151992-08-25 12:29:30 +0000153 if not self.ocheck(): return
154 if not self.vout.backup(): self.err('Output buffer exhausted')
155 self.oshow()
156
Guido van Rossuma8993cf1992-12-14 12:43:19 +0000157 def cb_out_rewind(self, *args):
Guido van Rossum9ee7e151992-08-25 12:29:30 +0000158 if not self.ocheck(): return
159 self.vout.rewind()
160 self.oshow()
161
162
Guido van Rossuma8993cf1992-12-14 12:43:19 +0000163 def cb_quit(self, *args):
Guido van Rossum9ee7e151992-08-25 12:29:30 +0000164 self.close_input()
165 self.close_output()
166 sys.exit(0)
167
168
169 def open_input(self, filename):
170 self.ifile = filename
171 basename = os.path.split(filename)[1]
172 title = 'in: ' + basename
173 try:
174 vin = Viewer.InputViewer().init(filename, \
175 title, self.qsize)
176 except:
177 self.err('Can\'t open input file', filename)
178 return
179 self.close_input()
180 self.vin = vin
181 self.in_file.label = basename
182 self.ishow()
183
184 def close_input(self):
185 if self.vin:
186 self.msg('Closing input file...')
187 self.vin.close()
188 self.msg('')
189 self.vin = None
190 self.in_file.label = '(none)'
191 self.format('in')
192
193 def ishow(self):
194 self.vin.show()
195 self.format('in')
196
197 def open_output(self, filename):
198 self.ofile = filename
199 basename = os.path.split(filename)[1]
200 title = 'out: ' + basename
201 try:
202 vout = Viewer.OutputViewer().init(filename, \
203 title, self.qsize)
204 except:
205 self.err('Can\'t open output file', filename)
206 return
207 self.close_output()
208 self.vout = vout
209 self.out_file.label = basename
210 if self.vin:
211 self.vout.setinfo(self.vin.getinfo())
212 self.oshow()
213
214 def close_output(self):
215 if self.vout:
216 self.msg('Closing output file...')
217 self.vout.close()
218 self.msg('')
219 self.vout = None
220 self.out_file.label = '(none)'
221 self.format('out')
222
223 def oshow(self):
224 self.vout.show()
225 self.format('out')
226
227
228 def msg(self, *args):
229 str = string.strip(string.join(args))
230 self.msg_area.label = str
231
232 def err(self, *args):
233 gl.ringbell()
234 apply(self.msg, args)
235
236 def format(self, io):
237 v = getattr(self, 'v' + io)
238 if v == None:
239 left = right = pos = 0
240 else:
241 left, right = v.qsizes()
242 pos = v.tell()
243 left = pos - left
244 right = pos + right
245 getattr(self, io + '_info1').label = `left`
246 getattr(self, io + '_info2').label = `pos`
247 getattr(self, io + '_info3').label = `right`
248
Guido van Rossume0be2b31992-09-01 14:45:57 +0000249
250try:
251 main()
252except KeyboardInterrupt:
253 print '[Interrupt]'