1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * Copyright 2015 Rockchip Electronics Co. LTD 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * Licensed under the Apache License, Version 2.0 (the "License"); 5*4882a593Smuzhiyun * you may not use this file except in compliance with the License. 6*4882a593Smuzhiyun * You may obtain a copy of the License at 7*4882a593Smuzhiyun * 8*4882a593Smuzhiyun * http://www.apache.org/licenses/LICENSE-2.0 9*4882a593Smuzhiyun * 10*4882a593Smuzhiyun * Unless required by applicable law or agreed to in writing, software 11*4882a593Smuzhiyun * distributed under the License is distributed on an "AS IS" BASIS, 12*4882a593Smuzhiyun * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*4882a593Smuzhiyun * See the License for the specific language governing permissions and 14*4882a593Smuzhiyun * limitations under the License. 15*4882a593Smuzhiyun */ 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun #ifndef __MPP_TIME_H__ 18*4882a593Smuzhiyun #define __MPP_TIME_H__ 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun #include "rk_type.h" 21*4882a593Smuzhiyun #include "mpp_thread.h" 22*4882a593Smuzhiyun 23*4882a593Smuzhiyun #if defined(_WIN32) && !defined(__MINGW32CE__) 24*4882a593Smuzhiyun #include <windows.h> 25*4882a593Smuzhiyun #define msleep Sleep 26*4882a593Smuzhiyun #define sleep(x) Sleep((x)*1000) 27*4882a593Smuzhiyun #else 28*4882a593Smuzhiyun #include <unistd.h> 29*4882a593Smuzhiyun #define msleep(x) usleep((x)*1000) 30*4882a593Smuzhiyun #endif 31*4882a593Smuzhiyun 32*4882a593Smuzhiyun typedef void* MppClock; 33*4882a593Smuzhiyun typedef void* MppTimer; 34*4882a593Smuzhiyun typedef void* MppStopwatch; 35*4882a593Smuzhiyun 36*4882a593Smuzhiyun #ifdef __cplusplus 37*4882a593Smuzhiyun extern "C" { 38*4882a593Smuzhiyun #endif 39*4882a593Smuzhiyun 40*4882a593Smuzhiyun RK_S64 mpp_time(); 41*4882a593Smuzhiyun void mpp_time_diff(RK_S64 start, RK_S64 end, RK_S64 limit, const char *fmt); 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun /* 44*4882a593Smuzhiyun * Clock create / destroy / enable / disable function 45*4882a593Smuzhiyun * Note when clock is create it is default disabled user need to call enable 46*4882a593Smuzhiyun * fucntion with enable = 1 to enable the clock. 47*4882a593Smuzhiyun * User can use enable function with enable = 0 to disable the clock. 48*4882a593Smuzhiyun */ 49*4882a593Smuzhiyun MppClock mpp_clock_get(const char *name); 50*4882a593Smuzhiyun void mpp_clock_put(MppClock clock); 51*4882a593Smuzhiyun void mpp_clock_enable(MppClock clock, RK_U32 enable); 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun /* 54*4882a593Smuzhiyun * Clock basic operation function: 55*4882a593Smuzhiyun * start : let clock start timing counter 56*4882a593Smuzhiyun * pause : let clock pause and return the diff to start time 57*4882a593Smuzhiyun * reset : let clock counter to all zero 58*4882a593Smuzhiyun */ 59*4882a593Smuzhiyun RK_S64 mpp_clock_start(MppClock clock); 60*4882a593Smuzhiyun RK_S64 mpp_clock_pause(MppClock clock); 61*4882a593Smuzhiyun RK_S64 mpp_clock_reset(MppClock clock); 62*4882a593Smuzhiyun 63*4882a593Smuzhiyun /* 64*4882a593Smuzhiyun * These clock helper function can only be call when clock is paused: 65*4882a593Smuzhiyun * mpp_clock_get_sum - Return clock sum up total value 66*4882a593Smuzhiyun * mpp_clock_get_count - Return clock sum up counter value 67*4882a593Smuzhiyun * mpp_clock_get_name - Return clock name 68*4882a593Smuzhiyun */ 69*4882a593Smuzhiyun RK_S64 mpp_clock_get_sum(MppClock clock); 70*4882a593Smuzhiyun RK_S64 mpp_clock_get_count(MppClock clock); 71*4882a593Smuzhiyun const char *mpp_clock_get_name(MppClock clock); 72*4882a593Smuzhiyun 73*4882a593Smuzhiyun /* 74*4882a593Smuzhiyun * MppTimer is for timer with callback function 75*4882a593Smuzhiyun * It will provide the ability to repeat doing something until it is 76*4882a593Smuzhiyun * disalble or put. 77*4882a593Smuzhiyun * 78*4882a593Smuzhiyun * Timer work flow: 79*4882a593Smuzhiyun * 80*4882a593Smuzhiyun * 1. mpp_timer_get 81*4882a593Smuzhiyun * 2. mpp_timer_set_callback 82*4882a593Smuzhiyun * 3. mpp_timer_set_timing(initial, interval) 83*4882a593Smuzhiyun * 4. mpp_timer_set_enable(initial, 1) 84*4882a593Smuzhiyun * ... running ... 85*4882a593Smuzhiyun * 5. mpp_timer_set_enable(initial, 0) 86*4882a593Smuzhiyun * 6. mpp_timer_put 87*4882a593Smuzhiyun */ 88*4882a593Smuzhiyun MppTimer mpp_timer_get(const char *name); 89*4882a593Smuzhiyun void mpp_timer_set_callback(MppTimer timer, MppThreadFunc func, void *ctx); 90*4882a593Smuzhiyun void mpp_timer_set_timing(MppTimer timer, RK_S32 initial, RK_S32 interval); 91*4882a593Smuzhiyun void mpp_timer_set_enable(MppTimer timer, RK_S32 enable); 92*4882a593Smuzhiyun void mpp_timer_put(MppTimer timer); 93*4882a593Smuzhiyun 94*4882a593Smuzhiyun /* 95*4882a593Smuzhiyun * MppStopwatch is for timer to record event and time 96*4882a593Smuzhiyun * 97*4882a593Smuzhiyun * Stopwatch work flow: 98*4882a593Smuzhiyun * 99*4882a593Smuzhiyun * 1. mpp_stopwatch_get 100*4882a593Smuzhiyun * 2. mpp_stopwatch_setup(max_count, show_on_exit) 101*4882a593Smuzhiyun * 3. mpp_stopwatch_record(event) 102*4882a593Smuzhiyun * ... running ... 103*4882a593Smuzhiyun * 4. mpp_stopwatch_record(event) 104*4882a593Smuzhiyun * 5. mpp_stopwatch_put (show events and time) 105*4882a593Smuzhiyun */ 106*4882a593Smuzhiyun MppStopwatch mpp_stopwatch_get(const char *name); 107*4882a593Smuzhiyun void mpp_stopwatch_set_show_on_exit(MppStopwatch stopwatch, RK_S32 show_on_exit); 108*4882a593Smuzhiyun void mpp_stopwatch_record(MppStopwatch stopwatch, const char *event); 109*4882a593Smuzhiyun void mpp_stopwatch_put(MppStopwatch timer); 110*4882a593Smuzhiyun RK_S64 mpp_stopwatch_elapsed_time(MppStopwatch stopwatch); 111*4882a593Smuzhiyun 112*4882a593Smuzhiyun #ifdef __cplusplus 113*4882a593Smuzhiyun } 114*4882a593Smuzhiyun #endif 115*4882a593Smuzhiyun 116*4882a593Smuzhiyun #ifdef __cplusplus 117*4882a593Smuzhiyun class AutoTiming 118*4882a593Smuzhiyun { 119*4882a593Smuzhiyun public: 120*4882a593Smuzhiyun AutoTiming(const char *name = "AutoTiming"); 121*4882a593Smuzhiyun ~AutoTiming(); 122*4882a593Smuzhiyun private: 123*4882a593Smuzhiyun const char *mName; 124*4882a593Smuzhiyun RK_S64 mStart; 125*4882a593Smuzhiyun RK_S64 mEnd; 126*4882a593Smuzhiyun 127*4882a593Smuzhiyun AutoTiming(const AutoTiming &); 128*4882a593Smuzhiyun AutoTiming &operator = (const AutoTiming&); 129*4882a593Smuzhiyun }; 130*4882a593Smuzhiyun 131*4882a593Smuzhiyun #endif 132*4882a593Smuzhiyun 133*4882a593Smuzhiyun #define AUTO_TIMER_STRING(name, cnt) name ## cnt 134*4882a593Smuzhiyun #define AUTO_TIMER_NAME_STRING(name, cnt) AUTO_TIMER_STRING(name, cnt) 135*4882a593Smuzhiyun #define AUTO_TIMER_NAME(name) AUTO_TIMER_NAME_STRING(name, __COUNTER__) 136*4882a593Smuzhiyun #define AUTO_TIMING() AutoTiming AUTO_TIMER_NAME(auto_timing)(__FUNCTION__) 137*4882a593Smuzhiyun 138*4882a593Smuzhiyun #endif /*__MPP_TIME_H__*/ 139