diff options
author | Jean-Marc Valin <jmvalin@jmvalin.ca> | 2016-05-31 20:49:41 -0400 |
---|---|---|
committer | Jean-Marc Valin <jmvalin@jmvalin.ca> | 2016-07-17 15:05:54 -0400 |
commit | 691f6f931b69e85d2a31838313bdd7d04ba460c0 (patch) | |
tree | d26b1981e96e7fe4bc63ce3cfc075d6e092bc857 /src/opus_encoder.c | |
parent | 78fc664c0c339c5fa73409fca56126cc65452566 (diff) | |
download | opus-691f6f931b69e85d2a31838313bdd7d04ba460c0.tar.gz |
Fixing bandwidth selection hysteresis
Previously, the bandwidth detection could (e.g.) change the bandwidth
from fullband to superwideband, and the hysteresis would then cause
bandwidth to be stuck in superwideband.
Diffstat (limited to 'src/opus_encoder.c')
-rw-r--r-- | src/opus_encoder.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/src/opus_encoder.c b/src/opus_encoder.c index 671e8d21..49f9f5b5 100644 --- a/src/opus_encoder.c +++ b/src/opus_encoder.c @@ -102,6 +102,8 @@ struct OpusEncoder { int prev_channels; int prev_framesize; int bandwidth; + /* Bandwidth determined automatically from the rate (before any other adjustment) */ + int auto_bandwidth; int silk_bw_switch; /* Sampling rate (at the API level) */ int first; @@ -1477,7 +1479,7 @@ opus_int32 opus_encode_native(OpusEncoder *st, const opus_val16 *pcm, int frame_ hysteresis = bandwidth_thresholds[2*(bandwidth-OPUS_BANDWIDTH_MEDIUMBAND)+1]; if (!st->first) { - if (st->bandwidth >= bandwidth) + if (st->auto_bandwidth >= bandwidth) threshold -= hysteresis; else threshold += hysteresis; @@ -1485,7 +1487,7 @@ opus_int32 opus_encode_native(OpusEncoder *st, const opus_val16 *pcm, int frame_ if (equiv_rate >= threshold) break; } while (--bandwidth>OPUS_BANDWIDTH_NARROWBAND); - st->bandwidth = bandwidth; + st->bandwidth = st->auto_bandwidth = bandwidth; /* 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->first && st->mode != MODE_CELT_ONLY && !st->silk_mode.inWBmodeWithoutVariableLP && st->bandwidth > OPUS_BANDWIDTH_WIDEBAND) |