shithub: opus

Download patch

ref: 9ba1743594ee9ba72c6247dec3bce53b80403456
parent: 9dc0e40475e5326e2b9a1d0e0459f64d1aebb15c
author: Jean-Marc Valin <[email protected]>
date: Mon Oct 24 18:41:18 EDT 2011

Implements OPUS_SET_MAX_BANDWIDTH()

--- a/celt/opus_defines.h
+++ b/celt/opus_defines.h
@@ -77,25 +77,18 @@
 
 /** These are the actual Encoder CTL ID numbers.
   * They should not be used directly by applications. */
-#define OPUS_SET_COMPLEXITY_REQUEST          4010
-#define OPUS_GET_COMPLEXITY_REQUEST          4011
+#define OPUS_SET_APPLICATION_REQUEST         4000
+#define OPUS_GET_APPLICATION_REQUEST         4001
 #define OPUS_SET_BITRATE_REQUEST             4002
 #define OPUS_GET_BITRATE_REQUEST             4003
+#define OPUS_SET_MAX_BANDWIDTH_REQUEST       4004
+#define OPUS_GET_MAX_BANDWIDTH_REQUEST       4005
 #define OPUS_SET_VBR_REQUEST                 4006
 #define OPUS_GET_VBR_REQUEST                 4007
-#define OPUS_SET_VBR_CONSTRAINT_REQUEST      4020
-#define OPUS_GET_VBR_CONSTRAINT_REQUEST      4021
-#define OPUS_SET_FORCE_CHANNELS_REQUEST      4022
-#define OPUS_GET_FORCE_CHANNELS_REQUEST      4023
 #define OPUS_SET_BANDWIDTH_REQUEST           4008
 #define OPUS_GET_BANDWIDTH_REQUEST           4009
-#define OPUS_SET_SIGNAL_REQUEST              4024
-#define OPUS_GET_SIGNAL_REQUEST              4025
-#define OPUS_SET_VOICE_RATIO_REQUEST         4018
-#define OPUS_GET_VOICE_RATIO_REQUEST         4019
-#define OPUS_SET_APPLICATION_REQUEST         4000
-#define OPUS_GET_APPLICATION_REQUEST         4001
-#define OPUS_GET_LOOKAHEAD_REQUEST           4027
+#define OPUS_SET_COMPLEXITY_REQUEST          4010
+#define OPUS_GET_COMPLEXITY_REQUEST          4011
 #define OPUS_SET_INBAND_FEC_REQUEST          4012
 #define OPUS_GET_INBAND_FEC_REQUEST          4013
 #define OPUS_SET_PACKET_LOSS_PERC_REQUEST    4014
@@ -102,6 +95,16 @@
 #define OPUS_GET_PACKET_LOSS_PERC_REQUEST    4015
 #define OPUS_SET_DTX_REQUEST                 4016
 #define OPUS_GET_DTX_REQUEST                 4017
+#define OPUS_SET_VOICE_RATIO_REQUEST         4018
+#define OPUS_GET_VOICE_RATIO_REQUEST         4019
+#define OPUS_SET_VBR_CONSTRAINT_REQUEST      4020
+#define OPUS_GET_VBR_CONSTRAINT_REQUEST      4021
+#define OPUS_SET_FORCE_CHANNELS_REQUEST      4022
+#define OPUS_GET_FORCE_CHANNELS_REQUEST      4023
+#define OPUS_SET_SIGNAL_REQUEST              4024
+#define OPUS_GET_SIGNAL_REQUEST              4025
+#define OPUS_GET_LOOKAHEAD_REQUEST           4027
+/* #define OPUS_RESET_STATE 4028 */
 #define OPUS_GET_FINAL_RANGE_REQUEST         4031
 #define OPUS_GET_PITCH_REQUEST               4033
 
--- a/src/opus_encoder.c
+++ b/src/opus_encoder.c
@@ -60,6 +60,7 @@
     int          force_channels;
     int          signal_type;
     int          user_bandwidth;
+    int          max_bandwidth;
     int          user_forced_mode;
     int          voice_ratio;
     opus_int32   Fs;
@@ -202,6 +203,7 @@
     st->application = application;
     st->signal_type = OPUS_AUTO;
     st->user_bandwidth = OPUS_AUTO;
+    st->max_bandwidth = OPUS_BANDWIDTH_FULLBAND;
     st->force_channels = OPUS_AUTO;
     st->user_forced_mode = OPUS_AUTO;
     st->voice_ratio = -1;
@@ -673,6 +675,9 @@
             st->bandwidth = OPUS_BANDWIDTH_WIDEBAND;
     }
 
+    if (st->bandwidth>st->max_bandwidth)
+       st->bandwidth = st->max_bandwidth;
+
     if (st->user_bandwidth != OPUS_AUTO)
         st->bandwidth = st->user_bandwidth;
 
@@ -1266,6 +1271,27 @@
         {
             opus_int32 *value = va_arg(ap, opus_int32*);
             *value = st->force_channels;
+        }
+        break;
+        case OPUS_SET_MAX_BANDWIDTH_REQUEST:
+        {
+            opus_int32 value = va_arg(ap, opus_int32);
+            if (value < OPUS_BANDWIDTH_NARROWBAND || value > OPUS_BANDWIDTH_FULLBAND)
+                return OPUS_BAD_ARG;
+            st->max_bandwidth = value;
+            if (st->max_bandwidth == OPUS_BANDWIDTH_NARROWBAND) {
+                st->silk_mode.maxInternalSampleRate = 8000;
+            } else if (st->max_bandwidth == OPUS_BANDWIDTH_MEDIUMBAND) {
+                st->silk_mode.maxInternalSampleRate = 12000;
+            } else {
+                st->silk_mode.maxInternalSampleRate = 16000;
+            }
+        }
+        break;
+        case OPUS_GET_MAX_BANDWIDTH_REQUEST:
+        {
+            opus_int32 *value = va_arg(ap, opus_int32*);
+            *value = st->max_bandwidth;
         }
         break;
         case OPUS_SET_BANDWIDTH_REQUEST: