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