Relying on SILK for the switching decisions

This commit is contained in:
Jean-Marc Valin 2011-04-28 08:04:20 -04:00
parent 897f5a568a
commit c1673fa9c6
3 changed files with 27 additions and 29 deletions

2
silk

@ -1 +1 @@
Subproject commit f90395ba0669dc1c2749ca671cca965cc6dcda8e Subproject commit 8a8b76efeeccaccf402b0b2b4e469980d0a48311

View file

@ -87,7 +87,7 @@ OpusEncoder *opus_encoder_create(int Fs, int channels)
st->user_mode = OPUS_MODE_AUTO; st->user_mode = OPUS_MODE_AUTO;
st->user_bandwidth = BANDWIDTH_AUTO; st->user_bandwidth = BANDWIDTH_AUTO;
st->voice_ratio = 90; st->voice_ratio = 90;
st->bandwidth_change = 1; st->first = 1;
st->encoder_buffer = st->Fs/100; st->encoder_buffer = st->Fs/100;
st->delay_compensation = st->Fs/400; st->delay_compensation = st->Fs/400;
@ -160,8 +160,6 @@ int opus_encode(OpusEncoder *st, const short *pcm, int frame_size,
} }
/* Bandwidth selection */ /* Bandwidth selection */
if (st->bandwidth_change)
{
if (st->mode == MODE_CELT_ONLY) if (st->mode == MODE_CELT_ONLY)
{ {
if (mono_rate>35000 || (mono_rate>28000 && st->bandwidth==BANDWIDTH_FULLBAND)) if (mono_rate>35000 || (mono_rate>28000 && st->bandwidth==BANDWIDTH_FULLBAND))
@ -172,7 +170,8 @@ int opus_encode(OpusEncoder *st, const short *pcm, int frame_size,
st->bandwidth = BANDWIDTH_WIDEBAND; st->bandwidth = BANDWIDTH_WIDEBAND;
else else
st->bandwidth = BANDWIDTH_NARROWBAND; st->bandwidth = BANDWIDTH_NARROWBAND;
} else { } else if (st->first || st->silk_mode.allowBandwidthSwitch)
{
if (mono_rate>30000 || (mono_rate>26000 && st->bandwidth==BANDWIDTH_FULLBAND)) if (mono_rate>30000 || (mono_rate>26000 && st->bandwidth==BANDWIDTH_FULLBAND))
st->bandwidth = BANDWIDTH_FULLBAND; st->bandwidth = BANDWIDTH_FULLBAND;
else if (mono_rate>22000 || (mono_rate>18000 && st->bandwidth==BANDWIDTH_SUPERWIDEBAND)) else if (mono_rate>22000 || (mono_rate>18000 && st->bandwidth==BANDWIDTH_SUPERWIDEBAND))
@ -183,7 +182,8 @@ int opus_encode(OpusEncoder *st, const short *pcm, int frame_size,
st->bandwidth = BANDWIDTH_MEDIUMBAND; st->bandwidth = BANDWIDTH_MEDIUMBAND;
else else
st->bandwidth = BANDWIDTH_NARROWBAND; st->bandwidth = BANDWIDTH_NARROWBAND;
} if (!st->silk_mode.inWBmodeWithoutVariableLP && st->bandwidth > BANDWIDTH_WIDEBAND)
st->bandwidth = BANDWIDTH_WIDEBAND;
} }
if (st->Fs <= 24000 && st->bandwidth > BANDWIDTH_SUPERWIDEBAND) if (st->Fs <= 24000 && st->bandwidth > BANDWIDTH_SUPERWIDEBAND)
@ -298,7 +298,6 @@ int opus_encode(OpusEncoder *st, const short *pcm, int frame_size,
fprintf (stderr, "SILK encode error: %d\n", ret); fprintf (stderr, "SILK encode error: %d\n", ret);
/* Handle error */ /* Handle error */
} }
st->bandwidth_change = nBytes==0 || (enc.buf[0]&0x80)==0;
if (nBytes==0) if (nBytes==0)
return 0; return 0;
/* Extract SILK internal bandwidth for signaling in first byte */ /* Extract SILK internal bandwidth for signaling in first byte */
@ -313,8 +312,6 @@ int opus_encode(OpusEncoder *st, const short *pcm, int frame_size,
} else { } else {
SKP_assert( st->silk_mode.internalSampleRate == 16000 ); SKP_assert( st->silk_mode.internalSampleRate == 16000 );
} }
} else {
st->bandwidth_change = 1;
} }
/* CELT processing */ /* CELT processing */
@ -493,6 +490,7 @@ int opus_encode(OpusEncoder *st, const short *pcm, int frame_size,
st->prev_mode = MODE_CELT_ONLY; st->prev_mode = MODE_CELT_ONLY;
else else
st->prev_mode = st->mode; st->prev_mode = st->mode;
st->first = 0;
return ret+1+redundancy_bytes; return ret+1+redundancy_bytes;
} }

View file

@ -55,7 +55,7 @@ struct OpusEncoder {
int bitrate_bps; int bitrate_bps;
int encoder_buffer; int encoder_buffer;
int delay_compensation; int delay_compensation;
int bandwidth_change; int first;
short delay_buffer[MAX_ENCODER_BUFFER*2]; short delay_buffer[MAX_ENCODER_BUFFER*2];
#ifdef OPUS_TEST_RANGE_CODER_STATE #ifdef OPUS_TEST_RANGE_CODER_STATE