X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Faacpsy.c;h=fa562b34b61f2c7157db675510ab0f074cf12a7e;hb=8672fc7b0453098d862bb1c0caafab4823ee0b4e;hp=a9a89888bf11ed35284cdc46a53c10278804f695;hpb=c9fe864472a2c55c7c4189ff6fb490bec8bd92b3;p=ffmpeg diff --git a/libavcodec/aacpsy.c b/libavcodec/aacpsy.c index a9a89888bf1..fa562b34b61 100644 --- a/libavcodec/aacpsy.c +++ b/libavcodec/aacpsy.c @@ -24,6 +24,8 @@ * AAC encoder psychoacoustic model */ +#include "libavutil/libm.h" + #include "avcodec.h" #include "aactab.h" #include "psymodel.h" @@ -333,7 +335,7 @@ static av_cold int psy_3gpp_init(FFPsyContext *ctx) { coeff->spread_low[1] = pow(10.0, -bark_width * en_spread_low); coeff->spread_hi [1] = pow(10.0, -bark_width * en_spread_hi); pe_min = bark_pe * bark_width; - minsnr = pow(2.0f, pe_min / band_sizes[g]) - 1.5f; + minsnr = exp2(pe_min / band_sizes[g]) - 1.5f; coeff->min_snr = av_clipf(1.0f / minsnr, PSY_SNR_25DB, PSY_SNR_1DB); } start = 0; @@ -524,8 +526,11 @@ static float calc_reduction_3gpp(float a, float desired_pe, float pe, { float thr_avg, reduction; - thr_avg = powf(2.0f, (a - pe) / (4.0f * active_lines)); - reduction = powf(2.0f, (a - desired_pe) / (4.0f * active_lines)) - thr_avg; + if(active_lines == 0.0) + return 0; + + thr_avg = exp2f((a - pe) / (4.0f * active_lines)); + reduction = exp2f((a - desired_pe) / (4.0f * active_lines)) - thr_avg; return FFMAX(reduction, 0.0f); } @@ -583,7 +588,7 @@ static void psy_3gpp_analyze_channel(FFPsyContext *ctx, int channel, form_factor += sqrtf(fabs(coefs[start+i])); } band->thr = band->energy * 0.001258925f; - band->nz_lines = form_factor / powf(band->energy / band_sizes[g], 0.25f); + band->nz_lines = band->energy>0 ? form_factor / powf(band->energy / band_sizes[g], 0.25f) : 0; start += band_sizes[g]; } @@ -703,7 +708,7 @@ static void psy_3gpp_analyze_channel(FFPsyContext *ctx, int channel, float delta_sfb_pe = band->norm_fac * norm_fac * delta_pe; float thr = band->thr; - thr *= powf(2.0f, delta_sfb_pe / band->active_lines); + thr *= exp2f(delta_sfb_pe / band->active_lines); if (thr > coeffs[g].min_snr * band->energy && band->avoid_holes == PSY_3GPP_AH_INACTIVE) thr = FFMAX(band->thr, coeffs[g].min_snr * band->energy); band->thr = thr;