From d1409fe952822f46a5367aa6ec436f5849c757da Mon Sep 17 00:00:00 2001 From: James Almer Date: Thu, 1 Aug 2019 00:49:08 -0300 Subject: [PATCH] avformat/mov: add demuxing support for Dolby TrueHD streams Signed-off-by: James Almer --- Changelog | 2 ++ libavformat/isom.c | 1 + libavformat/mov.c | 34 ++++++++++++++++++++++++++++++++++ libavformat/version.h | 2 +- 4 files changed, 38 insertions(+), 1 deletion(-) diff --git a/Changelog b/Changelog index 52096eed0ef..efdc65610f6 100644 --- a/Changelog +++ b/Changelog @@ -5,6 +5,8 @@ version : - v360 filter - Intel QSV-accelerated MJPEG decoding - Intel QSV-accelerated VP9 decoding +- support for TrueHD in mp4 + version 4.2: - tpad filter diff --git a/libavformat/isom.c b/libavformat/isom.c index c4880878c1b..fa2e3180990 100644 --- a/libavformat/isom.c +++ b/libavformat/isom.c @@ -369,6 +369,7 @@ const AVCodecTag ff_codec_movaudio_tags[] = { { AV_CODEC_ID_EVRC, MKTAG('s', 'e', 'v', 'c') }, /* 3GPP2 */ { AV_CODEC_ID_SMV, MKTAG('s', 's', 'm', 'v') }, /* 3GPP2 */ { AV_CODEC_ID_FLAC, MKTAG('f', 'L', 'a', 'C') }, /* nonstandard */ + { AV_CODEC_ID_TRUEHD, MKTAG('m', 'l', 'p', 'a') }, /* mp4ra.org */ { AV_CODEC_ID_OPUS, MKTAG('O', 'p', 'u', 's') }, /* mp4ra.org */ { AV_CODEC_ID_NONE, 0 }, }; diff --git a/libavformat/mov.c b/libavformat/mov.c index 24de5429d1d..8a4cdc4b43c 100644 --- a/libavformat/mov.c +++ b/libavformat/mov.c @@ -49,6 +49,7 @@ #include "libavcodec/ac3tab.h" #include "libavcodec/flac.h" #include "libavcodec/mpegaudiodecheader.h" +#include "libavcodec/mlp_parse.h" #include "avformat.h" #include "internal.h" #include "avio_internal.h" @@ -6683,6 +6684,38 @@ static int mov_read_dops(MOVContext *c, AVIOContext *pb, MOVAtom atom) return 0; } +static int mov_read_dmlp(MOVContext *c, AVIOContext *pb, MOVAtom atom) +{ + AVStream *st; + unsigned format_info; + int channel_assignment, channel_assignment1, channel_assignment2; + int ratebits; + + if (c->fc->nb_streams < 1) + return 0; + st = c->fc->streams[c->fc->nb_streams-1]; + + if (atom.size < 10) + return AVERROR_INVALIDDATA; + + format_info = avio_rb32(pb); + + ratebits = (format_info >> 28) & 0xF; + channel_assignment1 = (format_info >> 15) & 0x1F; + channel_assignment2 = format_info & 0x1FFF; + if (channel_assignment2) + channel_assignment = channel_assignment2; + else + channel_assignment = channel_assignment1; + + st->codecpar->frame_size = 40 << (ratebits & 0x7); + st->codecpar->sample_rate = mlp_samplerate(ratebits); + st->codecpar->channels = truehd_channels(channel_assignment); + st->codecpar->channel_layout = truehd_layout(channel_assignment); + + return 0; +} + static const MOVParseTableEntry mov_default_parse_table[] = { { MKTAG('A','C','L','R'), mov_read_aclr }, { MKTAG('A','P','R','G'), mov_read_avid }, @@ -6771,6 +6804,7 @@ static const MOVParseTableEntry mov_default_parse_table[] = { { MKTAG('s','t','3','d'), mov_read_st3d }, /* stereoscopic 3D video box */ { MKTAG('s','v','3','d'), mov_read_sv3d }, /* spherical video box */ { MKTAG('d','O','p','s'), mov_read_dops }, +{ MKTAG('d','m','l','p'), mov_read_dmlp }, { MKTAG('S','m','D','m'), mov_read_smdm }, { MKTAG('C','o','L','L'), mov_read_coll }, { MKTAG('v','p','c','C'), mov_read_vpcc }, diff --git a/libavformat/version.h b/libavformat/version.h index 57002d25c85..f5e3adff987 100644 --- a/libavformat/version.h +++ b/libavformat/version.h @@ -33,7 +33,7 @@ // Also please add any ticket numbers that you believe might be affected here #define LIBAVFORMAT_VERSION_MAJOR 58 #define LIBAVFORMAT_VERSION_MINOR 31 -#define LIBAVFORMAT_VERSION_MICRO 102 +#define LIBAVFORMAT_VERSION_MICRO 103 #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \ LIBAVFORMAT_VERSION_MINOR, \ -- 2.39.2