xref: /aosp_15_r20/external/libopus/silk/debug.c (revision a58d3d2adb790c104798cd88c8a3aff4fa8b82cc)
1*a58d3d2aSXin Li /***********************************************************************
2*a58d3d2aSXin Li Copyright (c) 2006-2011, Skype Limited. All rights reserved.
3*a58d3d2aSXin Li Redistribution and use in source and binary forms, with or without
4*a58d3d2aSXin Li modification, are permitted provided that the following conditions
5*a58d3d2aSXin Li are met:
6*a58d3d2aSXin Li - Redistributions of source code must retain the above copyright notice,
7*a58d3d2aSXin Li this list of conditions and the following disclaimer.
8*a58d3d2aSXin Li - Redistributions in binary form must reproduce the above copyright
9*a58d3d2aSXin Li notice, this list of conditions and the following disclaimer in the
10*a58d3d2aSXin Li documentation and/or other materials provided with the distribution.
11*a58d3d2aSXin Li - Neither the name of Internet Society, IETF or IETF Trust, nor the
12*a58d3d2aSXin Li names of specific contributors, may be used to endorse or promote
13*a58d3d2aSXin Li products derived from this software without specific prior written
14*a58d3d2aSXin Li permission.
15*a58d3d2aSXin Li THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
16*a58d3d2aSXin Li AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17*a58d3d2aSXin Li IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18*a58d3d2aSXin Li ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
19*a58d3d2aSXin Li LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20*a58d3d2aSXin Li CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21*a58d3d2aSXin Li SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22*a58d3d2aSXin Li INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23*a58d3d2aSXin Li CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24*a58d3d2aSXin Li ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25*a58d3d2aSXin Li POSSIBILITY OF SUCH DAMAGE.
26*a58d3d2aSXin Li ***********************************************************************/
27*a58d3d2aSXin Li 
28*a58d3d2aSXin Li #ifdef HAVE_CONFIG_H
29*a58d3d2aSXin Li #include "config.h"
30*a58d3d2aSXin Li #endif
31*a58d3d2aSXin Li 
32*a58d3d2aSXin Li typedef int prevent_empty_translation_unit_warning;
33*a58d3d2aSXin Li 
34*a58d3d2aSXin Li #include "debug.h"
35*a58d3d2aSXin Li 
36*a58d3d2aSXin Li #if SILK_DEBUG || SILK_TIC_TOC
37*a58d3d2aSXin Li #include "SigProc_FIX.h"
38*a58d3d2aSXin Li #endif
39*a58d3d2aSXin Li 
40*a58d3d2aSXin Li #if SILK_TIC_TOC
41*a58d3d2aSXin Li 
42*a58d3d2aSXin Li #if (defined(_WIN32) || defined(_WINCE))
43*a58d3d2aSXin Li #include <windows.h>    /* timer */
44*a58d3d2aSXin Li #else   /* Linux or Mac*/
45*a58d3d2aSXin Li #include <sys/time.h>
46*a58d3d2aSXin Li #endif
47*a58d3d2aSXin Li 
48*a58d3d2aSXin Li #ifdef _WIN32
silk_GetHighResolutionTime(void)49*a58d3d2aSXin Li unsigned long silk_GetHighResolutionTime(void) /* O  time in usec*/
50*a58d3d2aSXin Li {
51*a58d3d2aSXin Li     /* Returns a time counter in microsec   */
52*a58d3d2aSXin Li     /* the resolution is platform dependent */
53*a58d3d2aSXin Li     /* but is typically 1.62 us resolution  */
54*a58d3d2aSXin Li     LARGE_INTEGER lpPerformanceCount;
55*a58d3d2aSXin Li     LARGE_INTEGER lpFrequency;
56*a58d3d2aSXin Li     QueryPerformanceCounter(&lpPerformanceCount);
57*a58d3d2aSXin Li     QueryPerformanceFrequency(&lpFrequency);
58*a58d3d2aSXin Li     return (unsigned long)((1000000*(lpPerformanceCount.QuadPart)) / lpFrequency.QuadPart);
59*a58d3d2aSXin Li }
60*a58d3d2aSXin Li #else   /* Linux or Mac*/
GetHighResolutionTime(void)61*a58d3d2aSXin Li unsigned long GetHighResolutionTime(void) /* O  time in usec*/
62*a58d3d2aSXin Li {
63*a58d3d2aSXin Li     struct timeval tv;
64*a58d3d2aSXin Li     gettimeofday(&tv, 0);
65*a58d3d2aSXin Li     return((tv.tv_sec*1000000)+(tv.tv_usec));
66*a58d3d2aSXin Li }
67*a58d3d2aSXin Li #endif
68*a58d3d2aSXin Li 
69*a58d3d2aSXin Li int           silk_Timer_nTimers = 0;
70*a58d3d2aSXin Li int           silk_Timer_depth_ctr = 0;
71*a58d3d2aSXin Li char          silk_Timer_tags[silk_NUM_TIMERS_MAX][silk_NUM_TIMERS_MAX_TAG_LEN];
72*a58d3d2aSXin Li #ifdef _WIN32
73*a58d3d2aSXin Li LARGE_INTEGER silk_Timer_start[silk_NUM_TIMERS_MAX];
74*a58d3d2aSXin Li #else
75*a58d3d2aSXin Li unsigned long silk_Timer_start[silk_NUM_TIMERS_MAX];
76*a58d3d2aSXin Li #endif
77*a58d3d2aSXin Li unsigned int  silk_Timer_cnt[silk_NUM_TIMERS_MAX];
78*a58d3d2aSXin Li opus_int64     silk_Timer_min[silk_NUM_TIMERS_MAX];
79*a58d3d2aSXin Li opus_int64     silk_Timer_sum[silk_NUM_TIMERS_MAX];
80*a58d3d2aSXin Li opus_int64     silk_Timer_max[silk_NUM_TIMERS_MAX];
81*a58d3d2aSXin Li opus_int64     silk_Timer_depth[silk_NUM_TIMERS_MAX];
82*a58d3d2aSXin Li 
83*a58d3d2aSXin Li #ifdef _WIN32
silk_TimerSave(char * file_name)84*a58d3d2aSXin Li void silk_TimerSave(char *file_name)
85*a58d3d2aSXin Li {
86*a58d3d2aSXin Li     if( silk_Timer_nTimers > 0 )
87*a58d3d2aSXin Li     {
88*a58d3d2aSXin Li         int k;
89*a58d3d2aSXin Li         FILE *fp;
90*a58d3d2aSXin Li         LARGE_INTEGER lpFrequency;
91*a58d3d2aSXin Li         LARGE_INTEGER lpPerformanceCount1, lpPerformanceCount2;
92*a58d3d2aSXin Li         int del = 0x7FFFFFFF;
93*a58d3d2aSXin Li         double avg, sum_avg;
94*a58d3d2aSXin Li         /* estimate overhead of calling performance counters */
95*a58d3d2aSXin Li         for( k = 0; k < 1000; k++ ) {
96*a58d3d2aSXin Li             QueryPerformanceCounter(&lpPerformanceCount1);
97*a58d3d2aSXin Li             QueryPerformanceCounter(&lpPerformanceCount2);
98*a58d3d2aSXin Li             lpPerformanceCount2.QuadPart -= lpPerformanceCount1.QuadPart;
99*a58d3d2aSXin Li             if( (int)lpPerformanceCount2.LowPart < del )
100*a58d3d2aSXin Li                 del = lpPerformanceCount2.LowPart;
101*a58d3d2aSXin Li         }
102*a58d3d2aSXin Li         QueryPerformanceFrequency(&lpFrequency);
103*a58d3d2aSXin Li         /* print results to file */
104*a58d3d2aSXin Li         sum_avg = 0.0f;
105*a58d3d2aSXin Li         for( k = 0; k < silk_Timer_nTimers; k++ ) {
106*a58d3d2aSXin Li             if (silk_Timer_depth[k] == 0) {
107*a58d3d2aSXin Li                 sum_avg += (1e6 * silk_Timer_sum[k] / silk_Timer_cnt[k] - del) / lpFrequency.QuadPart * silk_Timer_cnt[k];
108*a58d3d2aSXin Li             }
109*a58d3d2aSXin Li         }
110*a58d3d2aSXin Li         fp = fopen(file_name, "w");
111*a58d3d2aSXin Li         fprintf(fp, "                                min         avg     %%         max      count\n");
112*a58d3d2aSXin Li         for( k = 0; k < silk_Timer_nTimers; k++ ) {
113*a58d3d2aSXin Li             if (silk_Timer_depth[k] == 0) {
114*a58d3d2aSXin Li                 fprintf(fp, "%-28s", silk_Timer_tags[k]);
115*a58d3d2aSXin Li             } else if (silk_Timer_depth[k] == 1) {
116*a58d3d2aSXin Li                 fprintf(fp, " %-27s", silk_Timer_tags[k]);
117*a58d3d2aSXin Li             } else if (silk_Timer_depth[k] == 2) {
118*a58d3d2aSXin Li                 fprintf(fp, "  %-26s", silk_Timer_tags[k]);
119*a58d3d2aSXin Li             } else if (silk_Timer_depth[k] == 3) {
120*a58d3d2aSXin Li                 fprintf(fp, "   %-25s", silk_Timer_tags[k]);
121*a58d3d2aSXin Li             } else {
122*a58d3d2aSXin Li                 fprintf(fp, "    %-24s", silk_Timer_tags[k]);
123*a58d3d2aSXin Li             }
124*a58d3d2aSXin Li             avg = (1e6 * silk_Timer_sum[k] / silk_Timer_cnt[k] - del) / lpFrequency.QuadPart;
125*a58d3d2aSXin Li             fprintf(fp, "%8.2f", (1e6 * (silk_max_64(silk_Timer_min[k] - del, 0))) / lpFrequency.QuadPart);
126*a58d3d2aSXin Li             fprintf(fp, "%12.2f %6.2f", avg, 100.0 * avg / sum_avg * silk_Timer_cnt[k]);
127*a58d3d2aSXin Li             fprintf(fp, "%12.2f", (1e6 * (silk_max_64(silk_Timer_max[k] - del, 0))) / lpFrequency.QuadPart);
128*a58d3d2aSXin Li             fprintf(fp, "%10d\n", silk_Timer_cnt[k]);
129*a58d3d2aSXin Li         }
130*a58d3d2aSXin Li         fprintf(fp, "                                microseconds\n");
131*a58d3d2aSXin Li         fclose(fp);
132*a58d3d2aSXin Li     }
133*a58d3d2aSXin Li }
134*a58d3d2aSXin Li #else
silk_TimerSave(char * file_name)135*a58d3d2aSXin Li void silk_TimerSave(char *file_name)
136*a58d3d2aSXin Li {
137*a58d3d2aSXin Li     if( silk_Timer_nTimers > 0 )
138*a58d3d2aSXin Li     {
139*a58d3d2aSXin Li         int k;
140*a58d3d2aSXin Li         FILE *fp;
141*a58d3d2aSXin Li         /* print results to file */
142*a58d3d2aSXin Li         fp = fopen(file_name, "w");
143*a58d3d2aSXin Li         fprintf(fp, "                                min         avg         max      count\n");
144*a58d3d2aSXin Li         for( k = 0; k < silk_Timer_nTimers; k++ )
145*a58d3d2aSXin Li         {
146*a58d3d2aSXin Li             if (silk_Timer_depth[k] == 0) {
147*a58d3d2aSXin Li                 fprintf(fp, "%-28s", silk_Timer_tags[k]);
148*a58d3d2aSXin Li             } else if (silk_Timer_depth[k] == 1) {
149*a58d3d2aSXin Li                 fprintf(fp, " %-27s", silk_Timer_tags[k]);
150*a58d3d2aSXin Li             } else if (silk_Timer_depth[k] == 2) {
151*a58d3d2aSXin Li                 fprintf(fp, "  %-26s", silk_Timer_tags[k]);
152*a58d3d2aSXin Li             } else if (silk_Timer_depth[k] == 3) {
153*a58d3d2aSXin Li                 fprintf(fp, "   %-25s", silk_Timer_tags[k]);
154*a58d3d2aSXin Li             } else {
155*a58d3d2aSXin Li                 fprintf(fp, "    %-24s", silk_Timer_tags[k]);
156*a58d3d2aSXin Li             }
157*a58d3d2aSXin Li             fprintf(fp, "%d ", silk_Timer_min[k]);
158*a58d3d2aSXin Li             fprintf(fp, "%f ", (double)silk_Timer_sum[k] / (double)silk_Timer_cnt[k]);
159*a58d3d2aSXin Li             fprintf(fp, "%d ", silk_Timer_max[k]);
160*a58d3d2aSXin Li             fprintf(fp, "%10d\n", silk_Timer_cnt[k]);
161*a58d3d2aSXin Li         }
162*a58d3d2aSXin Li         fprintf(fp, "                                microseconds\n");
163*a58d3d2aSXin Li         fclose(fp);
164*a58d3d2aSXin Li     }
165*a58d3d2aSXin Li }
166*a58d3d2aSXin Li #endif
167*a58d3d2aSXin Li 
168*a58d3d2aSXin Li #endif /* SILK_TIC_TOC */
169*a58d3d2aSXin Li 
170*a58d3d2aSXin Li #if SILK_DEBUG
171*a58d3d2aSXin Li FILE *silk_debug_store_fp[ silk_NUM_STORES_MAX ];
172*a58d3d2aSXin Li int silk_debug_store_count = 0;
173*a58d3d2aSXin Li #endif /* SILK_DEBUG */
174*a58d3d2aSXin Li 
175