summaryrefslogtreecommitdiff
path: root/libavformat/mov.c
diff options
context:
space:
mode:
authorMats Peterson <matsp888@yahoo.com>2016-01-08 12:59:13 +0100
committerMichael Niedermayer <michael@niedermayer.cc>2016-01-08 14:52:53 +0100
commit13d02d3dc81a3c14e2c910dfe52d1238d7b1d011 (patch)
treeab3df9892cdb234784bc033259d47ec4bf8cfddc /libavformat/mov.c
parent53ada3af62d566bfd53dfc0a90b79cb91328615e (diff)
lavf/mov: Audio and fourcc 0x00000000
In many older QuickTime files, the audio format, or "fourcc", is 0x00000000. The QuickTime File Format Specification states the following regarding this situation: "This format descriptor should not be used, but may be found in some files. Samples are assumed to be stored in either 'raw ' or 'twos' format, depending on the sample size field in the sound description." MPlayer handles this logic by itself, but FFmpeg/FFplay currently does not. Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
Diffstat (limited to 'libavformat/mov.c')
-rw-r--r--libavformat/mov.c16
1 files changed, 15 insertions, 1 deletions
diff --git a/libavformat/mov.c b/libavformat/mov.c
index 78081ceb77..f6462f7a2b 100644
--- a/libavformat/mov.c
+++ b/libavformat/mov.c
@@ -1812,9 +1812,16 @@ static void mov_parse_stsd_audio(MOVContext *c, AVIOContext *pb,
AVStream *st, MOVStreamContext *sc)
{
int bits_per_sample, flags;
- uint16_t version = avio_rb16(pb);
+ uint32_t format;
+ uint16_t version;
AVDictionaryEntry *compatible_brands = av_dict_get(c->fc->metadata, "compatible_brands", NULL, AV_DICT_MATCH_CASE);
+ avio_seek(pb, -12, SEEK_CUR);
+ format = avio_rb32(pb);
+ avio_seek(pb, 8, SEEK_CUR);
+
+ version = avio_rb16(pb);
+
avio_rb16(pb); /* revision level */
avio_rb32(pb); /* vendor */
@@ -1863,6 +1870,13 @@ static void mov_parse_stsd_audio(MOVContext *c, AVIOContext *pb,
}
}
+ if (format == 0) {
+ if (st->codec->bits_per_coded_sample == 8)
+ st->codec->codec_id = mov_codec_id(st, MKTAG('r','a','w',' '));
+ else if (st->codec->bits_per_coded_sample == 16)
+ st->codec->codec_id = mov_codec_id(st, MKTAG('t','w','o','s'));
+ }
+
switch (st->codec->codec_id) {
case AV_CODEC_ID_PCM_S8:
case AV_CODEC_ID_PCM_U8: