129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed/* 2a43fb8fce6d9be5577de1e0f49c99bd4fe2f6d44Duy Truong * Copyright (c) 2011-2012, The Linux Foundation. All rights reserved. 329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * Redistribution and use in source and binary forms, with or without 529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * modification, are permitted provided that the following conditions are 629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * met: 729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * * Redistributions of source code must retain the above copyright 829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * notice, this list of conditions and the following disclaimer. 929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * * Redistributions in binary form must reproduce the above 1029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * copyright notice, this list of conditions and the following 1129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * disclaimer in the documentation and/or other materials provided 1229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * with the distribution. 13a43fb8fce6d9be5577de1e0f49c99bd4fe2f6d44Duy Truong * * Neither the name of The Linux Foundation nor the names of its 1429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * contributors may be used to endorse or promote products derived 1529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * from this software without specific prior written permission. 1629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * 1729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 1829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 1929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 2029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 2129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 2229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 2329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 2429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 2529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 2629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 2729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed */ 2929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 30a87da60090f55b823ee999930b381daa3dbda67eNaseer Ahmed#define LOG_NDDEBUG 0 3129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed#include "profiler.h" 3229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 3329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed#ifdef DEBUG_CALC_FPS 3429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 3529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 36a87da60090f55b823ee999930b381daa3dbda67eNaseer AhmedANDROID_SINGLETON_STATIC_INSTANCE(qdutils::CalcFps) ; 37a87da60090f55b823ee999930b381daa3dbda67eNaseer Ahmed 38a87da60090f55b823ee999930b381daa3dbda67eNaseer Ahmednamespace qdutils { 3929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 4029a26818d7294055539167b2fbfdaa168bcf725cNaseer AhmedCalcFps::CalcFps() { 4129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed debug_fps_level = 0; 4229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed Init(); 4329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed} 4429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 4529a26818d7294055539167b2fbfdaa168bcf725cNaseer AhmedCalcFps::~CalcFps() { 4629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed} 4729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 4829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedvoid CalcFps::Init() { 4929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed char prop[PROPERTY_VALUE_MAX]; 5029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed property_get("debug.gr.calcfps", prop, "0"); 5129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed debug_fps_level = atoi(prop); 5229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed if (debug_fps_level > MAX_DEBUG_FPS_LEVEL) { 5329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed ALOGW("out of range value for debug.gr.calcfps, using 0"); 5429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed debug_fps_level = 0; 5529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed } 5629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 5729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed ALOGD("DEBUG_CALC_FPS: %d", debug_fps_level); 5829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed populate_debug_fps_metadata(); 5929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed} 6029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 6129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedvoid CalcFps::Fps() { 6229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed if (debug_fps_level > 0) 6329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed calc_fps(ns2us(systemTime())); 6429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed} 6529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 6629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedvoid CalcFps::populate_debug_fps_metadata(void) 6729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed{ 6829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed char prop[PROPERTY_VALUE_MAX]; 6929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 7029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed /*defaults calculation of fps to based on number of frames*/ 7129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed property_get("debug.gr.calcfps.type", prop, "0"); 7229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed debug_fps_metadata.type = (debug_fps_metadata_t::DfmType) atoi(prop); 7329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 7429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed /*defaults to 1000ms*/ 7529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed property_get("debug.gr.calcfps.timeperiod", prop, "1000"); 7629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed debug_fps_metadata.time_period = atoi(prop); 7729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 7829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed property_get("debug.gr.calcfps.period", prop, "10"); 7929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed debug_fps_metadata.period = atoi(prop); 8029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 8129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed if (debug_fps_metadata.period > MAX_FPS_CALC_PERIOD_IN_FRAMES) { 8229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed debug_fps_metadata.period = MAX_FPS_CALC_PERIOD_IN_FRAMES; 8329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed } 8429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 8529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed /* default ignorethresh_us: 500 milli seconds */ 8629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed property_get("debug.gr.calcfps.ignorethresh_us", prop, "500000"); 8729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed debug_fps_metadata.ignorethresh_us = atoi(prop); 8829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 8929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed debug_fps_metadata.framearrival_steps = 9029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed (debug_fps_metadata.ignorethresh_us / 16666); 9129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 9229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed if (debug_fps_metadata.framearrival_steps > MAX_FRAMEARRIVAL_STEPS) { 9329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed debug_fps_metadata.framearrival_steps = MAX_FRAMEARRIVAL_STEPS; 9429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed debug_fps_metadata.ignorethresh_us = 9529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed debug_fps_metadata.framearrival_steps * 16666; 9629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed } 9729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 9829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed /* 2ms margin of error for the gettimeofday */ 9929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed debug_fps_metadata.margin_us = 2000; 10029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 10129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed for (unsigned int i = 0; i < MAX_FRAMEARRIVAL_STEPS; i++) 10229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed debug_fps_metadata.accum_framearrivals[i] = 0; 10329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 10429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed ALOGD("period: %d", debug_fps_metadata.period); 10529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed ALOGD("ignorethresh_us: %lld", debug_fps_metadata.ignorethresh_us); 10629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed} 10729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 10829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedvoid CalcFps::print_fps(float fps) 10929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed{ 11029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed if (debug_fps_metadata_t::DFM_FRAMES == debug_fps_metadata.type) 11129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed ALOGD("FPS for last %d frames: %3.2f", debug_fps_metadata.period, fps); 11229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed else 11329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed ALOGD("FPS for last (%f ms, %d frames): %3.2f", 11429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed debug_fps_metadata.time_elapsed, 11529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed debug_fps_metadata.curr_frame, fps); 11629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 11729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed debug_fps_metadata.curr_frame = 0; 11829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed debug_fps_metadata.time_elapsed = 0.0; 11929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 12029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed if (debug_fps_level > 1) { 12129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed ALOGD("Frame Arrival Distribution:"); 12229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed for (unsigned int i = 0; 12329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed i < ((debug_fps_metadata.framearrival_steps / 6) + 1); 12429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed i++) { 12529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed ALOGD("%lld %lld %lld %lld %lld %lld", 12629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed debug_fps_metadata.accum_framearrivals[i*6], 12729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed debug_fps_metadata.accum_framearrivals[i*6+1], 12829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed debug_fps_metadata.accum_framearrivals[i*6+2], 12929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed debug_fps_metadata.accum_framearrivals[i*6+3], 13029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed debug_fps_metadata.accum_framearrivals[i*6+4], 13129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed debug_fps_metadata.accum_framearrivals[i*6+5]); 13229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed } 13329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 13429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed /* We are done with displaying, now clear the stats */ 13529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed for (unsigned int i = 0; 13629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed i < debug_fps_metadata.framearrival_steps; 13729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed i++) 13829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed debug_fps_metadata.accum_framearrivals[i] = 0; 13929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed } 14029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed return; 14129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed} 14229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 14329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedvoid CalcFps::calc_fps(nsecs_t currtime_us) 14429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed{ 14529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed static nsecs_t oldtime_us = 0; 14629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 14729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed nsecs_t diff = currtime_us - oldtime_us; 14829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 14929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed oldtime_us = currtime_us; 15029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 15129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed if (debug_fps_metadata_t::DFM_FRAMES == debug_fps_metadata.type && 15229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed diff > debug_fps_metadata.ignorethresh_us) { 15329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed return; 15429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed } 15529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 15629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed if (debug_fps_metadata.curr_frame < MAX_FPS_CALC_PERIOD_IN_FRAMES) { 15729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed debug_fps_metadata.framearrivals[debug_fps_metadata.curr_frame] = diff; 15829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed } 15929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 16029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed debug_fps_metadata.curr_frame++; 16129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 16229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed if (debug_fps_level > 1) { 16329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed unsigned int currstep = (diff + debug_fps_metadata.margin_us) / 16666; 16429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 16529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed if (currstep < debug_fps_metadata.framearrival_steps) { 16629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed debug_fps_metadata.accum_framearrivals[currstep-1]++; 16729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed } 16829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed } 16929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 17029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed if (debug_fps_metadata_t::DFM_FRAMES == debug_fps_metadata.type) { 17129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed if (debug_fps_metadata.curr_frame == debug_fps_metadata.period) { 17229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed /* time to calculate and display FPS */ 17329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed nsecs_t sum = 0; 17429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed for (unsigned int i = 0; i < debug_fps_metadata.period; i++) 17529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed sum += debug_fps_metadata.framearrivals[i]; 17629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed print_fps((debug_fps_metadata.period * float(1000000))/float(sum)); 17729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed } 17829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed } 17929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed else if (debug_fps_metadata_t::DFM_TIME == debug_fps_metadata.type) { 18029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed debug_fps_metadata.time_elapsed += ((float)diff/1000.0); 18129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed if (debug_fps_metadata.time_elapsed >= debug_fps_metadata.time_period) { 18229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed float fps = (1000.0 * debug_fps_metadata.curr_frame)/ 18329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed (float)debug_fps_metadata.time_elapsed; 18429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed print_fps(fps); 18529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed } 18629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed } 18729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed return; 18829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed} 189a87da60090f55b823ee999930b381daa3dbda67eNaseer Ahmed};//namespace qomutils 19029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed#endif 191