Package flumotion :: Package component :: Package producers :: Package firewire :: Module firewire
[hide private]

Source Code for Module flumotion.component.producers.firewire.firewire

  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  from flumotion.common import messages, gstreamer 
 19  from flumotion.common.i18n import N_, gettexter 
 20  from flumotion.component.common.avproducer import avproducer 
 21   
 22  __version__ = "$Rev$" 
 23  T_ = gettexter() 
 24   
 25   
 26  # See comments in gstdvdec.c for details on the dv format. 
 27   
 28   
29 -class Firewire(avproducer.AVProducerBase):
30 31 decoder = None 32 decoder_str = 'dvdec' 33 guid = 0 34
35 - def get_raw_video_element(self):
36 return self.decoder
37
38 - def get_pipeline_template(self):
39 # FIXME: might be nice to factor out dv1394src ! dvdec so we can 40 # replace it with videotestsrc of the same size and PAR, so we can 41 # unittest the pipeline 42 # need a queue in case tcpserversink blocks somehow 43 return ('dv1394src %s' 44 ' ! tee name=t' 45 ' ! queue leaky=2 max-size-time=1000000000' 46 ' ! dvdemux name=demux' 47 ' demux. ! queue ! %s name=decoder' 48 ' ! @feeder:video@' 49 ' demux. ! queue ! audio/x-raw-int ' 50 ' ! volume name=setvolume' 51 ' ! level name=volumelevel message=true ' 52 ' ! @feeder:audio@' 53 ' t. ! queue ! @feeder:dv@' % (self.guid, self.decoder_str))
54
55 - def configure_pipeline(self, pipeline, properties):
56 # catch bus message for when camera disappears 57 bus = pipeline.get_bus() 58 bus.add_signal_watch() 59 bus.connect('message::element', self._bus_message_received_cb) 60 61 self.decoder = pipeline.get_by_name("decoder") 62 if gstreamer.element_has_property(self.decoder, 'drop-factor'): 63 if self.framerate: 64 framerate = float(self.framerate.num / self.framerate.denom) 65 if 12.5 < framerate: 66 drop_factor = 1 67 elif 6.3 < framerate <= 12.5: 68 drop_factor = 2 69 elif 3.2 < framerate <= 6.3: 70 drop_factor = 4 71 elif framerate <= 3.2: 72 drop_factor = 8 73 else: 74 drop_factor = 1 75 self.decoder.set_property('drop-factor', drop_factor) 76 return avproducer.AVProducerBase.configure_pipeline(self, pipeline, 77 properties)
78
79 - def _parse_aditional_properties(self, props):
80 self.decoder_str = props.get('decoder', 'dvdec') 81 self.guid = "guid=%s" % props.get('guid', 0)
82 83 # detect camera unplugging or other cause of firewire bus reset 84
85 - def _bus_message_received_cb(self, bus, message):
86 """ 87 @param bus: the message bus sending the message 88 @param message: the message received 89 """ 90 if message.structure.get_name() == "ieee1394-bus-reset": 91 # we have a firewire bus reset 92 s = message.structure 93 # current-device-change is only in gst-plugins-good >= 0.10.3 94 if 'current-device-change' in s.keys(): 95 if s['current-device-change'] != 0: 96 # we actually have a connect or disconnect of the camera 97 # so first remove all the previous messages warning about a 98 # firewire-bus-reset 99 100 for m in self.state.get('messages'): 101 if m.id.startswith('firewire-bus-reset'): 102 self.state.remove('messages', m) 103 104 if s['current-device-change'] == 1: 105 # connected 106 m = messages.Info(T_(N_( 107 "The camera has now been reconnected.")), 108 mid="firewire-bus-reset-%d" % s['nodecount'], 109 priority=40) 110 self.state.append('messages', m) 111 elif s['current-device-change'] == -1: 112 # disconnected 113 m = messages.Warning(T_(N_( 114 "The camera has been disconnected.")), 115 mid="firewire-bus-reset-%d" % s['nodecount'], 116 priority=40) 117 self.state.append('messages', m)
118