annotate 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
rev   line source
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 */