summaryrefslogtreecommitdiff
path: root/libavcodec/mlpdec.c
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2014-01-05 22:53:13 +0100
committerMichael Niedermayer <michaelni@gmx.at>2014-01-05 22:53:13 +0100
commitb4107f7805be6699d4b38449b1f9235958a2a133 (patch)
treea0403f61442e8d2dff1d66c5577d8cfae861f30e /libavcodec/mlpdec.c
parentae01af24756d6f5bd13eef405ca19a8bf458b39f (diff)
parent4b7f1a7ced0e98f2cc698d896f7ebab8d30eaa09 (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.c42
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;
}