summaryrefslogtreecommitdiff
path: root/gst
diff options
context:
space:
mode:
authorJan Schmidt <jan@centricular.com>2021-02-25 05:04:00 +1100
committerGStreamer Marge Bot <gitlab-merge-bot@gstreamer-foundation.org>2021-04-12 14:27:00 +0000
commitbd9f675318b74b4450c8e1eca02aed0a45aaa1c6 (patch)
tree4b5825df7ab241491cab850a507e7b981f01286c /gst
parent1f865246c113c359160b5e8879bc582f64b896f9 (diff)
downloadgstreamer-plugins-bad-bd9f675318b74b4450c8e1eca02aed0a45aaa1c6.tar.gz
switchbin: When collecting srcpad caps, don't intersect with path caps.
The path caps describe the input caps that will select each path, don't intersect those with the srcpad caps, which could be completely different. Instead, when querying allowed caps for the srcpad, just construct the union of all possible output caps from all path srcpads. Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2018>
Diffstat (limited to 'gst')
-rw-r--r--gst/switchbin/gstswitchbin.c19
1 files changed, 14 insertions, 5 deletions
diff --git a/gst/switchbin/gstswitchbin.c b/gst/switchbin/gstswitchbin.c
index bf1a337c0..4a9a221fd 100644
--- a/gst/switchbin/gstswitchbin.c
+++ b/gst/switchbin/gstswitchbin.c
@@ -824,6 +824,8 @@ gst_switch_bin_get_allowed_caps (GstSwitchBin * switch_bin,
guint i;
GstCaps *total_path_caps;
+ gboolean is_sink_pad =
+ (gst_pad_get_direction (switch_bin_pad) == GST_PAD_SINK);
/* The allowed caps are a combination of the caps of all paths, the
* filter caps, and the allowed caps as indicated by the result
@@ -859,14 +861,21 @@ gst_switch_bin_get_allowed_caps (GstSwitchBin * switch_bin,
caps_query = gst_query_new_caps (NULL);
/* Query the path element for allowed caps. If this is
- * successful, intersect the returned caps with the path caps,
- * and append the result of the intersection to the total_path_caps. */
+ * successful, intersect the returned caps with the path caps for the sink pad,
+ * and append the result of the intersection to the total_path_caps,
+ * or just append the result to the total_path_caps if collecting srcpad caps. */
if (gst_pad_query (pad, caps_query)) {
gst_query_parse_caps_result (caps_query, &caps);
- intersected_caps = gst_caps_intersect (caps, path->caps);
+ if (is_sink_pad) {
+ intersected_caps = gst_caps_intersect (caps, path->caps);
+ } else {
+ intersected_caps = gst_caps_copy (caps);
+ }
gst_caps_append (total_path_caps, intersected_caps);
- } else
+ } else if (is_sink_pad) {
+ /* Just assume the sink pad has the path caps if the query failed */
gst_caps_append (total_path_caps, gst_caps_ref (path->caps));
+ }
gst_object_unref (GST_OBJECT (pad));
gst_query_unref (caps_query);
@@ -874,7 +883,7 @@ gst_switch_bin_get_allowed_caps (GstSwitchBin * switch_bin,
/* This is a path with no element (= is a dropping path),
* If querying the sink caps, append the path
* input caps, otherwise the output caps can be ANY */
- if (gst_pad_get_direction (switch_bin_pad) == GST_PAD_SINK)
+ if (is_sink_pad)
gst_caps_append (total_path_caps, gst_caps_ref (path->caps));
else
gst_caps_append (total_path_caps, gst_caps_new_any ());