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 <jamr...@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@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel