diff options
author | Jean-Marc Valin <jmvalin@amazon.com> | 2022-12-07 01:43:29 -0500 |
---|---|---|
committer | Jean-Marc Valin <jmvalin@amazon.com> | 2022-12-07 01:43:29 -0500 |
commit | ee8d0733e12f32700ea544b03c7c20f5aaaf4b9d (patch) | |
tree | 6ccf8ef78f71845ab6c7de3804607b7cc118ba73 | |
parent | 97fa4393589d00fbc541d7b7fb36c82032ab9e09 (diff) | |
download | opus-ee8d0733e12f32700ea544b03c7c20f5aaaf4b9d.tar.gz |
DRED: Decode variable number of frames
-rw-r--r-- | silk/dred_decoder.c | 7 | ||||
-rw-r--r-- | silk/dred_decoder.h | 2 | ||||
-rw-r--r-- | silk/structs.h | 1 | ||||
-rw-r--r-- | src/opus_decoder.c | 6 |
4 files changed, 10 insertions, 6 deletions
diff --git a/silk/dred_decoder.c b/silk/dred_decoder.c index acbe091d..21509c44 100644 --- a/silk/dred_decoder.c +++ b/silk/dred_decoder.c @@ -47,7 +47,7 @@ void dred_deinit_decoder(DREDDec *dec) DRED_rdovae_destroy_decoder(dec->rdovae_dec); } -void dred_decode_redundancy_package(DREDDec *dec, float *features, const opus_uint8 *bytes, int num_bytes) +int dred_decode_redundancy_package(DREDDec *dec, float *features, const opus_uint8 *bytes, int num_bytes, int max_fec_frames) { const opus_uint16 *p0 = DRED_rdovae_get_p0_pointer(); const opus_uint16 *quant_scales = DRED_rdovae_get_quant_scales_pointer(); @@ -70,7 +70,7 @@ void dred_decode_redundancy_package(DREDDec *dec, float *features, const opus_ui DRED_rdovae_dec_init_states(dec->rdovae_dec, state); /* decode newest to oldest and store oldest to newest */ - for (i = 0; i < DRED_NUM_REDUNDANCY_FRAMES; i += 2) + for (i = 0; i < IMIN(DRED_NUM_REDUNDANCY_FRAMES, (max_fec_frames+1)/2); i += 2) { /* FIXME: Figure out how to avoid missing a last frame that would take up < 8 bits. */ if (8*num_bytes - ec_tell(&ec) <= 7) @@ -85,10 +85,11 @@ void dred_decode_redundancy_package(DREDDec *dec, float *features, const opus_ui p0 + offset ); - offset = (2 * DRED_NUM_REDUNDANCY_FRAMES - 4 - 2 * i) * DRED_NUM_FEATURES; + offset = 2 * i * DRED_NUM_FEATURES; DRED_rdovae_decode_qframe( dec->rdovae_dec, features + offset, latents); } + return 2*i; } diff --git a/silk/dred_decoder.h b/silk/dred_decoder.h index 16f6e74e..2754a3fe 100644 --- a/silk/dred_decoder.h +++ b/silk/dred_decoder.h @@ -38,4 +38,4 @@ void init_dred_decoder(DREDDec *dec); void dred_deinit_decoder(DREDDec *dec); -void dred_decode_redundancy_package(DREDDec *dec, float *features, const opus_uint8 *bytes, int num_bytes); +int dred_decode_redundancy_package(DREDDec *dec, float *features, const opus_uint8 *bytes, int num_bytes, int max_fec_frames); diff --git a/silk/structs.h b/silk/structs.h index c1b95379..32574164 100644 --- a/silk/structs.h +++ b/silk/structs.h @@ -264,6 +264,7 @@ typedef struct { #ifdef ENABLE_NEURAL_FEC DREDDec dred_decoder; float fec_features[2*DRED_NUM_REDUNDANCY_FRAMES*DRED_NUM_FEATURES]; + int nb_fec_frames; #endif #endif } silk_PLC_struct; diff --git a/src/opus_decoder.c b/src/opus_decoder.c index ac308754..c7ae597a 100644 --- a/src/opus_decoder.c +++ b/src/opus_decoder.c @@ -1090,11 +1090,13 @@ int opus_decoder_dred_input(OpusDecoder *st, const unsigned char *data, } if (payload != NULL) { + int max_fec_frames; silk_decoder_state *silk_dec; silk_dec = (silk_decoder_state*)((char*)st+st->silk_dec_offset); /*printf("Found: %p of size %d\n", payload, payload_len);*/ - dred_decode_redundancy_package(&silk_dec->sPLC.dred_decoder, silk_dec->sPLC.fec_features, payload, payload_len); - /* Found something -- do the decoding. */ + max_fec_frames = IMIN(2 + offset, 2*DRED_NUM_REDUNDANCY_FRAMES); + silk_dec->sPLC.nb_fec_frames = dred_decode_redundancy_package(&silk_dec->sPLC.dred_decoder, silk_dec->sPLC.fec_features, payload, payload_len, max_fec_frames); + /*printf("%d\n", silk_dec->sPLC.nb_fec_frames);*/ return 1; } return 0; |