diff options
author | Anton Khirnov <anton@khirnov.net> | 2012-11-12 19:56:55 +0100 |
---|---|---|
committer | Anton Khirnov <anton@khirnov.net> | 2012-12-04 21:43:53 +0100 |
commit | e57c4706e969afa1f2384481b955ccd9494cddb5 (patch) | |
tree | d2d9c103ead191d9ae273572862b29d92f6fc3b6 /libavcodec | |
parent | ff953fecffd3b9a616a046723fb9d4690be032a6 (diff) | |
download | ffmpeg-e57c4706e969afa1f2384481b955ccd9494cddb5.tar.gz |
lavc: don't reuse audio buffers
Any performance gain from this is negligible and not worth the extra
code.
Diffstat (limited to 'libavcodec')
-rw-r--r-- | libavcodec/internal.h | 9 | ||||
-rw-r--r-- | libavcodec/utils.c | 76 |
2 files changed, 17 insertions, 68 deletions
diff --git a/libavcodec/internal.h b/libavcodec/internal.h index 9dde654528..069a855a74 100644 --- a/libavcodec/internal.h +++ b/libavcodec/internal.h @@ -39,9 +39,6 @@ typedef struct InternalBuffer { int width; int height; enum AVPixelFormat pix_fmt; - uint8_t **extended_data; - int audio_data_size; - int nb_channels; } InternalBuffer; typedef struct AVCodecInternal { @@ -78,6 +75,12 @@ typedef struct AVCodecInternal { * padded with silence. Reject all subsequent frames. */ int last_audio_frame; + + /** + * The data for the last allocated audio frame. + * Stored here so we can free it. + */ + uint8_t *audio_data; } AVCodecInternal; struct AVCodecDefault { diff --git a/libavcodec/utils.c b/libavcodec/utils.c index 6226b2841f..6752ed9e5d 100644 --- a/libavcodec/utils.c +++ b/libavcodec/utils.c @@ -300,72 +300,29 @@ int avcodec_fill_audio_frame(AVFrame *frame, int nb_channels, static int audio_get_buffer(AVCodecContext *avctx, AVFrame *frame) { AVCodecInternal *avci = avctx->internal; - InternalBuffer *buf; int buf_size, ret; + av_freep(&avci->audio_data); buf_size = av_samples_get_buffer_size(NULL, avctx->channels, frame->nb_samples, avctx->sample_fmt, 0); if (buf_size < 0) return AVERROR(EINVAL); - /* 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; + frame->data[0] = av_mallocz(buf_size); + if (!frame->data[0]) + return AVERROR(ENOMEM); - if (frame->extended_data == frame->data) - buf->extended_data = buf->data; - else - buf->extended_data = frame->extended_data; - memcpy(buf->data, frame->data, sizeof(frame->data)); - buf->linesize[0] = frame->linesize[0]; - buf->nb_channels = avctx->channels; - } else { - /* copy InternalBuffer info to the AVFrame */ - frame->extended_data = buf->extended_data; - frame->linesize[0] = buf->linesize[0]; - memcpy(frame->data, buf->data, sizeof(frame->data)); + ret = avcodec_fill_audio_frame(frame, avctx->channels, avctx->sample_fmt, + frame->data[0], buf_size, 0); + if (ret < 0) { + av_freep(&frame->data[0]); + return ret; } frame->type = FF_BUFFER_TYPE_INTERNAL; + avci->audio_data = frame->data[0]; if (avctx->debug & FF_DEBUG_BUFFERS) av_log(avctx, AV_LOG_DEBUG, "default_get_buffer called on frame %p, " "internal audio buffer used\n", frame); @@ -1787,18 +1744,7 @@ static void video_free_buffers(AVCodecContext *s) static void audio_free_buffers(AVCodecContext *avctx) { AVCodecInternal *avci = avctx->internal; - InternalBuffer *buf; - - if (!avci->buffer) - return; - buf = avci->buffer; - - if (buf->extended_data) { - av_free(buf->extended_data[0]); - if (buf->extended_data != buf->data) - av_free(buf->extended_data); - } - av_freep(&avci->buffer); + av_freep(&avci->audio_data); } void avcodec_default_free_buffers(AVCodecContext *avctx) |