diff --git a/src/opus.h b/src/opus.h index a95659375701a3a29e00e709cfdfac24d7b5086e..91048503d6fba468598647eaa74c304dc00d0235 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 ca302ee99fbd82844a998bcb9fd170a864c12c20..33e568d2516d20767bf9b43107af0d420870c5d1 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 d46b0eb675b7efa4b632d36ab9387b45a3e5b836..4d74c25f6472b63fdcda3fe73c85871e700b0a9c 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;