parsebin: Expose streams of unknown type

This actually respects the existing `expose-all-streams` property by exposing
them and having them present in the stream collection (as streams of type
unknown).

Fixes #1179

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2309>
This commit is contained in:
Edward Hervey 2022-04-27 09:22:40 +02:00 committed by GStreamer Marge Bot
parent 4fd3886f5d
commit 0125d7525a
2 changed files with 27 additions and 3 deletions

View file

@ -1393,10 +1393,32 @@ analyze_new_pad (GstParseBin * parsebin, GstElement * src, GstPad * pad,
if (factories == NULL)
goto expose_pad;
/* if the array is empty, we have a type for which we have no parser */
/* if the array is empty, we have a type for which we have no handler */
if (factories->n_values == 0) {
/* if not we have a unhandled type with no compatible factories */
g_value_array_free (factories);
if (parsebin->expose_allstreams) {
GstStream *newstream;
GST_LOG_OBJECT (parsepad, "Existing GstStream %" GST_PTR_FORMAT,
parsepad->active_stream);
/* If we expose all streams, we only need to inform the application about
* a missing handler but still expose it. We also make sure the stream
* type is unknown. */
g_assert (parsepad->active_stream);
newstream =
gst_stream_new (gst_stream_get_stream_id (parsepad->active_stream),
caps, GST_STREAM_TYPE_UNKNOWN,
gst_stream_get_stream_flags (parsepad->active_stream));
gst_object_replace ((GstObject **) & parsepad->active_stream,
(GstObject *) newstream);
GST_LOG_OBJECT (parsepad, "New GstStream %" GST_PTR_FORMAT,
parsepad->active_stream);
gst_element_post_message (GST_ELEMENT_CAST (parsebin),
gst_missing_decoder_message_new (GST_ELEMENT_CAST (parsebin), caps));
goto expose_pad;
}
/* Else we will bail out */
gst_object_unref (parsepad);
goto unknown_type;
}
@ -4028,8 +4050,10 @@ gst_parse_pad_stream_start_event (GstParsePad * parsepad, GstEvent * event)
GST_PTR_FORMAT, caps);
if (repeat_event) {
GST_LOG_OBJECT (parsepad, "Using previously created GstStream");
stream = gst_object_ref (parsepad->active_stream);
} else {
GST_LOG_OBJECT (parsepad, "Creating unknown GstStream");
stream =
gst_stream_new (stream_id, NULL, GST_STREAM_TYPE_UNKNOWN,
streamflags);

View file

@ -659,7 +659,7 @@ play_bus_msg (GstBus * bus, GstMessage * msg, gpointer user_data)
} else if (type & GST_STREAM_TYPE_TEXT) {
play->cur_text_sid = g_strdup (stream_id);
} else {
gst_print ("Unknown stream type with stream-id %s", stream_id);
gst_print ("Unknown stream type with stream-id %s\n", stream_id);
}
gst_object_unref (stream);
}