diff options
author | Jean-Marc Valin <jmvalin@amazon.com> | 2023-11-06 11:10:59 +0300 |
---|---|---|
committer | Jean-Marc Valin <jmvalin@amazon.com> | 2023-11-06 11:16:43 +0300 |
commit | 544b3e576c8edd1785914c988882b62d60652f26 (patch) | |
tree | d1dd9e1a90ce85f3fbb462228c7adea29fe10d70 /silk | |
parent | 98b8be09d56d03d220fff3536842c0703bae865c (diff) |
DRED: quantize r and p0 parameters with 8 bits
Only code non-degenerate symbols, which makes the encoder faster
Diffstat (limited to 'silk')
-rw-r--r-- | silk/dred_config.h | 2 | ||||
-rw-r--r-- | silk/dred_decoder.c | 9 | ||||
-rw-r--r-- | silk/dred_encoder.c | 10 |
3 files changed, 11 insertions, 10 deletions
diff --git a/silk/dred_config.h b/silk/dred_config.h index 06ff397b..5e3e74a3 100644 --- a/silk/dred_config.h +++ b/silk/dred_config.h @@ -32,7 +32,7 @@ #define DRED_EXTENSION_ID 126 /* Remove these two completely once DRED gets an extension number assigned. */ -#define DRED_EXPERIMENTAL_VERSION 6 +#define DRED_EXPERIMENTAL_VERSION 7 #define DRED_EXPERIMENTAL_BYTES 2 diff --git a/silk/dred_decoder.c b/silk/dred_decoder.c index 658d340f..68ba8559 100644 --- a/silk/dred_decoder.c +++ b/silk/dred_decoder.c @@ -43,20 +43,21 @@ static int sign_extend(int x, int b) { return (x ^ m) - m; } -static void dred_decode_latents(ec_dec *dec, float *x, const opus_uint16 *scale, const opus_uint16 *r, const opus_uint16 *p0, int dim) { +static void dred_decode_latents(ec_dec *dec, float *x, const opus_uint16 *scale, const opus_uint8 *r, const opus_uint8 *p0, int dim) { int i; for (i=0;i<dim;i++) { int q; - q = ec_laplace_decode_p0(dec, p0[i], r[i]); + if (r[i] == 0 || p0[i] == 255) q = 0; + else q = ec_laplace_decode_p0(dec, p0[i]<<7, r[i]<<7); x[i] = q*256.f/(scale[i] == 0 ? 1 : scale[i]); } } int dred_ec_decode(OpusDRED *dec, const opus_uint8 *bytes, int num_bytes, int min_feature_frames) { - const opus_uint16 *p0 = DRED_rdovae_get_p0_pointer(); + const opus_uint8 *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(); + const opus_uint8 *r = DRED_rdovae_get_r_pointer(); ec_dec ec; int q_level; int i; diff --git a/silk/dred_encoder.c b/silk/dred_encoder.c index 6b585416..3f842af0 100644 --- a/silk/dred_encoder.c +++ b/silk/dred_encoder.c @@ -217,7 +217,7 @@ void dred_compute_latents(DREDEnc *enc, const float *pcm, int frame_size, int ex } } -static void dred_encode_latents(ec_enc *enc, const float *x, const opus_uint16 *scale, const opus_uint16 *dzone, const opus_uint16 *r, const opus_uint16 *p0, int dim) { +static void dred_encode_latents(ec_enc *enc, const float *x, const opus_uint16 *scale, const opus_uint16 *dzone, const opus_uint8 *r, const opus_uint8 *p0, int dim) { int i; int q[IMAX(DRED_LATENT_DIM,DRED_STATE_DIM)]; float xq[IMAX(DRED_LATENT_DIM,DRED_STATE_DIM)]; @@ -238,16 +238,16 @@ static void dred_encode_latents(ec_enc *enc, const float *x, const opus_uint16 * } for (i=0;i<dim;i++) { /* Make the impossible actually impossible. */ - if (r[i] == 0 || p0[i] >= 32767) q[i] = 0; - ec_laplace_encode_p0(enc, q[i], p0[i], r[i]); + if (r[i] == 0 || p0[i] == 255) q[i] = 0; + else ec_laplace_encode_p0(enc, q[i], p0[i]<<7, r[i]<<7); } } int dred_encode_silk_frame(const DREDEnc *enc, unsigned char *buf, int max_chunks, int max_bytes) { const opus_uint16 *dead_zone = DRED_rdovae_get_dead_zone_pointer(); - const opus_uint16 *p0 = DRED_rdovae_get_p0_pointer(); + const opus_uint8 *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(); + const opus_uint8 *r = DRED_rdovae_get_r_pointer(); ec_enc ec_encoder; int q_level; |