1 /*****************************************************************************
2 * chrono.h: vout chrono
3 *****************************************************************************
4 * Copyright (C) 2009-2010 Laurent Aimar
7 * Authors: Laurent Aimar <fenrir _AT_ videolan _DOT_ org>
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
22 *****************************************************************************/
24 #ifndef LIBVLC_VOUT_CHRONO_H
25 #define LIBVLC_VOUT_CHRONO_H
38 static inline void vout_chrono_Init(vout_chrono_t *chrono, int shift, mtime_t avg_initial)
40 chrono->shift = shift;
42 chrono->avg = avg_initial;
44 chrono->shift_var = shift+1;
45 chrono->var = avg_initial / 2;
47 chrono->start = VLC_TS_INVALID;
49 static inline void vout_chrono_Clean(vout_chrono_t *chrono)
53 static inline void vout_chrono_Start(vout_chrono_t *chrono)
55 chrono->start = mdate();
57 static inline mtime_t vout_chrono_GetHigh(vout_chrono_t *chrono)
59 return chrono->avg + 2 * chrono->var;
61 static inline mtime_t vout_chrono_GetLow(vout_chrono_t *chrono)
63 return __MAX(chrono->avg - 2 * chrono->var, 0);
66 static inline void vout_chrono_Stop(vout_chrono_t *chrono)
68 assert(chrono->start != VLC_TS_INVALID);
71 const mtime_t duration = mdate() - chrono->start;
72 const mtime_t var = llabs( duration - chrono->avg );
74 /* Update average only if the current point is 'valid' */
75 if( duration < vout_chrono_GetHigh( chrono ) )
76 chrono->avg = (((1 << chrono->shift) - 1) * chrono->avg + duration) >> chrono->shift;
77 /* Always update the variance */
78 chrono->var = (((1 << chrono->shift_var) - 1) * chrono->var + var) >> chrono->shift_var;
81 chrono->start = VLC_TS_INVALID;
83 static inline void vout_chrono_Reset(vout_chrono_t *chrono)
85 vout_chrono_t ch = *chrono;
86 vout_chrono_Clean(chrono);
87 vout_chrono_Init(chrono, ch.shift, ch.avg_initial);