On 2012-01-31 11:40:17 -0500, Justin Ruggles wrote:
> Avoids doing malloc/free for each frame.
> Also fixes valgrind errors due to use of uninitialized padding bytes.
>
> Based on a patch by Reimar Döffinger <[email protected]>
> ---
> libavcodec/mpc.h | 2 ++
> libavcodec/mpc7.c | 21 ++++++++++++++-------
> 2 files changed, 16 insertions(+), 7 deletions(-)
>
> diff --git a/libavcodec/mpc.h b/libavcodec/mpc.h
> index 1a6e794..f3f24ee 100644
> --- a/libavcodec/mpc.h
> +++ b/libavcodec/mpc.h
> @@ -66,6 +66,8 @@ typedef struct {
> int buf_size;
> AVLFG rnd;
> int frames_to_skip;
> + uint8_t *buffer;
> + int buffer_size;
> /* for synthesis */
> DECLARE_ALIGNED(16, MPA_INT, synth_buf)[MPA_MAX_CHANNELS][512*2];
> int synth_buf_offset[MPA_MAX_CHANNELS];
> diff --git a/libavcodec/mpc7.c b/libavcodec/mpc7.c
> index 6b6bffe..38bf1d0 100644
> --- a/libavcodec/mpc7.c
> +++ b/libavcodec/mpc7.c
> @@ -203,7 +203,6 @@ static int mpc7_decode_frame(AVCodecContext * avctx, void
> *data,
> int buf_size = avpkt->size;
> MPCContext *c = avctx->priv_data;
> GetBitContext gb;
> - uint8_t *bits;
> int i, ch;
> int mb = -1;
> Band *bands = c->bands;
> @@ -223,11 +222,12 @@ static int mpc7_decode_frame(AVCodecContext * avctx,
> void *data,
> return ret;
> }
>
> - bits = av_malloc(((buf_size - 1) & ~3) + FF_INPUT_BUFFER_PADDING_SIZE);
> - if (!bits)
> + av_fast_padded_malloc(&c->buffer, &c->buffer_size, (buf_size - 1) & ~3);
> + if (!c->buffer)
> return AVERROR(ENOMEM);
> - c->dsp.bswap_buf((uint32_t*)bits, (const uint32_t*)(buf + 4), (buf_size
> - 4) >> 2);
> - init_get_bits(&gb, bits, (buf_size - 4)* 8);
> + c->dsp.bswap_buf((uint32_t*)c->buffer, (const uint32_t*)(buf + 4),
> + (buf_size - 4) >> 2);
> + init_get_bits(&gb, c->buffer, (buf_size - 4) * 8);
this has the same existing problem of a gap between the end of the
bswapped values and the padding if buf_size is not a multiple of 4.
> skip_bits_long(&gb, buf[0]);
>
> /* read subband indexes */
> @@ -284,8 +284,6 @@ static int mpc7_decode_frame(AVCodecContext * avctx, void
> *data,
>
> ff_mpc_dequantize_and_synth(c, mb, c->frame.data[0], 2);
>
> - av_free(bits);
> -
> bits_used = get_bits_count(&gb);
> bits_avail = (buf_size - 4) * 8;
> if(!buf[1] && ((bits_avail < bits_used) || (bits_used + 32 <=
> bits_avail))){
> @@ -312,12 +310,21 @@ static void mpc7_decode_flush(AVCodecContext *avctx)
> c->frames_to_skip = 32;
> }
>
> +static av_cold int mpc7_decode_close(AVCodecContext *avctx)
> +{
> + MPCContext *c = avctx->priv_data;
> + av_freep(&c->buffer);
> + c->buffer_size = 0;
> + return 0;
> +}
> +
> AVCodec ff_mpc7_decoder = {
> .name = "mpc7",
> .type = AVMEDIA_TYPE_AUDIO,
> .id = CODEC_ID_MUSEPACK7,
> .priv_data_size = sizeof(MPCContext),
> .init = mpc7_decode_init,
> + .close = mpc7_decode_close,
> .decode = mpc7_decode_frame,
> .flush = mpc7_decode_flush,
> .capabilities = CODEC_CAP_DR1,
otherwise ok
Janne
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel