From 13d02d3dc81a3c14e2c910dfe52d1238d7b1d011 Mon Sep 17 00:00:00 2001 From: Mats Peterson Date: Fri, 8 Jan 2016 12:59:13 +0100 Subject: [PATCH] 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 --- libavformat/mov.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) 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: