summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Buethe <jbuethe@amazon.de>2022-10-26 12:12:12 +0000
committerJan Buethe <jbuethe@amazon.de>2022-10-26 12:12:12 +0000
commit370d9b26eb93766a0e86df90b76ddf4eb3cd2c38 (patch)
tree8de8a13077cb03dba84724f1abc8413d157d6fff
parent7c423e61aacc582e846b593974544e508306bf21 (diff)
downloadopus-370d9b26eb93766a0e86df90b76ddf4eb3cd2c38.tar.gz
implemented DRED packet decoder
m---------lpcnet0
-rw-r--r--silk/dred_config.h2
-rw-r--r--silk/dred_decoder.c59
-rw-r--r--silk/dred_decoder.h4
-rw-r--r--silk/dred_encoder.c27
-rw-r--r--silk/dred_encoder.h2
-rw-r--r--silk_sources.mk3
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