- /* allocate InternalBuffer if needed */
- if (!avci->buffer) {
- avci->buffer = av_mallocz(sizeof(InternalBuffer));
- if (!avci->buffer)
- return AVERROR(ENOMEM);
- }
- buf = avci->buffer;
-
- /* if there is a previously-used internal buffer, check its size and
- * channel count to see if we can reuse it */
- if (buf->extended_data) {
- /* if current buffer is too small, free it */
- if (buf->extended_data[0] && buf_size > buf->audio_data_size) {
- av_free(buf->extended_data[0]);
- if (buf->extended_data != buf->data)
- av_free(buf->extended_data);
- buf->extended_data = NULL;
- buf->data[0] = NULL;
- }
- /* if number of channels has changed, reset and/or free extended data
- * pointers but leave data buffer in buf->data[0] for reuse */
- if (buf->nb_channels != avctx->channels) {
- if (buf->extended_data != buf->data)
- av_free(buf->extended_data);
- buf->extended_data = NULL;
- }
- }
-
- /* if there is no previous buffer or the previous buffer cannot be used
- * as-is, allocate a new buffer and/or rearrange the channel pointers */
- if (!buf->extended_data) {
- if (!buf->data[0]) {
- if (!(buf->data[0] = av_mallocz(buf_size)))
- return AVERROR(ENOMEM);
- buf->audio_data_size = buf_size;
- }
- if ((ret = avcodec_fill_audio_frame(frame, avctx->channels,
- avctx->sample_fmt, buf->data[0],
- buf->audio_data_size, 0)))
- return ret;