1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 import gettext
19 import os
20
21 from twisted.python import util
22 from zope.interface import implements
23
24 from flumotion.admin.assistant.interfaces import IProducerPlugin
25 from flumotion.admin.assistant.models import VideoProducer
26 from flumotion.common import errors
27 from flumotion.common.fraction import fractionAsString
28 from flumotion.common.i18n import N_, gettexter
29 from flumotion.common.messages import Info
30 from flumotion.admin.gtk.basesteps import VideoProducerStep
31
32 __version__ = "$Rev$"
33 _ = gettext.gettext
34 T_ = gettexter()
35
36
56
57
59 name = 'Webcam'
60 title = _('Webcam')
61 icon = 'webcam.png'
62 gladeFile = os.path.join(os.path.dirname(os.path.abspath(__file__)),
63 'wizard.glade')
64 componentType = 'video4linux'
65 docSection = 'help-configuration-assistant-producer-video-webcam'
66 docAnchor = ''
67
72
73
74
76 self.device.data_type = str
77 self.framerate.data_type = object
78 self.size.data_type = object
79
80 self.add_proxy(self.model.properties, ['device'])
81 self.add_proxy(self.model, ['size', 'framerate'])
82
87
88
89
91
92
93
94 self.size.set_sensitive(False)
95 self.framerate.set_sensitive(False)
96
98 msg = Info(T_(N_('Checking for Webcam devices...')),
99 mid='webcam-check')
100 self.wizard.add_msg(msg)
101 d = self.runInWorker('flumotion.worker.checks.device',
102 'fetchDevices', 'webcam-check',
103 ['v4l2src', 'v4lsrc'], 'device')
104
105 def webcamCheckDone(devices):
106 self.wizard.clear_msg('webcam-check')
107 self.device.prefill(devices)
108
109 def trapRemoteFailure(failure):
110 failure.trap(errors.RemoteRunFailure)
111
112 def trapRemoteError(failure):
113 failure.trap(errors.RemoteRunError)
114
115 d.addCallback(webcamCheckDone)
116 d.addErrback(trapRemoteError)
117 d.addErrback(trapRemoteFailure)
118
119 return d
120
137
138 def errRemoteRunError(failure):
139 failure.trap(errors.RemoteRunError)
140 self.debug('a RemoteRunError happened')
141 self._clear()
142 self.wizard.taskFinished(blockNext=True)
143
144 def deviceFound(result):
145 if not result:
146 self.debug('Could not detect the device\'s configuration.')
147 self._clear()
148 self.wizard.taskFinished(blockNext=True)
149 return None
150
151 factoryName, sizes = result
152 self.model.properties.element_factory = factoryName
153 self._populateSizes(sizes)
154 self.wizard.clear_msg('webcam-check')
155 self.wizard.taskFinished()
156 self.size.set_sensitive(True)
157 self.framerate.set_sensitive(True)
158
159 d.addCallback(deviceFound)
160 d.addErrback(errRemoteRunFailure)
161 d.addErrback(errRemoteRunError)
162
164
165
166
167 self._sizes = sizes
168
169 values = []
170 for w, h in sorted(sizes.keys(), reverse=True):
171 values.append(['%d x %d' % (w, h), (w, h)])
172 self.size.prefill(values)
173 if len(values) > 1:
174 self.size.set_active(1)
175
177 values = util.OrderedDict()
178 for d in self._sizes[size]:
179 num, denom = d['framerate']
180 values['%.2f fps' % (1.0*num/denom)] = d
181 self.framerate.prefill(values.items())
182
183
184
187
193
194
204