}
// Get the bitrate low and high limits for a codec/samplerate/mixdown triplet
+// The limits have been empirically determined through testing. Max bitrates
+// in table below. Numbers in parenthesis are the target bitrate chosen.
+/*
+Encoder 1 channel 2 channels 6 channels
+
+faac
+24kHz 86 (128) 173 (256) 460 (768)
+48kHz 152 (160) 304 (320) 759 (768)
+
+Vorbis
+24kHz 97 (80) 177 (160) 527 (512)
+48kHz 241 (224) 465 (448) 783 (768)
+
+Lame
+24kHz 146 (768) 138 (768)
+48kHz 318 (768) 318 (768)
+
+ffac3
+24kHz 318 (320) 318 (320) 318 (320)
+48kHz 636 (640) 636 (640) 636 (640)
+
+Core Audio (core audio api provides range of allowed bitrates)
+24kHz 16-64 32-128 80-320
+44.1kHz 64-320 160-768
+48kHz 32-256 64-320 160-768
+
+Core Audio (minimum limits found in testing)
+24kHz 16 32 96
+44.1kHz 32 64 160
+48kHz 40 80 240
+*/
+
void hb_get_audio_bitrate_limits(uint32_t codec, int samplerate, int mixdown, int *low, int *high)
{
int channels;
{
case HB_ACODEC_AC3:
*low = 32 * channels;
- *high = 640;
+ if (samplerate > 24000)
+ {
+ *high = 640;
+ }
+ else
+ {
+ *high = 320;
+ }
break;
case HB_ACODEC_CA_AAC:
- *low = channels * 40;
- if (samplerate <= 44100)
+ if (samplerate > 44100)
+ {
+ *low = channels * 40;
+ *high = 256;
+ if (channels == 2)
+ *high = 320;
+ if (channels == 6)
+ {
+ *high = 768;
+ }
+ }
+ else if (samplerate > 24000)
+ {
*low = channels * 32;
- if (samplerate <= 24000)
+ *high = 256;
+ if (channels == 2)
+ *high = 320;
+ if (channels == 6)
+ {
+ *low = 160;
+ *high = 768;
+ }
+ }
+ else
+ {
*low = channels * 16;
- if (channels == 6)
- *low = 192;
- *high = hb_audio_bitrates[hb_audio_bitrates_count-1].rate;
+ *high = channels * 64;
+ if (channels == 6)
+ {
+ *high = 320;
+ }
+ }
break;
case HB_ACODEC_FAAC:
*low = 32 * channels;
- *high = 160 * channels;
+ if (samplerate > 24000)
+ {
+ *high = 160 * channels;
+ }
+ else
+ {
+ *high = 128 * channels;
+ }
if (*high > 768)
*high = 768;
break;
case HB_ACODEC_VORBIS:
- *low = channels * 16;
- *high = hb_audio_bitrates[hb_audio_bitrates_count-1].rate;
+ *high = channels * 80;
if (samplerate > 24000)
{
if (channels > 2)
// Vorbis minimum is around 30kbps/ch for 6ch
// at rates > 24k (32k/44.1k/48k)
*low = 32 * channels;
+ *high = 128 * channels;
}
else
{
// Allow 24kbps mono and 48kbps stereo at rates > 24k
// (32k/44.1k/48k)
*low = 24 * channels;
+ if (samplerate > 32000)
+ *high = channels * 224;
+ else
+ *high = channels * 160;
}
}
+ else
+ {
+ *low = channels * 16;
+ *high = 80 * channels;
+ }
break;
default: