• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /***********************************************************************
2 Copyright (c) 2006-2011, Skype Limited. All rights reserved.
3 Redistribution and use in source and binary forms, with or without
4 modification, are permitted provided that the following conditions
5 are met:
6 - Redistributions of source code must retain the above copyright notice,
7 this list of conditions and the following disclaimer.
8 - Redistributions in binary form must reproduce the above copyright
9 notice, this list of conditions and the following disclaimer in the
10 documentation and/or other materials provided with the distribution.
11 - Neither the name of Internet Society, IETF or IETF Trust, nor the
12 names of specific contributors, may be used to endorse or promote
13 products derived from this software without specific prior written
14 permission.
15 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
16 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
19 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25 POSSIBILITY OF SUCH DAMAGE.
26 ***********************************************************************/
27 
28 #ifndef SILK_DEBUG_H
29 #define SILK_DEBUG_H
30 
31 #include "typedef.h"
32 #include <stdio.h>      /* file writing */
33 #include <string.h>     /* strcpy, strcmp */
34 
35 #ifdef  __cplusplus
36 extern "C"
37 {
38 #endif
39 
40 unsigned long GetHighResolutionTime(void); /* O  time in usec*/
41 
42 /* make SILK_DEBUG dependent on compiler's _DEBUG */
43 #if defined _WIN32
44     #ifdef _DEBUG
45         #define SILK_DEBUG  1
46     #else
47         #define SILK_DEBUG  0
48     #endif
49 
50     /* overrule the above */
51     #if 0
52     /*  #define NO_ASSERTS*/
53     #undef  SILK_DEBUG
54     #define SILK_DEBUG  1
55     #endif
56 #else
57     #define SILK_DEBUG  0
58 #endif
59 
60 /* Flag for using timers */
61 #define SILK_TIC_TOC    0
62 
63 
64 #if SILK_TIC_TOC
65 
66 #if (defined(_WIN32) || defined(_WINCE))
67 #include <windows.h>    /* timer */
68 #else   /* Linux or Mac*/
69 #include <sys/time.h>
70 #endif
71 
72 /*********************************/
73 /* timer functions for profiling */
74 /*********************************/
75 /* example:                                                         */
76 /*                                                                  */
77 /* TIC(LPC)                                                         */
78 /* do_LPC(in_vec, order, acoef);    // do LPC analysis              */
79 /* TOC(LPC)                                                         */
80 /*                                                                  */
81 /* and call the following just before exiting (from main)           */
82 /*                                                                  */
83 /* silk_TimerSave("silk_TimingData.txt");                           */
84 /*                                                                  */
85 /* results are now in silk_TimingData.txt                           */
86 
87 void silk_TimerSave(char *file_name);
88 
89 /* max number of timers (in different locations) */
90 #define silk_NUM_TIMERS_MAX                  50
91 /* max length of name tags in TIC(..), TOC(..) */
92 #define silk_NUM_TIMERS_MAX_TAG_LEN          30
93 
94 extern int           silk_Timer_nTimers;
95 extern int           silk_Timer_depth_ctr;
96 extern char          silk_Timer_tags[silk_NUM_TIMERS_MAX][silk_NUM_TIMERS_MAX_TAG_LEN];
97 #ifdef _WIN32
98 extern LARGE_INTEGER silk_Timer_start[silk_NUM_TIMERS_MAX];
99 #else
100 extern unsigned long silk_Timer_start[silk_NUM_TIMERS_MAX];
101 #endif
102 extern unsigned int  silk_Timer_cnt[silk_NUM_TIMERS_MAX];
103 extern opus_int64    silk_Timer_sum[silk_NUM_TIMERS_MAX];
104 extern opus_int64    silk_Timer_max[silk_NUM_TIMERS_MAX];
105 extern opus_int64    silk_Timer_min[silk_NUM_TIMERS_MAX];
106 extern opus_int64    silk_Timer_depth[silk_NUM_TIMERS_MAX];
107 
108 /* WARNING: TIC()/TOC can measure only up to 0.1 seconds at a time */
109 #ifdef _WIN32
110 #define TIC(TAG_NAME) {                                     \
111     static int init = 0;                                    \
112     static int ID = -1;                                     \
113     if( init == 0 )                                         \
114     {                                                       \
115         int k;                                              \
116         init = 1;                                           \
117         for( k = 0; k < silk_Timer_nTimers; k++ ) {         \
118             if( strcmp(silk_Timer_tags[k], #TAG_NAME) == 0 ) { \
119                 ID = k;                                     \
120                 break;                                      \
121             }                                               \
122         }                                                   \
123         if (ID == -1) {                                     \
124             ID = silk_Timer_nTimers;                        \
125             silk_Timer_nTimers++;                           \
126             silk_Timer_depth[ID] = silk_Timer_depth_ctr;    \
127             strcpy(silk_Timer_tags[ID], #TAG_NAME);         \
128             silk_Timer_cnt[ID] = 0;                         \
129             silk_Timer_sum[ID] = 0;                         \
130             silk_Timer_min[ID] = 0xFFFFFFFF;                \
131             silk_Timer_max[ID] = 0;                         \
132         }                                                   \
133     }                                                       \
134     silk_Timer_depth_ctr++;                                 \
135     QueryPerformanceCounter(&silk_Timer_start[ID]);         \
136 }
137 #else
138 #define TIC(TAG_NAME) {                                     \
139     static int init = 0;                                    \
140     static int ID = -1;                                     \
141     if( init == 0 )                                         \
142     {                                                       \
143         int k;                                              \
144         init = 1;                                           \
145         for( k = 0; k < silk_Timer_nTimers; k++ ) {         \
146         if( strcmp(silk_Timer_tags[k], #TAG_NAME) == 0 ) {  \
147                 ID = k;                                     \
148                 break;                                      \
149             }                                               \
150         }                                                   \
151         if (ID == -1) {                                     \
152             ID = silk_Timer_nTimers;                        \
153             silk_Timer_nTimers++;                           \
154             silk_Timer_depth[ID] = silk_Timer_depth_ctr;    \
155             strcpy(silk_Timer_tags[ID], #TAG_NAME);         \
156             silk_Timer_cnt[ID] = 0;                         \
157             silk_Timer_sum[ID] = 0;                         \
158             silk_Timer_min[ID] = 0xFFFFFFFF;                \
159             silk_Timer_max[ID] = 0;                         \
160         }                                                   \
161     }                                                       \
162     silk_Timer_depth_ctr++;                                 \
163     silk_Timer_start[ID] = GetHighResolutionTime();         \
164 }
165 #endif
166 
167 #ifdef _WIN32
168 #define TOC(TAG_NAME) {                                             \
169     LARGE_INTEGER lpPerformanceCount;                               \
170     static int init = 0;                                            \
171     static int ID = 0;                                              \
172     if( init == 0 )                                                 \
173     {                                                               \
174         int k;                                                      \
175         init = 1;                                                   \
176         for( k = 0; k < silk_Timer_nTimers; k++ ) {                 \
177             if( strcmp(silk_Timer_tags[k], #TAG_NAME) == 0 ) {      \
178                 ID = k;                                             \
179                 break;                                              \
180             }                                                       \
181         }                                                           \
182     }                                                               \
183     QueryPerformanceCounter(&lpPerformanceCount);                   \
184     lpPerformanceCount.QuadPart -= silk_Timer_start[ID].QuadPart;   \
185     if((lpPerformanceCount.QuadPart < 100000000) &&                 \
186         (lpPerformanceCount.QuadPart >= 0)) {                       \
187         silk_Timer_cnt[ID]++;                                       \
188         silk_Timer_sum[ID] += lpPerformanceCount.QuadPart;          \
189         if( lpPerformanceCount.QuadPart > silk_Timer_max[ID] )      \
190             silk_Timer_max[ID] = lpPerformanceCount.QuadPart;       \
191         if( lpPerformanceCount.QuadPart < silk_Timer_min[ID] )      \
192             silk_Timer_min[ID] = lpPerformanceCount.QuadPart;       \
193     }                                                               \
194     silk_Timer_depth_ctr--;                                         \
195 }
196 #else
197 #define TOC(TAG_NAME) {                                             \
198     unsigned long endTime;                                          \
199     static int init = 0;                                            \
200     static int ID = 0;                                              \
201     if( init == 0 )                                                 \
202     {                                                               \
203         int k;                                                      \
204         init = 1;                                                   \
205         for( k = 0; k < silk_Timer_nTimers; k++ ) {                 \
206             if( strcmp(silk_Timer_tags[k], #TAG_NAME) == 0 ) {      \
207                 ID = k;                                             \
208                 break;                                              \
209             }                                                       \
210         }                                                           \
211     }                                                               \
212     endTime = GetHighResolutionTime();                              \
213     endTime -= silk_Timer_start[ID];                                \
214     if((endTime < 100000000) &&                                     \
215         (endTime >= 0)) {                                           \
216         silk_Timer_cnt[ID]++;                                       \
217         silk_Timer_sum[ID] += endTime;                              \
218         if( endTime > silk_Timer_max[ID] )                          \
219             silk_Timer_max[ID] = endTime;                           \
220         if( endTime < silk_Timer_min[ID] )                          \
221             silk_Timer_min[ID] = endTime;                           \
222     }                                                               \
223         silk_Timer_depth_ctr--;                                     \
224 }
225 #endif
226 
227 #else /* SILK_TIC_TOC */
228 
229 /* define macros as empty strings */
230 #define TIC(TAG_NAME)
231 #define TOC(TAG_NAME)
232 #define silk_TimerSave(FILE_NAME)
233 
234 #endif /* SILK_TIC_TOC */
235 
236 
237 #if SILK_DEBUG
238 /************************************/
239 /* write data to file for debugging */
240 /************************************/
241 /* Example: DEBUG_STORE_DATA(testfile.pcm, &RIN[0], 160*sizeof(opus_int16)); */
242 
243 #define silk_NUM_STORES_MAX                                  100
244 extern FILE *silk_debug_store_fp[ silk_NUM_STORES_MAX ];
245 extern int silk_debug_store_count;
246 
247 /* Faster way of storing the data */
248 #define DEBUG_STORE_DATA( FILE_NAME, DATA_PTR, N_BYTES ) {          \
249     static opus_int init = 0, cnt = 0;                              \
250     static FILE **fp;                                               \
251     if (init == 0) {                                                \
252         init = 1;                                                   \
253         cnt = silk_debug_store_count++;                             \
254         silk_debug_store_fp[ cnt ] = fopen(#FILE_NAME, "wb");       \
255     }                                                               \
256     fwrite((DATA_PTR), (N_BYTES), 1, silk_debug_store_fp[ cnt ]);   \
257 }
258 
259 /* Call this at the end of main() */
260 #define SILK_DEBUG_STORE_CLOSE_FILES {                              \
261     opus_int i;                                                     \
262     for( i = 0; i < silk_debug_store_count; i++ ) {                 \
263         fclose( silk_debug_store_fp[ i ] );                         \
264     }                                                               \
265 }
266 
267 #else /* SILK_DEBUG */
268 
269 /* define macros as empty strings */
270 #define DEBUG_STORE_DATA(FILE_NAME, DATA_PTR, N_BYTES)
271 #define SILK_DEBUG_STORE_CLOSE_FILES
272 
273 #endif /* SILK_DEBUG */
274 
275 #ifdef  __cplusplus
276 }
277 #endif
278 
279 #endif /* SILK_DEBUG_H */
280