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