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

View file

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