Home | History | Annotate | Download | only in libqdutils
      1 /*
      2  * Copyright (c) 2011-2012, The Linux Foundation. All rights reserved.
      3 
      4  * Redistribution and use in source and binary forms, with or without
      5  * modification, are permitted provided that the following conditions are
      6  * met:
      7  *   * Redistributions of source code must retain the above copyright
      8  *     notice, this list of conditions and the following disclaimer.
      9  *   * Redistributions in binary form must reproduce the above
     10  *     copyright notice, this list of conditions and the following
     11  *     disclaimer in the documentation and/or other materials provided
     12  *     with the distribution.
     13  *   * Neither the name of The Linux Foundation nor the names of its
     14  *     contributors may be used to endorse or promote products derived
     15  *     from this software without specific prior written permission.
     16  *
     17  * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
     18  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
     19  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
     20  * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
     21  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     22  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     23  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
     24  * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
     25  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
     26  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
     27  * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     28  */
     29 
     30 #ifndef INCLUDE_PROFILER
     31 #define INCLUDE_PROFILER
     32 
     33 #include <stdio.h>
     34 #include <utils/Singleton.h>
     35 #include <cutils/properties.h>
     36 #include <cutils/log.h>
     37 
     38 #ifndef DEBUG_CALC_FPS
     39 #define CALC_FPS() ((void)0)
     40 #define CALC_INIT() ((void)0)
     41 #else
     42 #define CALC_FPS() qdutils::CalcFps::getInstance().Fps()
     43 #define CALC_INIT() qdutils::CalcFps::getInstance().Init()
     44 using namespace android;
     45 namespace qdutils {
     46 class CalcFps : public Singleton<CalcFps> {
     47     public:
     48     CalcFps();
     49     ~CalcFps();
     50 
     51     void Init();
     52     void Fps();
     53 
     54     private:
     55     static const unsigned int MAX_FPS_CALC_PERIOD_IN_FRAMES = 128;
     56     static const unsigned int MAX_FRAMEARRIVAL_STEPS = 50;
     57     static const unsigned int MAX_DEBUG_FPS_LEVEL = 2;
     58 
     59     struct debug_fps_metadata_t {
     60         /*fps calculation based on time or number of frames*/
     61         enum DfmType {
     62             DFM_FRAMES = 0,
     63             DFM_TIME   = 1,
     64         };
     65 
     66         DfmType type;
     67 
     68         /* indicates how much time do we wait till we calculate FPS */
     69         unsigned long time_period;
     70 
     71         /*indicates how much time elapsed since we report fps*/
     72         float time_elapsed;
     73 
     74         /* indicates how many frames do we wait till we calculate FPS */
     75         unsigned int period;
     76         /* current frame, will go upto period, and then reset */
     77         unsigned int curr_frame;
     78         /* frame will arrive at a multiple of 16666 us at the display.
     79            This indicates how many steps to consider for our calculations.
     80            For example, if framearrival_steps = 10, then the frame that arrived
     81            after 166660 us or more will be ignored.
     82            */
     83         unsigned int framearrival_steps;
     84         /* ignorethresh_us = framearrival_steps * 16666 */
     85         nsecs_t      ignorethresh_us;
     86         /* used to calculate the actual frame arrival step, the times might not be
     87            accurate
     88            */
     89         unsigned int margin_us;
     90 
     91         /* actual data storage */
     92         nsecs_t      framearrivals[MAX_FPS_CALC_PERIOD_IN_FRAMES];
     93         nsecs_t      accum_framearrivals[MAX_FRAMEARRIVAL_STEPS];
     94     };
     95 
     96     private:
     97     void populate_debug_fps_metadata(void);
     98     void print_fps(float fps);
     99     void calc_fps(nsecs_t currtime_us);
    100 
    101     private:
    102     debug_fps_metadata_t debug_fps_metadata;
    103     unsigned int debug_fps_level;
    104 };
    105 };//namespace qdutils
    106 #endif
    107 
    108 #endif // INCLUDE_PROFILER
    109