[FFmpeg-devel] [PATCH] avformat/matroskadec: Fix demuxing ProRes
James Almer
jamrial at gmail.com
Fri Oct 4 06:08:00 EEST 2019
On 9/28/2019 2:54 PM, Andreas Rheinhardt wrote:
> The structure of a ProRes frame in mov/mp4 is that of a typical atom:
> First a 32 bit BE size field, then a tag detailling the content. Said
> size field includes the eight bytes of the atom header.
>
> This header is actually redundant, as the size of the atom is already
> known from the containing atom. It is therefore stripped away when muxed
> into Matroska and so the Matroska demuxer has to recreate upon demuxing.
> But it did not account for the fact that the size field includes the
> size of the header and this can lead to problems when a decoder uses the
> in-band size field.
>
> Fixes ticket #8210.
>
> Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt at gmail.com>
> ---
> libavformat/matroskadec.c | 9 +++++----
> 1 file changed, 5 insertions(+), 4 deletions(-)
>
> diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
> index 10c398856b..a5f120b54d 100644
> --- a/libavformat/matroskadec.c
> +++ b/libavformat/matroskadec.c
> @@ -3280,15 +3280,16 @@ static int matroska_parse_prores(MatroskaTrack *track, uint8_t *src,
> int dstlen = *size;
>
> if (AV_RB32(&src[4]) != MKBETAG('i', 'c', 'p', 'f')) {
> - dst = av_malloc(dstlen + 8 + AV_INPUT_BUFFER_PADDING_SIZE);
> + dstlen += 8;
> +
> + dst = av_malloc(dstlen + AV_INPUT_BUFFER_PADDING_SIZE);
> if (!dst)
> return AVERROR(ENOMEM);
>
> AV_WB32(dst, dstlen);
> AV_WB32(dst + 4, MKBETAG('i', 'c', 'p', 'f'));
> - memcpy(dst + 8, src, dstlen);
> - memset(dst + 8 + dstlen, 0, AV_INPUT_BUFFER_PADDING_SIZE);
> - dstlen += 8;
> + memcpy(dst + 8, src, dstlen - 8);
> + memset(dst + dstlen, 0, AV_INPUT_BUFFER_PADDING_SIZE);
> }
>
> *pdst = dst;
Pushed, thanks.
More information about the ffmpeg-devel
mailing list