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) |