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

Reply via email to