diff options
Diffstat (limited to 'lib/rbcodec/codecs/libopus/silk/debug.h')
-rw-r--r-- | lib/rbcodec/codecs/libopus/silk/debug.h | 266 |
1 files changed, 266 insertions, 0 deletions
diff --git a/lib/rbcodec/codecs/libopus/silk/debug.h b/lib/rbcodec/codecs/libopus/silk/debug.h new file mode 100644 index 0000000000..6f68c1ca0f --- /dev/null +++ b/lib/rbcodec/codecs/libopus/silk/debug.h | |||
@@ -0,0 +1,266 @@ | |||
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 */ | ||