shithub: opus

Download patch

ref: 8623012b30035dae057ef91dc4438f18a2c9801d
parent: 0edb3954e863218f756cc637ecd10eb742b115b6
author: Jean-Marc Valin <jmvalin@amazon.com>
date: Tue Dec 6 11:09:39 EST 2022

DRED integration work in progress

--- a/silk/dred_decoder.c
+++ b/silk/dred_decoder.c
@@ -47,7 +47,7 @@
     DRED_rdovae_destroy_decoder(dec->rdovae_dec);
 }
 
-void dred_decode_redundancy_package(DREDDec *dec, float *features, opus_uint8 *bytes, int num_bytes)
+void dred_decode_redundancy_package(DREDDec *dec, float *features, const 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();
@@ -64,7 +64,7 @@
     celt_assert(DRED_NUM_REDUNDANCY_FRAMES % 2 == 0);
 
     /* decode initial state and initialize RDOVAE decoder */
-    ec_dec_init(&dec->ec_dec, bytes, num_bytes);
+    ec_dec_init(&dec->ec_dec, (unsigned char*)bytes, num_bytes);
     dred_decode_state(&dec->ec_dec, state);
     DRED_rdovae_dec_init_states(dec->rdovae_dec, state);
 
@@ -87,4 +87,4 @@
             features + offset,
             latents);
     }
-}
\ No newline at end of file
+}
--- a/silk/dred_decoder.h
+++ b/silk/dred_decoder.h
@@ -39,4 +39,4 @@
 
 void dred_deinit_decoder(DREDDec *dec);
 
-void dred_decode_redundancy_package(DREDDec *dec, float *features, opus_uint8 *bytes, int num_bytes);
+void dred_decode_redundancy_package(DREDDec *dec, float *features, const opus_uint8 *bytes, int num_bytes);
--- a/silk/structs.h
+++ b/silk/structs.h
@@ -38,7 +38,10 @@
 #include "lpcnet.h"
 #endif
 
+#ifdef ENABLE_NEURAL_FEC
 #include "dred_encoder.h"
+#include "dred_decoder.h"
+#endif
 
 #ifdef __cplusplus
 extern "C"
@@ -258,6 +261,10 @@
 #ifdef NEURAL_PLC
     /* FIXME: We should include the state struct directly to preserve the state shadow copy property. */
     LPCNetPLCState              *lpcnet;
+#ifdef ENABLE_NEURAL_FEC
+    DREDDec                     dred_decoder;
+    float                       fec_features[2*DRED_NUM_REDUNDANCY_FRAMES*DRED_NUM_FEATURES];
+#endif
 #endif
 } silk_PLC_struct;
 
--- a/src/opus_decoder.c
+++ b/src/opus_decoder.c
@@ -1054,6 +1054,8 @@
    
    /* Get the padding section of the packet. */
    ret = opus_packet_parse_impl(data, len, 0, NULL, frames, size, NULL, NULL, &data0, &len0);
+   if (ret < 0)
+      return ret;
    data = data0;
    len = len0;
    /* Scan extensions in order until we find the earliest frame with DRED data. */
@@ -1085,6 +1087,9 @@
    }
    if (payload != NULL)
    {
+      silk_decoder_state *silk_dec;
+      silk_dec = (silk_decoder_state*)((char*)st+st->silk_dec_offset);
+      dred_decode_redundancy_package(&silk_dec->sPLC.dred_decoder, silk_dec->sPLC.fec_features, payload, payload_len);
       /* Found something -- do the decoding. */
       return 1;
    }
--- a/src/opus_encoder.c
+++ b/src/opus_encoder.c
@@ -2179,8 +2179,10 @@
     }
     /* Count ToC and redundancy */
     ret += 1+redundancy_bytes;
-    if (0) {
-       opus_extension_data extension = {127, 0, (const unsigned char *)"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", 50};
+#ifdef ENABLE_NEURAL_FEC
+    if (1) {
+       DREDEnc *dred = &((silk_encoder*)silk_enc)->state_Fxx[0].sCmn.dred_encoder;
+       opus_extension_data extension = {127, 0, dred->ec_buffer, dred->ec_encoder.storage};
        ret = opus_packet_pad_impl(data, ret, max_data_bytes, !st->use_vbr, &extension, 1);
        if (ret < 0)
        {
@@ -2187,7 +2189,9 @@
           RESTORE_STACK;
           return OPUS_INTERNAL_ERROR;
        }
-    } else if (!st->use_vbr)
+    } else
+#endif
+    if (!st->use_vbr)
     {
        if (opus_packet_pad(data, ret, max_data_bytes) != OPUS_OK)
        {
--