diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2014-01-06 01:53:13 +0400 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2014-01-06 01:53:13 +0400 |
commit | b4107f7805be6699d4b38449b1f9235958a2a133 (patch) | |
tree | a0403f61442e8d2dff1d66c5577d8cfae861f30e /libavcodec/mlpdec.c | |
parent | ae01af24756d6f5bd13eef405ca19a8bf458b39f (diff) | |
parent | 4b7f1a7ced0e98f2cc698d896f7ebab8d30eaa09 (diff) |
Merge commit '4b7f1a7ced0e98f2cc698d896f7ebab8d30eaa09'
* commit '4b7f1a7ced0e98f2cc698d896f7ebab8d30eaa09':
mlp: Parse TrueHD decoder channel modifiers and set the AVMatrixEncoding for each substream.
Conflicts:
libavcodec/mlp_parser.h
libavcodec/mlpdec.c
Merged-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavcodec/mlpdec.c')
-rw-r--r-- | libavcodec/mlpdec.c | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/libavcodec/mlpdec.c b/libavcodec/mlpdec.c index 88cafc2fcf..7bfd640b88 100644 --- a/libavcodec/mlpdec.c +++ b/libavcodec/mlpdec.c @@ -60,6 +60,8 @@ typedef struct SubStream { uint8_t ch_assign[MAX_CHANNELS]; /// The channel layout for this substream uint64_t ch_layout; + /// The matrix encoding mode for this substream + enum AVMatrixEncoding matrix_encoding; /// Channel coding parameters for channels in the substream ChannelParams channel_params[MAX_CHANNELS]; @@ -398,6 +400,46 @@ static int read_major_sync(MLPDecodeContext *m, GetBitContext *gb) m->needs_reordering = mh.channel_arrangement >= 18 && mh.channel_arrangement <= 20; + /* Parse the TrueHD decoder channel modifiers and set each substream's + * AVMatrixEncoding accordingly. + * + * The meaning of the modifiers depends on the channel layout: + * + * - THD_CH_MODIFIER_LTRT, THD_CH_MODIFIER_LBINRBIN only apply to 2-channel + * + * - THD_CH_MODIFIER_MONO applies to 1-channel or 2-channel (dual mono) + * + * - THD_CH_MODIFIER_SURROUNDEX, THD_CH_MODIFIER_NOTSURROUNDEX only apply to + * layouts with an Ls/Rs channel pair + */ + for (substr = 0; substr < MAX_SUBSTREAMS; substr++) + m->substream[substr].matrix_encoding = AV_MATRIX_ENCODING_NONE; + if (m->avctx->codec_id == AV_CODEC_ID_TRUEHD) { + if (mh.num_substreams > 2 && + mh.channel_layout_thd_stream2 & AV_CH_SIDE_LEFT && + mh.channel_layout_thd_stream2 & AV_CH_SIDE_RIGHT && + mh.channel_modifier_thd_stream2 == THD_CH_MODIFIER_SURROUNDEX) + m->substream[2].matrix_encoding = AV_MATRIX_ENCODING_DOLBYEX; + + if (mh.num_substreams > 1 && + mh.channel_layout_thd_stream1 & AV_CH_SIDE_LEFT && + mh.channel_layout_thd_stream1 & AV_CH_SIDE_RIGHT && + mh.channel_modifier_thd_stream1 == THD_CH_MODIFIER_SURROUNDEX) + m->substream[1].matrix_encoding = AV_MATRIX_ENCODING_DOLBYEX; + + if (mh.num_substreams > 0) + switch (mh.channel_modifier_thd_stream0) { + case THD_CH_MODIFIER_LTRT: + m->substream[0].matrix_encoding = AV_MATRIX_ENCODING_DOLBY; + break; + case THD_CH_MODIFIER_LBINRBIN: + m->substream[0].matrix_encoding = AV_MATRIX_ENCODING_DOLBYHEADPHONE; + break; + default: + break; + } + } + return 0; } |