audio/videodecoder: use gst_pad_peer_query_caps to make output caps
authorHoonHee Lee <hoonhee.lee@lge.com>
Thu, 28 Jan 2016 09:06:44 +0000 (18:06 +0900)
committerSebastian Dröge <sebastian@centricular.com>
Thu, 28 Jan 2016 10:34:22 +0000 (11:34 +0100)
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
gst-libs/gst/video/gstvideodecoder.c

index 7a4e3f7..7703c12 100644 (file)
@@ -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);
index ff8a58d..992560f 100644 (file)
@@ -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);