From 15df3c812b3c4d545fce4a2cfa6b74f34c1d2020 Mon Sep 17 00:00:00 2001 From: HoonHee Lee Date: Thu, 28 Jan 2016 18:06:44 +0900 Subject: [PATCH] audio/videodecoder: use gst_pad_peer_query_caps to make output caps gst_pad_get_allowed_caps() will return NULL if the srcpad has no peer. In that case, use gst_pad_peer_query_caps() with template caps as filter to have negotiated output caps properly before forwarding GAP event. https://bugzilla.gnome.org/show_bug.cgi?id=761218 --- gst-libs/gst/audio/gstaudiodecoder.c | 15 +++++++++++++-- gst-libs/gst/video/gstvideodecoder.c | 15 +++++++++++++-- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/gst-libs/gst/audio/gstaudiodecoder.c b/gst-libs/gst/audio/gstaudiodecoder.c index 7a4e3f793c..7703c12ba4 100644 --- a/gst-libs/gst/audio/gstaudiodecoder.c +++ b/gst-libs/gst/audio/gstaudiodecoder.c @@ -1950,7 +1950,7 @@ gst_audio_decoder_do_byte (GstAudioDecoder * dec) static gboolean gst_audio_decoder_negotiate_default_caps (GstAudioDecoder * dec) { - GstCaps *caps; + GstCaps *caps, *templcaps; gint i; gint channels = 0; gint rate; @@ -1958,10 +1958,21 @@ gst_audio_decoder_negotiate_default_caps (GstAudioDecoder * dec) gint caps_size; GstStructure *structure; - caps = gst_pad_get_allowed_caps (dec->srcpad); + templcaps = gst_pad_get_pad_template_caps (dec->srcpad); + caps = gst_pad_peer_query_caps (dec->srcpad, templcaps); + if (caps) { + gst_caps_unref (templcaps); + templcaps = NULL; + } else { + caps = templcaps; + templcaps = NULL; + } + if (!caps || gst_caps_is_empty (caps) || gst_caps_is_any (caps)) goto caps_error; + GST_LOG_OBJECT (dec, "peer caps %" GST_PTR_FORMAT, caps); + /* before fixating, try to use whatever upstream provided */ caps = gst_caps_make_writable (caps); caps_size = gst_caps_get_size (caps); diff --git a/gst-libs/gst/video/gstvideodecoder.c b/gst-libs/gst/video/gstvideodecoder.c index ff8a58d046..992560fc02 100644 --- a/gst-libs/gst/video/gstvideodecoder.c +++ b/gst-libs/gst/video/gstvideodecoder.c @@ -1089,17 +1089,28 @@ _flush_events (GstPad * pad, GList * events) static gboolean gst_video_decoder_negotiate_default_caps (GstVideoDecoder * decoder) { - GstCaps *caps; + GstCaps *caps, *templcaps; GstVideoCodecState *state; GstVideoInfo info; gint i; gint caps_size; GstStructure *structure; - caps = gst_pad_get_allowed_caps (decoder->srcpad); + templcaps = gst_pad_get_pad_template_caps (decoder->srcpad); + caps = gst_pad_peer_query_caps (decoder->srcpad, templcaps); + if (caps) { + gst_caps_unref (templcaps); + templcaps = NULL; + } else { + caps = templcaps; + templcaps = NULL; + } + if (!caps || gst_caps_is_empty (caps) || gst_caps_is_any (caps)) goto caps_error; + GST_LOG_OBJECT (decoder, "peer caps %" GST_PTR_FORMAT, caps); + /* before fixating, try to use whatever upstream provided */ caps = gst_caps_make_writable (caps); caps_size = gst_caps_get_size (caps);