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
25 from twisted.python import util
26 from zope.interface import implements
27
28 from flumotion.admin.assistant.interfaces import IProducerPlugin
29 from flumotion.admin.assistant.models import VideoProducer
30 from flumotion.common import errors
31 from flumotion.common.fraction import fractionAsString
32 from flumotion.common.i18n import N_, gettexter
33 from flumotion.common.messages import Info
34 from flumotion.admin.gtk.basesteps import VideoProducerStep
35
36 __version__ = "$Rev$"
37 _ = gettext.gettext
38 T_ = gettexter()
39
40
60
61
63 name = 'Webcam'
64 title = _('Webcam')
65 icon = 'webcam.png'
66 gladeFile = os.path.join(os.path.dirname(os.path.abspath(__file__)),
67 'wizard.glade')
68 componentType = 'video4linux'
69 docSection = 'help-configuration-assistant-producer-video-webcam'
70 docAnchor = ''
71
76
77
78
80 self.device.data_type = str
81 self.framerate.data_type = object
82 self.size.data_type = object
83
84 self.add_proxy(self.model.properties, ['device'])
85 self.add_proxy(self.model, ['size', 'framerate'])
86
91
92
93
95
96
97
98 self.size.set_sensitive(False)
99 self.framerate.set_sensitive(False)
100
102 msg = Info(T_(N_('Checking for Webcam devices...')),
103 mid='webcam-check')
104 self.wizard.add_msg(msg)
105 d = self.runInWorker('flumotion.worker.checks.device',
106 'fetchDevices', 'webcam-check',
107 ['v4l2src', 'v4lsrc'], 'device')
108
109 def webcamCheckDone(devices):
110 self.wizard.clear_msg('webcam-check')
111 self.device.prefill(devices)
112
113 def trapRemoteFailure(failure):
114 failure.trap(errors.RemoteRunFailure)
115
116 def trapRemoteError(failure):
117 failure.trap(errors.RemoteRunError)
118
119 d.addCallback(webcamCheckDone)
120 d.addErrback(trapRemoteError)
121 d.addErrback(trapRemoteFailure)
122
123 return d
124
141
142 def errRemoteRunError(failure):
143 failure.trap(errors.RemoteRunError)
144 self.debug('a RemoteRunError happened')
145 self._clear()
146 self.wizard.taskFinished(blockNext=True)
147
148 def deviceFound(result):
149 if not result:
150 self.debug('Could not detect the device\'s configuration.')
151 self._clear()
152 self.wizard.taskFinished(blockNext=True)
153 return None
154
155 factoryName, sizes = result
156 self.model.properties.element_factory = factoryName
157 self._populateSizes(sizes)
158 self.wizard.clear_msg('webcam-check')
159 self.wizard.taskFinished()
160 self.size.set_sensitive(True)
161 self.framerate.set_sensitive(True)
162
163 d.addCallback(deviceFound)
164 d.addErrback(errRemoteRunFailure)
165 d.addErrback(errRemoteRunError)
166
168
169
170
171 self._sizes = sizes
172
173 values = []
174 for w, h in sorted(sizes.keys(), reverse=True):
175 values.append(['%d x %d' % (w, h), (w, h)])
176 self.size.prefill(values)
177 if len(values) > 1:
178 self.size.set_active(1)
179
181 values = util.OrderedDict()
182 for d in self._sizes[size]:
183 num, denom = d['framerate']
184 values['%.2f fps' % (1.0*num/denom)] = d
185 self.framerate.prefill(values.items())
186
187
188
191
197
198
208