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 zope.interface import implements
26
27 from flumotion.admin.assistant.interfaces import IProducerPlugin
28 from flumotion.admin.assistant.models import VideoProducer
29 from flumotion.common import errors
30 from flumotion.common.fraction import fractionAsFloat
31 from flumotion.common.i18n import N_, gettexter
32 from flumotion.common.messages import Info
33
34
35
36 __pychecker__ = 'no-shadowbuiltin'
37 from flumotion.common.python import sorted
38 __pychecker__ = ''
39 from flumotion.admin.gtk.basesteps import VideoProducerStep
40
41 __version__ = "$Rev: 7785 $"
42 _ = gettext.gettext
43 T_ = gettexter()
44
45
53
54
56 name = 'Webcam'
57 title = _('Webcam')
58 icon = 'webcam.png'
59 gladeFile = os.path.join(os.path.dirname(os.path.abspath(__file__)),
60 'wizard.glade')
61 componentType = 'video4linux'
62 docSection = 'help-configuration-assistant-producer-video-webcam'
63 docAnchor = ''
64
70
71
72
74 self._inSetup = True
75 self.device.data_type = str
76 self.framerate.data_type = object
77
78 self.device.prefill(['/dev/video0',
79 '/dev/video1',
80 '/dev/video2',
81 '/dev/video3'])
82
83 self.add_proxy(self.model.properties, ['device'])
84
85 self._inSetup = False
86
91
92
93
95
96
97
98 self.size.set_sensitive(False)
99 self.framerate.set_sensitive(False)
100 self.label_name.set_label("")
101
103 if self._inSetup:
104 return None
105
106 self.wizard.waitForTask('webcam checks')
107
108 device = self.device.get_selected()
109 msg = Info(T_(
110 N_("Probing the webcam. This can take a while...")),
111 mid='webcam-check')
112 self.wizard.add_msg(msg)
113 d = self.runInWorker('flumotion.worker.checks.video', 'checkWebcam',
114 device, mid='webcam-check')
115
116 def errRemoteRunFailure(failure):
117 failure.trap(errors.RemoteRunFailure)
118 self.debug('a RemoteRunFailure happened')
119 self._clear()
120 self.wizard.taskFinished(blockNext=True)
121
122 def errRemoteRunError(failure):
123 failure.trap(errors.RemoteRunError)
124 self.debug('a RemoteRunError happened')
125 self._clear()
126 self.wizard.taskFinished(blockNext=True)
127
128 def deviceFound(result):
129 if not result:
130 self.debug('no device %s' % device)
131 self._clear()
132 self.wizard.taskFinished(blockNext=True)
133 return None
134
135 deviceName, factoryName, sizes = result
136 self.model.properties.element_factory = factoryName
137 self._populateSizes(sizes)
138 self.wizard.clear_msg('webcam-check')
139 self.label_name.set_label(deviceName)
140 self.wizard.taskFinished()
141 self.size.set_sensitive(True)
142 self.framerate.set_sensitive(True)
143
144 d.addCallback(deviceFound)
145 d.addErrback(errRemoteRunFailure)
146 d.addErrback(errRemoteRunError)
147
149
150
151
152 self._sizes = sizes
153
154 values = []
155 for w, h in sorted(sizes.keys(), reverse=True):
156 values.append(['%d x %d' % (w, h), (w, h)])
157 self.size.prefill(values)
158
160 values = []
161 for d in self._sizes[size]:
162 num, denom = d['framerate']
163 values.append(('%.2f fps' % (1.0*num/denom), d))
164 self.framerate.prefill(values)
165
177
179 if self._inSetup:
180 return None
181
182 framerate = self.framerate.get_selected()
183 if framerate:
184 num, denom = framerate['framerate']
185 mime = framerate['mime']
186 format = framerate.get('format', None)
187 else:
188 self.warning('something bad happened: no framerate selected?')
189 num, denom = 15, 2
190 mime = 'video/x-raw-yuv'
191 format = None
192
193 self.model.properties.mime = mime
194 self.model.properties.framerate = fractionAsFloat((num, denom))
195 if format:
196 self.model.properties.format = format
197
198
199
202
205
208
209
219