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