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