diff --git a/gst-libs/gst/video/gstvideodecoder.c b/gst-libs/gst/video/gstvideodecoder.c index c680722a93..99dd4ee0f0 100644 --- a/gst-libs/gst/video/gstvideodecoder.c +++ b/gst-libs/gst/video/gstvideodecoder.c @@ -421,6 +421,9 @@ struct _GstVideoDecoderPrivate GstTagList *tags; gboolean tags_changed; + + /* flags */ + gboolean use_default_pad_acceptcaps; }; static GstElementClass *parent_class = NULL; @@ -1862,28 +1865,34 @@ gst_video_decoder_sink_query_default (GstVideoDecoder * decoder, break; } case GST_QUERY_ACCEPT_CAPS:{ - GstCaps *caps; - GstCaps *allowed_caps; - GstCaps *template_caps; - gboolean accept; + if (decoder->priv->use_default_pad_acceptcaps) { + res = + gst_pad_query_default (GST_VIDEO_DECODER_SINK_PAD (decoder), + GST_OBJECT_CAST (decoder), 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_VIDEO_DECODER_SINK_PAD (decoder), - caps); + if (accept) { + allowed_caps = + gst_pad_query_caps (GST_VIDEO_DECODER_SINK_PAD (decoder), 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; } default: @@ -4293,3 +4302,24 @@ gst_video_decoder_get_allocator (GstVideoDecoder * decoder, if (params) *params = decoder->priv->params; } + +/** + * gst_video_decoder_set_use_default_pad_acceptcaps: + * @decoder: a #GstVideoDecoder + * @use: if the default pad accept-caps query handling should be used + * + * Lets #GstVideoDecoder 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_video_decoder_set_use_default_pad_acceptcaps (GstVideoDecoder * decoder, + gboolean use) +{ + decoder->priv->use_default_pad_acceptcaps = use; +} diff --git a/gst-libs/gst/video/gstvideodecoder.h b/gst-libs/gst/video/gstvideodecoder.h index 779048e061..9497255b13 100644 --- a/gst-libs/gst/video/gstvideodecoder.h +++ b/gst-libs/gst/video/gstvideodecoder.h @@ -427,6 +427,9 @@ GstCaps * gst_video_decoder_proxy_getcaps (GstVideoDecoder * decoder, gboolean gst_video_decoder_sink_query_default (GstVideoDecoder * decoder, GstQuery * query); +void gst_video_decoder_set_use_default_pad_acceptcaps (GstVideoDecoder * decoder, + gboolean use); + G_END_DECLS diff --git a/win32/common/libgstvideo.def b/win32/common/libgstvideo.def index ef5d6501b7..65ee984581 100644 --- a/win32/common/libgstvideo.def +++ b/win32/common/libgstvideo.def @@ -129,6 +129,7 @@ EXPORTS gst_video_decoder_set_needs_format gst_video_decoder_set_output_state gst_video_decoder_set_packetized + gst_video_decoder_set_use_default_pad_acceptcaps gst_video_decoder_sink_query_default gst_video_dither_flags_get_type gst_video_dither_free