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