summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThibault Saunier <tsaunier@igalia.com>2020-07-08 15:47:12 -0400
committerThibault Saunier <tsaunier@igalia.com>2020-07-30 18:44:13 -0400
commit3a32247630d8a711434aecbebe5be7e53bc1c034 (patch)
treec9778602d1af79a4bb25116eb262603010d5960a
parent981a027ecd7b788df11ea96e29dbc8314cc5573d (diff)
uri-source: Respect user stream selection
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-editing-services/-/merge_requests/198>
-rw-r--r--ges/ges-uri-source.c44
1 files changed, 41 insertions, 3 deletions
diff --git a/ges/ges-uri-source.c b/ges/ges-uri-source.c
index 8c78926f..93226710 100644
--- a/ges/ges-uri-source.c
+++ b/ges/ges-uri-source.c
@@ -29,6 +29,25 @@ GST_DEBUG_CATEGORY_STATIC (uri_source_debug);
#undef GST_CAT_DEFAULT
#define GST_CAT_DEFAULT uri_source_debug
+#define DEFAULT_RAW_CAPS \
+ "video/x-raw; " \
+ "audio/x-raw; " \
+ "text/x-raw; " \
+ "subpicture/x-dvd; " \
+ "subpicture/x-pgs"
+
+static GstStaticCaps default_raw_caps = GST_STATIC_CAPS (DEFAULT_RAW_CAPS);
+
+static inline gboolean
+are_raw_caps (const GstCaps * caps)
+{
+ GstCaps *raw = gst_static_caps_get (&default_raw_caps);
+ gboolean res = gst_caps_can_intersect (caps, raw);
+
+ gst_caps_unref (raw);
+ return res;
+}
+
typedef enum
{
GST_AUTOPLUG_SELECT_TRY,
@@ -43,20 +62,39 @@ autoplug_select_cb (GstElement * bin, GstPad * pad, GstCaps * caps,
GstElement *nlesrc;
GstCaps *downstream_caps;
GstAutoplugSelectResult res = GST_AUTOPLUG_SELECT_TRY;
+ gchar *stream_id = gst_pad_get_stream_id (pad);
+ const gchar *wanted_id =
+ gst_discoverer_stream_info_get_stream_id
+ (ges_uri_source_asset_get_stream_info (GES_URI_SOURCE_ASSET
+ (ges_extractable_get_asset (GES_EXTRACTABLE (self->element)))));
+ gboolean wanted = !g_strcmp0 (stream_id, wanted_id);
+
if (!ges_source_get_rendering_smartly (GES_SOURCE (self->element))) {
+ if (!wanted && are_raw_caps (caps)) {
+ GST_DEBUG_OBJECT (self->element, "Totally skipping %s", stream_id);
+ res = GST_AUTOPLUG_SELECT_SKIP;
+ }
GST_LOG_OBJECT (self->element, "Not being smart here");
- return res;
+ goto done;
}
nlesrc = ges_track_element_get_nleobject (self->element);
downstream_caps = gst_pad_peer_query_caps (nlesrc->srcpads->data, NULL);
if (downstream_caps && gst_caps_can_intersect (downstream_caps, caps)) {
- GST_DEBUG_OBJECT (self, "Exposing %s", GST_OBJECT_NAME (factory));
- res = GST_AUTOPLUG_SELECT_EXPOSE;
+ if (wanted) {
+ res = GST_AUTOPLUG_SELECT_EXPOSE;
+ GST_DEBUG_OBJECT (self, "Exposing %" GST_PTR_FORMAT " with stream id: %s",
+ pad, stream_id);
+ } else {
+ res = GST_AUTOPLUG_SELECT_SKIP;
+ GST_DEBUG_OBJECT (self->element, "Totally skipping %s", stream_id);
+ }
}
gst_clear_caps (&downstream_caps);
+done:
+ g_free (stream_id);
return res;
}