uridecodebin: Handle non dynamic sources with several source pads

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4881>
This commit is contained in:
Thibault Saunier 2023-06-17 07:15:23 -04:00 committed by GStreamer Marge Bot
parent 2b3757402b
commit c5304751ab
3 changed files with 33 additions and 25 deletions

View file

@ -955,3 +955,4 @@ validate.test.rtp.h264.payloader_nego_profile
validate.test.rtp.rtpsession_recv_simple validate.test.rtp.rtpsession_recv_simple
validate.test.rtp.rtpsession_send_simple validate.test.rtp.rtpsession_send_simple
validate.test.scaletempo.playbin_audio_filter.fast_forward validate.test.scaletempo.playbin_audio_filter.fast_forward
validate.test.uridecodebin.uridecodebin_source_with_several_srcpads

View file

@ -0,0 +1,4 @@
meta,
args = {
"uridecodebin uri=\"ges:+track video +track audio +test-clip blue d=1.0\" name=d ! fakesink d. ! fakesink",
},

View file

@ -2185,7 +2185,7 @@ remove_source (GstURIDecodeBin * bin)
} }
/* is called when a dynamic source element created a new pad. */ /* is called when a dynamic source element created a new pad. */
static void static gboolean
source_new_pad (GstElement * element, GstPad * pad, GstURIDecodeBin * bin) source_new_pad (GstElement * element, GstPad * pad, GstURIDecodeBin * bin)
{ {
GstElement *decoder; GstElement *decoder;
@ -2208,7 +2208,7 @@ source_new_pad (GstElement * element, GstPad * pad, GstURIDecodeBin * bin)
GST_URI_DECODE_BIN_UNLOCK (bin); GST_URI_DECODE_BIN_UNLOCK (bin);
gst_caps_unref (rawcaps); gst_caps_unref (rawcaps);
expose_decoded_pad (element, pad, bin); expose_decoded_pad (element, pad, bin);
return; return TRUE;
} }
gst_caps_unref (rawcaps); gst_caps_unref (rawcaps);
@ -2228,14 +2228,14 @@ source_new_pad (GstElement * element, GstPad * pad, GstURIDecodeBin * bin)
gst_element_sync_state_with_parent (decoder); gst_element_sync_state_with_parent (decoder);
GST_URI_DECODE_BIN_UNLOCK (bin); GST_URI_DECODE_BIN_UNLOCK (bin);
return; return TRUE;
/* ERRORS */ /* ERRORS */
no_decodebin: no_decodebin:
{ {
/* error was posted */ /* error was posted */
GST_URI_DECODE_BIN_UNLOCK (bin); GST_URI_DECODE_BIN_UNLOCK (bin);
return; return FALSE;
} }
could_not_link: could_not_link:
{ {
@ -2244,7 +2244,7 @@ could_not_link:
(NULL), ("Can't link source to decoder element")); (NULL), ("Can't link source to decoder element"));
GST_URI_DECODE_BIN_UNLOCK (bin); GST_URI_DECODE_BIN_UNLOCK (bin);
do_async_done (bin); do_async_done (bin);
return; return FALSE;
} }
} }
@ -2265,12 +2265,27 @@ is_live_source (GstElement * source)
return is_live; return is_live;
} }
typedef struct
{
GstURIDecodeBin *decoder;
gboolean res;
} ExposeSourceData;
static gboolean
expose_source_pad (GstElement * element, GstPad * pad, ExposeSourceData * data)
{
data->res |= source_new_pad (element, pad, data->decoder);
return TRUE;
}
/* construct and run the source and decoder elements until we found /* construct and run the source and decoder elements until we found
* all the streams or until a preroll queue has been filled. * all the streams or until a preroll queue has been filled.
*/ */
static gboolean static gboolean
setup_source (GstURIDecodeBin * decoder) setup_source (GstURIDecodeBin * decoder)
{ {
gboolean res = TRUE;
gboolean is_raw, have_out, is_dynamic; gboolean is_raw, have_out, is_dynamic;
GstElement *source; GstElement *source;
@ -2355,20 +2370,19 @@ setup_source (GstURIDecodeBin * decoder)
if (!setup_streaming (decoder)) if (!setup_streaming (decoder))
goto streaming_failed; goto streaming_failed;
} else { } else {
GstElement *dec_elem; ExposeSourceData data = { decoder, FALSE };
/* no streaming source, we can link now */ GST_DEBUG_OBJECT (decoder, "Expose %" GST_PTR_FORMAT " srcpads",
GST_DEBUG_OBJECT (decoder, "Plugging decodebin to source"); decoder->source);
dec_elem = make_decoder (decoder); /* error message is posted if expose_source_pad fails */
if (!dec_elem) gst_element_foreach_src_pad (decoder->source,
goto no_decoder; (GstElementForeachPadFunc) expose_source_pad, &data);
if (!gst_element_link_pads (decoder->source, NULL, dec_elem, "sink")) res = data.res;
goto could_not_link;
} }
} }
return TRUE; return res;
/* ERRORS */ /* ERRORS */
no_source: no_source:
@ -2388,22 +2402,11 @@ invalid_source:
(_("Source element is invalid.")), (NULL)); (_("Source element is invalid.")), (NULL));
return FALSE; return FALSE;
} }
no_decoder:
{
/* message was posted */
return FALSE;
}
streaming_failed: streaming_failed:
{ {
/* message was posted */ /* message was posted */
return FALSE; return FALSE;
} }
could_not_link:
{
GST_ELEMENT_ERROR (decoder, CORE, NEGOTIATION,
(NULL), ("Can't link source to decoder element"));
return FALSE;
}
} }
static void static void