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;