From 95f3019a5193712a49cdcf9f2bc460e5c94fbc94 Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Fri, 17 Apr 2009 08:43:04 +0000 Subject: [PATCH] ac3dec: reorder output channels to SMPTE channel order Originally committed as revision 18542 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavcodec/ac3dec.c | 4 +++- libavcodec/ac3tab.c | 25 +++++++++++++++++++------ libavcodec/ac3tab.h | 1 + 3 files changed, 23 insertions(+), 7 deletions(-) diff --git a/libavcodec/ac3dec.c b/libavcodec/ac3dec.c index 854a38f32b..4a177aae69 100644 --- a/libavcodec/ac3dec.c +++ b/libavcodec/ac3dec.c @@ -1233,6 +1233,7 @@ static int ac3_decode_frame(AVCodecContext * avctx, void *data, int *data_size, AC3DecodeContext *s = avctx->priv_data; int16_t *out_samples = (int16_t *)data; int blk, ch, err; + const uint8_t *channel_map; /* initialize the GetBitContext with the start of valid AC-3 Frame */ if (s->input_buffer) { @@ -1321,6 +1322,7 @@ static int ac3_decode_frame(AVCodecContext * avctx, void *data, int *data_size, } /* decode the audio blocks */ + channel_map = ff_ac3_dec_channel_map[s->output_mode & ~AC3_OUTPUT_LFEON][s->lfe_on]; for (blk = 0; blk < s->num_blocks; blk++) { const float *output[s->out_channels]; if (!err && decode_audio_block(s, blk)) { @@ -1328,7 +1330,7 @@ static int ac3_decode_frame(AVCodecContext * avctx, void *data, int *data_size, err = 1; } for (ch = 0; ch < s->out_channels; ch++) - output[ch] = s->output[ch]; + output[ch] = s->output[channel_map[ch]]; s->dsp.float_to_int16_interleave(out_samples, output, 256, s->out_channels); out_samples += 256 * s->out_channels; } diff --git a/libavcodec/ac3tab.c b/libavcodec/ac3tab.c index 36a7449a72..cb07ac6255 100644 --- a/libavcodec/ac3tab.c +++ b/libavcodec/ac3tab.c @@ -79,21 +79,34 @@ const uint8_t ff_ac3_channels_tab[8] = { 2, 1, 2, 3, 3, 4, 4, 5 }; +#define COMMON_CHANNEL_MAP \ + { { 0, 1, }, { 0, 1, 2, } },\ + { { 0, }, { 0, 1, } },\ + { { 0, 1, }, { 0, 1, 2, } },\ + { { 0, 2, 1, }, { 0, 2, 1, 3, } },\ + { { 0, 1, 2, }, { 0, 1, 3, 2, } },\ + { { 0, 2, 1, 3, }, { 0, 2, 1, 4, 3, } }, + /** * Table to remap channels from SMPTE order to AC-3 order. * [channel_mode][lfe][ch] */ const uint8_t ff_ac3_enc_channel_map[8][2][6] = { - { { 0, 1, }, { 0, 1, 2, } }, - { { 0, }, { 0, 1, } }, - { { 0, 1, }, { 0, 1, 2, } }, - { { 0, 2, 1, }, { 0, 2, 1, 3, } }, - { { 0, 1, 2, }, { 0, 1, 3, 2, } }, - { { 0, 2, 1, 3, }, { 0, 2, 1, 4, 3, } }, + COMMON_CHANNEL_MAP { { 0, 1, 2, 3, 4, }, { 0, 1, 3, 4, 2, } }, { { 0, 2, 1, 3, 4, }, { 0, 2, 1, 4, 5, 3 } }, }; +/** + * Table to remap channels from from AC-3 order to SMPTE order. + * [channel_mode][lfe][ch] + */ +const uint8_t ff_ac3_dec_channel_map[8][2][6] = { + COMMON_CHANNEL_MAP + { { 0, 1, 2, 3, 4, }, { 0, 1, 4, 2, 3, } }, + { { 0, 2, 1, 3, 4, }, { 0, 2, 1, 5, 3, 4 } }, +}; + /* possible frequencies */ const uint16_t ff_ac3_sample_rate_tab[3] = { 48000, 44100, 32000 }; diff --git a/libavcodec/ac3tab.h b/libavcodec/ac3tab.h index 300e3c6bc0..e4d0ce8aea 100644 --- a/libavcodec/ac3tab.h +++ b/libavcodec/ac3tab.h @@ -27,6 +27,7 @@ extern const uint16_t ff_ac3_frame_size_tab[38][3]; extern const uint8_t ff_ac3_channels_tab[8]; extern const uint8_t ff_ac3_enc_channel_map[8][2][6]; +extern const uint8_t ff_ac3_dec_channel_map[8][2][6]; extern const uint16_t ff_ac3_sample_rate_tab[3]; extern const uint16_t ff_ac3_bitrate_tab[19]; extern const int16_t ff_ac3_window[256];