Tuning the surround masking
We're now a bit more conservative and only take into account the bands
that are being codec. Also weighting the rate saving by the band width.
diff --git a/celt/celt_encoder.c b/celt/celt_encoder.c
index 308f29f..41c28ab 100644
--- a/celt/celt_encoder.c
+++ b/celt/celt_encoder.c
@@ -1535,27 +1535,35 @@
for(i=0;i<st->end;i++)
surround_dynalloc[i] = 0;
/* This computes how much masking takes place between surround channels */
- if (st->energy_mask&&!st->lfe)
+ if (st->start==0&&st->energy_mask&&!st->lfe)
{
+ int mask_end;
opus_val32 mask_avg=0;
opus_val32 diff=0;
+ int count=0;
+ mask_end = st->lastCodedBands;
for (c=0;c<C;c++)
{
- for(i=0;i<st->end;i++)
+ for(i=0;i<mask_end;i++)
{
- mask_avg += st->energy_mask[nbEBands*c+i];
- diff += st->energy_mask[i+c*nbEBands]*(opus_int32)(1+2*i-st->end);
+ mask_avg += st->energy_mask[nbEBands*c+i]*(eBands[i+1]-eBands[i]);
+ count += (eBands[i+1]-eBands[i]);
+ diff += st->energy_mask[i+c*nbEBands]*(opus_int32)(1+2*i-mask_end);
}
}
- mask_avg = DIV32_16(mask_avg,C*st->end);
+ mask_avg = DIV32_16(mask_avg,count);
+ /* Just being conservative here */
+ mask_avg -= HALF32(HALF32(mask_avg));
mask_avg = MAX16(mask_avg, -QCONST16(2.f, DB_SHIFT));
- diff = diff*6/(C*(st->end-1)*(st->end+1)*st->end);
- diff = MAX32(MIN32(diff, QCONST32(.05f, DB_SHIFT)), -QCONST32(.05f, DB_SHIFT));
- for(i=0;i<st->end;i++)
+ diff = diff*6/(C*(mask_end-1)*(mask_end+1)*mask_end);
+ /* Again, being conservative */
+ diff = HALF32(diff);
+ diff = MAX32(MIN32(diff, QCONST32(.031f, DB_SHIFT)), -QCONST32(.031f, DB_SHIFT));
+ for(i=0;i<mask_end;i++)
{
opus_val32 lin;
opus_val16 unmask;
- lin = mask_avg + HALF32(diff*(1+2*i-st->end));
+ lin = mask_avg + HALF32(diff*(1+2*i-mask_end));
if (C==2)
unmask = MAX16(st->energy_mask[i], st->energy_mask[nbEBands+i]) - lin;
else