avauddec: use template caps intersection for accept-caps
authorThiago Santos <thiagoss@osg.samsung.com>
Fri, 14 Aug 2015 11:21:51 +0000 (08:21 -0300)
committerThiago Santos <thiagoss@osg.samsung.com>
Fri, 14 Aug 2015 12:14:11 +0000 (09:14 -0300)
Avoid doing downstream caps queries when accept-caps should just
do a shallow caps check on the element itself

https://bugzilla.gnome.org/show_bug.cgi?id=753623

ext/libav/gstavauddec.c

index 17eb773..fbce56f 100644 (file)
@@ -53,6 +53,8 @@ static gboolean gst_ffmpegauddec_set_format (GstAudioDecoder * decoder,
     GstCaps * caps);
 static GstFlowReturn gst_ffmpegauddec_handle_frame (GstAudioDecoder * decoder,
     GstBuffer * inbuf);
+static gboolean gst_ffmpegauddec_sink_query (GstAudioDecoder * decoder,
+    GstQuery * query);
 
 static gboolean gst_ffmpegauddec_negotiate (GstFFMpegAudDec * ffmpegdec,
     AVCodecContext * context, AVFrame * frame, gboolean force);
@@ -133,6 +135,8 @@ gst_ffmpegauddec_class_init (GstFFMpegAudDecClass * klass)
   gstaudiodecoder_class->flush = GST_DEBUG_FUNCPTR (gst_ffmpegauddec_flush);
   gstaudiodecoder_class->propose_allocation =
       GST_DEBUG_FUNCPTR (gst_ffmpegauddec_propose_allocation);
+  gstaudiodecoder_class->sink_query =
+      GST_DEBUG_FUNCPTR (gst_ffmpegauddec_sink_query);
 }
 
 static void
@@ -148,6 +152,8 @@ gst_ffmpegauddec_init (GstFFMpegAudDec * ffmpegdec)
 
   ffmpegdec->frame = av_frame_alloc ();
 
+  GST_PAD_SET_ACCEPT_TEMPLATE (GST_VIDEO_DECODER_SINK_PAD (ffmpegdec));
+
   gst_audio_decoder_set_drainable (GST_AUDIO_DECODER (ffmpegdec), TRUE);
   gst_audio_decoder_set_needs_format (GST_AUDIO_DECODER (ffmpegdec), TRUE);
 }
@@ -202,6 +208,25 @@ gst_ffmpegauddec_close (GstFFMpegAudDec * ffmpegdec, gboolean reset)
 }
 
 static gboolean
+gst_ffmpegauddec_sink_query (GstAudioDecoder * decoder, GstQuery * query)
+{
+  gboolean ret;
+
+  switch (GST_QUERY_TYPE (query)) {
+    case GST_QUERY_ACCEPT_CAPS:
+      /* resort to the default accept-caps query handling to skip the videodecoder handling */
+      ret =
+          gst_pad_query_default (GST_AUDIO_DECODER_SINK_PAD (decoder),
+          GST_OBJECT_CAST (decoder), query);
+      break;
+    default:
+      ret = gst_audio_decoder_sink_query_default (decoder, query);
+      break;
+  }
+  return ret;
+}
+
+static gboolean
 gst_ffmpegauddec_start (GstAudioDecoder * decoder)
 {
   GstFFMpegAudDec *ffmpegdec = (GstFFMpegAudDec *) decoder;