1/* 2 * Lagged Fibonacci PRNG 3 * Copyright (c) 2008 Michael Niedermayer 4 * 5 * This file is part of FFmpeg. 6 * 7 * FFmpeg is free software; you can redistribute it and/or 8 * modify it under the terms of the GNU Lesser General Public 9 * License as published by the Free Software Foundation; either 10 * version 2.1 of the License, or (at your option) any later version. 11 * 12 * FFmpeg is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15 * Lesser General Public License for more details. 16 * 17 * You should have received a copy of the GNU Lesser General Public 18 * License along with FFmpeg; if not, write to the Free Software 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 20 */ 21 22#include <inttypes.h> 23#include "lfg.h" 24#include "md5.h" 25#include "intreadwrite.h" 26 27void av_cold av_lfg_init(AVLFG *c, unsigned int seed){ 28 uint8_t tmp[16]={0}; 29 int i; 30 31 for(i=8; i<64; i+=4){ 32 AV_WL32(tmp, seed); tmp[4]=i; 33 av_md5_sum(tmp, tmp, 16); 34 c->state[i ]= AV_RL32(tmp); 35 c->state[i+1]= AV_RL32(tmp+4); 36 c->state[i+2]= AV_RL32(tmp+8); 37 c->state[i+3]= AV_RL32(tmp+12); 38 } 39 c->index=0; 40} 41 42#ifdef TEST 43#include "log.h" 44#include "common.h" 45 46int main(void) 47{ 48 int x=0; 49 int i, j; 50 AVLFG state; 51 52 av_lfg_init(&state, 0xdeadbeef); 53 for (j = 0; j < 10000; j++) { 54 START_TIMER 55 for (i = 0; i < 624; i++) { 56// av_log(NULL,AV_LOG_ERROR, "%X\n", av_lfg_get(&state)); 57 x+=av_lfg_get(&state); 58 } 59 STOP_TIMER("624 calls of av_random"); 60 } 61 av_log(NULL, AV_LOG_ERROR, "final value:%X\n", x); 62 return 0; 63} 64#endif 65