diff options
author | Rostislav Pehlivanov <atomnuker@gmail.com> | 2015-10-12 15:53:17 +0100 |
---|---|---|
committer | Rostislav Pehlivanov <atomnuker@gmail.com> | 2015-10-12 15:53:17 +0100 |
commit | b3deaece87b5b0216382e6d700854edb8d3727fb (patch) | |
tree | d53fc3af47abb1b9dc4a38535cfced1236ab8e8b | |
parent | e679a1e65f5254fcef702708797152b025350e91 (diff) | |
download | ffmpeg-b3deaece87b5b0216382e6d700854edb8d3727fb.tar.gz |
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.
-rw-r--r-- | libavcodec/aacenc.c | 5 | ||||
-rw-r--r-- | libavcodec/aacenctab.h | 20 |
2 files changed, 15 insertions, 10 deletions
diff --git a/libavcodec/aacenc.c b/libavcodec/aacenc.c index 9e96cbcfa1..8041127009 100644 --- a/libavcodec/aacenc.c +++ b/libavcodec/aacenc.c @@ -54,11 +54,12 @@ static void put_audio_specific_config(AVCodecContext *avctx) { PutBitContext pb; AACEncContext *s = avctx->priv_data; + int channels = s->channels - (s->channels == 8 ? 1 : 0); init_put_bits(&pb, avctx->extradata, avctx->extradata_size); put_bits(&pb, 5, s->profile+1); //profile put_bits(&pb, 4, s->samplerate_index); //sample rate index - put_bits(&pb, 4, s->channels); + put_bits(&pb, 4, channels); //GASpecificConfig put_bits(&pb, 1, 0); //frame length - 1024 samples put_bits(&pb, 1, 0); //does not depend on core coder @@ -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, "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); WARN_IF(1024.0 * avctx->bit_rate / avctx->sample_rate > 6144 * s->channels, "Too many bits per frame requested, clamping to max\n"); diff --git a/libavcodec/aacenctab.h b/libavcodec/aacenctab.h index 9157cff810..78b4d400c3 100644 --- a/libavcodec/aacenctab.h +++ b/libavcodec/aacenctab.h @@ -36,7 +36,7 @@ /** Total number of codebooks, including special ones **/ #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 int ff_aac_swb_size_1024_len; @@ -44,13 +44,15 @@ extern const uint8_t *ff_aac_swb_size_128[]; extern const int ff_aac_swb_size_128_len; /** default channel configurations */ -static const uint8_t aac_chan_configs[6][5] = { - {1, TYPE_SCE}, // 1 channel - single channel element - {1, TYPE_CPE}, // 2 channels - channel pair - {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_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 +static const uint8_t aac_chan_configs[AAC_MAX_CHANNELS][6] = { + {1, TYPE_SCE}, // 1 channel - single channel element + {1, TYPE_CPE}, // 2 channels - channel pair + {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_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 + {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] = { { 2, 0, 1, 3 }, { 2, 0, 1, 3, 4 }, { 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 |