Implements OPUS_RESET_STATE for the decoder (untested)
This commit is contained in:
parent
ec8008b086
commit
0446563010
2 changed files with 30 additions and 9 deletions
|
@ -157,6 +157,8 @@ extern "C" {
|
|||
#define OPUS_GET_LOOKAHEAD_REQUEST 27
|
||||
#define OPUS_GET_LOOKAHEAD(x) OPUS_GET_LOOKAHEAD_REQUEST, __opus_check_int_ptr(x)
|
||||
|
||||
#define OPUS_RESET_STATE 28
|
||||
|
||||
/* For testing purposes: the encoder and decoder state should
|
||||
always be identical after coding a payload */
|
||||
#define OPUS_GET_FINAL_RANGE_REQUEST 29
|
||||
|
|
|
@ -50,11 +50,13 @@ struct OpusDecoder {
|
|||
int celt_dec_offset;
|
||||
int silk_dec_offset;
|
||||
int channels;
|
||||
int Fs; /** Sampling rate (at the API level) */
|
||||
|
||||
/* Everything beyond this point gets cleared on a reset */
|
||||
#define OPUS_DECODER_RESET_START stream_channels
|
||||
int stream_channels;
|
||||
|
||||
int bandwidth;
|
||||
/* Sampling rate (at the API level) */
|
||||
int Fs;
|
||||
int mode;
|
||||
int prev_mode;
|
||||
int frame_size;
|
||||
|
@ -216,7 +218,6 @@ static int opus_decode_frame(OpusDecoder *st, const unsigned char *data,
|
|||
{
|
||||
data = NULL;
|
||||
/* In that case, don't conceal more than what the ToC says */
|
||||
/* FIXME: What if st->frame_size has never been set? */
|
||||
frame_size = IMIN(frame_size, st->frame_size);
|
||||
}
|
||||
if (data != NULL)
|
||||
|
@ -759,6 +760,24 @@ int opus_decoder_ctl(OpusDecoder *st, int request, ...)
|
|||
*value = st->rangeFinal;
|
||||
}
|
||||
break;
|
||||
case OPUS_RESET_STATE:
|
||||
{
|
||||
void *silk_dec;
|
||||
CELTDecoder *celt_dec;
|
||||
|
||||
silk_dec = (char*)st+st->silk_dec_offset;
|
||||
celt_dec = (CELTDecoder*)((char*)st+st->celt_dec_offset);
|
||||
|
||||
OPUS_CLEAR((char*)&st->OPUS_DECODER_RESET_START,
|
||||
opus_decoder_get_size(st->channels)-
|
||||
((char*)&st->OPUS_DECODER_RESET_START - (char*)st));
|
||||
|
||||
celt_decoder_ctl(celt_dec, CELT_RESET_STATE);
|
||||
silk_InitDecoder( silk_dec );
|
||||
st->stream_channels = st->channels;
|
||||
st->frame_size = st->Fs/400;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
/*fprintf(stderr, "unknown opus_decoder_ctl() request: %d", request);*/
|
||||
ret = OPUS_BAD_ARG;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue