xref: /OK3568_Linux_fs/external/mpp/osal/inc/mpp_time.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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