summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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 ());