diff --git a/docs/libs/gst-plugins-base-libs-sections.txt b/docs/libs/gst-plugins-base-libs-sections.txt index d497a297b3..fca6b289ab 100644 --- a/docs/libs/gst-plugins-base-libs-sections.txt +++ b/docs/libs/gst-plugins-base-libs-sections.txt @@ -2536,6 +2536,8 @@ gst_video_decoder_set_estimate_rate gst_video_decoder_set_output_state gst_video_decoder_set_max_errors gst_video_decoder_set_packetized +gst_video_decoder_get_needs_format +gst_video_decoder_set_needs_format gst_video_decoder_merge_tags GST_IS_VIDEO_DECODER diff --git a/gst-libs/gst/video/gstvideodecoder.c b/gst-libs/gst/video/gstvideodecoder.c index ca73a461f7..390e7e34d4 100644 --- a/gst-libs/gst/video/gstvideodecoder.c +++ b/gst-libs/gst/video/gstvideodecoder.c @@ -336,6 +336,7 @@ struct _GstVideoDecoderPrivate gboolean had_output_data; gboolean had_input_data; + gboolean needs_format; gboolean do_caps; /* ... being tracked here; @@ -558,6 +559,7 @@ gst_video_decoder_init (GstVideoDecoder * decoder, GstVideoDecoderClass * klass) decoder->priv->input_adapter = gst_adapter_new (); decoder->priv->output_adapter = gst_adapter_new (); decoder->priv->packetized = TRUE; + decoder->priv->needs_format = FALSE; gst_video_decoder_reset (decoder, TRUE, TRUE); } @@ -1981,6 +1983,9 @@ gst_video_decoder_chain (GstPad * pad, GstObject * parent, GstBuffer * buf) decoder->priv->do_caps = FALSE; } + if (G_UNLIKELY (!decoder->priv->input_state && decoder->priv->needs_format)) + goto not_negotiated; + GST_LOG_OBJECT (decoder, "chain PTS %" GST_TIME_FORMAT ", DTS %" GST_TIME_FORMAT " duration %" GST_TIME_FORMAT " size %" G_GSIZE_FORMAT, @@ -3446,6 +3451,50 @@ gst_video_decoder_get_max_errors (GstVideoDecoder * dec) return dec->priv->max_errors; } +/** + * gst_video_decoder_set_needs_format: + * @dec: a #GstVideoDecoder + * @enabled: new state + * + * Configures decoder format needs. If enabled, subclass needs to be + * negotiated with format caps before it can process any data. It will then + * never be handed any data before it has been configured. + * Otherwise, it might be handed data without having been configured and + * is then expected being able to do so either by default + * or based on the input data. + * + * Since: 1.4 + */ +void +gst_video_decoder_set_needs_format (GstVideoDecoder * dec, gboolean enabled) +{ + g_return_if_fail (GST_IS_VIDEO_DECODER (dec)); + + dec->priv->needs_format = enabled; +} + +/** + * gst_video_decoder_get_needs_format: + * @dec: a #GstVideoDecoder + * + * Queries decoder required format handling. + * + * Returns: TRUE if required format handling is enabled. + * + * Since: 1.4 + */ +gboolean +gst_video_decoder_get_needs_format (GstVideoDecoder * dec) +{ + gboolean result; + + g_return_val_if_fail (GST_IS_VIDEO_DECODER (dec), FALSE); + + result = dec->priv->needs_format; + + return result; +} + /** * gst_video_decoder_set_packetized: * @decoder: a #GstVideoDecoder diff --git a/gst-libs/gst/video/gstvideodecoder.h b/gst-libs/gst/video/gstvideodecoder.h index abe2fbb421..84a8e45bcf 100644 --- a/gst-libs/gst/video/gstvideodecoder.h +++ b/gst-libs/gst/video/gstvideodecoder.h @@ -316,6 +316,11 @@ void gst_video_decoder_set_max_errors (GstVideoDecoder * dec, gint gst_video_decoder_get_max_errors (GstVideoDecoder * dec); +void gst_video_decoder_set_needs_format (GstVideoDecoder * dec, + gboolean enabled); + +gboolean gst_video_decoder_get_needs_format (GstVideoDecoder * dec); + void gst_video_decoder_set_latency (GstVideoDecoder *decoder, GstClockTime min_latency, GstClockTime max_latency); diff --git a/win32/common/libgstvideo.def b/win32/common/libgstvideo.def index 616f1384ee..be6d6d4917 100644 --- a/win32/common/libgstvideo.def +++ b/win32/common/libgstvideo.def @@ -95,6 +95,7 @@ EXPORTS gst_video_decoder_get_latency gst_video_decoder_get_max_decode_time gst_video_decoder_get_max_errors + gst_video_decoder_get_needs_format gst_video_decoder_get_oldest_frame gst_video_decoder_get_output_state gst_video_decoder_get_packetized @@ -107,6 +108,7 @@ EXPORTS gst_video_decoder_set_estimate_rate gst_video_decoder_set_latency gst_video_decoder_set_max_errors + gst_video_decoder_set_needs_format gst_video_decoder_set_output_state gst_video_decoder_set_packetized gst_video_encoder_allocate_output_buffer