controlling rounding

This commit is contained in:
Jean-Marc Valin 2016-01-04 22:35:13 -05:00
parent 3934fac7e2
commit 886dc594f0

View file

@ -658,6 +658,7 @@ struct band_ctx {
const celt_ener *bandE; const celt_ener *bandE;
opus_uint32 seed; opus_uint32 seed;
int arch; int arch;
int theta_round;
}; };
struct split_ctx { struct split_ctx {
@ -715,8 +716,14 @@ static void compute_theta(struct band_ctx *ctx, struct split_ctx *sctx,
if (qn!=1) if (qn!=1)
{ {
if (encode) 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 /* 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. */ time split, a step for stereo, and a triangular one for the rest. */
if (stereo && N>2) if (stereo && N>2)
@ -1482,6 +1489,7 @@ void quant_all_bands(int encode, const CELTMode *m, int start, int end,
} else { } else {
if (Y!=NULL) if (Y!=NULL)
{ {
ctx.theta_round = 0;
x_cm = quant_band_stereo(&ctx, X, Y, N, b, B, x_cm = quant_band_stereo(&ctx, X, Y, N, b, B,
effective_lowband != -1 ? norm+effective_lowband : NULL, LM, effective_lowband != -1 ? norm+effective_lowband : NULL, LM,
last?NULL:norm+M*eBands[i]-norm_offset, lowband_scratch, x_cm|y_cm); last?NULL:norm+M*eBands[i]-norm_offset, lowband_scratch, x_cm|y_cm);