shithub: opus

Download patch

ref: ba547467c0e54814e3b464bc2646a27778948930
parent: 4907d3752ec580ced202dfa37e9616298547cbd0
author: Jean-Marc Valin <[email protected]>
date: Tue May 10 13:54:41 EDT 2011

Adding a decent auto/default bit-rate choice

--- a/src/opus.h
+++ b/src/opus.h
@@ -63,6 +63,8 @@
 
 #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
--- a/src/opus_encoder.c
+++ b/src/opus_encoder.c
@@ -123,7 +123,8 @@
 	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 @@
 
     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 @@
         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:
--- a/src/opus_encoder.h
+++ b/src/opus_encoder.h
@@ -53,6 +53,7 @@
     int          use_vbr;
     int          vbr_constraint;
     int          bitrate_bps;
+    int          user_bitrate_bps;
     int          encoder_buffer;
     int          delay_compensation;
     int          first;