diff options
Diffstat (limited to 'silk/dred_decoder.c')
-rw-r--r-- | silk/dred_decoder.c | 59 |
1 files changed, 57 insertions, 2 deletions
diff --git a/silk/dred_decoder.c b/silk/dred_decoder.c index 1a431f84..74a0d9bb 100644 --- a/silk/dred_decoder.c +++ b/silk/dred_decoder.c @@ -25,12 +25,67 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include <string.h> + #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "dred_decoder.h" +#include "dred_coding.h" +#include "celt/entdec.h" + + +void init_dred_decoder(DREDDec *dec) +{ + memset(dec, 0, sizeof(*dec)); + dec->rdovae_dec = DRED_rdovae_create_decoder(); +} + +void dred_deinit_decoder(DREDDec *dec) +{ + DRED_rdovae_destroy_decoder(dec->rdovae_dec); +} + +void dred_decode_redundancy_package(DREDDec *dec, float *features, opus_uint8 *bytes, int num_bytes) +{ + const opus_uint16 *p0 = DRED_rdovae_get_p0_pointer(); + const opus_uint16 *quant_scales = DRED_rdovae_get_quant_scales_pointer(); + const opus_uint16 *r = DRED_rdovae_get_r_pointer(); + + int q_level; + int i; + int offset; + + float state[DRED_STATE_DIM]; + float latents[DRED_LATENT_DIM]; + + /* since features are decoded in quadruples, it makes no sense to go with an uneven number of redundancy frames */ + celt_assert(DRED_NUM_REDUNDANCY_FRAMES % 2 == 0); + + /* decode initial state and initialize RDOVAE decoder */ + ec_dec_init(&dec->ec_dec, bytes, num_bytes); + dred_decode_state(&dec->ec_dec, state); + 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) + { + q_level = (int) round(DRED_ENC_Q0 + 1.f * (DRED_ENC_Q1 - DRED_ENC_Q0) * i / (DRED_NUM_REDUNDANCY_FRAMES - 2)); + offset = q_level * DRED_LATENT_DIM; -void init_dred_decoder(DREDDec *dec); + dred_decode_latents( + &dec->ec_dec, + latents, + quant_scales + offset, + r + offset, + p0 + offset + ); -void dred_decode_redundancy_package(DREDDec *dec, float *features, opus_uint8 *bytes, int num_bytes);
\ No newline at end of file + offset = (2 * DRED_NUM_REDUNDANCY_FRAMES - 4 - 2 * i) * DRED_NUM_FEATURES; + DRED_rdovae_decode_qframe( + dec->rdovae_dec, + features + offset, + latents); + } +}
\ No newline at end of file |