aacenc: Fix threshold-in-quiet calculation in the 3GPP psymodel.

Removing the modification vastly improves quality (at a slight bitrate
cost) for some samples. castanets.wav is a good example. The closest
equivalent I see to the modification in the 3GPP spec is a similar
modification (over a specific frequency range) when TNS is used.

This also changes the threshold-in-quiet calculation to match the
3GPP spec.

patch by Nathan Caldwell saintdev (at) gmail

Originally committed as revision 25588 to svn://svn.ffmpeg.org/ffmpeg/trunk
oldabi
Nathan Caldwell 14 years ago committed by Anton Khirnov
parent eafadadaf5
commit 4df5aebb81
  1. 8
      libavcodec/aacpsy.c

@ -419,12 +419,10 @@ static void psy_3gpp_analyze(FFPsyContext *ctx, int channel,
for (g = num_bands - 2; g >= 0; g--) for (g = num_bands - 2; g >= 0; g--)
band[g].thr = FFMAX(band[g].thr, band[g+1].thr * coeffs->spread_hi [g]); band[g].thr = FFMAX(band[g].thr, band[g+1].thr * coeffs->spread_hi [g]);
for (g = 0; g < num_bands; g++) { for (g = 0; g < num_bands; g++) {
band[g].thr_quiet = FFMAX(band[g].thr, coeffs->ath[g]); band[g].thr_quiet = band[g].thr = FFMAX(band[g].thr, coeffs->ath[g]);
if (!(wi->window_type[0] == LONG_STOP_SEQUENCE || (wi->window_type[1] == LONG_START_SEQUENCE && !w))) if (!(wi->window_type[0] == LONG_STOP_SEQUENCE || (wi->window_type[1] == LONG_START_SEQUENCE && !w)))
band[g].thr_quiet = FFMAX(PSY_3GPP_RPEMIN*band[g].thr_quiet, band[g].thr = FFMAX(PSY_3GPP_RPEMIN*band[g].thr, FFMIN(band[g].thr,
FFMIN(band[g].thr_quiet, PSY_3GPP_RPELEV*pch->prev_band[w+g].thr_quiet));
PSY_3GPP_RPELEV*pch->prev_band[w+g].thr_quiet));
band[g].thr = FFMAX(band[g].thr, band[g].thr_quiet * 0.25);
ctx->psy_bands[channel*PSY_MAX_BANDS+w+g].threshold = band[g].thr; ctx->psy_bands[channel*PSY_MAX_BANDS+w+g].threshold = band[g].thr;
} }

Loading…
Cancel
Save