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) 2004,2005,2006,2007,2008,2009 Fluendo, S.L. 
  6  # Copyright (C) 2010,2011 Flumotion Services, S.A. 
  7  # All rights reserved. 
  8  # 
  9  # This file may be distributed and/or modified under the terms of 
 10  # the GNU Lesser General Public License version 2.1 as published by 
 11  # the Free Software Foundation. 
 12  # This file is distributed without any warranty; without even the implied 
 13  # warranty of merchantability or fitness for a particular purpose. 
 14  # See "LICENSE.LGPL" in the source distribution for more information. 
 15  # 
 16  # Headers in this file shall remain intact. 
 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   
37 -class WebcamProducer(VideoProducer):
38 componentType = 'webcam-producer' 39
40 - def __init__(self):
41 super(WebcamProducer, self).__init__()
42
43 - def getProperties(self):
44 p = super(WebcamProducer, self).getProperties() 45 46 if 'mime' not in p: 47 p.mime = self.framerate['mime'] 48 if 'format' not in p: 49 p.format = self.framerate.get('format', None) 50 if 'framerate' not in p: 51 p.framerate = fractionAsString(self.framerate['framerate']) 52 53 self.properties = p 54 55 return p
56 57
58 -class WebcamStep(VideoProducerStep):
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
68 - def __init__(self, wizard, model):
69 VideoProducerStep.__init__(self, wizard, model) 70 # _sizes is probed, not set from the UI 71 self._sizes = None
72 73 # WizardStep 74
75 - def setup(self):
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
83 - def workerChanged(self, worker):
84 self.model.worker = worker 85 self._clear() 86 self._populateDevices()
87 88 # Private 89
90 - def _clear(self):
91 # Clear is called: 92 # - when changing a worker 93 # - after probing a device, if none found 94 self.size.set_sensitive(False) 95 self.framerate.set_sensitive(False)
96
97 - def _populateDevices(self):
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
121 - def _runChecks(self):
122 self.wizard.waitForTask('webcam checks') 123 124 device = self.device.get_selected() 125 msg = Info(T_( 126 N_("Probing the webcam. This can take a while...")), 127 mid='webcam-check') 128 self.wizard.add_msg(msg) 129 d = self.runInWorker('flumotion.worker.checks.video', 'checkWebcam', 130 device, mid='webcam-check') 131 132 def errRemoteRunFailure(failure): 133 failure.trap(errors.RemoteRunFailure) 134 self.debug('a RemoteRunFailure happened') 135 self._clear() 136 self.wizard.taskFinished(blockNext=True)
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
163 - def _populateSizes(self, sizes):
164 # Set sizes before populating the values, since 165 # it trigger size_changed which depends on this 166 # to be set 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
176 - def _populateFramerates(self, size):
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 # Callbacks 184
185 - def on_device_changed(self, combo):
186 self._runChecks()
187
188 - def on_size_changed(self, combo):
189 size = self.size.get_selected() 190 if size: 191 self._populateFramerates(size) 192 self.model.properties.width, self.model.properties.height = size
193 194
195 -class WebcamWizardPlugin(object):
196 implements(IProducerPlugin) 197
198 - def __init__(self, wizard):
199 self.wizard = wizard 200 self.model = WebcamProducer()
201
202 - def getProductionStep(self, type):
203 return WebcamStep(self.wizard, self.model)
204