Fixes weird LFE bug
authorJean-Marc Valin <jmvalin@jmvalin.ca>
Mon, 14 Oct 2013 21:33:53 +0000 (17:33 -0400)
committerJean-Marc Valin <jmvalin@jmvalin.ca>
Mon, 14 Oct 2013 21:33:53 +0000 (17:33 -0400)
The LFE encoder would first decide to switch to SILK, and allocated
redundancy bytes. Then, it would force CELT because of LFE, but keep
the redundancy allocation, and end up with too few bytes, that would
end up being padded to the desired size for CBR.

src/opus_encoder.c

index bdacb6b..eff0af7 100644 (file)
@@ -1195,6 +1195,8 @@ opus_int32 opus_encode_native(OpusEncoder *st, const opus_val16 *pcm, int frame_
     /* Override the chosen mode to make sure we meet the requested frame size */
     if (st->mode != MODE_CELT_ONLY && frame_size < st->Fs/100)
        st->mode = MODE_CELT_ONLY;
+    if (st->lfe)
+       st->mode = MODE_CELT_ONLY;
 
     if (st->stream_channels == 1 && st->prev_channels ==2 && st->silk_mode.toMono==0
           && st->mode != MODE_CELT_ONLY && st->prev_mode != MODE_CELT_ONLY)
@@ -1357,10 +1359,7 @@ opus_int32 opus_encode_native(OpusEncoder *st, const opus_val16 *pcm, int frame_
     if (st->mode == MODE_CELT_ONLY && st->bandwidth == OPUS_BANDWIDTH_MEDIUMBAND)
         st->bandwidth = OPUS_BANDWIDTH_WIDEBAND;
     if (st->lfe)
-    {
        st->bandwidth = OPUS_BANDWIDTH_NARROWBAND;
-       st->mode = MODE_CELT_ONLY;
-    }
 
     /* Can't support higher than wideband for >20 ms frames */
     if (frame_size > st->Fs/50 && (st->mode == MODE_CELT_ONLY || st->bandwidth > OPUS_BANDWIDTH_WIDEBAND))