diff options
author | Jean-Marc Valin <jmvalin@jmvalin.ca> | 2016-05-31 20:49:41 -0400 |
---|---|---|
committer | Jean-Marc Valin <jmvalin@jmvalin.ca> | 2016-06-02 15:13:36 -0400 |
commit | 10fdd00c563ebed27b61e6a199942f20c12f99e5 (patch) | |
tree | 619e816d987d461e0d9e78e6d69a37ba23101b8c | |
parent | 11bbb7d3ec9aa37b968017e2da62966c373b118e (diff) | |
download | opus-10fdd00c563ebed27b61e6a199942f20c12f99e5.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.
-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 70be249c..1e222e00 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; @@ -1468,7 +1470,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; @@ -1476,7 +1478,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) |