00001 /* 00002 * Lagged Fibonacci PRNG 00003 * Copyright (c) 2008 Michael Niedermayer 00004 * 00005 * This file is part of FFmpeg. 00006 * 00007 * FFmpeg is free software; you can redistribute it and/or 00008 * modify it under the terms of the GNU Lesser General Public 00009 * License as published by the Free Software Foundation; either 00010 * version 2.1 of the License, or (at your option) any later version. 00011 * 00012 * FFmpeg is distributed in the hope that it will be useful, 00013 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00014 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00015 * Lesser General Public License for more details. 00016 * 00017 * You should have received a copy of the GNU Lesser General Public 00018 * License along with FFmpeg; if not, write to the Free Software 00019 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 00020 */ 00021 00022 #ifndef AVUTIL_LFG_H 00023 #define AVUTIL_LFG_H 00024 00025 typedef struct { 00026 unsigned int state[64]; 00027 int index; 00028 } AVLFG; 00029 00030 void av_lfg_init(AVLFG *c, unsigned int seed); 00031 00038 static inline unsigned int av_lfg_get(AVLFG *c){ 00039 c->state[c->index & 63] = c->state[(c->index-24) & 63] + c->state[(c->index-55) & 63]; 00040 return c->state[c->index++ & 63]; 00041 } 00042 00048 static inline unsigned int av_mlfg_get(AVLFG *c){ 00049 unsigned int a= c->state[(c->index-55) & 63]; 00050 unsigned int b= c->state[(c->index-24) & 63]; 00051 return c->state[c->index++ & 63] = 2*a*b+a+b; 00052 } 00053 00060 void av_bmg_get(AVLFG *lfg, double out[2]); 00061 00062 #endif /* AVUTIL_LFG_H */