From 2d3842f541bd25512130bf910a051d9ffece44dd Mon Sep 17 00:00:00 2001 From: Michael Niedermayer Date: Mon, 9 Jun 2014 17:52:44 +0200 Subject: [PATCH] avformat: add mjpeg_probe() Fixes Ticket3679 Signed-off-by: Michael Niedermayer --- libavformat/rawdec.c | 60 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 59 insertions(+), 1 deletion(-) 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; ibuf_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