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: 8748 $"
37 _ = gettext.gettext
38 T_ = gettexter()
39
40
59
60
62 name = 'Webcam'
63 title = _('Webcam')
64 icon = 'webcam.png'
65 gladeFile = os.path.join(os.path.dirname(os.path.abspath(__file__)),
66 'wizard.glade')
67 componentType = 'video4linux'
68 docSection = 'help-configuration-assistant-producer-video-webcam'
69 docAnchor = ''
70
75
76
77
79 self.device.data_type = str
80 self.framerate.data_type = object
81 self.size.data_type = object
82
83 self.add_proxy(self.model.properties, ['device'])
84 self.add_proxy(self.model, ['size', 'framerate'])
85
90
91
92
94
95
96
97 self.size.set_sensitive(False)
98 self.framerate.set_sensitive(False)
99
101 msg = Info(T_(N_('Checking for Webcam devices...')),
102 mid='webcam-check')
103 self.wizard.add_msg(msg)
104 d = self.runInWorker('flumotion.worker.checks.device',
105 'fetchDevices', 'webcam-check',
106 ['v4l2src', 'v4lsrc'], 'device')
107
108 def webcamCheckDone(devices):
109 self.wizard.clear_msg('webcam-check')
110 self.device.prefill(devices)
111
112 def trapRemoteFailure(failure):
113 failure.trap(errors.RemoteRunFailure)
114
115 def trapRemoteError(failure):
116 failure.trap(errors.RemoteRunError)
117
118 d.addCallback(webcamCheckDone)
119 d.addErrback(trapRemoteError)
120 d.addErrback(trapRemoteFailure)
121
122 return d
123
140
141 def errRemoteRunError(failure):
142 failure.trap(errors.RemoteRunError)
143 self.debug('a RemoteRunError happened')
144 self._clear()
145 self.wizard.taskFinished(blockNext=True)
146
147 def deviceFound(result):
148 if not result:
149 self.debug('Could not detect the device\'s configuration.')
150 self._clear()
151 self.wizard.taskFinished(blockNext=True)
152 return None
153
154 factoryName, sizes = result
155 self.model.properties.element_factory = factoryName
156 self._populateSizes(sizes)
157 self.wizard.clear_msg('webcam-check')
158 self.wizard.taskFinished()
159 self.size.set_sensitive(True)
160 self.framerate.set_sensitive(True)
161
162 d.addCallback(deviceFound)
163 d.addErrback(errRemoteRunFailure)
164 d.addErrback(errRemoteRunError)
165
167
168
169
170 self._sizes = sizes
171
172 values = []
173 for w, h in sorted(sizes.keys(), reverse=True):
174 values.append(['%d x %d' % (w, h), (w, h)])
175 self.size.prefill(values)
176 if len(values) > 1:
177 self.size.set_active(1)
178
180 values = util.OrderedDict()
181 for d in self._sizes[size]:
182 num, denom = d['framerate']
183 values['%.2f fps' % (1.0*num/denom)] = d
184 self.framerate.prefill(values.items())
185
186
187
190
196
197
207