mirror of
https://github.com/xiph/opus.git
synced 2025-06-02 08:37:43 +00:00
Smoother intensity stereo decision thresholds
We now have rates for each possible threshold. This also adds some histeresis but it's not that useful for now because the effective rate doesn't changes from frame to frame (unless one changes the target rate). This change also has the side effect of lowering the intensity stereo point for 64 kb/s to band 15 (instead of 16).
This commit is contained in:
parent
32024cb5c2
commit
416dc73f28
1 changed files with 15 additions and 21 deletions
36
celt/celt.c
36
celt/celt.c
|
@ -190,6 +190,7 @@ struct OpusCustomEncoder {
|
|||
opus_int32 vbr_count;
|
||||
opus_val16 overlap_max;
|
||||
opus_val16 stereo_saving;
|
||||
int intensity;
|
||||
|
||||
#ifdef RESYNTH
|
||||
celt_sig syn_mem[2][2*MAX_PERIOD];
|
||||
|
@ -986,7 +987,6 @@ int celt_encode_with_ec(CELTEncoder * restrict st, const opus_val16 * pcm, int f
|
|||
int alloc_trim;
|
||||
int pitch_index=COMBFILTER_MINPERIOD;
|
||||
opus_val16 gain1 = 0;
|
||||
int intensity=0;
|
||||
int dual_stereo=0;
|
||||
int effectiveBytes;
|
||||
opus_val16 pf_threshold;
|
||||
|
@ -1569,33 +1569,27 @@ int celt_encode_with_ec(CELTEncoder * restrict st, const opus_val16 * pcm, int f
|
|||
if (LM!=0)
|
||||
dual_stereo = stereo_analysis(st->mode, X, LM, N);
|
||||
|
||||
static const opus_val16 intensity_thresholds[21]=
|
||||
/* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 off*/
|
||||
{ 16,21,23,25,27,29,31,33,35,38,42,46,50,54,58,63,68,75,84,102,130};
|
||||
static const opus_val16 intensity_histeresis[21]=
|
||||
{ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 4, 5, 6, 8, 12};
|
||||
|
||||
/* Account for coarse energy */
|
||||
effectiveRate = (8*effectiveBytes - 80)>>LM;
|
||||
|
||||
/* effectiveRate in kb/s */
|
||||
effectiveRate = 2*effectiveRate/5;
|
||||
if (effectiveRate<35)
|
||||
intensity = 8;
|
||||
else if (effectiveRate<50)
|
||||
intensity = 12;
|
||||
else if (effectiveRate<68)
|
||||
intensity = 16;
|
||||
else if (effectiveRate<84)
|
||||
intensity = 18;
|
||||
else if (effectiveRate<102)
|
||||
intensity = 19;
|
||||
else if (effectiveRate<130)
|
||||
intensity = 20;
|
||||
else
|
||||
intensity = 100;
|
||||
intensity = IMIN(st->end,IMAX(st->start, intensity));
|
||||
|
||||
st->intensity = hysteresis_decision(effectiveRate, intensity_thresholds, intensity_histeresis, 21, st->intensity);
|
||||
st->intensity = IMIN(st->end,IMAX(st->start, st->intensity));
|
||||
}
|
||||
|
||||
alloc_trim = 5;
|
||||
if (tell+(6<<BITRES) <= total_bits - total_boost)
|
||||
{
|
||||
alloc_trim = alloc_trim_analysis(st->mode, X, bandLogE,
|
||||
st->end, LM, C, N, &st->analysis, &st->stereo_saving, tf_estimate, intensity);
|
||||
st->end, LM, C, N, &st->analysis, &st->stereo_saving, tf_estimate, st->intensity);
|
||||
ec_enc_icdf(enc, alloc_trim, trim_icdf, 7);
|
||||
tell = ec_tell_frac(enc);
|
||||
}
|
||||
|
@ -1614,7 +1608,7 @@ int celt_encode_with_ec(CELTEncoder * restrict st, const opus_val16 * pcm, int f
|
|||
coded_bands = st->lastCodedBands ? st->lastCodedBands : st->mode->nbEBands;
|
||||
coded_bins = st->mode->eBands[coded_bands]<<LM;
|
||||
if (C==2)
|
||||
coded_bins += st->mode->eBands[IMIN(intensity, coded_bands)]<<LM;
|
||||
coded_bins += st->mode->eBands[IMIN(st->intensity, coded_bands)]<<LM;
|
||||
|
||||
/* Don't attempt to use more than 510 kb/s, even for frames smaller than 20 ms.
|
||||
The CELT allocator will just not be able to use more than that anyway. */
|
||||
|
@ -1632,7 +1626,7 @@ int celt_encode_with_ec(CELTEncoder * restrict st, const opus_val16 * pcm, int f
|
|||
{
|
||||
int coded_stereo_bands;
|
||||
int coded_stereo_dof;
|
||||
coded_stereo_bands = IMIN(intensity, coded_bands);
|
||||
coded_stereo_bands = IMIN(st->intensity, coded_bands);
|
||||
coded_stereo_dof = (st->mode->eBands[coded_stereo_bands]<<LM)-coded_stereo_bands;
|
||||
/*printf("%d %d %d ", coded_stereo_dof, coded_bins, tot_boost);*/
|
||||
target -= MIN32(target/3, SHR16(MULT16_16(st->stereo_saving,(coded_stereo_dof<<BITRES)),8));
|
||||
|
@ -1744,7 +1738,7 @@ int celt_encode_with_ec(CELTEncoder * restrict st, const opus_val16 * pcm, int f
|
|||
anti_collapse_rsv = isTransient&&LM>=2&&bits>=((LM+2)<<BITRES) ? (1<<BITRES) : 0;
|
||||
bits -= anti_collapse_rsv;
|
||||
codedBands = compute_allocation(st->mode, st->start, st->end, offsets, cap,
|
||||
alloc_trim, &intensity, &dual_stereo, bits, &balance, pulses,
|
||||
alloc_trim, &st->intensity, &dual_stereo, bits, &balance, pulses,
|
||||
fine_quant, fine_priority, C, LM, enc, 1, st->lastCodedBands);
|
||||
st->lastCodedBands = codedBands;
|
||||
|
||||
|
@ -1764,7 +1758,7 @@ int celt_encode_with_ec(CELTEncoder * restrict st, const opus_val16 * pcm, int f
|
|||
/* Residual quantisation */
|
||||
ALLOC(collapse_masks, C*st->mode->nbEBands, unsigned char);
|
||||
quant_all_bands(1, st->mode, st->start, st->end, X, C==2 ? X+N : NULL, collapse_masks,
|
||||
bandE, pulses, shortBlocks, st->spread_decision, dual_stereo, intensity, tf_res,
|
||||
bandE, pulses, shortBlocks, st->spread_decision, dual_stereo, st->intensity, tf_res,
|
||||
nbCompressedBytes*(8<<BITRES)-anti_collapse_rsv, balance, enc, LM, codedBands, &st->rng);
|
||||
|
||||
if (anti_collapse_rsv > 0)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue