Adding history to the intra decision distortion

This commit is contained in:
Jean-Marc Valin 2011-04-21 16:59:26 -04:00
parent 9c3dc6b4b8
commit cb73e5ca62

View file

@ -271,11 +271,12 @@ void quant_coarse_energy(const CELTMode *m, int start, int end, int effEnd,
celt_uint32 tell; celt_uint32 tell;
int badness1=0; int badness1=0;
celt_int32 intra_bias; celt_int32 intra_bias;
celt_word32 new_distortion;
SAVE_STACK; SAVE_STACK;
intra = force_intra || (!two_pass && *delayedIntra>2*C*(end-start) && nbAvailableBytes > (end-start)*C); intra = force_intra || (!two_pass && *delayedIntra>2*C*(end-start) && nbAvailableBytes > (end-start)*C);
intra_bias = ((budget**delayedIntra*loss_rate)/(C*512)); intra_bias = ((budget**delayedIntra*loss_rate)/(C*512));
*delayedIntra = loss_distortion(eBands, oldEBands, start, effEnd, m->nbEBands, C); new_distortion = loss_distortion(eBands, oldEBands, start, effEnd, m->nbEBands, C);
tell = ec_tell(enc); tell = ec_tell(enc);
if (tell+3 > budget) if (tell+3 > budget)
@ -336,11 +337,19 @@ void quant_coarse_energy(const CELTMode *m, int start, int end, int effEnd,
intra_bits, nintra_bytes - nstart_bytes); intra_bits, nintra_bytes - nstart_bytes);
CELT_COPY(oldEBands, oldEBands_intra, C*m->nbEBands); CELT_COPY(oldEBands, oldEBands_intra, C*m->nbEBands);
CELT_COPY(error, error_intra, C*m->nbEBands); CELT_COPY(error, error_intra, C*m->nbEBands);
intra = 1;
} }
} else { } else {
CELT_COPY(oldEBands, oldEBands_intra, C*m->nbEBands); CELT_COPY(oldEBands, oldEBands_intra, C*m->nbEBands);
CELT_COPY(error, error_intra, C*m->nbEBands); CELT_COPY(error, error_intra, C*m->nbEBands);
} }
if (intra)
*delayedIntra = new_distortion;
else
*delayedIntra = ADD32(MULT16_32_Q15(MULT16_16_Q15(pred_coef[LM], pred_coef[LM]),*delayedIntra),
new_distortion);
RESTORE_STACK; RESTORE_STACK;
} }