[FFmpeg-devel] [PATCH] avcodec/alac: also use a temp buffer for 24bit samples

Paul B Mahol onemda at gmail.com
Tue Oct 6 21:40:53 CEST 2015


On 10/6/15, James Almer <jamrial at gmail.com> wrote:
> Since AVFrame.extended_data is apparently not padded, simd functions
> could in some cases overread, so make the decoder use a temp buffer
> unconditionally.
>
> Signed-off-by: James Almer <jamrial at gmail.com>
> ---
>  libavcodec/alac.c | 18 +++++-------------
>  1 file changed, 5 insertions(+), 13 deletions(-)
>
> diff --git a/libavcodec/alac.c b/libavcodec/alac.c
> index 146668e..394bd19 100644
> --- a/libavcodec/alac.c
> +++ b/libavcodec/alac.c
> @@ -80,7 +80,6 @@ typedef struct ALACContext {
>      int extra_bits;     /**< number of extra bits beyond 16-bit */
>      int nb_samples;     /**< number of samples in the current frame */
>
> -    int direct_output;
>      int extra_bit_bug;
>
>      ALACDSPContext dsp;
> @@ -278,10 +277,6 @@ static int decode_element(AVCodecContext *avctx,
> AVFrame *frame, int ch_index,
>          return AVERROR_INVALIDDATA;
>      }
>      alac->nb_samples = output_samples;
> -    if (alac->direct_output) {
> -        for (ch = 0; ch < channels; ch++)
> -            alac->output_samples_buffer[ch] = (int32_t
> *)frame->extended_data[ch_index + ch];
> -    }
>
>      if (is_compressed) {
>          int16_t lpc_coefs[2][32];
> @@ -393,8 +388,9 @@ static int decode_element(AVCodecContext *avctx, AVFrame
> *frame, int ch_index,
>          break;
>      case 24: {
>          for (ch = 0; ch < channels; ch++) {
> +            int32_t *outbuffer = (int32_t *)frame->extended_data[ch_index +
> ch];
>              for (i = 0; i < alac->nb_samples; i++)
> -                alac->output_samples_buffer[ch][i] <<= 8;
> +                *outbuffer++ = alac->output_samples_buffer[ch][i] << 8;
>          }}
>          break;
>      }
> @@ -468,8 +464,7 @@ static av_cold int alac_decode_close(AVCodecContext
> *avctx)
>      int ch;
>      for (ch = 0; ch < FFMIN(alac->channels, 2); ch++) {
>          av_freep(&alac->predict_error_buffer[ch]);
> -        if (!alac->direct_output)
> -            av_freep(&alac->output_samples_buffer[ch]);
> +        av_freep(&alac->output_samples_buffer[ch]);
>          av_freep(&alac->extra_bits_buffer[ch]);
>      }
>
> @@ -491,11 +486,8 @@ static int allocate_buffers(ALACContext *alac)
>          FF_ALLOC_OR_GOTO(alac->avctx, alac->predict_error_buffer[ch],
>                           buf_size, buf_alloc_fail);
>
> -        alac->direct_output = alac->sample_size > 16;
> -        if (!alac->direct_output) {
> -            FF_ALLOC_OR_GOTO(alac->avctx, alac->output_samples_buffer[ch],
> -                             buf_size, buf_alloc_fail);
> -        }
> +        FF_ALLOC_OR_GOTO(alac->avctx, alac->output_samples_buffer[ch],
> +                         buf_size, buf_alloc_fail);
>
>          FF_ALLOC_OR_GOTO(alac->avctx, alac->extra_bits_buffer[ch],
>                           buf_size, buf_alloc_fail);
> --
> 2.5.2
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>

it should be padded and not introduce slowdown


More information about the ffmpeg-devel mailing list