AAC: Add support for 7350Hz sampling rates, no error on too hight bitrate.

Instead, warn that bitrate will be clamped down to the maximum allowed.

Patch is mostly work of Kamendo2 in issue #2686, quite tested within that issue.

Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
Claudio Freire 2015-03-06 04:05:32 -03:00 committed by Michael Niedermayer
parent b32cae1cc2
commit 6dbbb981b5
1 changed files with 18 additions and 5 deletions

View File

@ -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;