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