Neither the encoder nor decoder were incrementing the side-channel
index for a mid-only frame.
Unfortunately, they used that index to index the VAD flags and LBRR
flags.
This made the VAD flags for the side channel particularly useless,
as you couldn't tell which frame a flag belonged to without
decoding most of the packet.
It also desynched the LBRR information, as look at the wrong LBRR
flags to decide when it had to code a mid-only flag.
If some frames were skipped in the side channel, then the last few
VAD flags and LBRR flags would be garbage, but still get encoded.
This patch fixes this by continuing to increment nFramesDecoded or
nFramesEncoded, even when skipping a frame in the side channel.
This makes the side-channel VAD and LBRR flags correspond to the
correct time periods for frames greater than 20 ms.
It also fixes a bug where if DTX was not used on the packet where
the side channel got turned off, it would never get used again
until the encoder attempted to encode something in the side
channel again.
b24e5746 introduced changes to LastGainIndex which broke
conditional coding for side frames after a mid-only frame (i.e.,
in a 60 ms frame where the side is coded, not coded, then coded
again).
These rules were a mess in general, however, because the side
channel state kept a different nFramesDecoded count from the mid
channel state, and had no way to tell if the prior side frame was
coded.
This patch attempts to rationalize them by moving the conditional
coding decision up to the top level, where all this information is
available.
The first coded side frame after an uncoded side frame now always
uses independent coding.
If such a frame is also not the first side frame in an Opus frame,
then it doesn't include an LTP scaling parameter (because the LTP
state is well-defined).
- There was a bug where the decoder resampler was not properly initialized
when fs_kHz == API_fs_kHz. In that case the resampler would continue to
upsample, and the output was corrupt.
- The delay value in the decoder was taken from the state before it was
potentially updated. This caused the decoder to apply the new dalay value one
frame late
- The encoder and decoder states are now updated more consistently, when
the sampling rate changes (pesq liked these changes)
- Properly resetting the side channel encoder and decoder for the first
frame with side coding active again
- Faster updating the "ratio" value in the LR_to_MS() code for large
prediction values means that for certain extreme/artificial input
signals the output looks better
- increases the max pitch lag by 1 (the thing Tim pointed out). this brings the decoder in sync with the old one
- avoids that the first stereo frame is collapsed to mono
1) averaging the output of the left and right resampling states when
switching to mono
2) averaging the the delay buffers from left and right when switching
Adds SILK delay compensation that depends on encode and decode sampling
rate, as well as SILK internal coding rate. This ensures that the SILK
part of Opus is always in sync with the CELT part no matter what the
sampling rates are. It also increases the resampling delay to 1.15 ms
(was previously 0.48 ms).
Simplifies mono/stereo switching in SILK
Fixes a quantization mismatch between encoder and decoder
Constrains the pitch lags in the same way in the encoder and decoder
Delaying stereo->mono switching decisions so that SILK can do a smooth
downmix. Also, wrote proper float/fixed code for the hybrid variable
stereo collapse, including a smooth downmix for stereo<->mono switching