diff options
m--------- | lpcnet | 0 | ||||
-rw-r--r-- | silk/dred_config.h | 2 | ||||
-rw-r--r-- | silk/dred_decoder.c | 59 | ||||
-rw-r--r-- | silk/dred_decoder.h | 4 | ||||
-rw-r--r-- | silk/dred_encoder.c | 27 | ||||
-rw-r--r-- | silk/dred_encoder.h | 2 | ||||
-rw-r--r-- | silk_sources.mk | 3 |
7 files changed, 92 insertions, 5 deletions
diff --git a/lpcnet b/lpcnet -Subproject b7dc36526a90df74e7b4f11ed3e0a6543b79e5a +Subproject feb09ac00288c0ff5317b33a027a72d8135fd78 diff --git a/silk/dred_config.h b/silk/dred_config.h index 6a059abb..fc35760b 100644 --- a/silk/dred_config.h +++ b/silk/dred_config.h @@ -37,4 +37,4 @@ #define DRED_MAX_DATA_SIZE 1000 #define DRED_ENC_Q0 9 #define DRED_ENC_Q1 15 -#define DRED_NUM_REDUNDANCY_FRAMES 50
\ No newline at end of file +#define DRED_NUM_REDUNDANCY_FRAMES 50 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 diff --git a/silk/dred_decoder.h b/silk/dred_decoder.h index 98da6e78..f2df6fd0 100644 --- a/silk/dred_decoder.h +++ b/silk/dred_decoder.h @@ -30,11 +30,13 @@ #include "entcode.h" typedef struct { - ec_enc ec_encoder; + ec_dec ec_dec; RDOVAEDec *rdovae_dec; } DREDDec; void init_dred_decoder(DREDDec *dec); +void dred_deinit_decoder(DREDDec *dec); + void dred_decode_redundancy_package(DREDDec *dec, float *features, opus_uint8 *bytes, int num_bytes); diff --git a/silk/dred_encoder.c b/silk/dred_encoder.c index 8628863d..d799a5e2 100644 --- a/silk/dred_encoder.c +++ b/silk/dred_encoder.c @@ -27,8 +27,10 @@ #include <string.h> +#if 1 #include <stdio.h> #include <math.h> +#endif #ifdef HAVE_CONFIG_H #include "config.h" @@ -38,6 +40,8 @@ #include "dred_coding.h" #include "celt/entenc.h" +#include "dred_decoder.h" + void init_dred_encoder(DREDEnc* enc) { memset(enc, 0, sizeof(*enc)); @@ -112,6 +116,29 @@ void dred_encode_silk_frame(DREDEnc *enc, const opus_int16 *silk_frame) fwrite(ec_get_buffer(&enc->ec_encoder), 1, bytes, fbs); #endif +#if 0 + DREDDec dec; + float dec_features[2 * DRED_NUM_REDUNDANCY_FRAMES * DRED_NUM_FEATURES]; + float zeros[36 - 20] = {0}; + + init_dred_decoder(&dec); + dred_decode_redundancy_package(&dec, dec_features, ec_get_buffer(&enc->ec_encoder), bytes); + + static FILE *fid; + if (fid == NULL) + { + fid = fopen("features_rdovae.f32", "wb"); + } + + int foffset = (2*DRED_NUM_REDUNDANCY_FRAMES - 2) * DRED_NUM_FEATURES; + foffset = 0; + fwrite(&dec_features[foffset], sizeof(float), DRED_NUM_FEATURES, fid); + fwrite(zeros, sizeof(float), 16, fid); + fwrite(&dec_features[foffset + DRED_NUM_FEATURES], sizeof(float), DRED_NUM_FEATURES, fid); + fwrite(zeros, sizeof(float), 16, fid); + + dred_deinit_decoder(&dec); +#endif #if 0 /* trial decoding */ diff --git a/silk/dred_encoder.h b/silk/dred_encoder.h index 90c7c7cd..a8bb7cbf 100644 --- a/silk/dred_encoder.h +++ b/silk/dred_encoder.h @@ -49,6 +49,8 @@ typedef struct { void init_dred_encoder(DREDEnc* enc); +void dred_deinit_encoder(DREDEnc *enc); + void dred_encode_silk_frame(DREDEnc *enc, const opus_int16 *silk_frame); #endif
\ No newline at end of file diff --git a/silk_sources.mk b/silk_sources.mk index eb2d076e..77186878 100644 --- a/silk_sources.mk +++ b/silk_sources.mk @@ -77,7 +77,8 @@ silk/stereo_find_predictor.c \ silk/stereo_quant_pred.c \ silk/LPC_fit.c \ silk/dred_encoder.c \ -silk/dred_coding.c +silk/dred_coding.c \ +silk/dred_decoder.c SILK_SOURCES_X86_RTCD = \ silk/x86/x86_silk_map.c |