Package flumotion :: Package component :: Package producers :: Package webcam :: Module wizard_gtk
[hide private]

Source Code for Module flumotion.component.producers.webcam.wizard_gtk

  1  # -*- Mode: Python -*- 
  2  # vi:si:et:sw=4:sts=4:ts=4 
  3  # 
  4  # Flumotion - a streaming media server 
  5  # Copyright (C) 2008 Fluendo, S.L. (www.fluendo.com). 
  6  # All rights reserved. 
  7   
  8  # This file may be distributed and/or modified under the terms of 
  9  # the GNU General Public License version 2 as published by 
 10  # the Free Software Foundation. 
 11  # This file is distributed without any warranty; without even the implied 
 12  # warranty of merchantability or fitness for a particular purpose. 
 13  # See "LICENSE.GPL" in the source distribution for more information. 
 14   
 15  # Licensees having purchased or holding a valid Flumotion Advanced 
 16  # Streaming Server license may use this file in accordance with the 
 17  # Flumotion Advanced Streaming Server Commercial License Agreement. 
 18  # See "LICENSE.Flumotion" in the source distribution for more information. 
 19   
 20  # Headers in this file shall remain intact. 
 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  # FIXME: make pychecker able to suppress shadowed builtins like these 
 34  # at the defining site, not caller site 
 35  # P2.4 
 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   
46 -class WebcamProducer(VideoProducer):
47 componentType = 'webcam-producer' 48
49 - def __init__(self):
50 super(WebcamProducer, self).__init__() 51 52 self.properties.device = '/dev/video0'
53 54
55 -class WebcamStep(VideoProducerStep):
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
65 - def __init__(self, wizard, model):
66 VideoProducerStep.__init__(self, wizard, model) 67 self._inSetup = False 68 # _sizes is probed, not set from the UI 69 self._sizes = None
70 71 # WizardStep 72
73 - def setup(self):
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
87 - def workerChanged(self, worker):
88 self.model.worker = worker 89 self._clear() 90 self._runChecks()
91 92 # Private 93
94 - def _clear(self):
95 # Clear is called: 96 # - when changing a worker 97 # - after probing a device, if none found 98 self.size.set_sensitive(False) 99 self.framerate.set_sensitive(False) 100 self.label_name.set_label("")
101
102 - def _runChecks(self):
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
148 - def _populateSizes(self, sizes):
149 # Set sizes before populating the values, since 150 # it trigger size_changed which depends on this 151 # to be set 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
159 - def _populateFramerates(self, size):
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
166 - def _updateSize(self):
167 size = self.size.get_selected() 168 if size: 169 self._populateFramerates(size) 170 width, height = size 171 else: 172 self.warning('something bad happened: no height/width selected?') 173 width, height = 320, 240 174 175 self.model.properties.width = width 176 self.model.properties.height = height
177
178 - def _updateFramerate(self):
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 # Callbacks 199
200 - def on_device_changed(self, combo):
201 self._runChecks()
202
203 - def on_size_changed(self, combo):
204 self._updateSize()
205
206 - def on_framerate_changed(self, combo):
207 self._updateFramerate()
208 209
210 -class WebcamWizardPlugin(object):
211 implements(IProducerPlugin) 212
213 - def __init__(self, wizard):
214 self.wizard = wizard 215 self.model = WebcamProducer()
216
217 - def getProductionStep(self, type):
218 return WebcamStep(self.wizard, self.model)
219