Package flumotion :: Package component :: Package encoders :: Package vorbis :: Module vorbis010
[hide private]

Source Code for Module flumotion.component.encoders.vorbis.vorbis010

  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   
 20  from flumotion.common import gstreamer 
 21  from flumotion.component import feedcomponent 
 22  from vorbisutils import get_max_sample_rate, get_preferred_sample_rate 
 23   
 24  __version__ = "$Rev$" 
 25   
 26   
27 -class Vorbis(feedcomponent.EncoderComponent):
28 checkTimestamp = True 29 checkOffset = True 30
31 - def do_check(self):
32 self.debug('running Vorbis check') 33 from flumotion.worker.checks import encoder 34 d = encoder.checkVorbis() 35 36 d.addCallback(self._checkCallback) 37 38 return d
39
40 - def _checkCallback(self, result):
41 for m in result.messages: 42 self.addMessage(m)
43
44 - def get_pipeline_string(self, properties):
45 self.bitrate = properties.get('bitrate', -1) 46 self.quality = properties.get('quality', 0.3) 47 self.channels = properties.get('channels', 2) 48 resampler = 'audioresample' 49 if gstreamer.element_factory_exists('legacyresample'): 50 resampler = 'legacyresample' 51 return ('%s name=ar ! audioconvert ! capsfilter name=cf ' 52 '! vorbisenc name=enc' % resampler)
53
54 - def configure_pipeline(self, pipeline, properties):
55 enc = pipeline.get_by_name('enc') 56 cf = pipeline.get_by_name('cf') 57 ar = pipeline.get_by_name('ar') 58 59 assert enc and cf and ar 60 61 if self.bitrate > -1: 62 enc.set_property('bitrate', self.bitrate) 63 else: 64 enc.set_property('quality', self.quality) 65 66 pad = ar.get_pad('sink') 67 handle = None 68 69 def buffer_probe(pad, buffer): 70 # this comes from another thread 71 caps = buffer.get_caps() 72 in_rate = caps[0]['rate'] 73 74 # now do necessary filtercaps 75 self.rate = in_rate 76 if self.bitrate > -1: 77 maxsamplerate = get_max_sample_rate( 78 self.bitrate, self.channels) 79 if in_rate > maxsamplerate: 80 self.rate = get_preferred_sample_rate(maxsamplerate) 81 self.debug( 82 'rate %d > max rate %d (for %d kbit/sec), ' 83 'selecting rate %d instead' % ( 84 in_rate, maxsamplerate, self.bitrate, self.rate)) 85 86 87 caps_str = 'audio/x-raw-float, rate=%d, channels=%d' % (self.rate, 88 self.channels) 89 cf.set_property('caps', 90 gst.caps_from_string(caps_str)) 91 pad.remove_buffer_probe(handle) 92 return True
93 94 handle = pad.add_buffer_probe(buffer_probe)
95
96 - def modify_property_Bitrate(self, value):
97 if not self.checkPropertyType('bitrate', value, int): 98 return False 99 maxsamplerate = get_max_sample_rate(value, self.channels) 100 if self.rate > maxsamplerate: 101 self.warning("Could not set property 'bitrate' on the theora " 102 "encoder: rate %d > max rate %d (for %d kbit/sec)" % ( 103 self.rate, maxsamplerate, value)) 104 return False 105 self.modify_element_property('enc', 'bitrate', value, needs_reset=True) 106 return True
107