summaryrefslogtreecommitdiff
path: root/silk/dred_decoder.c
diff options
context:
space:
mode:
Diffstat (limited to 'silk/dred_decoder.c')
-rw-r--r--silk/dred_decoder.c59
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