summaryrefslogtreecommitdiff
path: root/libavformat/rawdec.c
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2014-06-09 17:52:44 +0200
committerMichael Niedermayer <michaelni@gmx.at>2014-06-09 17:52:44 +0200
commit2d3842f541bd25512130bf910a051d9ffece44dd (patch)
tree40f5ae0462f2fedd8e61c48ebd8ff9dc62a32fce /libavformat/rawdec.c
parent2ffe55a64f7853987b7541858009f88f717f1385 (diff)
downloadffmpeg-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.c60
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