diff --git a/libavcodec/aacenc.c b/libavcodec/aacenc.c index 7c286aac20..7015a2789c 100644 --- a/libavcodec/aacenc.c +++ b/libavcodec/aacenc.c @@ -53,6 +53,11 @@ return AVERROR(EINVAL); \ } +#define WARN_IF(cond, ...) \ + if (cond) { \ + av_log(avctx, AV_LOG_WARNING, __VA_ARGS__); \ + } + float ff_aac_pow34sf_tab[428]; static const uint8_t swb_size_1024_96[] = { @@ -102,7 +107,8 @@ static const uint8_t *swb_size_1024[] = { swb_size_1024_96, swb_size_1024_96, swb_size_1024_64, swb_size_1024_48, swb_size_1024_48, swb_size_1024_32, swb_size_1024_24, swb_size_1024_24, swb_size_1024_16, - swb_size_1024_16, swb_size_1024_16, swb_size_1024_8 + swb_size_1024_16, swb_size_1024_16, swb_size_1024_8, + swb_size_1024_8 }; static const uint8_t swb_size_128_96[] = { @@ -131,7 +137,8 @@ static const uint8_t *swb_size_128[] = { swb_size_128_96, swb_size_128_96, swb_size_128_96, swb_size_128_48, swb_size_128_48, swb_size_128_48, swb_size_128_24, swb_size_128_24, swb_size_128_16, - swb_size_128_16, swb_size_128_16, swb_size_128_8 + swb_size_128_16, swb_size_128_16, swb_size_128_8, + swb_size_128_8 }; /** default channel configurations */ @@ -754,14 +761,20 @@ static av_cold int aac_encode_init(AVCodecContext *avctx) s->channels = avctx->channels; - ERROR_IF(i >= 12, + ERROR_IF(i == 16 + || i >= (sizeof(swb_size_1024) / sizeof(*swb_size_1024)) + || i >= (sizeof(swb_size_128) / sizeof(*swb_size_128)), "Unsupported sample rate %d\n", avctx->sample_rate); ERROR_IF(s->channels > AAC_MAX_CHANNELS, "Unsupported number of channels: %d\n", s->channels); ERROR_IF(avctx->profile != FF_PROFILE_UNKNOWN && avctx->profile != FF_PROFILE_AAC_LOW, "Unsupported profile %d\n", avctx->profile); - ERROR_IF(1024.0 * avctx->bit_rate / avctx->sample_rate > 6144 * s->channels, - "Too many bits per frame requested\n"); + WARN_IF(1024.0 * avctx->bit_rate / avctx->sample_rate > 6144 * s->channels, + "Too many bits per frame requested, clamping to max\n"); + + avctx->bit_rate = (int)FFMIN( + 6144 * s->channels / 1024.0 * avctx->sample_rate, + avctx->bit_rate); s->samplerate_index = i;