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: 7782 $"
37 _ = gettext.gettext
38 T_ = gettexter()
39
40
57
58
60 icon = 'firewire.png'
61 gladeFile = os.path.join(os.path.dirname(os.path.abspath(__file__)),
62 'wizard.glade')
63 componentType = 'firewire'
64 width_corrections = ['none', 'pad', 'stretch']
65
67
68 self._dims = None
69 self._factors = [1, 2, 3, 4, 6, 8]
70 self._input_heights = None
71 self._input_widths = None
72 self._par = None
73
74
75 self._factor_i = 0
76 self._width_correction = None
77
78
79
80
84
85
86
88 self.vbox_controls.set_sensitive(is_sensitive)
89 self.wizard.blockNext(not is_sensitive)
90
100
102
103 standard = 'Unknown'
104 aspect = 'Unknown'
105 h = self._dims[1]
106 if h == 576:
107 standard = 'PAL'
108 elif h == 480:
109 standard = 'NTSC'
110 else:
111 self.warning('Unknown capture standard for height %d' % h)
112
113 nom = self._par[0]
114 den = self._par[1]
115 if nom == 59 or nom == 10:
116 aspect = '4:3'
117 elif nom == 118 or nom == 40:
118 aspect = '16:9'
119 else:
120 self.warning('Unknown pixel aspect ratio %d/%d' % (nom, den))
121
122 text = _('%s, %s (%d/%d pixel aspect ratio)') % (standard, aspect,
123 nom, den)
124 self.label_camera_settings.set_text(text)
125
127 self._width_correction = None
128 for i in type(self).width_corrections:
129 if getattr(self, 'radiobutton_width_' + i).get_active():
130 self._width_correction = i
131 break
132 assert self._width_correction
133
146
148
149
150 sh = self._input_heights[self._factor_i]
151 sw = self._input_widths[self._factor_i]
152 par = 1. * self._par[0] / self._par[1]
153
154 if self.model.properties.is_square:
155 sw = int(math.ceil(sw * par))
156
157
158
159
160
161
162 self.frame_width_correction.set_sensitive(sw % 8 != 0)
163 self.radiobutton_width_none.set_active(sw % 8 == 0)
164 self.radiobutton_width_pad.set_active(sw % 8 != 0)
165
166
167 ow = sw
168 oh = sh
169
170 if self._width_correction == 'pad':
171 ow = sw + (8 - (sw % 8)) % 8
172 elif self._width_correction == 'stretch':
173 ow = sw + (8 - (sw % 8)) % 8
174 sw = ow
175
176 return dict(sw=sw, sh=sh, ow=ow, oh=oh)
177
179 self._setSensitive(False)
180 msg = messages.Info(T_(N_('Checking for Firewire devices...')),
181 mid='firewire-check')
182 self.wizard.add_msg(msg)
183 d = self.runInWorker('flumotion.worker.checks.gst010',
184 'check1394devices', mid='firewire-check')
185
186 def firewireCheckDone(devices):
187 self.wizard.clear_msg('firewire-check')
188 self.guid.prefill(devices)
189
190 def trapRemoteFailure(failure):
191 failure.trap(errors.RemoteRunFailure)
192
193 def trapRemoteError(failure):
194 failure.trap(errors.RemoteRunError)
195
196 d.addCallback(firewireCheckDone)
197 d.addErrback(trapRemoteError)
198 d.addErrback(trapRemoteFailure)
199
200 return d
201
203 self._setSensitive(False)
204 msg = messages.Info(T_(N_('Checking for Firewire device...')),
205 mid='firewire-check')
206 self.wizard.add_msg(msg)
207
208 d = self.runInWorker('flumotion.worker.checks.gst010', 'check1394',
209 mid='firewire-check', guid=self.guid.get_selected())
210
211 def firewireCheckDone(options):
212 self.wizard.clear_msg('firewire-check')
213 self._dims = (options['width'], options['height'])
214 self._par = options['par']
215 self._input_heights = [self._dims[1]/i for i in self._factors]
216 self._input_widths = [self._dims[0]/i for i in self._factors]
217 values = []
218 for i, height in enumerate(self._input_heights):
219 values.append(('%d pixels' % height, i))
220 self.combobox_scaled_height.prefill(values)
221 if len(values) > 2:
222 self.combobox_scaled_height.set_active(1)
223 self._setSensitive(True)
224 self._update_output_format()
225
226 def trapRemoteFailure(failure):
227 failure.trap(errors.RemoteRunFailure)
228
229 def trapRemoteError(failure):
230 failure.trap(errors.RemoteRunError)
231
232 d.addCallback(firewireCheckDone)
233 d.addErrback(trapRemoteError)
234 d.addErrback(trapRemoteFailure)
235 return d
236
237
238
241
244
247
250
253
256
257
259 name = 'Firewire'
260 title = _('Firewire Video')
261 docSection = 'help-configuration-assistant-producer-video-firewire'
262 docAnchor = ''
263 docVersion = 'local'
264
268
270 self.guid.data_type = int
271 self.framerate.data_type = float
272 self.add_proxy(self.model.properties,
273 ['guid', 'framerate', 'is_square'])
274
275
277 name = 'Firewire audio'
278 title = _('Firewire Audio')
279 docSection = 'help-configuration-assistant-producer-audio-firewire'
280 docAnchor = ''
281 docVersion = 'local'
282
286
287
288
290 self.frame_scaling.hide()
291 self.frame_width_correction.hide()
292 self.frame_capture.hide()
293 self.frame_output_format.hide()
294
297
298
310