From b8c6413a8efebd2272eb98171f3dcf936c20ae0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Fri, 24 May 2013 16:52:50 +0200 Subject: [PATCH] audio: Always provide a buffer in gst_audio_(enc|dec)oder_allocate_output_buffer() We have no way of tell the caller of the exact error (e.g. if we're flushing), so will have to wait until the caller uses API that returns a GstFlowReturn, for example when pushing this buffer. https://bugzilla.gnome.org/show_bug.cgi?id=700006 --- gst-libs/gst/audio/gstaudiodecoder.c | 16 +++++++++++++--- gst-libs/gst/audio/gstaudioencoder.c | 17 ++++++++++++++--- 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/gst-libs/gst/audio/gstaudiodecoder.c b/gst-libs/gst/audio/gstaudiodecoder.c index d9bfe95b4d..f8fb8b7ff2 100644 --- a/gst-libs/gst/audio/gstaudiodecoder.c +++ b/gst-libs/gst/audio/gstaudiodecoder.c @@ -2985,15 +2985,25 @@ gst_audio_decoder_allocate_output_buffer (GstAudioDecoder * dec, gsize size) if (G_UNLIKELY (dec->priv->ctx.output_format_changed || (GST_AUDIO_INFO_IS_VALID (&dec->priv->ctx.info) && gst_pad_check_reconfigure (dec->srcpad)))) { - if (!gst_audio_decoder_negotiate (dec)) - goto done; + if (!gst_audio_decoder_negotiate (dec)) { + GST_INFO_OBJECT (dec, "Failed to negotiate, fallback allocation"); + goto fallback; + } } buffer = gst_buffer_new_allocate (dec->priv->ctx.allocator, size, &dec->priv->ctx.params); + if (!buffer) { + GST_INFO_OBJECT (dec, "couldn't allocate output buffer"); + goto fallback; + } -done: + GST_AUDIO_DECODER_STREAM_UNLOCK (dec); + + return buffer; +fallback: + buffer = gst_buffer_new_allocate (NULL, size, NULL); GST_AUDIO_DECODER_STREAM_UNLOCK (dec); return buffer; diff --git a/gst-libs/gst/audio/gstaudioencoder.c b/gst-libs/gst/audio/gstaudioencoder.c index 9ed59242dc..3bf6b22cd8 100644 --- a/gst-libs/gst/audio/gstaudioencoder.c +++ b/gst-libs/gst/audio/gstaudioencoder.c @@ -2726,15 +2726,26 @@ gst_audio_encoder_allocate_output_buffer (GstAudioEncoder * enc, gsize size) if (G_UNLIKELY (enc->priv->ctx.output_caps_changed || (enc->priv->ctx.caps && gst_pad_check_reconfigure (enc->srcpad)))) { - if (!gst_audio_encoder_negotiate (enc)) - goto done; + if (!gst_audio_encoder_negotiate (enc)) { + GST_INFO_OBJECT (enc, "Failed to negotiate, fallback allocation"); + goto fallback; + } } buffer = gst_buffer_new_allocate (enc->priv->ctx.allocator, size, &enc->priv->ctx.params); + if (!buffer) { + GST_INFO_OBJECT (enc, "couldn't allocate output buffer"); + goto fallback; + } -done: + GST_AUDIO_ENCODER_STREAM_UNLOCK (enc); + + return buffer; + +fallback: + buffer = gst_buffer_new_allocate (NULL, size, NULL); GST_AUDIO_ENCODER_STREAM_UNLOCK (enc); return buffer;