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 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$" 
 37  _ = gettext.gettext 
 38  T_ = gettexter() 
 39   
 40   
41 -class WebcamProducer(VideoProducer):
42 componentType = 'webcam-producer' 43
44 - def __init__(self):
45 super(WebcamProducer, self).__init__()
46
47 - def getProperties(self):
48 p = super(WebcamProducer, self).getProperties() 49 50 if 'mime' not in p: 51 p.mime = self.framerate['mime'] 52 if 'format' not in p: 53 p.format = self.framerate.get('format', None) 54 if 'framerate' not in p: 55 p.framerate = fractionAsString(self.framerate['framerate']) 56 57 self.properties = p 58 59 return p
60 61
62 -class WebcamStep(VideoProducerStep):
63 name = 'Webcam' 64 title = _('Webcam') 65 icon = 'webcam.png' 66 gladeFile = os.path.join(os.path.dirname(os.path.abspath(__file__)), 67 'wizard.glade') 68 componentType = 'video4linux' 69 docSection = 'help-configuration-assistant-producer-video-webcam' 70 docAnchor = '' 71
72 - def __init__(self, wizard, model):
73 VideoProducerStep.__init__(self, wizard, model) 74 # _sizes is probed, not set from the UI 75 self._sizes = None
76 77 # WizardStep 78
79 - def setup(self):
80 self.device.data_type = str 81 self.framerate.data_type = object 82 self.size.data_type = object 83 84 self.add_proxy(self.model.properties, ['device']) 85 self.add_proxy(self.model, ['size', 'framerate'])
86
87 - def workerChanged(self, worker):
88 self.model.worker = worker 89 self._clear() 90 self._populateDevices()
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
101 - def _populateDevices(self):
102 msg = Info(T_(N_('Checking for Webcam devices...')), 103 mid='webcam-check') 104 self.wizard.add_msg(msg) 105 d = self.runInWorker('flumotion.worker.checks.device', 106 'fetchDevices', 'webcam-check', 107 ['v4l2src', 'v4lsrc'], 'device') 108 109 def webcamCheckDone(devices): 110 self.wizard.clear_msg('webcam-check') 111 self.device.prefill(devices)
112 113 def trapRemoteFailure(failure): 114 failure.trap(errors.RemoteRunFailure)
115 116 def trapRemoteError(failure): 117 failure.trap(errors.RemoteRunError) 118 119 d.addCallback(webcamCheckDone) 120 d.addErrback(trapRemoteError) 121 d.addErrback(trapRemoteFailure) 122 123 return d 124
125 - def _runChecks(self):
126 self.wizard.waitForTask('webcam checks') 127 128 device = self.device.get_selected() 129 msg = Info(T_( 130 N_("Probing the webcam. This can take a while...")), 131 mid='webcam-check') 132 self.wizard.add_msg(msg) 133 d = self.runInWorker('flumotion.worker.checks.video', 'checkWebcam', 134 device, mid='webcam-check') 135 136 def errRemoteRunFailure(failure): 137 failure.trap(errors.RemoteRunFailure) 138 self.debug('a RemoteRunFailure happened') 139 self._clear() 140 self.wizard.taskFinished(blockNext=True)
141 142 def errRemoteRunError(failure): 143 failure.trap(errors.RemoteRunError) 144 self.debug('a RemoteRunError happened') 145 self._clear() 146 self.wizard.taskFinished(blockNext=True) 147 148 def deviceFound(result): 149 if not result: 150 self.debug('Could not detect the device\'s configuration.') 151 self._clear() 152 self.wizard.taskFinished(blockNext=True) 153 return None 154 155 factoryName, sizes = result 156 self.model.properties.element_factory = factoryName 157 self._populateSizes(sizes) 158 self.wizard.clear_msg('webcam-check') 159 self.wizard.taskFinished() 160 self.size.set_sensitive(True) 161 self.framerate.set_sensitive(True) 162 163 d.addCallback(deviceFound) 164 d.addErrback(errRemoteRunFailure) 165 d.addErrback(errRemoteRunError) 166
167 - def _populateSizes(self, sizes):
168 # Set sizes before populating the values, since 169 # it trigger size_changed which depends on this 170 # to be set 171 self._sizes = sizes 172 173 values = [] 174 for w, h in sorted(sizes.keys(), reverse=True): 175 values.append(['%d x %d' % (w, h), (w, h)]) 176 self.size.prefill(values) 177 if len(values) > 1: 178 self.size.set_active(1)
179
180 - def _populateFramerates(self, size):
181 values = util.OrderedDict() 182 for d in self._sizes[size]: 183 num, denom = d['framerate'] 184 values['%.2f fps' % (1.0*num/denom)] = d 185 self.framerate.prefill(values.items())
186 187 # Callbacks 188
189 - def on_device_changed(self, combo):
190 self._runChecks()
191
192 - def on_size_changed(self, combo):
193 size = self.size.get_selected() 194 if size: 195 self._populateFramerates(size) 196 self.model.properties.width, self.model.properties.height = size
197 198
199 -class WebcamWizardPlugin(object):
200 implements(IProducerPlugin) 201
202 - def __init__(self, wizard):
203 self.wizard = wizard 204 self.model = WebcamProducer()
205
206 - def getProductionStep(self, type):
207 return WebcamStep(self.wizard, self.model)
208