summaryrefslogtreecommitdiff
path: root/libavcodec/mlp_parser.c
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2011-03-31 12:47:35 +0200
committerMichael Niedermayer <michaelni@gmx.at>2011-03-31 12:48:41 +0200
commit1caa4123bd83f8b1f8a4e11a8d8539be7d54b105 (patch)
tree094ece3f8531095920978d68b65e7119ab7007e7 /libavcodec/mlp_parser.c
parent8b8bf89e52bc3bf4be1a9f10eb1eb153a443172f (diff)
parent229e2631be528c595650a7568c1d4df8af9c4944 (diff)
Merge remote-tracking branch 'newdev/master'
* newdev/master: rtsp: Use GET_PARAMETER for keep-alive for generic RTSP servers mlp_parse.c: set AVCodecContext channel_layout APIChanges: mark the place where 0.6 was branched. avio: make get_checksum() internal. avio: move ff_crc04C11DB7_update() from avio.h -> avio_internal.h avio: make init_checksum() internal. NOT MERGED Add MxPEG decoder NOT MERGED Add support for picture_ptr field in MJpegDecodeContext NOT MERGED Move MJPEG's input buffer preprocessing in separate public function NOT MERGED Support reference picture defined by bitmask in MJPEG's SOS decoder sndio bug fix Merged-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavcodec/mlp_parser.c')
-rw-r--r--libavcodec/mlp_parser.c59
1 files changed, 57 insertions, 2 deletions
diff --git a/libavcodec/mlp_parser.c b/libavcodec/mlp_parser.c
index a6196f9abd..90b0d00f8a 100644
--- a/libavcodec/mlp_parser.c
+++ b/libavcodec/mlp_parser.c
@@ -42,11 +42,52 @@ static const uint8_t mlp_channels[32] = {
5, 6, 5, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
};
+static const uint64_t mlp_layout[32] = {
+ AV_CH_LAYOUT_MONO,
+ AV_CH_LAYOUT_STEREO,
+ AV_CH_LAYOUT_2_1,
+ AV_CH_LAYOUT_2_2,
+ AV_CH_LAYOUT_STEREO|AV_CH_LOW_FREQUENCY,
+ AV_CH_LAYOUT_2_1|AV_CH_LOW_FREQUENCY,
+ AV_CH_LAYOUT_2_2|AV_CH_LOW_FREQUENCY,
+ AV_CH_LAYOUT_SURROUND,
+ AV_CH_LAYOUT_4POINT0,
+ AV_CH_LAYOUT_5POINT0,
+ AV_CH_LAYOUT_SURROUND|AV_CH_LOW_FREQUENCY,
+ AV_CH_LAYOUT_4POINT0|AV_CH_LOW_FREQUENCY,
+ AV_CH_LAYOUT_5POINT1,
+ AV_CH_LAYOUT_4POINT0,
+ AV_CH_LAYOUT_5POINT0,
+ AV_CH_LAYOUT_SURROUND|AV_CH_LOW_FREQUENCY,
+ AV_CH_LAYOUT_4POINT0|AV_CH_LOW_FREQUENCY,
+ AV_CH_LAYOUT_5POINT1,
+ AV_CH_LAYOUT_2_2|AV_CH_LOW_FREQUENCY,
+ AV_CH_LAYOUT_5POINT0,
+ AV_CH_LAYOUT_5POINT1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+};
+
static const uint8_t thd_chancount[13] = {
// LR C LFE LRs LRvh LRc LRrs Cs Ts LRsd LRw Cvh LFE2
2, 1, 1, 2, 2, 2, 2, 1, 1, 2, 2, 1, 1
};
+static const uint64_t thd_layout[13] = {
+ AV_CH_FRONT_LEFT|AV_CH_FRONT_RIGHT, // LR
+ AV_CH_FRONT_CENTER, // C
+ AV_CH_LOW_FREQUENCY, // LFE
+ AV_CH_SIDE_LEFT|AV_CH_SIDE_RIGHT, // LRs
+ AV_CH_TOP_FRONT_LEFT|AV_CH_TOP_FRONT_RIGHT, // LRvh
+ AV_CH_SIDE_LEFT|AV_CH_SIDE_RIGHT, // LRc
+ AV_CH_BACK_LEFT|AV_CH_BACK_RIGHT, // LRrs
+ AV_CH_BACK_CENTER, // Cs
+ AV_CH_TOP_BACK_CENTER, // Ts
+ AV_CH_SIDE_LEFT|AV_CH_SIDE_RIGHT, // LRsd
+ AV_CH_FRONT_LEFT_OF_CENTER|AV_CH_FRONT_RIGHT_OF_CENTER, // LRw
+ AV_CH_TOP_BACK_CENTER, // Cvh
+ AV_CH_LOW_FREQUENCY // LFE2
+};
+
static int mlp_samplerate(int in)
{
if (in == 0xF)
@@ -65,6 +106,16 @@ static int truehd_channels(int chanmap)
return channels;
}
+static int64_t truehd_layout(int chanmap)
+{
+ int layout = 0, i;
+
+ for (i = 0; i < 13; i++)
+ layout |= thd_layout[i] * ((chanmap >> i) & 1);
+
+ return layout;
+}
+
/** Read a major sync info header - contains high level information about
* the stream - sample rate, channel arrangement etc. Most of this
* information is not actually necessary for decoding, only for playback.
@@ -264,12 +315,16 @@ static int mlp_parse(AVCodecParserContext *s,
if (mh.stream_type == 0xbb) {
/* MLP stream */
avctx->channels = mlp_channels[mh.channels_mlp];
+ avctx->channel_layout = mlp_layout[mh.channels_mlp];
} else { /* mh.stream_type == 0xba */
/* TrueHD stream */
- if (mh.channels_thd_stream2)
+ if (mh.channels_thd_stream2) {
avctx->channels = truehd_channels(mh.channels_thd_stream2);
- else
+ avctx->channel_layout = truehd_layout(mh.channels_thd_stream2);
+ } else {
avctx->channels = truehd_channels(mh.channels_thd_stream1);
+ avctx->channel_layout = truehd_layout(mh.channels_thd_stream1);
+ }
}
if (!mh.is_vbr) /* Stream is CBR */