Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.xiph.org/xiph/opus.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/silk
diff options
context:
space:
mode:
authorJean-Marc Valin <jmvalin@amazon.com>2023-11-06 11:10:59 +0300
committerJean-Marc Valin <jmvalin@amazon.com>2023-11-06 11:16:43 +0300
commit544b3e576c8edd1785914c988882b62d60652f26 (patch)
treed1dd9e1a90ce85f3fbb462228c7adea29fe10d70 /silk
parent98b8be09d56d03d220fff3536842c0703bae865c (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.h2
-rw-r--r--silk/dred_decoder.c9
-rw-r--r--silk/dred_encoder.c10
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;