Commit b3deaece authored by Rostislav Pehlivanov's avatar Rostislav Pehlivanov

aacenc: add support for encoding 7.1 channel audio

This commit implements support for 7.1 channel audio. There's no
more predefined bitstream channel mappings so going beyond 8 channels
(and 7 channels exactly) will require programmable channel elements,
which is already underway.
parent e679a1e6
...@@ -54,11 +54,12 @@ static void put_audio_specific_config(AVCodecContext *avctx) ...@@ -54,11 +54,12 @@ static void put_audio_specific_config(AVCodecContext *avctx)
{ {
PutBitContext pb; PutBitContext pb;
AACEncContext *s = avctx->priv_data; AACEncContext *s = avctx->priv_data;
int channels = s->channels - (s->channels == 8 ? 1 : 0);
init_put_bits(&pb, avctx->extradata, avctx->extradata_size); init_put_bits(&pb, avctx->extradata, avctx->extradata_size);
put_bits(&pb, 5, s->profile+1); //profile put_bits(&pb, 5, s->profile+1); //profile
put_bits(&pb, 4, s->samplerate_index); //sample rate index put_bits(&pb, 4, s->samplerate_index); //sample rate index
put_bits(&pb, 4, s->channels); put_bits(&pb, 4, channels);
//GASpecificConfig //GASpecificConfig
put_bits(&pb, 1, 0); //frame length - 1024 samples put_bits(&pb, 1, 0); //frame length - 1024 samples
put_bits(&pb, 1, 0); //does not depend on core coder put_bits(&pb, 1, 0); //does not depend on core coder
...@@ -866,7 +867,7 @@ static av_cold int aac_encode_init(AVCodecContext *avctx) ...@@ -866,7 +867,7 @@ static av_cold int aac_encode_init(AVCodecContext *avctx)
ERROR_IF(i == 16 || i >= ff_aac_swb_size_1024_len || i >= ff_aac_swb_size_128_len, ERROR_IF(i == 16 || i >= ff_aac_swb_size_1024_len || i >= ff_aac_swb_size_128_len,
"Unsupported sample rate %d\n", avctx->sample_rate); "Unsupported sample rate %d\n", avctx->sample_rate);
ERROR_IF(s->channels > AAC_MAX_CHANNELS, ERROR_IF(s->channels > AAC_MAX_CHANNELS || s->channels == 7,
"Unsupported number of channels: %d\n", s->channels); "Unsupported number of channels: %d\n", s->channels);
WARN_IF(1024.0 * avctx->bit_rate / avctx->sample_rate > 6144 * s->channels, WARN_IF(1024.0 * avctx->bit_rate / avctx->sample_rate > 6144 * s->channels,
"Too many bits per frame requested, clamping to max\n"); "Too many bits per frame requested, clamping to max\n");
......
...@@ -36,7 +36,7 @@ ...@@ -36,7 +36,7 @@
/** Total number of codebooks, including special ones **/ /** Total number of codebooks, including special ones **/
#define CB_TOT_ALL 15 #define CB_TOT_ALL 15
#define AAC_MAX_CHANNELS 6 #define AAC_MAX_CHANNELS 8
extern const uint8_t *ff_aac_swb_size_1024[]; extern const uint8_t *ff_aac_swb_size_1024[];
extern const int ff_aac_swb_size_1024_len; extern const int ff_aac_swb_size_1024_len;
...@@ -44,13 +44,15 @@ extern const uint8_t *ff_aac_swb_size_128[]; ...@@ -44,13 +44,15 @@ extern const uint8_t *ff_aac_swb_size_128[];
extern const int ff_aac_swb_size_128_len; extern const int ff_aac_swb_size_128_len;
/** default channel configurations */ /** default channel configurations */
static const uint8_t aac_chan_configs[6][5] = { static const uint8_t aac_chan_configs[AAC_MAX_CHANNELS][6] = {
{1, TYPE_SCE}, // 1 channel - single channel element {1, TYPE_SCE}, // 1 channel - single channel element
{1, TYPE_CPE}, // 2 channels - channel pair {1, TYPE_CPE}, // 2 channels - channel pair
{2, TYPE_SCE, TYPE_CPE}, // 3 channels - center + stereo {2, TYPE_SCE, TYPE_CPE}, // 3 channels - center + stereo
{3, TYPE_SCE, TYPE_CPE, TYPE_SCE}, // 4 channels - front center + stereo + back center {3, TYPE_SCE, TYPE_CPE, TYPE_SCE}, // 4 channels - front center + stereo + back center
{3, TYPE_SCE, TYPE_CPE, TYPE_CPE}, // 5 channels - front center + stereo + back stereo {3, TYPE_SCE, TYPE_CPE, TYPE_CPE}, // 5 channels - front center + stereo + back stereo
{4, TYPE_SCE, TYPE_CPE, TYPE_CPE, TYPE_LFE}, // 6 channels - front center + stereo + back stereo + LFE {4, TYPE_SCE, TYPE_CPE, TYPE_CPE, TYPE_LFE}, // 6 channels - front center + stereo + back stereo + LFE
{0}, // 7 channels - invalid without PCE
{5, TYPE_SCE, TYPE_CPE, TYPE_CPE, TYPE_CPE, TYPE_LFE}, // 8 channels - front center + front stereo + side stereo + back stereo + LFE
}; };
/** /**
...@@ -63,6 +65,8 @@ static const uint8_t aac_chan_maps[AAC_MAX_CHANNELS][AAC_MAX_CHANNELS] = { ...@@ -63,6 +65,8 @@ static const uint8_t aac_chan_maps[AAC_MAX_CHANNELS][AAC_MAX_CHANNELS] = {
{ 2, 0, 1, 3 }, { 2, 0, 1, 3 },
{ 2, 0, 1, 3, 4 }, { 2, 0, 1, 3, 4 },
{ 2, 0, 1, 4, 5, 3 }, { 2, 0, 1, 4, 5, 3 },
{ 0 },
{ 2, 0, 1, 6, 7, 4, 5, 3 },
}; };
/* duplicated from avpriv_mpeg4audio_sample_rates to avoid shared build /* duplicated from avpriv_mpeg4audio_sample_rates to avoid shared build
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment