From 651b6c612db4e809c506973996f2580c4158ac3a Mon Sep 17 00:00:00 2001 From: mickeyl Date: Sat, 27 Sep 2003 11:29:26 +0000 Subject: merge dasher which has been introduced in BRANCH first (wtf?) into HEAD --- (limited to 'inputmethods/dasher/FrameRate.h') diff --git a/inputmethods/dasher/FrameRate.h b/inputmethods/dasher/FrameRate.h new file mode 100644 index 0000000..2f86b03 --- a/dev/null +++ b/inputmethods/dasher/FrameRate.h @@ -0,0 +1,112 @@ +// FrameRate.h +// +///////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002 David Ward +// +///////////////////////////////////////////////////////////////////////////// + +#ifndef __FrameRate_h__ +#define __FrameRate_h__ + +#include "MSVC_Unannoy.h" + +// keeps track of framerate +// computes the Steps parameter +// computes RXmax - which controls the maximum rate of zooming in + +const double LN2= log(2); + +class CFrameRate { + public: + CFrameRate() ; + ~CFrameRate() {}; + const double Rxmax() const {return m_dRXmax;} + const int Steps() const {return m_iSteps;} + const double Framerate() const {return m_dFr;} + void Reset(unsigned long Time); + void NewFrame(unsigned long Time); + + // TODO: These two shouldn't be the same thing: + void SetBitrate(double TargetRate); + void SetMaxBitrate(double MaxRate); + private: + double m_dFr; + double m_dMaxbitrate; // the maximum rate of entering information + double m_dRXmax; // the maximum zoomin per frame + int m_iFrames,m_iTime,m_iTime2,m_iSamples; + int m_iSteps; // the 'Steps' parameter. See djw thesis. +}; + +inline CFrameRate::CFrameRate() { + + // maxbitrate should be user-defined and/or adaptive. Currently it is not. +#if defined(_WIN32_WCE) + m_dMaxbitrate=5; +#else + m_dMaxbitrate=5.5; +#endif + + m_dRXmax=2; // only a transient effect + m_iFrames=0; + m_iSamples=1; + + // we dont know the framerate yet - play it safe by setting it high + m_dFr=1<<5; + + // start off very slow until we have sampled framerate adequately + m_iSteps=2000; + m_iTime=0; // Hmmm, User must reset framerate before starting. +} + +inline void CFrameRate::NewFrame(unsigned long Time) + // compute framerate if we have sampled enough frames +{ + + m_iFrames++; + + if (m_iFrames==m_iSamples) { + m_iTime2=Time; + if (m_iTime2-m_iTime < 50) + m_iSamples++; // increase sample size + else if (m_iTime2-m_iTime > 80) { + m_iSamples--; + if (m_iSamples <2) + m_iSamples=2; + } + if (m_iTime2-m_iTime) { + m_dFr=m_iFrames*1000.0/(m_iTime2-m_iTime); + m_iTime=m_iTime2; + m_iFrames=0; + + } + m_dRXmax=exp(m_dMaxbitrate*LN2/m_dFr); + m_iSteps=m_iSteps/2+(int)(-log(0.2)*m_dFr/LN2/m_dMaxbitrate)/2; + // dchar debug[256]; + // _stprintf(debug,TEXT("fr %f Steps %d samples %d time2 %d rxmax %f\n"),fr,Steps,samples,time2,RXmax); + // OutputDebugString(debug); + + } +} + +inline void CFrameRate::Reset(unsigned long Time) +{ + m_iFrames=0; + m_iTime=Time; +} + + +inline void CFrameRate::SetBitrate(double TargetRate) +{ + m_dMaxbitrate = TargetRate; +} + + +inline void CFrameRate::SetMaxBitrate(double MaxRate) +{ + m_dMaxbitrate = MaxRate; +} + + + +#endif /* #ifndef __FrameRate_h__ */ -- cgit v0.9.0.2