Adding a second output to a custom element
jbuffington at redzone.com
Tue Feb 4 18:22:30 UTC 2020
I am working on a custom Gstreamer element based on GstBaseTransform. I am
trying to output video on two pads where the video isn't identical (so I
can't use a tee). Additionally, for each buffer that I receive, I want to
send it to only one of the output pads.
I have code that is partially running that creates the extra output pad but
if I try to connect anything to it, it hangs after the first frame. I don't
get any errors but I only get one frame. This code runs if I only connect
to one of the pads. I was expecting that it would run but that the second
output would be blank since I am not specifically sending buffers to it.
I'll try to give relevant info below.
I am using gst-launch-1.0 and am not specifying pads by name when connecting
things up. Everything after the source pads is identical.
*It seems that I need to create a second template for my pad or else I just
end up with a single output pad:*
static GstStaticPadTemplate laserSrcTemplate = GST_STATIC_PAD_TEMPLATE
*In my class_init, I have to add one of my output pads. I believe that I
tested adding it later but I was getting a compilation warning. *
gst_element_class_add_static_pad_template (element_class, &srcTemplate);
*In my element_init I can add the second pad:*
lfselement->laserSrcPad = gst_pad_new_from_static_template
gst_element_add_pad (GST_ELEMENT (lfselement), lfselement->laserSrcPad);
*I am using the transform function which is defined as:*
static GstFlowReturn gst_lfselement_transform (GstBaseTransform *trans,
GstBuffer *inbuf, GstBuffer *outbuf)
*I am mapping my in buffer and out buffers (error checking not shown)*
gst_buffer_map (inbuf, &inMap, GST_MAP_READ);
gst_buffer_map (outbuf, &outMap, GST_MAP_WRITE);
* I get pointers to the actual video data:*
dest = outMap.data;
src = inMap.data;
* I draw onto the buffer without changing its size and then unmap the
// Drawing code not shown
gst_buffer_unmap (outbuf, &outMap);
gst_buffer_unmap (inbuf, &inMap);
I then just return GST_FLOW_OK. *
I'm not specifying where the data goes so I'm guessing that it defaults to
the first pad created or possibly to a pad named 'src'
My questions are:
* How do I make it so that things don't hang?
* Do I need to add some function to deal with the second pad?
* How do I specify which pad to send the data to? I'm guessing that I need
to use gst_pad_push() somehow but haven't made it that far to check.
Any help would be greatly appreciated.
Sent from: http://gstreamer-devel.966125.n4.nabble.com/
More information about the gstreamer-devel