SILK bugfix
[opus.git] / src / opus_encoder.c
index 2334aa2..4ac580e 100644 (file)
@@ -95,6 +95,8 @@ int opus_encode(OpusEncoder *st, const short *pcm, int frame_size,
     int silk_internal_bandwidth;
     int bytes_target;
     int prefill=0;
+    int start_band;
+    int redundancy = 0;
 
        bytes_target = st->bitrate_bps * frame_size / (st->Fs * 8) - 1;
 
@@ -155,7 +157,10 @@ int opus_encode(OpusEncoder *st, const short *pcm, int frame_size,
         /* Call SILK encoder for the low band */
         nBytes = max_data_bytes-1;
         if (prefill)
-               SKP_Silk_SDK_Encode( st->silk_enc, &st->silk_mode, st->delay_buffer, ENCODER_BUFFER, NULL, 0, 1 );
+        {
+            int zero=0;
+               SKP_Silk_SDK_Encode( st->silk_enc, &st->silk_mode, st->delay_buffer, ENCODER_BUFFER, NULL, &zero, 1 );
+        }
 
         ret = SKP_Silk_SDK_Encode( st->silk_enc, &st->silk_mode, pcm, frame_size, &enc, &nBytes, 0 );
         if( ret ) {
@@ -179,7 +184,7 @@ int opus_encode(OpusEncoder *st, const short *pcm, int frame_size,
     /* CELT processing */
        if (st->mode != MODE_SILK_ONLY)
        {
-               int endband;
+           int endband;
            short pcm_buf[960*2];
            int nb_compr_bytes;
 
@@ -213,10 +218,20 @@ int opus_encode(OpusEncoder *st, const short *pcm, int frame_size,
         } else {
                celt_encoder_ctl(st->celt_enc, CELT_SET_PREDICTION(2));
         }
+
+        start_band = 0;
+        if (st->mode == MODE_HYBRID)
+        {
+            /* Check if we have a redundant 0-8 kHz band */
+            ec_enc_bit_logp(&enc, redundancy, 12);
+            if (!redundancy)
+                start_band = 17;
+        }
+        celt_encoder_ctl(st->celt_enc, CELT_SET_START_BAND(start_band));
+
         if (st->mode == MODE_HYBRID)
         {
             int len;
-            celt_encoder_ctl(st->celt_enc, CELT_SET_START_BAND(17));
 
             len = (ec_tell(&enc)+7)>>3;
             if( st->use_vbr ) {
@@ -226,7 +241,6 @@ int opus_encode(OpusEncoder *st, const short *pcm, int frame_size,
                 nb_compr_bytes = len > bytes_target ? len : bytes_target;
             }
         } else {
-            celt_encoder_ctl(st->celt_enc, CELT_SET_START_BAND(0));
             if (st->use_vbr)
             {
                 celt_encoder_ctl(st->celt_enc, CELT_SET_VBR(1));