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.common import errors, messages
29 from flumotion.common.i18n import N_, gettexter
30 from flumotion.wizard.basesteps import AudioProducerStep, VideoProducerStep
31 from flumotion.wizard.interfaces import IProducerPlugin
32 from flumotion.wizard.models import AudioProducer, VideoProducer, \
33 AudioEncoder, VideoEncoder, VideoConverter
34
35 __pychecker__ = 'no-returnvalues'
36 __version__ = "$Rev: 7097 $"
37 _ = gettext.gettext
38 T_ = gettexter()
39
40
55
56
58 icon = 'firewire.png'
59 gladeFile = os.path.join(os.path.dirname(os.path.abspath(__file__)),
60 'wizard.glade')
61 componentType = 'firewire'
62 width_corrections = ['none', 'pad', 'stretch']
63
65
66 self._dims = None
67 self._factors = [1, 2, 3, 4, 6, 8]
68 self._input_heights = None
69 self._input_widths = None
70 self._par = None
71
72
73 self._factor_i = None
74 self._width_correction = None
75
76
77
78
82
83
84
86 self.vbox_controls.set_sensitive(is_sensitive)
87 self.wizard.blockNext(not is_sensitive)
88
97
99
100 standard = 'Unknown'
101 aspect = 'Unknown'
102 h = self._dims[1]
103 if h == 576:
104 standard = 'PAL'
105 elif h == 480:
106 standard = 'NTSC'
107 else:
108 self.warning('Unknown capture standard for height %d' % h)
109
110 nom = self._par[0]
111 den = self._par[1]
112 if nom == 59 or nom == 10:
113 aspect = '4:3'
114 elif nom == 118 or nom == 40:
115 aspect = '16:9'
116 else:
117 self.warning('Unknown pixel aspect ratio %d/%d' % (nom, den))
118
119 text = _('%s, %s (%d/%d pixel aspect ratio)') % (standard, aspect,
120 nom, den)
121 self.label_camera_settings.set_text(text)
122
124 self._width_correction = None
125 for i in type(self).width_corrections:
126 if getattr(self,'radiobutton_width_'+i).get_active():
127 self._width_correction = i
128 break
129 assert self._width_correction
130
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
164
165 ow = sw
166 oh = sh
167 if self._width_correction == 'pad':
168 ow = sw + (8 - (sw % 8)) % 8
169 elif self._width_correction == 'stretch':
170 ow = sw + (8 - (sw % 8)) % 8
171 sw = ow
172
173 return dict(sw=sw,sh=sh,ow=ow,oh=oh)
174
176 self._setSensitive(False)
177 msg = messages.Info(T_(N_('Checking for Firewire device...')),
178 mid='firewire-check')
179 self.wizard.add_msg(msg)
180 d = self.runInWorker('flumotion.worker.checks.gst010', 'check1394',
181 mid='firewire-check')
182
183 def firewireCheckDone(options):
184 self.wizard.clear_msg('firewire-check')
185 self._dims = (options['width'], options['height'])
186 self._par = options['par']
187 self._input_heights = [self._dims[1]/i for i in self._factors]
188 self._input_widths = [self._dims[0]/i for i in self._factors]
189 values = []
190 for i, height in enumerate(self._input_heights):
191 values.append(('%d pixels' % height, i))
192 self.combobox_scaled_height.prefill(values)
193 self._setSensitive(True)
194 self._update_output_format()
195
196 def trapRemoteFailure(failure):
197 failure.trap(errors.RemoteRunFailure)
198
199 def trapRemoteError(failure):
200 failure.trap(errors.RemoteRunError)
201 d.addCallback(firewireCheckDone)
202 d.addErrback(trapRemoteError)
203 d.addErrback(trapRemoteFailure)
204 return d
205
206
207
210
213
216
219
222
223
225 name = 'Firewire'
226 title = _('Firewire')
230
231
233 name = 'Firewire audio'
234 title = _('Firewire audio')
235
239
240
241
243 self.frame_scaling.hide()
244 self.frame_width_correction.hide()
245 self.frame_capture.hide()
246 self.frame_output_format.hide()
247
250
251
266