| Index: src/opus_encoder.c
 | 
| diff --git a/src/opus_encoder.c b/src/opus_encoder.c
 | 
| index b77e48e620cb20919553d193bff503eb288c060f..aae31256ca579a7642b474adc97516d37080b85c 100644
 | 
| --- a/src/opus_encoder.c
 | 
| +++ b/src/opus_encoder.c
 | 
| @@ -291,7 +291,7 @@ static unsigned char gen_toc(int mode, int framerate, int bandwidth, int channel
 | 
|  }
 | 
|  
 | 
|  #ifndef FIXED_POINT
 | 
| -void silk_biquad_float(
 | 
| +static void silk_biquad_float(
 | 
|      const opus_val16      *in,            /* I:    Input signal                   */
 | 
|      const opus_int32      *B_Q28,         /* I:    MA coefficients [3]            */
 | 
|      const opus_int32      *A_Q28,         /* I:    AR coefficients [2]            */
 | 
| @@ -458,20 +458,20 @@ opus_int32 opus_encode_float(OpusEncoder *st, const opus_val16 *pcm, int frame_s
 | 
|      int prefill=0;
 | 
|      int start_band = 0;
 | 
|      int redundancy = 0;
 | 
| -    int redundancy_bytes = 0;
 | 
| +    int redundancy_bytes = 0; /* Number of bytes to use for redundancy frame */
 | 
|      int celt_to_silk = 0;
 | 
|      VARDECL(opus_val16, pcm_buf);
 | 
|      int nb_compr_bytes;
 | 
|      int to_celt = 0;
 | 
|      opus_uint32 redundant_rng = 0;
 | 
|      int cutoff_Hz, hp_freq_smth1;
 | 
| -    int voice_est;
 | 
| +    int voice_est; /* Probability of voice in Q7 */
 | 
|      opus_int32 equiv_rate;
 | 
|      int delay_compensation;
 | 
|      int frame_rate;
 | 
| -    opus_int32 max_rate;
 | 
| +    opus_int32 max_rate; /* Max bitrate we're allowed to use */
 | 
|      int curr_bandwidth;
 | 
| -    opus_int32 max_data_bytes;
 | 
| +    opus_int32 max_data_bytes; /* Max number of bytes we're allowed to use */
 | 
|      VARDECL(opus_val16, tmp_prefill);
 | 
|  
 | 
|      ALLOC_STACK;
 | 
| @@ -652,6 +652,7 @@ opus_int32 opus_encode_float(OpusEncoder *st, const opus_val16 *pcm, int frame_s
 | 
|              }
 | 
|          }
 | 
|      }
 | 
| +    /* For the first frame at a new SILK bandwidth */
 | 
|      if (st->silk_bw_switch)
 | 
|      {
 | 
|         redundancy = 1;
 | 
| @@ -659,6 +660,15 @@ opus_int32 opus_encode_float(OpusEncoder *st, const opus_val16 *pcm, int frame_s
 | 
|         st->silk_bw_switch = 0;
 | 
|      }
 | 
|  
 | 
| +    if (redundancy)
 | 
| +    {
 | 
| +       /* Fair share of the max size allowed */
 | 
| +       redundancy_bytes = IMIN(257, max_data_bytes*(opus_int32)(st->Fs/200)/(frame_size+st->Fs/200));
 | 
| +       /* For VBR, target the actual bitrate (subject to the limit above) */
 | 
| +       if (st->use_vbr)
 | 
| +          redundancy_bytes = IMIN(redundancy_bytes, st->bitrate_bps/1600);
 | 
| +    }
 | 
| +
 | 
|      if (st->mode != MODE_CELT_ONLY && st->prev_mode == MODE_CELT_ONLY)
 | 
|      {
 | 
|          silk_EncControlStruct dummy;
 | 
| @@ -823,7 +833,7 @@ opus_int32 opus_encode_float(OpusEncoder *st, const opus_val16 *pcm, int frame_s
 | 
|          st->mode = MODE_SILK_ONLY;
 | 
|  
 | 
|      /* printf("%d %d %d %d\n", st->bitrate_bps, st->stream_channels, st->mode, curr_bandwidth); */
 | 
| -    bytes_target = IMIN(max_data_bytes, st->bitrate_bps * frame_size / (st->Fs * 8)) - 1;
 | 
| +    bytes_target = IMIN(max_data_bytes-redundancy_bytes, st->bitrate_bps * frame_size / (st->Fs * 8)) - 1;
 | 
|  
 | 
|      data += 1;
 | 
|  
 | 
| @@ -929,7 +939,7 @@ opus_int32 opus_encode_float(OpusEncoder *st, const opus_val16 *pcm, int frame_s
 | 
|          st->silk_mode.useCBR = !st->use_vbr;
 | 
|  
 | 
|          /* Call SILK encoder for the low band */
 | 
| -        nBytes = IMIN(1275, max_data_bytes-1);
 | 
| +        nBytes = IMIN(1275, max_data_bytes-1-redundancy_bytes);
 | 
|  
 | 
|          st->silk_mode.maxBits = nBytes*8;
 | 
|          /* Only allow up to 90% of the bits for hybrid mode*/
 | 
| @@ -941,8 +951,6 @@ opus_int32 opus_encode_float(OpusEncoder *st, const opus_val16 *pcm, int frame_s
 | 
|             /* Reduce the initial target to make it easier to reach the CBR rate */
 | 
|             st->silk_mode.bitRate = IMAX(1, st->silk_mode.bitRate-2000);
 | 
|          }
 | 
| -        if (redundancy)
 | 
| -           st->silk_mode.maxBits -= st->silk_mode.maxBits/(1 + frame_size/(st->Fs/200));
 | 
|  
 | 
|          if (prefill)
 | 
|          {
 | 
| @@ -990,6 +998,7 @@ opus_int32 opus_encode_float(OpusEncoder *st, const opus_val16 *pcm, int frame_s
 | 
|          }
 | 
|  
 | 
|          st->silk_mode.opusCanSwitch = st->silk_mode.switchReady;
 | 
| +        /* FIXME: How do we allocate the redundancy for CBR? */
 | 
|          if (st->silk_mode.opusCanSwitch)
 | 
|          {
 | 
|             redundancy = 1;
 | 
| @@ -1047,7 +1056,7 @@ opus_int32 opus_encode_float(OpusEncoder *st, const opus_val16 *pcm, int frame_s
 | 
|                  celt_encoder_ctl(celt_enc, OPUS_SET_VBR(1));
 | 
|                  celt_encoder_ctl(celt_enc, OPUS_SET_VBR_CONSTRAINT(st->vbr_constraint));
 | 
|                  celt_encoder_ctl(celt_enc, OPUS_SET_BITRATE(st->bitrate_bps));
 | 
| -                nb_compr_bytes = max_data_bytes-1;
 | 
| +                nb_compr_bytes = max_data_bytes-1-redundancy_bytes;
 | 
|              } else {
 | 
|                  nb_compr_bytes = bytes_target;
 | 
|              }
 | 
| @@ -1119,8 +1128,10 @@ opus_int32 opus_encode_float(OpusEncoder *st, const opus_val16 *pcm, int frame_s
 | 
|      }
 | 
|  
 | 
|      if (!redundancy)
 | 
| +    {
 | 
|         st->silk_bw_switch = 0;
 | 
| -
 | 
| +       redundancy_bytes = 0;
 | 
| +    }
 | 
|      if (st->mode != MODE_CELT_ONLY)start_band=17;
 | 
|  
 | 
|      if (st->mode == MODE_SILK_ONLY)
 | 
| 
 |