From f94bd54302d4b67f7035e11598f07dc8caa0c26b Mon Sep 17 00:00:00 2001
From: Jean-Marc Valin <jmvalin@amazon.com>
Date: Tue, 27 Jun 2023 02:56:49 -0400
Subject: [PATCH] Handle the sign of the DRED offset

---
 silk/dred_decoder.c | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/silk/dred_decoder.c b/silk/dred_decoder.c
index dea532518..04ba1ef38 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);*/
-- 
GitLab