All pastes #590362 Raw Edit

Tenshi

public text v1 · immutable
#590362 ·published 2007-06-26 14:44 UTC
rendered paste body
# the MetaDataMuxer element/plugin
class MetaDataMuxer(gst.Element):

  __gstdetails__ = ('MetaDataMuxer Plugin',
                    "metadata.py",
                    "Combine a Metadata Stream with Any Other Stream",
                    "Corey O.")
  
  _srcpadtemplate = gst.PadTemplate ("src",
                                     gst.PAD_SRC,
				     gst.PAD_ALWAYS,
				     gst.caps_new_any())

  _sinkpadtemplate = gst.PadTemplate ("sink",
                                      gst.PAD_SINK,
			              gst.PAD_ALWAYS,
			              gst.caps_new_any())

  _metadatasinkpadtemplate = gst.PadTemplate ("metadatasink",
                                              gst.PAD_SINK,
                                              gst.PAD_ALWAYS,
                                              METADATA_CAPS)

  __gsttemplates__ = (_srcpadtemplate,
                      _sinkpadtemplate,
                      _metadatasinkpadtemplate)

  def __init__(self):
    gst.Element.__init__(self)
    self.condition = Condition()
    self.metadata_queue = []
    self.data_queue = []

    self.srcpad = gst.Pad(self._srcpadtemplate)
    self.sinkpad = gst.Pad(self._sinkpadtemplate)
    self.metadatasinkpad = gst.Pad(self._metadatasinkpadtemplate)
    self.add_pad(self.srcpad)
    self.add_pad(self.metadatasinkpad)
    self.add_pad(self.sinkpad)

    self.sinkpad.set_chain_function(self.chainfunc)
    self.metadatasinkpad.set_chain_function(self.chainfunc)
    self.sinkpad.set_event_function(self.eventfunc)
    self.metadatasinkpad.set_event_function(self.eventfunc)

  def send_pair(self):
    status = gst.FLOW_OK
    if len(self.metadata_queue) > 0 and len(self.data_queue) > 0:
      metadata_buffer = self.metadata_queue.pop(0)
      data_buffer = self.data_queue.pop(0)
      status = self.srcpad.push(metadata_buffer)
      if status == gst.FLOW_OK or status == gst.FLOW_NOT_NEGOTIATED:
        status = self.srcpad.push(data_buffer)
    return status

  def queue_buffer(self, buffer):
    self.condition.acquire()
    if buffer.get_caps() == METADATA_CAPS:
      self.metadata_queue.append(buffer)
    else:
      self.data_queue.append(buffer)
    status = self.send_pair()
    self.condition.release()
    return status

  def chainfunc(self, pad, buffer):
    return self.queue_buffer(buffer)

  def eventfunc(self, pad, event):
    print self.get_name(), " event:", event
    return self.srcpad.push_event(event)