diff options
author | Petter Ericson <petter.ericson@codemill.se> | 2012-10-17 16:53:19 +0200 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2012-10-19 16:07:49 +0200 |
commit | 7abf394814d818973db562102f21ab9d10540840 (patch) | |
tree | bb5543855eff904afc3036f5b49c006ea7967f07 /libavformat/mov.c | |
parent | 9434ead2f34b971176b43ff0c3a54b9e76ac2249 (diff) | |
download | ffmpeg-7abf394814d818973db562102f21ab9d10540840.tar.gz |
mov.c: Check for stsd + m1s tag indicating MOV-wrapped MPEG-PS, and force continued probing if found.
Fixes Ticket241
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavformat/mov.c')
-rw-r--r-- | libavformat/mov.c | 45 |
1 files changed, 37 insertions, 8 deletions
diff --git a/libavformat/mov.c b/libavformat/mov.c index 7e653236ac..b296c248ff 100644 --- a/libavformat/mov.c +++ b/libavformat/mov.c @@ -2861,43 +2861,72 @@ static int mov_probe(AVProbeData *p) int64_t offset; uint32_t tag; int score = 0; + int moov_offset = -1; /* check file header */ offset = 0; for (;;) { /* ignore invalid offset */ if ((offset + 8) > (unsigned int)p->buf_size) - return score; + break; tag = AV_RL32(p->buf + offset + 4); switch(tag) { /* check for obvious tags */ - case MKTAG('j','P',' ',' '): /* jpeg 2000 signature */ case MKTAG('m','o','o','v'): + moov_offset = offset + 4; + case MKTAG('j','P',' ',' '): /* jpeg 2000 signature */ case MKTAG('m','d','a','t'): case MKTAG('p','n','o','t'): /* detect movs with preview pics like ew.mov and april.mov */ case MKTAG('u','d','t','a'): /* Packet Video PVAuthor adds this and a lot of more junk */ case MKTAG('f','t','y','p'): - return AVPROBE_SCORE_MAX; + score = AVPROBE_SCORE_MAX; + offset = FFMAX(4, AV_RB32(p->buf+offset)) + offset; + break; /* those are more common words, so rate then a bit less */ case MKTAG('e','d','i','w'): /* xdcam files have reverted first tags */ case MKTAG('w','i','d','e'): case MKTAG('f','r','e','e'): case MKTAG('j','u','n','k'): case MKTAG('p','i','c','t'): - return AVPROBE_SCORE_MAX - 5; + score = FFMAX(score, AVPROBE_SCORE_MAX - 5); + offset = FFMAX(4, AV_RB32(p->buf+offset)) + offset; + break; case MKTAG(0x82,0x82,0x7f,0x7d): case MKTAG('s','k','i','p'): case MKTAG('u','u','i','d'): case MKTAG('p','r','f','l'): - offset = AV_RB32(p->buf+offset) + offset; /* if we only find those cause probedata is too small at least rate them */ - score = AVPROBE_SCORE_MAX - 50; + score = FFMAX(score, AVPROBE_SCORE_MAX - 50); + offset = FFMAX(4, AV_RB32(p->buf+offset)) + offset; break; default: - /* unrecognized tag */ - return score; + offset = FFMAX(4, AV_RB32(p->buf+offset)) + offset; + } + } + if(tag > AVPROBE_SCORE_MAX - 50 && moov_offset != -1) { + /* moov atom in the header - we should make sure that this is not a + * MOV-packed MPEG-PS */ + offset = moov_offset; + + while(offset < (p->buf_size - 20)){ /* Sufficient space */ + /* We found an actual stsd atom */ + if(AV_RL32(p->buf+offset) == MKTAG('s','t','s','d') && + /* Make sure there's only one stream */ + AV_RB32(p->buf + offset + 8) == 1 && + AV_RL32(p->buf + offset + 16) == MKTAG('m','1','s',' ') + ){ + av_log(NULL, AV_LOG_WARNING, "Found m1s tag indicating this is a MOV-packed MPEG-PS.\n"); + /* We found an stsd atom describing an MPEG-PS-in-MOV, return a + * low score to force expanding the probe window until + * mpegps_probe finds what it needs */ + return 5; + }else + /* Keep looking */ + offset+=2; } } + + return score; } // must be done after parsing all trak because there's no order requirement |