Update Opus range coder due to CELT refactoring.
[opus.git] / src / opus_encoder.c
index a6fda2e..2fe0f5d 100644 (file)
@@ -95,7 +95,6 @@ int opus_encode(OpusEncoder *st, const short *pcm, int frame_size,
        int ret=0;
        SKP_int32 nBytes;
        ec_enc enc;
-       ec_byte_buffer buf;
        int framerate, period;
     int silk_internal_bandwidth;
     int bytes_target;
@@ -103,17 +102,29 @@ int opus_encode(OpusEncoder *st, const short *pcm, int frame_size,
        bytes_target = st->bitrate_bps * frame_size / (st->Fs * 8) - 1;
 
        data += 1;
-       ec_byte_writeinit_buffer(&buf, data, max_data_bytes-1);
-       ec_enc_init(&enc,&buf);
+       ec_enc_init(&enc, data, max_data_bytes-1);
 
        /* SILK processing */
-    if (st->mode != MODE_CELT_ONLY)
-    {
+    if (st->mode != MODE_CELT_ONLY) {
         st->silk_mode.bitRate = st->bitrate_bps - 8*st->Fs/frame_size;
         if( st->mode == MODE_HYBRID ) {
-            /* FIXME: Tune this offset */
-            st->silk_mode.bitRate = (st->silk_mode.bitRate + 12000) / 2;
-            /* FIXME: Adjust for 10 ms frames */
+            if( st->bandwidth == BANDWIDTH_SUPERWIDEBAND ) {
+                if( st->Fs == 100 * frame_size ) {
+                    /* 24 kHz, 10 ms */
+                    st->silk_mode.bitRate = ( ( st->silk_mode.bitRate + 12000 - ( 1 - st->use_vbr ) * 10000 ) * 2 ) / 3;
+                } else {
+                    /* 24 kHz, 20 ms */
+                    st->silk_mode.bitRate = ( ( st->silk_mode.bitRate + 8000 - ( 1 - st->use_vbr ) * 7000 ) * 2 ) / 3;
+                }
+            } else {
+                if( st->Fs == 100 * frame_size ) {
+                    /* 48 kHz, 10 ms */
+                    st->silk_mode.bitRate = ( st->silk_mode.bitRate + 16000 - ( 1 - st->use_vbr ) * 8000 ) / 2;
+                } else {
+                    /* 48 kHz, 20 ms */
+                       st->silk_mode.bitRate = ( st->silk_mode.bitRate + 14000 - ( 1 - st->use_vbr ) * 5000 ) / 2;
+                }
+            }
         }
 
         st->silk_mode.payloadSize_ms = 1000 * frame_size / st->Fs;
@@ -181,7 +192,7 @@ int opus_encode(OpusEncoder *st, const short *pcm, int frame_size,
             int len;
             celt_encoder_ctl(st->celt_enc, CELT_SET_START_BAND(17));
 
-            len = (ec_enc_tell(&enc, 0)+7)>>3;
+            len = (ec_tell(&enc)+7)>>3;
             if( st->use_vbr ) {
                 nb_compr_bytes = len + (st->bitrate_bps - 12000) * frame_size / (2 * 8 * st->Fs);
             } else {
@@ -205,14 +216,14 @@ int opus_encode(OpusEncoder *st, const short *pcm, int frame_size,
         for (;i<frame_size*st->channels;i++)
             pcm_buf[i] = pcm[i-ENCODER_DELAY_COMPENSATION*st->channels];
 
-        ec_byte_shrink(&buf, nb_compr_bytes);
+        ec_enc_shrink(&enc, nb_compr_bytes);
 
            /* Encode high band with CELT */
            ret = celt_encode_with_ec(st->celt_enc, pcm_buf, frame_size, NULL, nb_compr_bytes, &enc);
            for (i=0;i<ENCODER_DELAY_COMPENSATION*st->channels;i++)
                st->delay_buffer[i] = pcm[frame_size*st->channels-ENCODER_DELAY_COMPENSATION*st->channels+i];
        } else {
-           ret = (ec_enc_tell(&enc, 0)+7)>>3;
+           ret = (ec_tell(&enc)+7)>>3;
            ec_enc_done(&enc);
        }
 
@@ -320,6 +331,7 @@ void opus_encoder_ctl(OpusEncoder *st, int request, ...)
         {
             int value = va_arg(ap, int);
             st->silk_mode.complexity = value;
+            celt_encoder_ctl(st->celt_enc, CELT_SET_COMPLEXITY(value));
         }
         break;
         case OPUS_GET_COMPLEXITY_REQUEST: