1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 import gettext
19 import os
20 import math
21
22 from zope.interface import implements
23
24 from flumotion.admin.assistant.interfaces import IProducerPlugin
25 from flumotion.admin.assistant.models import AudioProducer, VideoProducer, \
26 AudioEncoder, VideoEncoder, VideoConverter
27 from flumotion.common import errors, messages
28 from flumotion.common.i18n import N_, gettexter
29 from flumotion.admin.gtk.basesteps import AudioProducerStep, VideoProducerStep
30
31 __pychecker__ = 'no-returnvalues'
32 __version__ = "$Rev$"
33 _ = gettext.gettext
34 T_ = gettexter()
35
36
65
66
68 icon = 'firewire.png'
69 gladeFile = os.path.join(os.path.dirname(os.path.abspath(__file__)),
70 'wizard.glade')
71 componentType = 'firewire'
72 width_corrections = ['none', 'pad', 'stretch']
73
75
76 self._dims = None
77 self._factors = [1, 2, 3, 4, 6, 8]
78 self._input_heights = None
79 self._input_widths = None
80 self._par = None
81
82
83 self._factor_i = 0
84 self._width_correction = None
85
86
87
88
92
93
94
96 self.vbox_controls.set_sensitive(is_sensitive)
97 self.wizard.blockNext(not is_sensitive)
98
108
110
111 standard = 'Unknown'
112 aspect = 'Unknown'
113 h = self._dims[1]
114 if h == 576:
115 standard = 'PAL'
116 elif h == 480:
117 standard = 'NTSC'
118 else:
119 self.warning('Unknown capture standard for height %d' % h)
120
121 nom = self._par[0]
122 den = self._par[1]
123 if nom == 59 or nom == 10:
124 aspect = '4:3'
125 elif nom == 118 or nom == 40:
126 aspect = '16:9'
127 else:
128 self.warning('Unknown pixel aspect ratio %d/%d' % (nom, den))
129
130 text = _('%s, %s (%d/%d pixel aspect ratio)') % (standard, aspect,
131 nom, den)
132 self.label_camera_settings.set_text(text)
133
135 self._width_correction = None
136 for i in type(self).width_corrections:
137 if getattr(self, 'radiobutton_width_' + i).get_active():
138 self._width_correction = i
139 break
140 assert self._width_correction
141
176
178
179
180 oh = self._input_heights[self._factor_i]
181 ow = self._input_widths[self._factor_i]
182 par = 1. * self._par[0] / self._par[1]
183
184 if self.model.properties.is_square:
185 ow = int(math.ceil(ow * par))
186
187
188
189 return dict(ow=ow, oh=oh)
190
192 self._setSensitive(False)
193 msg = messages.Info(T_(N_('Checking for Firewire devices...')),
194 mid='firewire-check')
195 self.wizard.add_msg(msg)
196 d = self.runInWorker('flumotion.worker.checks.device',
197 'fetchDevices', 'firewire-check',
198 ['dv1394src'], 'guid')
199
200 def firewireCheckDone(devices):
201 self.wizard.clear_msg('firewire-check')
202 self.guid.prefill(devices)
203
204 def trapRemoteFailure(failure):
205 failure.trap(errors.RemoteRunFailure)
206
207 def trapRemoteError(failure):
208 failure.trap(errors.RemoteRunError)
209
210 d.addCallback(firewireCheckDone)
211 d.addErrback(trapRemoteError)
212 d.addErrback(trapRemoteFailure)
213
214 return d
215
217 self._setSensitive(False)
218 msg = messages.Info(T_(N_('Checking for Firewire device...')),
219 mid='firewire-check')
220 self.wizard.add_msg(msg)
221
222 d = self.runInWorker('flumotion.worker.checks.gst010', 'check1394',
223 mid='firewire-check', guid=self.guid.get_selected())
224
225 def chooseDecoder(missing):
226 if 'ffdec_dvvideo' in missing and 'dvdec' not in missing:
227 msg = messages.Warning(T_(
228 N_("GStreamer's dv decoder element (dvdec) will be used "
229 "instead of FFmpeg's which is better in terms of "
230 "performance.\nIf the configuration doesn't work "
231 "properly, consider installing the ffmpeg plugins for "
232 "gstreamer.")), mid='firewire-warning')
233 self.wizard.add_msg(msg)
234 self.model.properties.decoder = 'dvdec'
235 elif 'dvdec' in missing:
236 msg = messages.Error(T_(
237 N_("None of the dv decoder elements was found in your "
238 "system, consider installing the ffmpeg plugins for "
239 "gstreamer to continue.")), mid='firewire-error')
240 self.wizard.add_msg(msg)
241 self.wizard.blockNext(True)
242
243 def firewireCheckDone(options):
244 self.wizard.clear_msg('firewire-check')
245 self._dims = (options['width'], options['height'])
246 self._par = options['par']
247 self._input_heights = [self._dims[1]/i for i in self._factors]
248 self._input_widths = [self._dims[0]/i for i in self._factors]
249 values = []
250 for i, height in enumerate(self._input_heights):
251 values.append(('%d pixels' % height, i))
252 self.combobox_scaled_height.prefill(values)
253 if len(values) > 2:
254 self.combobox_scaled_height.set_active(1)
255 self._setSensitive(True)
256 self._update_output_format(True)
257
258 d = self.wizard.checkElements(self.model.worker,
259 'ffdec_dvvideo', 'dvdec')
260 d.addCallback(chooseDecoder)
261 return d
262
263 def trapRemoteFailure(failure):
264 failure.trap(errors.RemoteRunFailure)
265
266 def trapRemoteError(failure):
267 failure.trap(errors.RemoteRunError)
268
269 d.addCallback(firewireCheckDone)
270 d.addErrback(trapRemoteError)
271 d.addErrback(trapRemoteFailure)
272 return d
273
274
275
278
281
284
287
290
293
294
296 name = 'Firewire'
297 title = _('Firewire Video')
298 docSection = 'help-configuration-assistant-producer-video-firewire'
299 docAnchor = ''
300 docVersion = 'local'
301
305
307 self.guid.data_type = int
308 self.framerate.data_type = float
309 self.add_proxy(self.model.properties,
310 ['guid', 'framerate', 'is_square'])
311
312
314 name = 'Firewire audio'
315 title = _('Firewire Audio')
316 docSection = 'help-configuration-assistant-producer-audio-firewire'
317 docAnchor = ''
318 docVersion = 'local'
319
323
324
325
327 self.guid.data_type = int
328 self.add_proxy(self.model.properties, ['guid'])
329 self.frame_scaling.hide()
330 self.frame_width_correction.hide()
331 self.frame_capture.hide()
332 self.frame_output_format.hide()
333
336
337
349