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