Package flumotion :: Package component :: Package common :: Package avproducer :: Module avproducer
[hide private]

Source Code for Module flumotion.component.common.avproducer.avproducer

  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 gst 
 19  from twisted.internet import defer 
 20   
 21  from flumotion.common import errors, messages 
 22  from flumotion.common.i18n import N_, gettexter 
 23  from flumotion.component import feedcomponent 
 24  from flumotion.component.effects.deinterlace import deinterlace 
 25  from flumotion.component.effects.videorate import videorate 
 26  from flumotion.component.effects.videoscale import videoscale 
 27  from flumotion.component.effects.audioconvert import audioconvert 
 28  from flumotion.component.effects.kuscheduler import kuscheduler 
 29  from flumotion.component.effects.volume import volume 
 30   
 31  __version__ = "$Rev$" 
 32  T_ = gettexter() 
 33   
 34   
35 -class AVProducerBase(feedcomponent.ParseLaunchComponent):
36
37 - def get_raw_video_element(self):
38 raise NotImplementedError("Subclasses must implement " 39 "'get_raw_video_element'")
40
41 - def get_pipeline_template(self):
42 raise NotImplementedError("Subclasses must implement " 43 "'get_pipeline_template'")
44
45 - def do_check(self):
46 self.debug('running PyGTK/PyGST and configuration checks') 47 from flumotion.component.producers import checks 48 d1 = checks.checkTicket347() 49 d2 = checks.checkTicket348() 50 l = self._do_extra_checks() 51 l.extend([d1, d2]) 52 dl = defer.DeferredList(l) 53 dl.addCallback(self._checkCallback) 54 return dl
55
56 - def check_properties(self, props, addMessage):
57 deintMode = props.get('deinterlace-mode', 'auto') 58 deintMethod = props.get('deinterlace-method', 'ffmpeg') 59 60 if deintMode not in deinterlace.DEINTERLACE_MODE: 61 msg = messages.Error(T_(N_("Configuration error: '%s' " \ 62 "is not a valid deinterlace mode." % deintMode))) 63 addMessage(msg) 64 raise errors.ConfigError(msg) 65 66 if deintMethod not in deinterlace.DEINTERLACE_METHOD: 67 msg = messages.Error(T_(N_("Configuration error: '%s' " \ 68 "is not a valid deinterlace method." % deintMethod))) 69 self.debug("'%s' is not a valid deinterlace method", 70 deintMethod) 71 addMessage(msg) 72 raise errors.ConfigError(msg)
73
74 - def get_pipeline_string(self, props):
75 self.is_square = props.get('is-square', False) 76 self.width = props.get('width', None) 77 self.height = props.get('height', None) 78 self.add_borders = props.get('add-borders', True) 79 self.deintMode = props.get('deinterlace-mode', 'auto') 80 self.deintMethod = props.get('deinterlace-method', 'ffmpeg') 81 self.kuinterval = props.get('keyunits-interval', 0) * gst.MSECOND 82 fr = props.get('framerate', None) 83 self.framerate = fr and gst.Fraction(fr[0], fr[1]) or None 84 self._parse_aditional_properties(props) 85 return self.get_pipeline_template()
86
87 - def configure_pipeline(self, pipeline, properties):
88 if self.get_raw_video_element() is not None: 89 self._add_video_effects(pipeline) 90 self._add_audio_effects(pipeline)
91
92 - def getVolume(self):
93 return self.volume.get_property('volume')
94
95 - def setVolume(self, value):
96 """ 97 @param value: float between 0.0 and 4.0 98 """ 99 self.debug("Setting volume to %f" % (value)) 100 self.volume.set_property('volume', value)
101
102 - def _checkCallback(self, results):
103 for (state, result) in results: 104 for m in result.messages: 105 self.addMessage(m)
106
107 - def _do_extra_checks(self):
108 ''' 109 Subclasses should override this method to perform aditional checks 110 111 @returns: A list of checks' defers 112 @rtype: list 113 ''' 114 return []
115
116 - def _parse_aditional_properties(self, props):
117 ''' 118 Subclasses should overrride this method to parse aditional properties 119 ''' 120 pass
121
122 - def _add_video_effects(self, pipeline):
123 # Add deinterlacer 124 deinterlacer = deinterlace.Deinterlace('deinterlace', 125 self.get_raw_video_element().get_pad("src"), pipeline, 126 self.deintMode, self.deintMethod) 127 self.addEffect(deinterlacer) 128 deinterlacer.plug() 129 130 # Add video rate converter 131 rateconverter = videorate.Videorate('videorate', 132 deinterlacer.effectBin.get_pad("src"), pipeline, 133 self.framerate) 134 self.addEffect(rateconverter) 135 rateconverter.plug() 136 137 # Add video scaler 138 videoscaler = videoscale.Videoscale('videoscale', self, 139 rateconverter.effectBin.get_pad("src"), pipeline, 140 self.width, self.height, self.is_square, self.add_borders) 141 self.addEffect(videoscaler) 142 videoscaler.plug() 143 144 # Add key units scheduler 145 scheduler = kuscheduler.KeyUnitsScheduler('video-kuscheduler', 146 videoscaler.effectBin.get_pad("src"), pipeline, self.kuinterval) 147 self.addEffect(scheduler) 148 scheduler.plug()
149
150 - def _add_audio_effects(self, pipeline):
151 # Add volume setter 152 self.volume = pipeline.get_by_name("setvolume") 153 comp_level = pipeline.get_by_name('volumelevel') 154 vol = volume.Volume('inputVolume', comp_level, pipeline) 155 self.addEffect(vol) 156 157 # Add audio converter 158 audioconverter = audioconvert.Audioconvert('audioconvert', 159 comp_level.get_pad("src"), pipeline, tolerance=40 * gst.MSECOND) 160 self.addEffect(audioconverter) 161 audioconverter.plug() 162 163 # Add key units scheduler 164 scheduler = kuscheduler.KeyUnitsScheduler('audio-kuscheduler', 165 audioconverter.effectBin.get_pad("src"), pipeline, self.kuinterval) 166 self.addEffect(scheduler) 167 scheduler.plug()
168