mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-25 11:11:08 +00:00
parsebin: Improve elementary stream handling
The goal of parsebin is to figure out which elements to link together in order to provide elementary streams given any random input. The problem is that deciding whether a given stream should still have more elements plugged in or not was dependent on ... the presence of compatible decoders (sic). Instead of that, if we can't plug anymore elements on a given stream *and* it is detected as being an elementary stream, expose it. Fixes #2118 Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4231>
This commit is contained in:
parent
9e3faf69f2
commit
095356b67e
1 changed files with 17 additions and 4 deletions
|
@ -1272,7 +1272,7 @@ analyze_new_pad (GstParseBin * parsebin, GstElement * src, GstPad * pad,
|
||||||
{
|
{
|
||||||
gboolean apcontinue = TRUE;
|
gboolean apcontinue = TRUE;
|
||||||
GValueArray *factories = NULL, *result = NULL;
|
GValueArray *factories = NULL, *result = NULL;
|
||||||
GstParsePad *parsepad;
|
GstParsePad *parsepad = NULL;
|
||||||
GstElementFactory *factory;
|
GstElementFactory *factory;
|
||||||
const gchar *classification;
|
const gchar *classification;
|
||||||
gboolean is_parser_converter = FALSE;
|
gboolean is_parser_converter = FALSE;
|
||||||
|
@ -1418,7 +1418,6 @@ analyze_new_pad (GstParseBin * parsebin, GstElement * src, GstPad * pad,
|
||||||
goto expose_pad;
|
goto expose_pad;
|
||||||
}
|
}
|
||||||
/* Else we will bail out */
|
/* Else we will bail out */
|
||||||
gst_object_unref (parsepad);
|
|
||||||
goto unknown_type;
|
goto unknown_type;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1513,12 +1512,24 @@ analyze_new_pad (GstParseBin * parsebin, GstElement * src, GstPad * pad,
|
||||||
if (is_parser_converter)
|
if (is_parser_converter)
|
||||||
gst_object_unref (pad);
|
gst_object_unref (pad);
|
||||||
|
|
||||||
gst_object_unref (parsepad);
|
|
||||||
g_value_array_free (factories);
|
g_value_array_free (factories);
|
||||||
|
|
||||||
if (!res)
|
if (!res) {
|
||||||
|
if (deadend_details == NULL) {
|
||||||
|
/* connect_pad() only failed because no element was compatible
|
||||||
|
* (i.e. deadend_details is NULL). If this stream is an elementary stream,
|
||||||
|
* we can expose it since this is non-fatal */
|
||||||
|
GstPbUtilsCapsDescriptionFlags caps_flags =
|
||||||
|
gst_pb_utils_get_caps_description_flags (caps);
|
||||||
|
if (caps_flags
|
||||||
|
&& !(caps_flags & GST_PBUTILS_CAPS_DESCRIPTION_FLAG_CONTAINER)) {
|
||||||
|
goto expose_pad;
|
||||||
|
}
|
||||||
|
}
|
||||||
goto unknown_type;
|
goto unknown_type;
|
||||||
|
}
|
||||||
|
|
||||||
|
gst_object_unref (parsepad);
|
||||||
gst_caps_unref (caps);
|
gst_caps_unref (caps);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
@ -1535,6 +1546,8 @@ expose_pad:
|
||||||
unknown_type:
|
unknown_type:
|
||||||
{
|
{
|
||||||
GST_LOG_OBJECT (pad, "Unknown type, posting message and firing signal");
|
GST_LOG_OBJECT (pad, "Unknown type, posting message and firing signal");
|
||||||
|
if (parsepad)
|
||||||
|
gst_object_unref (parsepad);
|
||||||
|
|
||||||
chain->deadend_details = deadend_details;
|
chain->deadend_details = deadend_details;
|
||||||
chain->deadend = TRUE;
|
chain->deadend = TRUE;
|
||||||
|
|
Loading…
Reference in a new issue