1054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/* 2054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * Copyright (c) 2011-2012, The Linux Foundation. All rights reserved. 3054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 4054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * Redistribution and use in source and binary forms, with or without 5054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * modification, are permitted provided that the following conditions are 6054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * met: 7054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * * Redistributions of source code must retain the above copyright 8054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * notice, this list of conditions and the following disclaimer. 9054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * * Redistributions in binary form must reproduce the above 10054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * copyright notice, this list of conditions and the following 11054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * disclaimer in the documentation and/or other materials provided 12054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * with the distribution. 13054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * * Neither the name of The Linux Foundation nor the names of its 14054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * contributors may be used to endorse or promote products derived 15054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * from this software without specific prior written permission. 16054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * 17054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 18054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 19054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 20054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 21054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 22054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 23054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 24054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 25054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 26054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 27054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin */ 29054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 30054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#ifndef INCLUDE_PROFILER 31054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#define INCLUDE_PROFILER 32054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 33054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <stdio.h> 34054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <utils/Singleton.h> 35054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <cutils/properties.h> 36054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <cutils/log.h> 37054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 38054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#ifndef DEBUG_CALC_FPS 39054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#define CALC_FPS() ((void)0) 40054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#define CALC_INIT() ((void)0) 41054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#else 42054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#define CALC_FPS() qdutils::CalcFps::getInstance().Fps() 43054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#define CALC_INIT() qdutils::CalcFps::getInstance().Init() 44054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinusing namespace android; 45054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinnamespace qdutils { 46054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinclass CalcFps : public Singleton<CalcFps> { 47054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin public: 48054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin CalcFps(); 49054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin ~CalcFps(); 50054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 51054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin void Init(); 52054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin void Fps(); 53054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 54054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin private: 55054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin static const unsigned int MAX_FPS_CALC_PERIOD_IN_FRAMES = 128; 56054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin static const unsigned int MAX_FRAMEARRIVAL_STEPS = 50; 57054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin static const unsigned int MAX_DEBUG_FPS_LEVEL = 2; 58054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 59054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin struct debug_fps_metadata_t { 60054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin /*fps calculation based on time or number of frames*/ 61054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin enum DfmType { 62054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin DFM_FRAMES = 0, 63054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin DFM_TIME = 1, 64054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin }; 65054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 66054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin DfmType type; 67054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 68054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin /* indicates how much time do we wait till we calculate FPS */ 69054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin unsigned long time_period; 70054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 71054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin /*indicates how much time elapsed since we report fps*/ 72054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin float time_elapsed; 73054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 74054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin /* indicates how many frames do we wait till we calculate FPS */ 75054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin unsigned int period; 76054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin /* current frame, will go upto period, and then reset */ 77054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin unsigned int curr_frame; 78054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin /* frame will arrive at a multiple of 16666 us at the display. 79054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin This indicates how many steps to consider for our calculations. 80054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin For example, if framearrival_steps = 10, then the frame that arrived 81054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin after 166660 us or more will be ignored. 82054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin */ 83054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin unsigned int framearrival_steps; 84054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin /* ignorethresh_us = framearrival_steps * 16666 */ 85054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin nsecs_t ignorethresh_us; 86054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin /* used to calculate the actual frame arrival step, the times might not be 87054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin accurate 88054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin */ 89054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin unsigned int margin_us; 90054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 91054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin /* actual data storage */ 92054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin nsecs_t framearrivals[MAX_FPS_CALC_PERIOD_IN_FRAMES]; 93054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin nsecs_t accum_framearrivals[MAX_FRAMEARRIVAL_STEPS]; 94054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin }; 95054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 96054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin private: 97054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin void populate_debug_fps_metadata(void); 98054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin void print_fps(float fps); 99054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin void calc_fps(nsecs_t currtime_us); 100054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 101054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin private: 102054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin debug_fps_metadata_t debug_fps_metadata; 103054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin unsigned int debug_fps_level; 104054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin}; 105054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin};//namespace qdutils 106054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#endif 107054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin 108054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#endif // INCLUDE_PROFILER 109