[FFmpeg-cvslog] avcodec/mjpeg_parser: skip markers after EOI, not by size
Alex Xu (Hello71)
git at videolan.org
Sat Nov 27 19:30:52 EET 2021
ffmpeg | branch: master | Alex Xu (Hello71) <alex_y_xu at yahoo.ca> | Thu Nov 25 14:30:33 2021 -0500| [cd0bdce71ac0b9871fa04d31756daa26fa7999af] | committer: Michael Niedermayer
avcodec/mjpeg_parser: skip markers after EOI, not by size
The check for m->size >= 0xF000 is intended to avoid skipping too much
garbage data between JPEG frames in test_roman (thus missing next SOI),
but it erroneously also skips valid markers between SOI and SOS. Instead
of this, we should simply skip parsing markers other than SOI after EOI.
That way, we will not accidentally skip over SOI due to some garbage
between frames. There is still a small risk of encountering FFD8 in the
garbage data, but the chance of this is fairly low.
Fixes: https://trac.ffmpeg.org/ticket/8967
Signed-off-by: Michael Niedermayer <michael at niedermayer.cc>
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=cd0bdce71ac0b9871fa04d31756daa26fa7999af
---
libavcodec/mjpeg_parser.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/libavcodec/mjpeg_parser.c b/libavcodec/mjpeg_parser.c
index 16a5902c7c..62b923b625 100644
--- a/libavcodec/mjpeg_parser.c
+++ b/libavcodec/mjpeg_parser.c
@@ -80,10 +80,10 @@ static int find_frame_end(MJPEGParserContext *m, const uint8_t *buf, int buf_siz
pc->frame_start_found=0;
pc->state=0;
return i-3;
+ } else if((state>>16)==0xFFD9 && (state&0xFFFF)!=0xFFD8){
+ state= 0xFFD900|(state&0xFF);
} else if(state<0xFFD00000 || state>0xFFD9FFFF){
m->size= (state&0xFFFF)-1;
- if (m->size >= 0xF000)
- m->size = 0;
}
}
if(m->size>0){
More information about the ffmpeg-cvslog
mailing list