Re: [FFmpeg-devel] [PATCH] avformat/dhav: Fix incorrect non-DHAV chunk skipping logic
Oh i didn't notice that. Thanks. On Mon, Jan 18, 2021 at 8:22 PM Paul B Mahol wrote: > Isn't this applied already? > > On Mon, Jan 18, 2021 at 6:46 PM Idan Freiberg wrote: > > > Can one of the maintainers review the patch please? > > > > בתאריך יום ד׳, 13 בינו׳ 2021 ב-14:35 מאת Idan Freiberg >: > > > > > DAV files may contain a variable length padding in between chunks > > > filled with 0xff bytes. The current skipping logic is incorrect as it > > > may skip over DHAV chunks not appearing sequentially in the file. > > > > > > We now look for the 'DHAV' tag using a byte-by-byte search in order > > > to handle such situations. Also the dhav->last_good_pos field will > > > not be updated while skipping unrecognized data. > > > --- > > > libavformat/dhav.c | 15 +++ > > > 1 file changed, 3 insertions(+), 12 deletions(-) > > > > > > diff --git a/libavformat/dhav.c b/libavformat/dhav.c > > > index 00e0d8476e..6a6c235e65 100644 > > > --- a/libavformat/dhav.c > > > +++ b/libavformat/dhav.c > > > @@ -173,18 +173,9 @@ static int read_chunk(AVFormatContext *s) > > > if (avio_feof(s->pb)) > > > return AVERROR_EOF; > > > > > > -if (avio_rl32(s->pb) != MKTAG('D','H','A','V') && > > dhav->last_good_pos > > > < INT64_MAX - 0x8000) { > > > -dhav->last_good_pos += 0x8000; > > > -avio_seek(s->pb, dhav->last_good_pos, SEEK_SET); > > > - > > > -while (avio_rl32(s->pb) != MKTAG('D','H','A','V')) { > > > -if (avio_feof(s->pb) || dhav->last_good_pos >= INT64_MAX - > > > 0x8000) > > > -return AVERROR_EOF; > > > -dhav->last_good_pos += 0x8000; > > > -ret = avio_skip(s->pb, 0x8000 - 4); > > > - if (ret < 0) > > > -return ret; > > > -} > > > +while (avio_r8(s->pb) != 'D' || avio_r8(s->pb) != 'H' || > > > avio_r8(s->pb) != 'A' || avio_r8(s->pb) != 'V') { > > > +if (avio_feof(s->pb)) > > > +return AVERROR_EOF; > > > } > > > > > > start = avio_tell(s->pb) - 4; > > > -- > > > 2.30.0 > > > > > > -- > > Idan Freiberg Mobile: +972-52-2925213 > > ___ > > ffmpeg-devel mailing list > > ffmpeg-devel@ffmpeg.org > > https://ffmpeg.org/mailman/listinfo/ffmpeg-devel > > > > To unsubscribe, visit link above, or email > > ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe". > ___ > ffmpeg-devel mailing list > ffmpeg-devel@ffmpeg.org > https://ffmpeg.org/mailman/listinfo/ffmpeg-devel > > To unsubscribe, visit link above, or email > ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe". -- Idan Freiberg Mobile: +972-52-2925213 ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".
Re: [FFmpeg-devel] [PATCH] avformat/dhav: Fix incorrect non-DHAV chunk skipping logic
Can one of the maintainers review the patch please? בתאריך יום ד׳, 13 בינו׳ 2021 ב-14:35 מאת Idan Freiberg : > DAV files may contain a variable length padding in between chunks > filled with 0xff bytes. The current skipping logic is incorrect as it > may skip over DHAV chunks not appearing sequentially in the file. > > We now look for the 'DHAV' tag using a byte-by-byte search in order > to handle such situations. Also the dhav->last_good_pos field will > not be updated while skipping unrecognized data. > --- > libavformat/dhav.c | 15 +++ > 1 file changed, 3 insertions(+), 12 deletions(-) > > diff --git a/libavformat/dhav.c b/libavformat/dhav.c > index 00e0d8476e..6a6c235e65 100644 > --- a/libavformat/dhav.c > +++ b/libavformat/dhav.c > @@ -173,18 +173,9 @@ static int read_chunk(AVFormatContext *s) > if (avio_feof(s->pb)) > return AVERROR_EOF; > > -if (avio_rl32(s->pb) != MKTAG('D','H','A','V') && dhav->last_good_pos > < INT64_MAX - 0x8000) { > -dhav->last_good_pos += 0x8000; > -avio_seek(s->pb, dhav->last_good_pos, SEEK_SET); > - > -while (avio_rl32(s->pb) != MKTAG('D','H','A','V')) { > -if (avio_feof(s->pb) || dhav->last_good_pos >= INT64_MAX - > 0x8000) > -return AVERROR_EOF; > -dhav->last_good_pos += 0x8000; > -ret = avio_skip(s->pb, 0x8000 - 4); > -if (ret < 0) > -return ret; > -} > +while (avio_r8(s->pb) != 'D' || avio_r8(s->pb) != 'H' || > avio_r8(s->pb) != 'A' || avio_r8(s->pb) != 'V') { > +if (avio_feof(s->pb)) > +return AVERROR_EOF; > } > > start = avio_tell(s->pb) - 4; > -- > 2.30.0 > > -- Idan Freiberg Mobile: +972-52-2925213 ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".
[FFmpeg-devel] Fix for avformat DHAV parsing issue.
Hello FFmpeg developers, Iv'e noticed some DAV files containing a 0xff's padding in between DHAV chunks. This is possible when the Dahua DVR device generates a DAV file which is concatenated from 2 different DAV files kept on the device hard drive. Here <https://www98.zippyshare.com/v/SjZCQwuv/file.html> is a 30 seconds sample DAV file with such concatenation. The current code (master) fails to parse frame at 11:00:12 (clock on frame) as it incorrectly skips valid DHAV chunks in the file after detecting the padding. Proposing a possible patch for this issue (git formatted patch is attached). Will like to hear your thoughts and insights. Thank you -- Idan Freiberg Mobile: +972-52-2925213 From 89a7678883d061f3601b6260a2be5dc3471a76a9 Mon Sep 17 00:00:00 2001 From: Idan Freiberg Date: Wed, 13 Jan 2021 13:55:48 +0200 Subject: [PATCH] avformat/dhav: Fix incorrect non-DHAV chunk skipping logic DAV files may contain a variable length padding in between chunks filled with 0xff bytes. The current skipping logic is incorrect as it may skip over DHAV chunks not appearing sequentially in the file. We now look for the 'DHAV' tag using a byte-by-byte search in order to handle such situations. Also the dhav->last_good_pos field will not be updated while skipping unrecognized data. --- libavformat/dhav.c | 15 +++ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/libavformat/dhav.c b/libavformat/dhav.c index 00e0d8476e..6a6c235e65 100644 --- a/libavformat/dhav.c +++ b/libavformat/dhav.c @@ -173,18 +173,9 @@ static int read_chunk(AVFormatContext *s) if (avio_feof(s->pb)) return AVERROR_EOF; -if (avio_rl32(s->pb) != MKTAG('D','H','A','V') && dhav->last_good_pos < INT64_MAX - 0x8000) { -dhav->last_good_pos += 0x8000; -avio_seek(s->pb, dhav->last_good_pos, SEEK_SET); - -while (avio_rl32(s->pb) != MKTAG('D','H','A','V')) { -if (avio_feof(s->pb) || dhav->last_good_pos >= INT64_MAX - 0x8000) -return AVERROR_EOF; -dhav->last_good_pos += 0x8000; -ret = avio_skip(s->pb, 0x8000 - 4); -if (ret < 0) -return ret; -} +while (avio_r8(s->pb) != 'D' || avio_r8(s->pb) != 'H' || avio_r8(s->pb) != 'A' || avio_r8(s->pb) != 'V') { +if (avio_feof(s->pb)) +return AVERROR_EOF; } start = avio_tell(s->pb) - 4; -- 2.29.2 ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".
[FFmpeg-devel] [PATCH] avformat/dhav: Fix incorrect non-DHAV chunk skipping logic
DAV files may contain a variable length padding in between chunks filled with 0xff bytes. The current skipping logic is incorrect as it may skip over DHAV chunks not appearing sequentially in the file. We now look for the 'DHAV' tag using a byte-by-byte search in order to handle such situations. Also the dhav->last_good_pos field will not be updated while skipping unrecognized data. --- libavformat/dhav.c | 15 +++ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/libavformat/dhav.c b/libavformat/dhav.c index 00e0d8476e..6a6c235e65 100644 --- a/libavformat/dhav.c +++ b/libavformat/dhav.c @@ -173,18 +173,9 @@ static int read_chunk(AVFormatContext *s) if (avio_feof(s->pb)) return AVERROR_EOF; -if (avio_rl32(s->pb) != MKTAG('D','H','A','V') && dhav->last_good_pos < INT64_MAX - 0x8000) { -dhav->last_good_pos += 0x8000; -avio_seek(s->pb, dhav->last_good_pos, SEEK_SET); - -while (avio_rl32(s->pb) != MKTAG('D','H','A','V')) { -if (avio_feof(s->pb) || dhav->last_good_pos >= INT64_MAX - 0x8000) -return AVERROR_EOF; -dhav->last_good_pos += 0x8000; -ret = avio_skip(s->pb, 0x8000 - 4); -if (ret < 0) -return ret; -} +while (avio_r8(s->pb) != 'D' || avio_r8(s->pb) != 'H' || avio_r8(s->pb) != 'A' || avio_r8(s->pb) != 'V') { +if (avio_feof(s->pb)) +return AVERROR_EOF; } start = avio_tell(s->pb) - 4; -- 2.30.0 ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".