On 26.01.2016 23:17, Paul B Mahol wrote:
> ffmpeg | branch: master | Paul B Mahol <one...@gmail.com> | Mon Jan 25 
> 21:54:17 2016 +0100| [e9e623369d7ba330ab8157157e956cb71d8058b5] | committer: 
> Paul B Mahol
> 
> avcodec: add Ulead DV audio decoder
> 
> Fixes #1564.
> 
> Signed-off-by: Paul B Mahol <one...@gmail.com>

Leaving a little bit more time for review would have been nice.

> diff --git a/libavcodec/dvaudiodec.c b/libavcodec/dvaudiodec.c
> new file mode 100644
> index 0000000..84db509
> --- /dev/null
> +++ b/libavcodec/dvaudiodec.c
> @@ -0,0 +1,144 @@
[...]
> +static int decode_frame(AVCodecContext *avctx, void *data,
> +                        int *got_frame_ptr, AVPacket *pkt)
> +{
> +    DVAudioContext *s = avctx->priv_data;
> +    AVFrame *frame = data;
> +    const uint8_t *src = pkt->data;
> +    int16_t *dst;
> +    int ret, i;
> +
> +    if (pkt->size != s->block_size)
> +        return AVERROR_INVALIDDATA;
> +
> +    frame->nb_samples = dv_get_audio_sample_count(pkt->data + 244, 
> s->is_pal);
> +    if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
> +        return ret;
> +    dst = (int16_t *)frame->data[0];
> +
> +    for (i = 0; i < frame->nb_samples; i++) {

Maybe this should be 'i < frame->nb_samples / 2'?

> +       const uint8_t *v = &src[s->shuffle[i]];
> +
> +       if (s->is_12bit) {
> +           *dst++ = dv_audio_12to16((v[0] << 4) | ((v[2] >> 4) & 0x0f));
> +           *dst++ = dv_audio_12to16((v[1] << 4) | ((v[2] >> 0) & 0x0f));
> +       } else {
> +           *dst++ = AV_RB16(&v[0]);

Because otherwise this can cause out of bounds writes.

Best regards,
Andreas
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel

Reply via email to