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.common import errors
28 from flumotion.common.fraction import fractionAsString
29 from flumotion.common.i18n import N_, gettexter
30 from flumotion.common.messages import Info
31
32
33
34 __pychecker__ = 'no-shadowbuiltin'
35 from flumotion.common.python import sorted
36 __pychecker__ = ''
37 from flumotion.wizard.basesteps import VideoProducerStep
38 from flumotion.wizard.interfaces import IProducerPlugin
39 from flumotion.wizard.models import VideoProducer
40
41 __version__ = "$Rev: 7097 $"
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
68
69
70
72 self._inSetup = True
73 self.device.data_type = str
74 self.framerate.data_type = object
75
76 self.device.prefill(['/dev/video0',
77 '/dev/video1',
78 '/dev/video2',
79 '/dev/video3'])
80
81 self.add_proxy(self.model.properties,['device'])
82
83 self._inSetup = False
84
89
90
91
93
94
95
96 self.size.set_sensitive(False)
97 self.framerate.set_sensitive(False)
98 self.label_name.set_label("")
99
119
120 def errRemoteRunError(failure):
121 failure.trap(errors.RemoteRunError)
122 self.debug('a RemoteRunError happened')
123 self._clear()
124 self.wizard.taskFinished(blockNext=True)
125
126 def deviceFound(result):
127 if not result:
128 self.debug('no device %s' % device)
129 self._clear()
130 self.wizard.taskFinished(blockNext=True)
131 return None
132
133 deviceName, factoryName, sizes = result
134 self.model.properties.element_factory = factoryName
135 self._populateSizes(sizes)
136 self.wizard.clear_msg('webcam-check')
137 self.label_name.set_label(deviceName)
138 self.wizard.taskFinished()
139 self.size.set_sensitive(True)
140 self.framerate.set_sensitive(True)
141
142 d.addCallback(deviceFound)
143 d.addErrback(errRemoteRunFailure)
144 d.addErrback(errRemoteRunError)
145
147
148
149
150 self._sizes = sizes
151
152 values = []
153 for w, h in sorted(sizes.keys(), reverse=True):
154 values.append(['%d x %d' % (w, h), (w, h)])
155 self.size.prefill(values)
156
158 values = []
159 for d in self._sizes[size]:
160 num, denom = d['framerate']
161 values.append(('%.2f fps' % (1.0*num/denom), d))
162 self.framerate.prefill(values)
163
175
177 if self._inSetup:
178 return None
179
180 framerate = self.framerate.get_selected()
181 if framerate:
182 num, denom = framerate['framerate']
183 mime = framerate['mime']
184 format = framerate.get('format', None)
185 else:
186 self.warning('something bad happened: no framerate selected?')
187 num, denom = 15, 2
188 mime = 'video/x-raw-yuv'
189 format = None
190
191 self.model.properties.mime = mime
192 self.model.properties.framerate = fractionAsString((num, denom))
193 if format:
194 self.model.properties.format = format
195
196
197
200
203
206
207
216