diff --git a/src/opus.h b/src/opus.h index a9565937..91048503 100644 --- a/src/opus.h +++ b/src/opus.h @@ -63,6 +63,8 @@ extern "C" { #define OPUS_TEST_RANGE_CODER_STATE 1 +#define OPUS_BITRATE_AUTO -1 + #define OPUS_MODE_AUTO 2000 #define OPUS_MODE_VOICE 2001 #define OPUS_MODE_AUDIO 2002 diff --git a/src/opus_encoder.c b/src/opus_encoder.c index ca302ee9..33e568d2 100644 --- a/src/opus_encoder.c +++ b/src/opus_encoder.c @@ -123,7 +123,8 @@ OpusEncoder *opus_encoder_init(OpusEncoder* st, int Fs, int channels) st->mode = MODE_HYBRID; st->bandwidth = BANDWIDTH_FULLBAND; st->use_vbr = 0; - st->bitrate_bps = 32000; + st->user_bitrate_bps = OPUS_BITRATE_AUTO; + st->bitrate_bps = 3000+Fs*channels; st->user_mode = OPUS_MODE_AUTO; st->user_bandwidth = BANDWIDTH_AUTO; st->voice_ratio = 90; @@ -173,6 +174,12 @@ int opus_encode(OpusEncoder *st, const short *pcm, int frame_size, silk_enc = (char*)st+st->silk_enc_offset; celt_enc = (CELTEncoder*)((char*)st+st->celt_enc_offset); + + if (st->user_bitrate_bps==OPUS_BITRATE_AUTO) + st->bitrate_bps = 60*st->Fs/frame_size + st->Fs*st->channels; + else + st->bitrate_bps = st->user_bitrate_bps; + /* Rete-dependent mono-stereo decision */ if (st->channels == 2) { @@ -583,7 +590,14 @@ int opus_encoder_ctl(OpusEncoder *st, int request, ...) case OPUS_SET_BITRATE_REQUEST: { int value = va_arg(ap, int); - st->bitrate_bps = value; + if (value != OPUS_BITRATE_AUTO) + { + if (value <= 0) + goto bad_arg; + else if (value <= 500) + value = 500; + } + st->user_bitrate_bps = value; } break; case OPUS_GET_BITRATE_REQUEST: diff --git a/src/opus_encoder.h b/src/opus_encoder.h index d46b0eb6..4d74c25f 100644 --- a/src/opus_encoder.h +++ b/src/opus_encoder.h @@ -53,6 +53,7 @@ struct OpusEncoder { int use_vbr; int vbr_constraint; int bitrate_bps; + int user_bitrate_bps; int encoder_buffer; int delay_compensation; int first;