diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2014-06-09 17:52:44 +0200 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2014-06-09 17:52:44 +0200 |
commit | 2d3842f541bd25512130bf910a051d9ffece44dd (patch) | |
tree | 40f5ae0462f2fedd8e61c48ebd8ff9dc62a32fce /libavformat/rawdec.c | |
parent | 2ffe55a64f7853987b7541858009f88f717f1385 (diff) | |
download | ffmpeg-2d3842f541bd25512130bf910a051d9ffece44dd.tar.gz |
avformat: add mjpeg_probe()
Fixes Ticket3679
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavformat/rawdec.c')
-rw-r--r-- | libavformat/rawdec.c | 60 |
1 files changed, 59 insertions, 1 deletions
diff --git a/libavformat/rawdec.c b/libavformat/rawdec.c index 9b2aa3551e..62e590191b 100644 --- a/libavformat/rawdec.c +++ b/libavformat/rawdec.c @@ -135,7 +135,65 @@ AVInputFormat ff_latm_demuxer = { #endif #if CONFIG_MJPEG_DEMUXER -FF_DEF_RAWVIDEO_DEMUXER(mjpeg, "raw MJPEG video", NULL, "mjpg,mjpeg,mpo", AV_CODEC_ID_MJPEG) +static int mjpeg_probe(AVProbeData *p) +{ + int i; + int state = -1; + int nb_invalid = 0; + int nb_frames = 0; + + for (i=0; i<p->buf_size-2; i++) { + int c; + if (p->buf[i] != 0xFF) + continue; + c = p->buf[i+1]; + switch (c) { + case 0xD8: + state = 0xD8; + break; + case 0xC0: + case 0xC1: + case 0xC2: + case 0xC3: + case 0xC5: + case 0xC6: + case 0xC7: + case 0xF7: + if (state == 0xD8) { + state = 0xC0; + } else + nb_invalid++; + break; + case 0xDA: + if (state == 0xC0) { + state = 0xDA; + } else + nb_invalid++; + break; + case 0xD9: + if (state == 0xDA) { + state = 0xD9; + nb_frames++; + } else + nb_invalid++; + break; + default: + if ( (c >= 0x02 && c <= 0xBF) + || c == 0xC8) { + nb_invalid++; + } + } + } + + if (nb_invalid == 0 && nb_frames > 2) + return AVPROBE_SCORE_EXTENSION / 2; + if (nb_invalid*4 + 1 < nb_frames) + return AVPROBE_SCORE_EXTENSION / 4; + + return 0; +} + +FF_DEF_RAWVIDEO_DEMUXER(mjpeg, "raw MJPEG video", mjpeg_probe, "mjpg,mjpeg,mpo", AV_CODEC_ID_MJPEG) #endif #if CONFIG_MLP_DEMUXER |