diff --git a/src/opus_encoder.c b/src/opus_encoder.c index a4375df3b706568c172d706498bd05db13da805b..8d4d0e40513ab071a8050c8b1d5c0be3becc8601 100644 --- a/src/opus_encoder.c +++ b/src/opus_encoder.c @@ -118,10 +118,12 @@ int opus_encode(OpusEncoder *st, const short *pcm, int frame_size, int to_celt = 0; celt_int32 mono_rate; + /* Rete-dependent mono-stereo decision */ if (st->channels == 2) { celt_int32 decision_rate; decision_rate = st->bitrate_bps + st->voice_ratio*st->voice_ratio; + /* Add some hysteresis */ if (st->stream_channels == 2) decision_rate += 4000; else @@ -145,7 +147,9 @@ int opus_encode(OpusEncoder *st, const short *pcm, int frame_size, if (st->user_mode==OPUS_MODE_AUTO) { celt_int32 decision_rate; + /* SILK/CELT threshold is higher for voice than for music */ decision_rate = mono_rate - 3*st->voice_ratio*st->voice_ratio; + /* Hysteresis */ if (st->prev_mode == MODE_CELT_ONLY) decision_rate += 4000; else if (st->prev_mode>0) @@ -161,7 +165,7 @@ int opus_encode(OpusEncoder *st, const short *pcm, int frame_size, st->mode = MODE_CELT_ONLY; } - /* Bandwidth selection */ + /* Automatic (rate-dependent) bandwidth selection */ if (st->mode == MODE_CELT_ONLY) { if (mono_rate>35000 || (mono_rate>28000 && st->bandwidth==BANDWIDTH_FULLBAND)) @@ -184,10 +188,14 @@ int opus_encode(OpusEncoder *st, const short *pcm, int frame_size, st->bandwidth = BANDWIDTH_MEDIUMBAND; else st->bandwidth = BANDWIDTH_NARROWBAND; + /* Prevents any transition to SWB/FB until the SILK layer has fully + switched to WB mode and turned the variable LP filter off */ if (!st->silk_mode.inWBmodeWithoutVariableLP && st->bandwidth > BANDWIDTH_WIDEBAND) st->bandwidth = BANDWIDTH_WIDEBAND; } + /* Prevents Opus from wasting bits on frequencies that are above + the Nyquist rate of the input signal */ if (st->Fs <= 24000 && st->bandwidth > BANDWIDTH_SUPERWIDEBAND) st->bandwidth = BANDWIDTH_SUPERWIDEBAND; if (st->Fs <= 16000 && st->bandwidth > BANDWIDTH_WIDEBAND) @@ -200,7 +208,7 @@ int opus_encode(OpusEncoder *st, const short *pcm, int frame_size, if (st->user_bandwidth != BANDWIDTH_AUTO) st->bandwidth = st->user_bandwidth; - /* Preventing non-sensical configurations */ + /* Prevents nonsensical configurations, i.e. modes that don't exist */ if (frame_size < st->Fs/100 && st->mode != MODE_CELT_ONLY) st->mode = MODE_CELT_ONLY; if (frame_size > st->Fs/50 && st->mode != MODE_SILK_ONLY)