summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThiago Santos <thiagoss@osg.samsung.com>2015-08-14 08:21:51 -0300
committerThiago Santos <thiagoss@osg.samsung.com>2015-08-14 09:14:11 -0300
commit2b387ba827313c6835e3877653ea9571bb9a9086 (patch)
treec9ce0b6531ccc5d8bc0ab8cfde9908a3d1520c13
parent51896af52b2580baeee6784af830efaa8ce6a8b1 (diff)
downloadgst-libav-2b387ba827313c6835e3877653ea9571bb9a9086.tar.gz
avauddec: use template caps intersection for accept-caps
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
-rw-r--r--ext/libav/gstavauddec.c25
1 files changed, 25 insertions, 0 deletions
diff --git a/ext/libav/gstavauddec.c b/ext/libav/gstavauddec.c
index 17eb773..fbce56f 100644
--- a/ext/libav/gstavauddec.c
+++ b/ext/libav/gstavauddec.c
@@ -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;