[FFmpeg-trac] #4874(undetermined:new): AAC decoder frame->nb_samples & frame->channels is wrong at get_buffer2

FFmpeg trac at avcodec.org
Wed Sep 23 10:30:13 CEST 2015

#4874: AAC decoder frame->nb_samples & frame->channels is wrong at get_buffer2
             Reporter:  zylthinking  |                    Owner:
                 Type:  defect       |                   Status:  new
             Priority:  normal       |                Component:
              Version:  git-master   |  undetermined
             Keywords:  aac          |               Resolution:
             Blocking:               |               Blocked By:
Analyzed by developer:  0            |  Reproduced by developer:  0

Comment (by zylthinking):

 Replying to [comment:3 cehoyos]:

 it just happens to be correct.
 to be precise, I print information in the default audio_get_buffer with
 the code:
 __android_log_print(6, "zylthinking", "frame->linesize[0] = %d, planes =
 %d, frame->nb_extended_buf = %d:%d\n", frame->linesize[0], planes,
 frame->nb_extended_buf, AV_NUM_DATA_POINTERS);

 and I get:
 E/zylthinking(13386): frame->linesize[0] = 8192, planes = 2,
 frame->nb_extended_buf = 0:8
 this is the lc-aac, and you see
 1. channel is 2, not 1
 2.  pool->linesize[0] is 8192, this is the exactly a buffer size large
 enough to avoid the errors; in fact, only 4096 bytes is needed for 1

 the conclusion is that:
 1. the default get_buffer known what I don't know, e.g. the internal
 FramePool, all information is query from it and it even use a large buffer
 to avoid buffer size issues; though it has enough and correct
 information(maybe, if it still have some other source to query the correct
 nb_samples) to get the buffer size needed

 while, I have to say, for a user provided get_buffer2 hook,  the only
 information for me to use is the information decoder passed to me. So, the
 decoder should not tell me wrong things.

 see the code in utils.c
 static int audio_get_buffer(AVCodecContext *avctx, AVFrame *frame)
     FramePool *pool = avctx->internal->pool;
     int planes = pool->planes;
     int i;

     frame->linesize[0] = pool->linesize[0];
     __android_log_print(6, "zylthinking", "frame->linesize[0] = %d, planes
 = %d, frame->nb_extended_buf = %d:%d\n", frame->linesize[0], planes,
 frame->nb_extended_buf, AV_NUM_DATA_POINTERS);

     if (planes > AV_NUM_DATA_POINTERS) {
         frame->extended_data = av_mallocz_array(planes,
         frame->nb_extended_buf = planes - AV_NUM_DATA_POINTERS;
         frame->extended_buf  = av_mallocz_array(frame->nb_extended_buf,
         if (!frame->extended_data || !frame->extended_buf) {
             return AVERROR(ENOMEM);
     } else {
         frame->extended_data = frame->data;
         av_assert0(frame->nb_extended_buf == 0);

     for (i = 0; i < FFMIN(planes, AV_NUM_DATA_POINTERS); i++) {
         frame->buf[i] = av_buffer_pool_get(pool->pools[0]);
         if (!frame->buf[i])
             goto fail;
         frame->extended_data[i] = frame->data[i] = frame->buf[i]->data;
     for (i = 0; i < frame->nb_extended_buf; i++) {
         frame->extended_buf[i] = av_buffer_pool_get(pool->pools[0]);
         if (!frame->extended_buf[i])
             goto fail;
         frame->extended_data[i + AV_NUM_DATA_POINTERS] =

     if (avctx->debug & FF_DEBUG_BUFFERS)
         av_log(avctx, AV_LOG_DEBUG, "default_get_buffer called on frame
 %p", frame);

     return 0;
     return AVERROR(ENOMEM);

Ticket URL: <https://trac.ffmpeg.org/ticket/4874#comment:7>
FFmpeg <https://ffmpeg.org>
FFmpeg issue tracker

More information about the FFmpeg-trac mailing list