diff options
Diffstat (limited to 'celt/bands.c')
-rw-r--r-- | celt/bands.c | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/celt/bands.c b/celt/bands.c index cc20d365..acb4025a 100644 --- a/celt/bands.c +++ b/celt/bands.c @@ -683,6 +683,7 @@ struct band_ctx { opus_uint32 seed; int arch; int theta_round; + int disable_inv; }; struct split_ctx { @@ -832,7 +833,7 @@ static void compute_theta(struct band_ctx *ctx, struct split_ctx *sctx, } else if (stereo) { if (encode) { - inv = itheta > 8192; + inv = itheta > 8192 && !ctx->disable_inv; if (inv) { int j; @@ -849,6 +850,9 @@ static void compute_theta(struct band_ctx *ctx, struct split_ctx *sctx, inv = ec_dec_bit_logp(ec, 2); } else inv = 0; + /* inv flag override to avoid problems with downmixing. */ + if (ctx->disable_inv) + inv = 0; itheta = 0; } qalloc = ec_tell_frac(ec) - tell; @@ -1367,7 +1371,7 @@ void quant_all_bands(int encode, const CELTMode *m, int start, int end, const celt_ener *bandE, int *pulses, int shortBlocks, int spread, int dual_stereo, int intensity, int *tf_res, opus_int32 total_bits, opus_int32 balance, ec_ctx *ec, int LM, int codedBands, - opus_uint32 *seed, int complexity, int arch) + opus_uint32 *seed, int complexity, int arch, int disable_inv) { int i; opus_int32 remaining_bits; @@ -1433,6 +1437,7 @@ void quant_all_bands(int encode, const CELTMode *m, int start, int end, ctx.seed = *seed; ctx.spread = spread; ctx.arch = arch; + ctx.disable_inv = disable_inv; ctx.resynth = resynth; ctx.theta_round = 0; for (i=start;i<end;i++) |