]> git.sesse.net Git - ffmpeg/commitdiff
lavc: Relax API strictness in avcodec_decode_audio3 with a custom get_buffer()
authorReinhard Tartler <siretart@tauware.de>
Sun, 15 Jan 2012 19:32:11 +0000 (20:32 +0100)
committerReinhard Tartler <siretart@tauware.de>
Sun, 15 Jan 2012 20:40:59 +0000 (21:40 +0100)
Do not fail audio decoding with avcodec_decode_audio3 if user has set a
custom get_buffer. Strictly speaking, this was never allowed by the API,
but it seems that some software packages did so anyways. In order to
unbreak applications (cf. http://bugs.debian.org/655890), this change
clarifies the API and overrides the custom get_buffer() with the defaults.

This change is inspired by a similar
commit (c3846e3ebab610be691adb8b40d376dc2f675dc4) in FFmpeg.

Signed-off-by: Reinhard Tartler <siretart@tauware.de>
libavcodec/avcodec.h
libavcodec/utils.c

index c195ad5b189026d88916144d9f0dcac9336593f8..49d2a0f91814ee14e53e854f130865043a970abf 100644 (file)
@@ -4070,6 +4070,11 @@ int avcodec_open2(AVCodecContext *avctx, AVCodec *codec, AVDictionary **options)
  * @warning The end of the input buffer avpkt->data should be set to 0 to ensure that
  * no overreading happens for damaged MPEG streams.
  *
+ * @warning You must not provide a custom get_buffer() when using
+ * avcodec_decode_audio3().  Doing so will override it with
+ * avcodec_default_get_buffer.  Use avcodec_decode_audio4() instead,
+ * which does allow the application to provide a custom get_buffer().
+ *
  * @note You might have to align the input buffer avpkt->data and output buffer
  * samples. The alignment requirements depend on the CPU: On some CPUs it isn't
  * necessary at all, on others it won't work at all if not aligned and on others
index 6f4d7e68da28659a85edfa036596061729bbb7b4..8473aacb4f71fd0d3929642f267bba3c13836a2f 100644 (file)
@@ -933,9 +933,11 @@ int attribute_align_arg avcodec_decode_audio3(AVCodecContext *avctx, int16_t *sa
     int ret, got_frame = 0;
 
     if (avctx->get_buffer != avcodec_default_get_buffer) {
-        av_log(avctx, AV_LOG_ERROR, "A custom get_buffer() cannot be used with "
-               "avcodec_decode_audio3()\n");
-        return AVERROR(EINVAL);
+        av_log(avctx, AV_LOG_ERROR, "Custom get_buffer() for use with"
+               "avcodec_decode_audio3() detected. Overriding with avcodec_default_get_buffer\n");
+        av_log(avctx, AV_LOG_ERROR, "Please port your application to "
+               "avcodec_decode_audio4()\n");
+        avctx->get_buffer = avcodec_default_get_buffer;
     }
 
     ret = avcodec_decode_audio4(avctx, &frame, &got_frame, avpkt);