From 886dc594f087284eefa4c6947da2a35eceb4cef9 Mon Sep 17 00:00:00 2001
From: Jean-Marc Valin <jmvalin@jmvalin.ca>
Date: Mon, 4 Jan 2016 22:35:13 -0500
Subject: [PATCH] controlling rounding

---
 celt/bands.c | 12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)

diff --git a/celt/bands.c b/celt/bands.c
index 36f1004ef..44e9074df 100644
--- a/celt/bands.c
+++ b/celt/bands.c
@@ -658,6 +658,7 @@ struct band_ctx {
    const celt_ener *bandE;
    opus_uint32 seed;
    int arch;
+   int theta_round;
 };
 
 struct split_ctx {
@@ -715,8 +716,14 @@ static void compute_theta(struct band_ctx *ctx, struct split_ctx *sctx,
    if (qn!=1)
    {
       if (encode)
-         itheta = (itheta*(opus_int32)qn+8192)>>14;
-
+      {
+         if (!stereo || ctx->theta_round == 0)
+            itheta = (itheta*(opus_int32)qn+8192)>>14;
+         else if (ctx->theta_round < 0)
+            itheta = (itheta*(opus_int32)qn)>>14;
+         else
+            itheta = (itheta*(opus_int32)qn+16383)>>14;
+      }
       /* Entropy coding of the angle. We use a uniform pdf for the
          time split, a step for stereo, and a triangular one for the rest. */
       if (stereo && N>2)
@@ -1482,6 +1489,7 @@ void quant_all_bands(int encode, const CELTMode *m, int start, int end,
       } else {
          if (Y!=NULL)
          {
+            ctx.theta_round = 0;
             x_cm = quant_band_stereo(&ctx, X, Y, N, b, B,
                   effective_lowband != -1 ? norm+effective_lowband : NULL, LM,
                   last?NULL:norm+M*eBands[i]-norm_offset, lowband_scratch, x_cm|y_cm);
-- 
GitLab