1*c83a76b0SSuyog Pawar /******************************************************************************
2*c83a76b0SSuyog Pawar *
3*c83a76b0SSuyog Pawar * Copyright (C) 2018 The Android Open Source Project
4*c83a76b0SSuyog Pawar *
5*c83a76b0SSuyog Pawar * Licensed under the Apache License, Version 2.0 (the "License");
6*c83a76b0SSuyog Pawar * you may not use this file except in compliance with the License.
7*c83a76b0SSuyog Pawar * You may obtain a copy of the License at:
8*c83a76b0SSuyog Pawar *
9*c83a76b0SSuyog Pawar * http://www.apache.org/licenses/LICENSE-2.0
10*c83a76b0SSuyog Pawar *
11*c83a76b0SSuyog Pawar * Unless required by applicable law or agreed to in writing, software
12*c83a76b0SSuyog Pawar * distributed under the License is distributed on an "AS IS" BASIS,
13*c83a76b0SSuyog Pawar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*c83a76b0SSuyog Pawar * See the License for the specific language governing permissions and
15*c83a76b0SSuyog Pawar * limitations under the License.
16*c83a76b0SSuyog Pawar *
17*c83a76b0SSuyog Pawar *****************************************************************************
18*c83a76b0SSuyog Pawar * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19*c83a76b0SSuyog Pawar */
20*c83a76b0SSuyog Pawar
21*c83a76b0SSuyog Pawar /*!
22*c83a76b0SSuyog Pawar ******************************************************************************
23*c83a76b0SSuyog Pawar * \file ihevce_profile.c
24*c83a76b0SSuyog Pawar *
25*c83a76b0SSuyog Pawar * \brief
26*c83a76b0SSuyog Pawar * This file contains Profiling related functions
27*c83a76b0SSuyog Pawar *
28*c83a76b0SSuyog Pawar * \date
29*c83a76b0SSuyog Pawar * 18/09/2012
30*c83a76b0SSuyog Pawar *
31*c83a76b0SSuyog Pawar * \author
32*c83a76b0SSuyog Pawar * Ittiam
33*c83a76b0SSuyog Pawar *
34*c83a76b0SSuyog Pawar *
35*c83a76b0SSuyog Pawar * List of Functions
36*c83a76b0SSuyog Pawar *
37*c83a76b0SSuyog Pawar *
38*c83a76b0SSuyog Pawar ******************************************************************************
39*c83a76b0SSuyog Pawar */
40*c83a76b0SSuyog Pawar
41*c83a76b0SSuyog Pawar /*****************************************************************************/
42*c83a76b0SSuyog Pawar /* File Includes */
43*c83a76b0SSuyog Pawar /*****************************************************************************/
44*c83a76b0SSuyog Pawar
45*c83a76b0SSuyog Pawar /* System include files */
46*c83a76b0SSuyog Pawar #include <stdio.h>
47*c83a76b0SSuyog Pawar #include <string.h>
48*c83a76b0SSuyog Pawar #include <stdlib.h>
49*c83a76b0SSuyog Pawar #include <assert.h>
50*c83a76b0SSuyog Pawar #include <stdarg.h>
51*c83a76b0SSuyog Pawar #include <math.h>
52*c83a76b0SSuyog Pawar
53*c83a76b0SSuyog Pawar /* User include files */
54*c83a76b0SSuyog Pawar #include "ihevc_typedefs.h"
55*c83a76b0SSuyog Pawar #include "ihevce_profile.h"
56*c83a76b0SSuyog Pawar #include "itt_video_api.h"
57*c83a76b0SSuyog Pawar #include "ihevce_api.h"
58*c83a76b0SSuyog Pawar #include <sys/time.h>
59*c83a76b0SSuyog Pawar
60*c83a76b0SSuyog Pawar /* print attributes */
61*c83a76b0SSuyog Pawar
62*c83a76b0SSuyog Pawar /* print everything on console */
63*c83a76b0SSuyog Pawar #define PRINTF(x, y, ...) printf(__VA_ARGS__)
64*c83a76b0SSuyog Pawar
65*c83a76b0SSuyog Pawar #if PROFILE_ENABLE
66*c83a76b0SSuyog Pawar
67*c83a76b0SSuyog Pawar /*!
68*c83a76b0SSuyog Pawar ******************************************************************************
69*c83a76b0SSuyog Pawar * \if Function name : init_profiler \endif
70*c83a76b0SSuyog Pawar *
71*c83a76b0SSuyog Pawar * \brief
72*c83a76b0SSuyog Pawar * Initialization of profiling context
73*c83a76b0SSuyog Pawar *
74*c83a76b0SSuyog Pawar *****************************************************************************
75*c83a76b0SSuyog Pawar */
init_profiler(profile_database_t * ps_profile_data)76*c83a76b0SSuyog Pawar void init_profiler(profile_database_t *ps_profile_data)
77*c83a76b0SSuyog Pawar {
78*c83a76b0SSuyog Pawar memset(ps_profile_data, 0, sizeof(*ps_profile_data));
79*c83a76b0SSuyog Pawar
80*c83a76b0SSuyog Pawar return;
81*c83a76b0SSuyog Pawar }
82*c83a76b0SSuyog Pawar
83*c83a76b0SSuyog Pawar /*!
84*c83a76b0SSuyog Pawar ******************************************************************************
85*c83a76b0SSuyog Pawar * \if Function name : profile_sample_time \endif
86*c83a76b0SSuyog Pawar *
87*c83a76b0SSuyog Pawar * \brief
88*c83a76b0SSuyog Pawar * This function calls the system function gettimeofday() to get the current
89*c83a76b0SSuyog Pawar * time
90*c83a76b0SSuyog Pawar *
91*c83a76b0SSuyog Pawar *****************************************************************************
92*c83a76b0SSuyog Pawar */
profile_sample_time()93*c83a76b0SSuyog Pawar ULWORD64 profile_sample_time()
94*c83a76b0SSuyog Pawar {
95*c83a76b0SSuyog Pawar struct timeval s_time;
96*c83a76b0SSuyog Pawar ULWORD64 u8_curr_time;
97*c83a76b0SSuyog Pawar
98*c83a76b0SSuyog Pawar gettimeofday(&s_time, NULL);
99*c83a76b0SSuyog Pawar u8_curr_time = (((ULWORD64)s_time.tv_sec * 1000 * 1000) + (ULWORD64)(s_time.tv_usec));
100*c83a76b0SSuyog Pawar
101*c83a76b0SSuyog Pawar return u8_curr_time;
102*c83a76b0SSuyog Pawar }
103*c83a76b0SSuyog Pawar
104*c83a76b0SSuyog Pawar /*!
105*c83a76b0SSuyog Pawar ******************************************************************************
106*c83a76b0SSuyog Pawar * \if Function name : profile_start \endif
107*c83a76b0SSuyog Pawar *
108*c83a76b0SSuyog Pawar * \brief
109*c83a76b0SSuyog Pawar * This function samples current time
110*c83a76b0SSuyog Pawar *
111*c83a76b0SSuyog Pawar *****************************************************************************
112*c83a76b0SSuyog Pawar */
profile_start(profile_database_t * ps_profile_data)113*c83a76b0SSuyog Pawar void profile_start(profile_database_t *ps_profile_data)
114*c83a76b0SSuyog Pawar {
115*c83a76b0SSuyog Pawar ps_profile_data->u8_time_start = profile_sample_time();
116*c83a76b0SSuyog Pawar assert(0 == ps_profile_data->u1_sample_taken_flag);
117*c83a76b0SSuyog Pawar ps_profile_data->u1_sample_taken_flag = 1;
118*c83a76b0SSuyog Pawar
119*c83a76b0SSuyog Pawar return;
120*c83a76b0SSuyog Pawar }
121*c83a76b0SSuyog Pawar
122*c83a76b0SSuyog Pawar /*!
123*c83a76b0SSuyog Pawar ******************************************************************************
124*c83a76b0SSuyog Pawar * \if Function name : profile_sample_time_end \endif
125*c83a76b0SSuyog Pawar *
126*c83a76b0SSuyog Pawar * \brief
127*c83a76b0SSuyog Pawar * This function is called for getting current time after a process call.
128*c83a76b0SSuyog Pawar * It also updates this info in profile database
129*c83a76b0SSuyog Pawar *
130*c83a76b0SSuyog Pawar *****************************************************************************
131*c83a76b0SSuyog Pawar */
profile_sample_time_end(profile_database_t * ps_profile_data)132*c83a76b0SSuyog Pawar void profile_sample_time_end(profile_database_t *ps_profile_data)
133*c83a76b0SSuyog Pawar {
134*c83a76b0SSuyog Pawar ps_profile_data->u8_time_end = profile_sample_time();
135*c83a76b0SSuyog Pawar assert(1 == ps_profile_data->u1_sample_taken_flag);
136*c83a76b0SSuyog Pawar ps_profile_data->u1_sample_taken_flag = 0;
137*c83a76b0SSuyog Pawar
138*c83a76b0SSuyog Pawar return;
139*c83a76b0SSuyog Pawar }
140*c83a76b0SSuyog Pawar
141*c83a76b0SSuyog Pawar /*!
142*c83a76b0SSuyog Pawar ******************************************************************************
143*c83a76b0SSuyog Pawar * \if Function name : profile_get_time_taken \endif
144*c83a76b0SSuyog Pawar *
145*c83a76b0SSuyog Pawar * \brief
146*c83a76b0SSuyog Pawar * This function computes the time taken by the process call
147*c83a76b0SSuyog Pawar *
148*c83a76b0SSuyog Pawar *****************************************************************************
149*c83a76b0SSuyog Pawar */
profile_get_time_taken(profile_database_t * ps_profile_data)150*c83a76b0SSuyog Pawar void profile_get_time_taken(profile_database_t *ps_profile_data)
151*c83a76b0SSuyog Pawar {
152*c83a76b0SSuyog Pawar if(ps_profile_data->u8_time_end < ps_profile_data->u8_time_start)
153*c83a76b0SSuyog Pawar {
154*c83a76b0SSuyog Pawar /* Timer overflow */
155*c83a76b0SSuyog Pawar ps_profile_data->u8_cur_time =
156*c83a76b0SSuyog Pawar ((LWORD64)0xFFFFFFFF - ps_profile_data->u8_time_start) + ps_profile_data->u8_time_end;
157*c83a76b0SSuyog Pawar }
158*c83a76b0SSuyog Pawar else
159*c83a76b0SSuyog Pawar {
160*c83a76b0SSuyog Pawar ps_profile_data->u8_cur_time =
161*c83a76b0SSuyog Pawar ps_profile_data->u8_time_end - ps_profile_data->u8_time_start;
162*c83a76b0SSuyog Pawar }
163*c83a76b0SSuyog Pawar }
164*c83a76b0SSuyog Pawar
165*c83a76b0SSuyog Pawar /*!
166*c83a76b0SSuyog Pawar ******************************************************************************
167*c83a76b0SSuyog Pawar * \if Function name : profile_get_average \endif
168*c83a76b0SSuyog Pawar *
169*c83a76b0SSuyog Pawar * \brief
170*c83a76b0SSuyog Pawar * This function computes the average time taken by the process calls so far
171*c83a76b0SSuyog Pawar *
172*c83a76b0SSuyog Pawar *****************************************************************************
173*c83a76b0SSuyog Pawar */
profile_get_average(profile_database_t * ps_profile_data)174*c83a76b0SSuyog Pawar void profile_get_average(profile_database_t *ps_profile_data)
175*c83a76b0SSuyog Pawar {
176*c83a76b0SSuyog Pawar ps_profile_data->u8_total_time += ps_profile_data->u8_cur_time;
177*c83a76b0SSuyog Pawar ps_profile_data->u4_num_profile_calls++;
178*c83a76b0SSuyog Pawar
179*c83a76b0SSuyog Pawar ps_profile_data->u8_avg_time =
180*c83a76b0SSuyog Pawar (ps_profile_data->u8_total_time / ps_profile_data->u4_num_profile_calls);
181*c83a76b0SSuyog Pawar
182*c83a76b0SSuyog Pawar return;
183*c83a76b0SSuyog Pawar }
184*c83a76b0SSuyog Pawar
185*c83a76b0SSuyog Pawar /*!
186*c83a76b0SSuyog Pawar ******************************************************************************
187*c83a76b0SSuyog Pawar * \if Function name : profile_get_avg_time \endif
188*c83a76b0SSuyog Pawar *
189*c83a76b0SSuyog Pawar * \brief
190*c83a76b0SSuyog Pawar * This function returns the average time taken by the process calls so far
191*c83a76b0SSuyog Pawar *
192*c83a76b0SSuyog Pawar *****************************************************************************
193*c83a76b0SSuyog Pawar */
profile_get_avg_time(profile_database_t * ps_profile_data)194*c83a76b0SSuyog Pawar int profile_get_avg_time(profile_database_t *ps_profile_data)
195*c83a76b0SSuyog Pawar {
196*c83a76b0SSuyog Pawar return (UWORD32)(ps_profile_data->u8_avg_time);
197*c83a76b0SSuyog Pawar }
198*c83a76b0SSuyog Pawar
199*c83a76b0SSuyog Pawar /*!
200*c83a76b0SSuyog Pawar ******************************************************************************
201*c83a76b0SSuyog Pawar * \if Function name : profile_get_peak \endif
202*c83a76b0SSuyog Pawar *
203*c83a76b0SSuyog Pawar * \brief
204*c83a76b0SSuyog Pawar * This function computes the peak time taken by the process calls so far
205*c83a76b0SSuyog Pawar *
206*c83a76b0SSuyog Pawar *****************************************************************************
207*c83a76b0SSuyog Pawar */
profile_get_peak(profile_database_t * ps_profile_data)208*c83a76b0SSuyog Pawar void profile_get_peak(profile_database_t *ps_profile_data)
209*c83a76b0SSuyog Pawar {
210*c83a76b0SSuyog Pawar if(ps_profile_data->u8_cur_time > ps_profile_data->u8_peak_time)
211*c83a76b0SSuyog Pawar {
212*c83a76b0SSuyog Pawar ps_profile_data->u8_peak_time = ps_profile_data->u8_cur_time;
213*c83a76b0SSuyog Pawar }
214*c83a76b0SSuyog Pawar return;
215*c83a76b0SSuyog Pawar }
216*c83a76b0SSuyog Pawar
217*c83a76b0SSuyog Pawar /*!
218*c83a76b0SSuyog Pawar ******************************************************************************
219*c83a76b0SSuyog Pawar * \if Function name : profile_get_peak \endif
220*c83a76b0SSuyog Pawar *
221*c83a76b0SSuyog Pawar * \brief
222*c83a76b0SSuyog Pawar * This function returns the peak time taken by the process calls so far
223*c83a76b0SSuyog Pawar *
224*c83a76b0SSuyog Pawar *****************************************************************************
225*c83a76b0SSuyog Pawar */
profile_get_peak_time(profile_database_t * ps_profile_data)226*c83a76b0SSuyog Pawar int profile_get_peak_time(profile_database_t *ps_profile_data)
227*c83a76b0SSuyog Pawar {
228*c83a76b0SSuyog Pawar return (UWORD32)(ps_profile_data->u8_peak_time);
229*c83a76b0SSuyog Pawar }
230*c83a76b0SSuyog Pawar
231*c83a76b0SSuyog Pawar /*!
232*c83a76b0SSuyog Pawar ******************************************************************************
233*c83a76b0SSuyog Pawar * \if Function name : profile_end \endif
234*c83a76b0SSuyog Pawar *
235*c83a76b0SSuyog Pawar * \brief
236*c83a76b0SSuyog Pawar * This function prints the profile data - time taken by the last process
237*c83a76b0SSuyog Pawar * call, average time so far and peak time so far
238*c83a76b0SSuyog Pawar *
239*c83a76b0SSuyog Pawar *****************************************************************************
240*c83a76b0SSuyog Pawar */
profile_end(profile_database_t * ps_profile_data,char * msg)241*c83a76b0SSuyog Pawar void profile_end(profile_database_t *ps_profile_data, char *msg)
242*c83a76b0SSuyog Pawar {
243*c83a76b0SSuyog Pawar printf("**********************************************\n");
244*c83a76b0SSuyog Pawar if(msg)
245*c83a76b0SSuyog Pawar {
246*c83a76b0SSuyog Pawar printf(
247*c83a76b0SSuyog Pawar "IHEVC : %s, Avg Process Time: %d micro-seconds\n",
248*c83a76b0SSuyog Pawar msg,
249*c83a76b0SSuyog Pawar (UWORD32)(ps_profile_data->u8_avg_time));
250*c83a76b0SSuyog Pawar printf(
251*c83a76b0SSuyog Pawar "IHEVC : %s, Peak Process Time : %d micro-seconds\n",
252*c83a76b0SSuyog Pawar msg,
253*c83a76b0SSuyog Pawar (UWORD32)(ps_profile_data->u8_peak_time));
254*c83a76b0SSuyog Pawar }
255*c83a76b0SSuyog Pawar else
256*c83a76b0SSuyog Pawar {
257*c83a76b0SSuyog Pawar printf(
258*c83a76b0SSuyog Pawar "IHEVC : %s, Avg Process Time: %d micro-seconds\n",
259*c83a76b0SSuyog Pawar "<unknown>",
260*c83a76b0SSuyog Pawar (UWORD32)(ps_profile_data->u8_avg_time));
261*c83a76b0SSuyog Pawar printf(
262*c83a76b0SSuyog Pawar "IHEVC : %s, Peak Process Time : %d micro-seconds\n",
263*c83a76b0SSuyog Pawar "<unknown>",
264*c83a76b0SSuyog Pawar (UWORD32)(ps_profile_data->u8_peak_time));
265*c83a76b0SSuyog Pawar }
266*c83a76b0SSuyog Pawar return;
267*c83a76b0SSuyog Pawar }
268*c83a76b0SSuyog Pawar
269*c83a76b0SSuyog Pawar /*!
270*c83a76b0SSuyog Pawar ******************************************************************************
271*c83a76b0SSuyog Pawar * \if Function name : profile_stop \endif
272*c83a76b0SSuyog Pawar *
273*c83a76b0SSuyog Pawar * \brief
274*c83a76b0SSuyog Pawar * This function prints the profile time
275*c83a76b0SSuyog Pawar *
276*c83a76b0SSuyog Pawar *****************************************************************************
277*c83a76b0SSuyog Pawar */
profile_stop(profile_database_t * ps_profile_data,char * msg)278*c83a76b0SSuyog Pawar void profile_stop(profile_database_t *ps_profile_data, char *msg)
279*c83a76b0SSuyog Pawar {
280*c83a76b0SSuyog Pawar /* Get current time - This corresponds to time after the process call */
281*c83a76b0SSuyog Pawar profile_sample_time_end(ps_profile_data);
282*c83a76b0SSuyog Pawar /* Get time taken for the process call */
283*c83a76b0SSuyog Pawar profile_get_time_taken(ps_profile_data);
284*c83a76b0SSuyog Pawar /* Calculate average time taken so far */
285*c83a76b0SSuyog Pawar profile_get_average(ps_profile_data);
286*c83a76b0SSuyog Pawar /* Calculate peak time per process call taken so far */
287*c83a76b0SSuyog Pawar profile_get_peak(ps_profile_data);
288*c83a76b0SSuyog Pawar
289*c83a76b0SSuyog Pawar if(msg)
290*c83a76b0SSuyog Pawar {
291*c83a76b0SSuyog Pawar printf("%s, fps: :%10.3f", msg, (DOUBLE)(1000000.0 / ps_profile_data->u8_avg_time));
292*c83a76b0SSuyog Pawar }
293*c83a76b0SSuyog Pawar
294*c83a76b0SSuyog Pawar return;
295*c83a76b0SSuyog Pawar }
296*c83a76b0SSuyog Pawar
297*c83a76b0SSuyog Pawar #endif /* #if PROFILE_ENABLE */
298