# 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)