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
diff options
context:
space:
mode:
authorJean-Marc Valin <jmvalin@amazon.com>2023-06-27 09:56:49 +0300
committerJean-Marc Valin <jmvalin@amazon.com>2023-06-27 23:43:39 +0300
commitf94bd54302d4b67f7035e11598f07dc8caa0c26b (patch)
tree078b2ec162475872d045f2410cc6d943b3cc8d00
parent115edd9c0668ad07d9be1e4ea150689a4c32508a (diff)
Handle the sign of the DRED offset
-rw-r--r--silk/dred_decoder.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/silk/dred_decoder.c b/silk/dred_decoder.c
index dea53251..04ba1ef3 100644
--- a/silk/dred_decoder.c
+++ b/silk/dred_decoder.c
@@ -36,7 +36,11 @@
#include "dred_coding.h"
#include "celt/entdec.h"
-
+/* From http://graphics.stanford.edu/~seander/bithacks.html#FixedSignExtend */
+static int sign_extend(int x, int b) {
+ int m = 1U << (b - 1);
+ return (x ^ m) - m;
+}
int dred_ec_decode(OpusDRED *dec, const opus_uint8 *bytes, int num_bytes, int min_feature_frames)
@@ -57,7 +61,7 @@ int dred_ec_decode(OpusDRED *dec, const opus_uint8 *bytes, int num_bytes, int mi
/* decode initial state and initialize RDOVAE decoder */
ec_dec_init(&ec, (unsigned char*)bytes, num_bytes);
- dec->dred_offset = ec_dec_uint(&ec, 32);
+ dec->dred_offset = sign_extend(ec_dec_uint(&ec, 32), 5);
q0 = ec_dec_uint(&ec, 16);
dQ = ec_dec_uint(&ec, 8);
/*printf("%d %d %d\n", dred_offset, q0, dQ);*/