[FFmpeg-devel] [PATCH] Chromium MKV patches
David Conrad
lessen42
Tue May 18 23:21:26 CEST 2010
On May 9, 2010, at 12:35 PM, Aurelien Jacobs wrote:
> On Wed, May 05, 2010 at 05:18:20AM -0400, David Conrad wrote:
>> Hi,
>>
>> Here are the useful patches from chromium for the mkv demuxer. 1 doesn't fix any actual issues that I'm aware of, but might make it easier to spot any if they exist.
>>
>> Another change made was ensuring sample_rate was nonzero, but AFAIK a zero sample_rate meant unknown and applications should handle that instead of the demuxer inventing a rate?
>>
>
>> From ccd07e7b93df77882cd5f69c00c32af728a6545e Mon Sep 17 00:00:00 2001
>> From: David Conrad <lessen42 at gmail.com>
>> Date: Sat, 1 May 2010 14:05:14 -0400
>> Subject: [PATCH 1/4] matroskadec: Use av_freep in ebml_read_ascii
>>
>> Based on a Chromium patch
>> ---
>> libavformat/matroskadec.c | 4 ++--
>> 1 files changed, 2 insertions(+), 2 deletions(-)
>>
>> diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
>> index 4e6f375..46d039a 100644
>> --- a/libavformat/matroskadec.c
>> +++ b/libavformat/matroskadec.c
>> @@ -615,13 +615,13 @@ static int ebml_read_float(ByteIOContext *pb, int size, double *num)
>> */
>> static int ebml_read_ascii(ByteIOContext *pb, int size, char **str)
>> {
>> - av_free(*str);
>> + av_freep(str);
>> /* EBML strings are usually not 0-terminated, so we allocate one
>> * byte more, read the string and NULL-terminate it ourselves. */
>> if (!(*str = av_malloc(size + 1)))
>> return AVERROR(ENOMEM);
>
> This hunk is rejected.
> There is no point in zeroing *str when it's overwritten just on the next
> line.
Removed
>> if (get_buffer(pb, (uint8_t *) *str, size) != size) {
>> - av_free(*str);
>> + av_freep(str);
>> return AVERROR(EIO);
>> }
>> (*str)[size] = '\0';
>
> Might make debugging easier if something wrong happen, so OK.
Applied
>> From fd0192fc730621b16f851d1e47bc854a63b1d4a9 Mon Sep 17 00:00:00 2001
>> From: David Conrad <lessen42 at gmail.com>
>> Date: Sat, 1 May 2010 14:13:01 -0400
>> Subject: [PATCH 2/4] matroskadec: Ensure time_scale is nonzero, fixes divide-by-zero if the file
>> has 0 written
>>
>> Based on a Chromium patch
>> ---
>> libavformat/matroskadec.c | 2 ++
>> 1 files changed, 2 insertions(+), 0 deletions(-)
>>
>> diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
>> index 46d039a..2b4d513 100644
>> --- a/libavformat/matroskadec.c
>> +++ b/libavformat/matroskadec.c
>> @@ -1154,6 +1154,8 @@ static int matroska_read_header(AVFormatContext *s, AVFormatParameters *ap)
>> return -1;
>> matroska_execute_seekhead(matroska);
>>
>> + if (!matroska->time_scale)
>> + matroska->time_scale = 1000000;
>> if (matroska->duration)
>> matroska->ctx->duration = matroska->duration * matroska->time_scale
>> * 1000 / AV_TIME_BASE;
>
> A file containing time_scale=0 is broken.
> But if they wrote this patch, I guess such a file existe in the wild, so
> patch OK.
> Having a sample would of course be useful...
Easy enough to create one by writing 0 here in matroskaenc.
Applied.
>> From 3c8b0a5a4f3843f0f6f9d31ac8e8a486ced27d62 Mon Sep 17 00:00:00 2001
>> From: David Conrad <lessen42 at gmail.com>
>> Date: Sat, 1 May 2010 14:17:57 -0400
>> Subject: [PATCH 3/4] matroskadec: Fix buffer overread in matroska_ebmlnum_uint
>>
>> Based on a Chromium patch
>> ---
>> libavformat/matroskadec.c | 2 +-
>> 1 files changed, 1 insertions(+), 1 deletions(-)
>>
>> diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
>> index 2b4d513..8e70bbc 100644
>> --- a/libavformat/matroskadec.c
>> +++ b/libavformat/matroskadec.c
>> @@ -679,7 +679,7 @@ static int matroska_ebmlnum_uint(MatroskaDemuxContext *matroska,
>> {
>> ByteIOContext pb;
>> init_put_byte(&pb, data, size, 0, NULL, NULL, NULL, NULL);
>> - return ebml_read_num(matroska, &pb, 8, num);
>> + return ebml_read_num(matroska, &pb, FFMIN(size, 8), num);
>> }
>>
>> /*
>
> Should be OK.
Applied
>> From 35c4685b5b08f961522ead0a7b4b534dce552ff6 Mon Sep 17 00:00:00 2001
>> From: David Conrad <lessen42 at gmail.com>
>> Date: Sat, 1 May 2010 14:42:12 -0400
>> Subject: [PATCH 4/4] matroskadec: Free ebml binary buffer on error
>>
>> Based on a Chromium patch
>> ---
>> libavformat/matroskadec.c | 4 +++-
>> 1 files changed, 3 insertions(+), 1 deletions(-)
>>
>> diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
>> index 8e70bbc..e449838 100644
>> --- a/libavformat/matroskadec.c
>> +++ b/libavformat/matroskadec.c
>> @@ -641,8 +641,10 @@ static int ebml_read_binary(ByteIOContext *pb, int length, EbmlBin *bin)
>>
>> bin->size = length;
>> bin->pos = url_ftell(pb);
>> - if (get_buffer(pb, bin->data, length) != length)
>> + if (get_buffer(pb, bin->data, length) != length) {
>> + av_freep(&bin->data);
>> return AVERROR(EIO);
>> + }
>>
>> return 0;
>> }
>
> OK.
Applied
More information about the ffmpeg-devel
mailing list