From 33b1da7b802346550bb4b44ed1eba8865b49612c Mon Sep 17 00:00:00 2001 From: Thiago Santos Date: Sat, 15 Aug 2015 07:31:54 -0300 Subject: [PATCH] audiodecoder: add option to use default pad accept-caps handling Add gst_audio_decoder_set_use_default_pad_acceptcaps() to allow subclasses to make videodecoder use the default pad acceptcaps handling instead of resorting to the caps query that is, usually, less efficient and unecessary API: gst_audio_decoder_set_use_default_pad_acceptcaps --- gst-libs/gst/audio/gstaudiodecoder.c | 62 +++++++++++++++++++++------- gst-libs/gst/audio/gstaudiodecoder.h | 3 ++ win32/common/libgstaudio.def | 1 + 3 files changed, 50 insertions(+), 16 deletions(-) diff --git a/gst-libs/gst/audio/gstaudiodecoder.c b/gst-libs/gst/audio/gstaudiodecoder.c index e831be3434..4515d2e33e 100644 --- a/gst-libs/gst/audio/gstaudiodecoder.c +++ b/gst-libs/gst/audio/gstaudiodecoder.c @@ -279,6 +279,9 @@ struct _GstAudioDecoderPrivate /* pending serialized sink events, will be sent from finish_frame() */ GList *pending_events; + + /* flags */ + gboolean use_default_pad_acceptcaps; }; //* Default channel layouts taken from audioconvert */ @@ -2691,28 +2694,34 @@ gst_audio_decoder_sink_query_default (GstAudioDecoder * dec, GstQuery * query) break; } case GST_QUERY_ACCEPT_CAPS:{ - GstCaps *caps; - GstCaps *allowed_caps; - GstCaps *template_caps; - gboolean accept; + if (dec->priv->use_default_pad_acceptcaps) { + res = + gst_pad_query_default (GST_AUDIO_DECODER_SINK_PAD (dec), + GST_OBJECT_CAST (dec), query); + } else { + GstCaps *caps; + GstCaps *allowed_caps; + GstCaps *template_caps; + gboolean accept; - gst_query_parse_accept_caps (query, &caps); + gst_query_parse_accept_caps (query, &caps); - template_caps = gst_pad_get_pad_template_caps (pad); - accept = gst_caps_is_subset (caps, template_caps); - gst_caps_unref (template_caps); + template_caps = gst_pad_get_pad_template_caps (pad); + accept = gst_caps_is_subset (caps, template_caps); + gst_caps_unref (template_caps); - if (accept) { - allowed_caps = gst_pad_query_caps (GST_AUDIO_DECODER_SINK_PAD (dec), - caps); + if (accept) { + allowed_caps = gst_pad_query_caps (GST_AUDIO_DECODER_SINK_PAD (dec), + caps); - accept = gst_caps_can_intersect (caps, allowed_caps); + accept = gst_caps_can_intersect (caps, allowed_caps); - gst_caps_unref (allowed_caps); + gst_caps_unref (allowed_caps); + } + + gst_query_set_accept_caps_result (query, accept); + res = TRUE; } - - gst_query_set_accept_caps_result (query, accept); - res = TRUE; break; } case GST_QUERY_SEEKING: @@ -3611,3 +3620,24 @@ gst_audio_decoder_get_allocator (GstAudioDecoder * dec, if (params) *params = dec->priv->ctx.params; } + +/** + * gst_audio_decoder_set_use_default_pad_acceptcaps: + * @decoder: a #GstAudioDecoder + * @use: if the default pad accept-caps query handling should be used + * + * Lets #GstAudioDecoder sub-classes decide if they want the sink pad + * to use the default pad query handler to reply to accept-caps queries. + * + * By setting this to true it is possible to further customize the default + * handler with %GST_PAD_SET_ACCEPT_INTERSECT and + * %GST_PAD_SET_ACCEPT_TEMPLATE + * + * Since: 1.6 + */ +void +gst_audio_decoder_set_use_default_pad_acceptcaps (GstAudioDecoder * decoder, + gboolean use) +{ + decoder->priv->use_default_pad_acceptcaps = use; +} diff --git a/gst-libs/gst/audio/gstaudiodecoder.h b/gst-libs/gst/audio/gstaudiodecoder.h index 3e9fa0332b..cd65b2dbc1 100644 --- a/gst-libs/gst/audio/gstaudiodecoder.h +++ b/gst-libs/gst/audio/gstaudiodecoder.h @@ -397,6 +397,9 @@ void gst_audio_decoder_merge_tags (GstAudioDecoder * dec, gboolean gst_audio_decoder_sink_query_default (GstAudioDecoder * dec, GstQuery * query); +void gst_audio_decoder_set_use_default_pad_acceptcaps (GstAudioDecoder * decoder, + gboolean use); + G_END_DECLS #endif /* _GST_AUDIO_DECODER_H_ */ diff --git a/win32/common/libgstaudio.def b/win32/common/libgstaudio.def index 39e2742fc0..8ef663ea4d 100644 --- a/win32/common/libgstaudio.def +++ b/win32/common/libgstaudio.def @@ -67,6 +67,7 @@ EXPORTS gst_audio_decoder_set_plc gst_audio_decoder_set_plc_aware gst_audio_decoder_set_tolerance + gst_audio_decoder_set_use_default_pad_acceptcaps gst_audio_decoder_sink_query_default gst_audio_downmix_meta_api_get_type gst_audio_downmix_meta_get_info