On Sun, Aug 25, 2019 at 11:39 AM Michael Niedermayer <mich...@niedermayer.cc> wrote:
> On Fri, Aug 23, 2019 at 04:03:10PM -0700, Niki Bowe wrote: > > On Thu, Aug 22, 2019 at 2:30 AM Paul B Mahol <one...@gmail.com> wrote: > > > > > On Thu, Aug 22, 2019 at 11:19 AM Carl Eugen Hoyos <ceffm...@gmail.com> > > > wrote: > > > > > > > Am Mi., 21. Aug. 2019 um 23:05 Uhr schrieb Niki Bowe > > > > <nbowe-at-google....@ffmpeg.org>: > > > > > > > > > > On Mon, Aug 19, 2019 at 7:22 PM Carl Eugen Hoyos < > ceffm...@gmail.com> > > > > wrote: > > > > > > > > > > > > > > > > > This score would mean that mjpeg can never be detected. > > > > > > I suspect you have to reduce one of the demuxers to "- 1". > > > > > > > > > > > > > > > > > Thanks Carl. > > > > > Attached patch to reduce mpeg probe by -1, which also fixes the > issue. > > > > > > > > Sorry, I misread the original report, it looked to me as if mJpeg was > > > > the culprit. > > > > > > > > Imo, the mpeg probing should be fixed (return a smaller value) for > your > > > > sample > > > > by detecting that it is not mpeg, not by returning a smaller value > for > > > > all samples. > > > > > > > > > > 1000% agree. > > > > > > > > It didn't return a smaller value for all samples, only the "invalid VDR > > files and short PES streams" case. > > Most mpegps files still return 26 immediately, because they have pack > > headers. > > > > However, here is another patch where I try to limit it to only changing > > score for these jpegs. > > I noticed that these jpegs had a lot of 0x00000100 sequences, which > matches > > mpeg picture header start code. I added another heuristic which matches > > these jpegs, but not any mpegps files I could find. > > > > Alternatively I could make reduce score if it doesn't start with a start > > code? At the moment its happy to search until it finds start codes. > > > > > > Is everyone really sure the best approach is to modify mpegps_probe for > > this? > > The mpegps_probe function returns 25 in many instances where it may not > be > > mpegps. It does only minimal structural checking, and allows invalid data > > to still classify as mpegps. > > jpeg probing returns 25 in some cases where it is almost certainly a jpeg > > (Has to go through multiple tags to get to SOS, many of which early out > if > > they find invalid data). > > Note that 25 is still treated as "low confidence" for jpeg. It logs > "Format > > jpeg_pipe detected only with low score of 25, misdetection possible!" for > > these jpegs. > > So I still think a score of 25 is too low for these jpegs, and that a > > better fix would be to return 26 for jpeg_pipe and mjpeg if it makes it > > past multiple tags to SOS. > > jpegs can be in other container formats its not jpeg in that case but the > other container format > about this patch > it breaks this: > > ./ffplay tickets//3327/issue3327-libc-2.17.so > > https://trac.ffmpeg.org/raw-attachment/ticket/3327/issue3327-libc-2.17.so > > which is detected as mpeg after the patch. > really nothing should be detected as mpeg after this that was not before > the idea IIUC is make something that was detected as mpeg to be not anymore > > Thanks Michael. Good find. Attached patch which only applies the extra sanity checks to the "Invalid VDR files and short PES streams" path. > Thanks > > [...] > > > -- > Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB > > Awnsering whenever a program halts or runs forever is > On a turing machine, in general impossible (turings halting problem). > On any real computer, always possible as a real computer has a finite > number > of states N, and will either halt in less than N cycles or never halt. > _______________________________________________ > 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". -- Nikolas Bowe | SWE | nb...@google.com | 408-565-5137
From 7b054280926cdf837b7e8b361779cdf7ffcbdc56 Mon Sep 17 00:00:00 2001 From: Nikolas Bowe <nbowe@google.com> Date: Thu, 8 Aug 2019 15:32:51 -0700 Subject: [PATCH] avformat: Fix probing on some JPEGs Fixes "Invalid data found when processing input" on some JPEGs. Some large extensionless JPEGs can get probe score collisions with mpeg eg $ ffprobe -loglevel trace /tmp/foo [NULL @ 0x55c130ab04c0] Opening '/tmp/foo' for reading [file @ 0x55c130ab0f40] Setting default whitelist 'file,crypto' Probing jpeg_pipe score:6 size:2048 Probing jpeg_pipe score:6 size:4096 Probing jpeg_pipe score:6 size:8192 Probing jpeg_pipe score:6 size:16384 Probing jpeg_pipe score:25 size:32768 Probing jpeg_pipe score:25 size:65536 Probing jpeg_pipe score:25 size:131072 Probing jpeg_pipe score:25 size:262144 Probing jpeg_pipe score:25 size:524288 Probing mpeg score:25 size:1048576 Probing jpeg_pipe score:25 size:1048576 [AVIOContext @ 0x55c130ab9300] Statistics: 1048576 bytes read, 0 seeks /tmp/foo: Invalid data found when processing input This patch fixes this by reducing probe score for mpeg in some rare situations --- libavformat/mpeg.c | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/libavformat/mpeg.c b/libavformat/mpeg.c index 3205f209e6..8a97826551 100644 --- a/libavformat/mpeg.c +++ b/libavformat/mpeg.c @@ -68,8 +68,8 @@ static int mpegps_probe(const AVProbeData *p) { uint32_t code = -1; int i; - int sys = 0, pspack = 0, priv1 = 0, vid = 0; - int audio = 0, invalid = 0, score = 0; + int sys = 0, pspack = 0, priv1 = 0, vid = 0, pic = 0; + int audio = 0, invalid = 0; int endpes = 0; for (i = 0; i < p->buf_size; i++) { @@ -92,18 +92,15 @@ static int mpegps_probe(const AVProbeData *p) else if ((code & 0xe0) == AUDIO_ID && pes) {audio++; i+=len;} else if (code == PRIVATE_STREAM_1 && pes) {priv1++; i+=len;} else if (code == 0x1fd && pes) vid++; //VC1 - else if ((code & 0xf0) == VIDEO_ID && !pes) invalid++; else if ((code & 0xe0) == AUDIO_ID && !pes) invalid++; else if (code == PRIVATE_STREAM_1 && !pes) invalid++; + else if (code == 0x100) pic++; } } - if (vid + audio > invalid + 1) /* invalid VDR files nd short PES streams */ - score = AVPROBE_SCORE_EXTENSION / 2; - -// av_log(NULL, AV_LOG_ERROR, "vid:%d aud:%d sys:%d pspack:%d invalid:%d size:%d \n", -// vid, audio, sys, pspack, invalid, p->buf_size); +// av_log(NULL, AV_LOG_ERROR, "vid:%d aud:%d sys:%d pspack:%d pic:%d invalid:%d size:%d \n", +// vid, audio, sys, pspack, pic, invalid, p->buf_size); if (sys > invalid && sys * 9 <= pspack * 10) return (audio > 12 || vid > 3 || pspack > 2) ? AVPROBE_SCORE_EXTENSION + 2 @@ -116,10 +113,21 @@ static int mpegps_probe(const AVProbeData *p) return (audio > 12 || vid > 6 + 2 * invalid) ? AVPROBE_SCORE_EXTENSION + 2 : AVPROBE_SCORE_EXTENSION / 2; + if (vid + audio > invalid + 1) { + if (pspack == 0 && vid > 0 && vid * 10 < pic) { + // If we don't find a pack header, and we have many more picture headers codes than + // mpeg video stream codes, then its probably not mpeg. + return AVPROBE_SCORE_EXTENSION / 2 - 1; + } else { + // Invalid VDR files and short PES streams + return AVPROBE_SCORE_EXTENSION / 2; + } + } + // 02-Penguin.flac has sys:0 priv1:0 pspack:0 vid:0 audio:1 // mp3_misidentified_2.mp3 has sys:0 priv1:0 pspack:0 vid:0 audio:6 // Have\ Yourself\ a\ Merry\ Little\ Christmas.mp3 0 0 0 5 0 1 len:21618 - return score; + return 0; } typedef struct MpegDemuxContext { -- 2.23.0.187.g17f5b7556c-goog
_______________________________________________ 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".