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)