diff --git a/libavcodec/aaccoder.c b/libavcodec/aaccoder.c index 284b401adf..35787e841e 100644 --- a/libavcodec/aaccoder.c +++ b/libavcodec/aaccoder.c @@ -643,11 +643,9 @@ static void search_for_pns(AACEncContext *s, AVCodecContext *avctx, SingleChanne float band_energy, scale, pns_senergy; const int start_c = (w+w2)*128+sce->ics.swb_offset[g]; band = &s->psy.ch[s->cur_channel].psy_bands[(w+w2)*16+g]; - for (i = 0; i < sce->ics.swb_sizes[g]; i+=2) { - double rnd[2]; - av_bmg_get(&s->lfg, rnd); - PNS[i+0] = (float)rnd[0]; - PNS[i+1] = (float)rnd[1]; + for (i = 0; i < sce->ics.swb_sizes[g]; i++) { + s->random_state = lcg_random(s->random_state); + PNS[i] = s->random_state; } band_energy = s->fdsp->scalarproduct_float(PNS, PNS, sce->ics.swb_sizes[g]); scale = noise_amp/sqrtf(band_energy); diff --git a/libavcodec/aacenc.c b/libavcodec/aacenc.c index 9e421a9aaa..ee3cbf80b0 100644 --- a/libavcodec/aacenc.c +++ b/libavcodec/aacenc.c @@ -1031,7 +1031,7 @@ static av_cold int aac_encode_init(AVCodecContext *avctx) goto fail; s->psypp = ff_psy_preprocess_init(avctx); ff_lpc_init(&s->lpc, 2*avctx->frame_size, TNS_MAX_ORDER, FF_LPC_TYPE_LEVINSON); - av_lfg_init(&s->lfg, 0x72adca55); + s->random_state = 0x1f2e3d4c; if (HAVE_MIPSDSP) ff_aac_coder_init_mips(s); diff --git a/libavcodec/aacenc.h b/libavcodec/aacenc.h index 63e789366f..1ace00d2e0 100644 --- a/libavcodec/aacenc.h +++ b/libavcodec/aacenc.h @@ -23,7 +23,6 @@ #define AVCODEC_AACENC_H #include "libavutil/float_dsp.h" -#include "libavutil/lfg.h" #include "avcodec.h" #include "put_bits.h" @@ -100,7 +99,6 @@ typedef struct AACEncContext { FFTContext mdct1024; ///< long (1024 samples) frame transform context FFTContext mdct128; ///< short (128 samples) frame transform context AVFloatDSPContext *fdsp; - AVLFG lfg; ///< PRNG needed for PNS float *planar_samples[8]; ///< saved preprocessed input int profile; ///< copied from avctx diff --git a/libavcodec/aacenc_utils.h b/libavcodec/aacenc_utils.h index bb1dcb4361..ff9188aee3 100644 --- a/libavcodec/aacenc_utils.h +++ b/libavcodec/aacenc_utils.h @@ -252,6 +252,19 @@ static inline int ff_sfdelta_can_replace(const SingleChannelElement *sce, && sce->sf_idx[nextband[band]] <= (new_sf + SCALE_MAX_DIFF); } +/** + * linear congruential pseudorandom number generator + * + * @param previous_val pointer to the current state of the generator + * + * @return Returns a 32-bit pseudorandom integer + */ +static av_always_inline int lcg_random(unsigned previous_val) +{ + union { unsigned u; int s; } v = { previous_val * 1664525u + 1013904223 }; + return v.s; +} + #define ERROR_IF(cond, ...) \ if (cond) { \ av_log(avctx, AV_LOG_ERROR, __VA_ARGS__); \