diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2011-03-31 12:47:35 +0200 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2011-03-31 12:48:41 +0200 |
commit | 1caa4123bd83f8b1f8a4e11a8d8539be7d54b105 (patch) | |
tree | 094ece3f8531095920978d68b65e7119ab7007e7 /libavcodec/mlp_parser.c | |
parent | 8b8bf89e52bc3bf4be1a9f10eb1eb153a443172f (diff) | |
parent | 229e2631be528c595650a7568c1d4df8af9c4944 (diff) | |
download | ffmpeg-1caa4123bd83f8b1f8a4e11a8d8539be7d54b105.tar.gz |
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.c | 59 |
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 */ |