Fixes probing of JPEG files containing MPF metadata appended at the end of the file.
The MPF metadata chunk can contains multiple JPEG images (thumbnails) which makes the jpeg_probe fails (return 0) because it finds a SOI marker after EOI. --- This patch fixes probing of JPEG files containing MPF metadata [1] appended at the end of the file. Such files can be produced by GoPro camera (which produces JPEG files with MPF metadata). You can find a sample here: https://0x5c.me/gopro_jpg_mpf_probe_fail To reproduce the issue using ffmpeg master: wget https://0x5c.me/gopro_jpg_mpf_probe_fail ./ffmpeg -formatprobesize 5000000 -i gopro_jpg_mpf_probe_fail I removed intentionally the jpeg extension from the filename so the image2 demuxer is not used. Current ffmpeg master won't still be able to decode this file because of a "regression" introduced by ec3d8a0e6945fe015d16cd98a1e7dbb4be815c15 on the mjpeg_parser. The jpeg_pipe demuxer outputs partial chunks of the jpeg file that the mjpeg decoder can't handle (it needs the whole data). Before ec3d8a0e6945fe015d16cd98a1e7dbb4be815c15, the mjpeg_parser was outputting a complete frame. If the parser is correct as is, another way to fix this issue whould be to add AVSTREAM_PARSE_HEADERS to the need_parsing flags from the jpeg_pipe demuxer, ie: --- a/libavformat/img2dec.c +++ b/libavformat/img2dec.c @@ -209,7 +209,7 @@ int ff_img_read_header(AVFormatContext *s1) s->is_pipe = 0; else { s->is_pipe = 1; - st->need_parsing = AVSTREAM_PARSE_FULL; + st->need_parsing = AVSTREAM_PARSE_FULL | AVSTREAM_PARSE_HEADERS; Settings AVSTREAM_PARSE_HEADERS makes avformat requests complete frames from the parser in libavformat/utils.c What do you think ? [1] https://exiftool.org/TagNames/MPF.html --- libavformat/img2dec.c | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/libavformat/img2dec.c b/libavformat/img2dec.c index 93cd51c1932..decd8023e02 100644 --- a/libavformat/img2dec.c +++ b/libavformat/img2dec.c @@ -773,9 +773,7 @@ static int jpeg_probe(const AVProbeData *p) case EOI: if (state != SOS) return 0; - state = EOI; - break; - case DHT: + return AVPROBE_SCORE_EXTENSION + 1; case DQT: case APP0: case APP1: @@ -803,8 +801,6 @@ static int jpeg_probe(const AVProbeData *p) } } - if (state == EOI) - return AVPROBE_SCORE_EXTENSION + 1; if (state == SOS) return AVPROBE_SCORE_EXTENSION / 2; return AVPROBE_SCORE_EXTENSION / 8; -- 2.26.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".