Mercurial > hg > sv-dependency-builds
comparison src/opus-1.3/silk/debug.h @ 154:4664ac0c1032
Add Opus sources and macOS builds
author | Chris Cannam <cannam@all-day-breakfast.com> |
---|---|
date | Wed, 23 Jan 2019 13:48:08 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
153:84bc3a5ec321 | 154:4664ac0c1032 |
---|---|
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 /* Set to 1 to enable DEBUG_STORE_DATA() macros for dumping | |
43 * intermediate signals from the codec. | |
44 */ | |
45 #define SILK_DEBUG 0 | |
46 | |
47 /* Flag for using timers */ | |
48 #define SILK_TIC_TOC 0 | |
49 | |
50 | |
51 #if SILK_TIC_TOC | |
52 | |
53 #if (defined(_WIN32) || defined(_WINCE)) | |
54 #include <windows.h> /* timer */ | |
55 #else /* Linux or Mac*/ | |
56 #include <sys/time.h> | |
57 #endif | |
58 | |
59 /*********************************/ | |
60 /* timer functions for profiling */ | |
61 /*********************************/ | |
62 /* example: */ | |
63 /* */ | |
64 /* TIC(LPC) */ | |
65 /* do_LPC(in_vec, order, acoef); // do LPC analysis */ | |
66 /* TOC(LPC) */ | |
67 /* */ | |
68 /* and call the following just before exiting (from main) */ | |
69 /* */ | |
70 /* silk_TimerSave("silk_TimingData.txt"); */ | |
71 /* */ | |
72 /* results are now in silk_TimingData.txt */ | |
73 | |
74 void silk_TimerSave(char *file_name); | |
75 | |
76 /* max number of timers (in different locations) */ | |
77 #define silk_NUM_TIMERS_MAX 50 | |
78 /* max length of name tags in TIC(..), TOC(..) */ | |
79 #define silk_NUM_TIMERS_MAX_TAG_LEN 30 | |
80 | |
81 extern int silk_Timer_nTimers; | |
82 extern int silk_Timer_depth_ctr; | |
83 extern char silk_Timer_tags[silk_NUM_TIMERS_MAX][silk_NUM_TIMERS_MAX_TAG_LEN]; | |
84 #ifdef _WIN32 | |
85 extern LARGE_INTEGER silk_Timer_start[silk_NUM_TIMERS_MAX]; | |
86 #else | |
87 extern unsigned long silk_Timer_start[silk_NUM_TIMERS_MAX]; | |
88 #endif | |
89 extern unsigned int silk_Timer_cnt[silk_NUM_TIMERS_MAX]; | |
90 extern opus_int64 silk_Timer_sum[silk_NUM_TIMERS_MAX]; | |
91 extern opus_int64 silk_Timer_max[silk_NUM_TIMERS_MAX]; | |
92 extern opus_int64 silk_Timer_min[silk_NUM_TIMERS_MAX]; | |
93 extern opus_int64 silk_Timer_depth[silk_NUM_TIMERS_MAX]; | |
94 | |
95 /* WARNING: TIC()/TOC can measure only up to 0.1 seconds at a time */ | |
96 #ifdef _WIN32 | |
97 #define TIC(TAG_NAME) { \ | |
98 static int init = 0; \ | |
99 static int ID = -1; \ | |
100 if( init == 0 ) \ | |
101 { \ | |
102 int k; \ | |
103 init = 1; \ | |
104 for( k = 0; k < silk_Timer_nTimers; k++ ) { \ | |
105 if( strcmp(silk_Timer_tags[k], #TAG_NAME) == 0 ) { \ | |
106 ID = k; \ | |
107 break; \ | |
108 } \ | |
109 } \ | |
110 if (ID == -1) { \ | |
111 ID = silk_Timer_nTimers; \ | |
112 silk_Timer_nTimers++; \ | |
113 silk_Timer_depth[ID] = silk_Timer_depth_ctr; \ | |
114 strcpy(silk_Timer_tags[ID], #TAG_NAME); \ | |
115 silk_Timer_cnt[ID] = 0; \ | |
116 silk_Timer_sum[ID] = 0; \ | |
117 silk_Timer_min[ID] = 0xFFFFFFFF; \ | |
118 silk_Timer_max[ID] = 0; \ | |
119 } \ | |
120 } \ | |
121 silk_Timer_depth_ctr++; \ | |
122 QueryPerformanceCounter(&silk_Timer_start[ID]); \ | |
123 } | |
124 #else | |
125 #define TIC(TAG_NAME) { \ | |
126 static int init = 0; \ | |
127 static int ID = -1; \ | |
128 if( init == 0 ) \ | |
129 { \ | |
130 int k; \ | |
131 init = 1; \ | |
132 for( k = 0; k < silk_Timer_nTimers; k++ ) { \ | |
133 if( strcmp(silk_Timer_tags[k], #TAG_NAME) == 0 ) { \ | |
134 ID = k; \ | |
135 break; \ | |
136 } \ | |
137 } \ | |
138 if (ID == -1) { \ | |
139 ID = silk_Timer_nTimers; \ | |
140 silk_Timer_nTimers++; \ | |
141 silk_Timer_depth[ID] = silk_Timer_depth_ctr; \ | |
142 strcpy(silk_Timer_tags[ID], #TAG_NAME); \ | |
143 silk_Timer_cnt[ID] = 0; \ | |
144 silk_Timer_sum[ID] = 0; \ | |
145 silk_Timer_min[ID] = 0xFFFFFFFF; \ | |
146 silk_Timer_max[ID] = 0; \ | |
147 } \ | |
148 } \ | |
149 silk_Timer_depth_ctr++; \ | |
150 silk_Timer_start[ID] = GetHighResolutionTime(); \ | |
151 } | |
152 #endif | |
153 | |
154 #ifdef _WIN32 | |
155 #define TOC(TAG_NAME) { \ | |
156 LARGE_INTEGER lpPerformanceCount; \ | |
157 static int init = 0; \ | |
158 static int ID = 0; \ | |
159 if( init == 0 ) \ | |
160 { \ | |
161 int k; \ | |
162 init = 1; \ | |
163 for( k = 0; k < silk_Timer_nTimers; k++ ) { \ | |
164 if( strcmp(silk_Timer_tags[k], #TAG_NAME) == 0 ) { \ | |
165 ID = k; \ | |
166 break; \ | |
167 } \ | |
168 } \ | |
169 } \ | |
170 QueryPerformanceCounter(&lpPerformanceCount); \ | |
171 lpPerformanceCount.QuadPart -= silk_Timer_start[ID].QuadPart; \ | |
172 if((lpPerformanceCount.QuadPart < 100000000) && \ | |
173 (lpPerformanceCount.QuadPart >= 0)) { \ | |
174 silk_Timer_cnt[ID]++; \ | |
175 silk_Timer_sum[ID] += lpPerformanceCount.QuadPart; \ | |
176 if( lpPerformanceCount.QuadPart > silk_Timer_max[ID] ) \ | |
177 silk_Timer_max[ID] = lpPerformanceCount.QuadPart; \ | |
178 if( lpPerformanceCount.QuadPart < silk_Timer_min[ID] ) \ | |
179 silk_Timer_min[ID] = lpPerformanceCount.QuadPart; \ | |
180 } \ | |
181 silk_Timer_depth_ctr--; \ | |
182 } | |
183 #else | |
184 #define TOC(TAG_NAME) { \ | |
185 unsigned long endTime; \ | |
186 static int init = 0; \ | |
187 static int ID = 0; \ | |
188 if( init == 0 ) \ | |
189 { \ | |
190 int k; \ | |
191 init = 1; \ | |
192 for( k = 0; k < silk_Timer_nTimers; k++ ) { \ | |
193 if( strcmp(silk_Timer_tags[k], #TAG_NAME) == 0 ) { \ | |
194 ID = k; \ | |
195 break; \ | |
196 } \ | |
197 } \ | |
198 } \ | |
199 endTime = GetHighResolutionTime(); \ | |
200 endTime -= silk_Timer_start[ID]; \ | |
201 if((endTime < 100000000) && \ | |
202 (endTime >= 0)) { \ | |
203 silk_Timer_cnt[ID]++; \ | |
204 silk_Timer_sum[ID] += endTime; \ | |
205 if( endTime > silk_Timer_max[ID] ) \ | |
206 silk_Timer_max[ID] = endTime; \ | |
207 if( endTime < silk_Timer_min[ID] ) \ | |
208 silk_Timer_min[ID] = endTime; \ | |
209 } \ | |
210 silk_Timer_depth_ctr--; \ | |
211 } | |
212 #endif | |
213 | |
214 #else /* SILK_TIC_TOC */ | |
215 | |
216 /* define macros as empty strings */ | |
217 #define TIC(TAG_NAME) | |
218 #define TOC(TAG_NAME) | |
219 #define silk_TimerSave(FILE_NAME) | |
220 | |
221 #endif /* SILK_TIC_TOC */ | |
222 | |
223 | |
224 #if SILK_DEBUG | |
225 /************************************/ | |
226 /* write data to file for debugging */ | |
227 /************************************/ | |
228 /* Example: DEBUG_STORE_DATA(testfile.pcm, &RIN[0], 160*sizeof(opus_int16)); */ | |
229 | |
230 #define silk_NUM_STORES_MAX 100 | |
231 extern FILE *silk_debug_store_fp[ silk_NUM_STORES_MAX ]; | |
232 extern int silk_debug_store_count; | |
233 | |
234 /* Faster way of storing the data */ | |
235 #define DEBUG_STORE_DATA( FILE_NAME, DATA_PTR, N_BYTES ) { \ | |
236 static opus_int init = 0, cnt = 0; \ | |
237 static FILE **fp; \ | |
238 if (init == 0) { \ | |
239 init = 1; \ | |
240 cnt = silk_debug_store_count++; \ | |
241 silk_debug_store_fp[ cnt ] = fopen(#FILE_NAME, "wb"); \ | |
242 } \ | |
243 fwrite((DATA_PTR), (N_BYTES), 1, silk_debug_store_fp[ cnt ]); \ | |
244 } | |
245 | |
246 /* Call this at the end of main() */ | |
247 #define SILK_DEBUG_STORE_CLOSE_FILES { \ | |
248 opus_int i; \ | |
249 for( i = 0; i < silk_debug_store_count; i++ ) { \ | |
250 fclose( silk_debug_store_fp[ i ] ); \ | |
251 } \ | |
252 } | |
253 | |
254 #else /* SILK_DEBUG */ | |
255 | |
256 /* define macros as empty strings */ | |
257 #define DEBUG_STORE_DATA(FILE_NAME, DATA_PTR, N_BYTES) | |
258 #define SILK_DEBUG_STORE_CLOSE_FILES | |
259 | |
260 #endif /* SILK_DEBUG */ | |
261 | |
262 #ifdef __cplusplus | |
263 } | |
264 #endif | |
265 | |
266 #endif /* SILK_DEBUG_H */ |