Requesting a new tee's src pad temporary pauses the pipeline

Sebastian Greco greco.sebastian at gmail.com
Fri Nov 23 23:57:11 UTC 2018


Hello!
I have been working on this c program for the past weeks and even tho I
have learned a lot, I have been hitting a wall lately, and I really cant
solve this problem with tee.

So my idea is to have a running pipeline, and on demand add sinks to the
app. For what I have been reading around this should be done something like
this.

mysrc -> tee -> queue -> fakesink


So when I want to add a new sink, I simply have to request a src_% pad to
the tee, connect it to my new bin, in case should be something like this:

tee -> [queue -> flvmux -> rtmpsink ] ([] is a bin I have created)


I have simplified the pipeline to make it easier to explain, but I have
been working with different possibilities (having the flvmux placed before
the tee for example, and using only one tee, and now I changed to having
one tee for audio and another for video and then adding it to the flvmux
inside my bin)

The problem is all seems to be working, but when looking at the endpoint
(in this case youtube live) I can't see any image even if it says it's
receiving data... just weird.

So looking at my debug output, I can see that my pipeline is passing to
PAUSED state right after requesting the src pads to the tee. And then after
all is elements are in play state, the pipeline changes to PLAYING again.
So I'm wondering if that's normal and if it should be like that.

Some code:
Example of how I add the fake sink to a tee:

GstElement *audioFakesink = gst_element_factory_make("fakesink",
"main-audio-fakesink");
GstElement *Aqueue = gst_element_factory_make("queue", "fakeAQueue");
mainAudioTee = gst_element_factory_make("tee", "mainAudioTee");
gst_bin_add_many (GST_BIN (pipeline), webrtcbin, mainAudioTee,
mainVideoTee, Aqueue, Vqueue,audioFakesink, videoFakesink, NULL);

gst_element_link ( Aqueue, audioFakesink);

GstPad *queueAudioPad = gst_element_get_static_pad (Aqueue, "sink");
g_assert_nonnull (queueAudioPad);

GstPadTemplate *templ = gst_element_class_get_pad_template
(GST_ELEMENT_GET_CLASS (mainAudioTee), "src_%u");
GstPad *teeAudioSrcPad = gst_element_request_pad (mainAudioTee, templ,
NULL, NULL);
g_assert_nonnull (teeAudioSrcPad);

ret = gst_pad_link (teeAudioSrcPad, queueAudioPad);
g_assert_cmpint (ret, ==, GST_PAD_LINK_OK);

Example of how I add a new source

gst_bin_add (GST_BIN (pipeline), myBinRTMP);

std::cout << "Info: RtmpBin added " << std::endl;
// AUDIO
GstPad *sinkAudioTargetPad = gst_element_get_static_pad (myBinRTMP, "audio");
g_assert_nonnull (sinkAudioTargetPad);

std::cout << "Info: RtmpBin got AUDIO sinkPad " << std::endl;


GstPadTemplate *templAudio = gst_element_class_get_pad_template
(GST_ELEMENT_GET_CLASS (mainAudioTee), "src_%u");
GstPad *teeAudioSrcPad = gst_element_request_pad (mainAudioTee,
templAudio, NULL, NULL);
g_assert_nonnull (teeAudioSrcPad);

std::cout << "Info: RtmpBin got AUDIO Tee new sourcePad " << std::endl;
/* Start displaying video */
gst_element_sync_state_with_parent (myBinRTMP);
std::cout << "Info: RtmpBin sync " << std::endl;

gst_pad_link (teeAudioSrcPad, sinkAudioTargetPad);

std::cout << "Info: RtmpBin pad linked " << std::endl;


What I'ḿ seeing in my logs

Debug: Checking to start pending
Debug: AUDIO AND VIDEO READY lets roll
Debug: putting pipeline to work>>>>>>>> STATE CHANGED:
main-video-fakesink NEW: PAUSED PENDING: VOID_PENDING>>>>>>>> STATE
CHANGED: main-video-fakesink NEW: PLAYING PENDING:
VOID_PENDING>>>>>>>> STATE CHANGED: main-audio-fakesink NEW: PLAYING
PENDING: VOID_PENDING*>>>>>>>> STATE CHANGED: my-pipeline NEW: PLAYING
PENDING: VOID_PENDING
*DEBUG: onMessage: called with message_id: streamRTMP
Info: Adding RTMP: FUKyqA3xY:
rtmp://a.rtmp.youtube.com/live2//xxxx-cccc-ssss-wwww
Info: Add when ready - sending to: FUKyqA3xY:
rtmp://a.rtmp.youtube.com/live2//xxxx-cccc-ssss-wwww
Info: RtmpBin added
Info: RtmpBin got AUDIO sinkPad
Info: RtmpBin got AUDIO Tee new sourcePad
Info: RtmpBin got VIDEO sinkPad
Info: RtmpBin got VIDEO Tee new sourcePad>>>>>>>> STATE CHANGED:
rtmpsink-FUKyqA3xY NEW: READY PENDING: VOID_PENDING>>>>>>>> STATE
CHANGED: flvmux-FUKyqA3xY NEW: READY PENDING: VOID_PENDING>>>>>>>>
STATE CHANGED: queue-audio-FUKyqA3xY NEW: READY PENDING:
VOID_PENDING>>>>>>>> STATE CHANGED: queue-video-FUKyqA3xY NEW: READY
PENDING: VOID_PENDING>>>>>>>> STATE CHANGED: rtmpBin-FUKyqA3xY NEW:
READY PENDING: PLAYING*>>>>>>>> STATE CHANGED: my-pipeline NEW: PAUSED
PENDING: PAUSED
*>>>>>>>> STATE CHANGED: flvmux-FUKyqA3xY NEW: PAUSED PENDING:
VOID_PENDING>>>>>>>> STATE CHANGED: queue-audio-FUKyqA3xY NEW: PAUSED
PENDING: VOID_PENDING>>>>>>>> STATE CHANGED: queue-video-FUKyqA3xY
NEW: PAUSED PENDING: VOID_PENDING
Info: RtmpBin sync
Info: RtmpBin pad linked>>>>>>>> STATE CHANGED: rtmpsink-FUKyqA3xY
NEW: PAUSED PENDING: VOID_PENDING>>>>>>>> STATE CHANGED:
rtmpBin-FUKyqA3xY NEW: PAUSED PENDING: VOID_PENDING*>>>>>>>> STATE
CHANGED: my-pipeline NEW: PAUSED PENDING: PLAYING
*>>>>>>>> STATE CHANGED: rtmpsink-FUKyqA3xY NEW: PLAYING PENDING:
VOID_PENDING>>>>>>>> STATE CHANGED: flvmux-FUKyqA3xY NEW: PLAYING
PENDING: VOID_PENDING>>>>>>>> STATE CHANGED: queue-audio-FUKyqA3xY
NEW: PLAYING PENDING: VOID_PENDING>>>>>>>> STATE CHANGED:
queue-video-FUKyqA3xY NEW: PLAYING PENDING: VOID_PENDING>>>>>>>> STATE
CHANGED: rtmpBin-FUKyqA3xY NEW: PLAYING PENDING: VOID_PENDING*>>>>>>>>
STATE CHANGED: my-pipeline NEW: PLAYING PENDING: VOID_PENDING
*


So I know it's difficult to read my code, but maybe I have a concept error
and some of you can guide me on the right direction... I have done my
homework and looked into the doc and examples like this:
https://github.com/sdroege/gst-snippets/blob/217ae015aaddfe3f7aa66ffc936ce93401fca04e/dynamic-tee-vsink.c

Or reading things like:
https://gstreamer.freedesktop.org/documentation/tutorials/basic/dynamic-pipelines.html

Maybe I need to use some probe blocking (which to be honest I don't fully
understand) but I was hoping to have to deal with that only when removing
the sink pads... but looks like I'm not getting there yet hehe

Something maybe matters is that all this is a stream, I'm receiving a
stream from webrtc and pushing it to rtmp (audio being converted to acc,
video trying to sent it directly in h264 as it comes out from the webrtcbin)

Thanks a lot even if you took the time to read 1/3 of this huge post.

Cheers!

---
Sebastian A. Greco
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/gstreamer-devel/attachments/20181124/65e661e0/attachment-0001.html>


More information about the gstreamer-devel mailing list