Home | History | Annotate | Download | only in inc
      1 
      2 /*
      3  * Copyright (C) Texas Instruments - http://www.ti.com/
      4  *
      5  * This library is free software; you can redistribute it and/or
      6  * modify it under the terms of the GNU Lesser General Public
      7  * License as published by the Free Software Foundation; either
      8  * version 2.1 of the License, or (at your option) any later version.
      9  *
     10  *
     11  * This library is distributed in the hope that it will be useful,
     12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
     13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     14  * Lesser General Public License for more details.
     15  *
     16  *
     17  * You should have received a copy of the GNU Lesser General Public
     18  * License along with this library; if not, write to the Free Software
     19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
     20  */
     21 /* =============================================================================
     22 *             Texas Instruments OMAP(TM) Platform Software
     23 *  (c) Copyright Texas Instruments, Incorporated.  All Rights Reserved.
     24 *
     25 *  Use of this software is controlled by the terms and conditions found
     26 *  in the license agreement under which this software has been supplied.
     27 * =========================================================================== */
     28 /**
     29 * @file OMX_TI_Debug.h
     30 *
     31 * This file implements the TI-specific OMX Debug interface
     32 *
     33 * @path  $(CSLPATH)\inc
     34 *
     35 * @rev  0.1
     36 */
     37 /* -------------------------------------------------------------------------- */
     38 /* =============================================================================
     39 *!
     40 *! Revision History
     41 *! ================================================================
     42 *!
     43 *! 10-Mar-2009 lm: Revisions appear in reverse chronological order;
     44 *! that is, newest first.  The date format is dd-Mon-yyyy.
     45 * =========================================================================== */
     46 
     47 #ifndef OMX_TI_DEBUG__H
     48 #define OMX_TI_DEBUG__H
     49 
     50 #include <ctype.h>
     51 #include <utils/Log.h>
     52 /*
     53     The OMX TI Debug interface allows debug messages to be classified by
     54     domain and importance.  There are no preset classifications required, but
     55     rather these are arbitrary.  Nonetheless, all modules using this interface
     56     must adhere to these domain and level conventions.
     57 
     58     While it would make sense that errors should be printed at the highest
     59     level, we separated errors into their own domain, as even error printing
     60     could have additional details that are not always desirable to print.
     61 
     62     In order to facilitate using the debug interface, a set of macros are
     63     defined for the common domains and levels.
     64 
     65     Features of the TI Debug interface:
     66 
     67     - debug messages are maskable: only messages for domains marked, and that
     68       have levels at least of the mask's level will be printed
     69     - there are two output files supported.  Error domain output is going to
     70       the error file, whereas other outputs usually go into the other output
     71       file.  This also allows only printing error messages.
     72     - colors can be specified for each domain - through this file or the
     73       macros
     74     - line number information can be added (via a compile time option)
     75 
     76     Compile time flags:
     77 
     78     __OMX_DEBUG__      - enable OMX Debug print calls
     79     __OMX_DBG_COLOR__  - enable color output
     80     __OMX_DBG_FN__     - print function
     81     __OMX_DBG_FILE__   - print file
     82     __OMX_DBG_LINE__   - print line number
     83     __OMX_DBG_LEVEL__  - print level
     84     __OMX_DBG_DOMAIN__ - print domain
     85     __OMX_DBG_4ISERROR__ - print level 4 messages into the error file
     86 
     87     __OMX_DBG_ANDROID__ - always outputs to Android log.  Otherwise, Android
     88                           log is only used if output is stderr or stdout.
     89 
     90     Output format is:
     91     file:function():line domain<level> message
     92 
     93 */
     94 
     95 /*  You can change this file here to globally set the debug configurations
     96 
     97  */
     98 #define __OMX_DEBUG__
     99 #undef  __OMX_DBG_COLOR__
    100 #undef  __OMX_DBG_FILE__
    101 #define __OMX_DBG_FN__
    102 #define __OMX_DBG_LINE__
    103 #undef  __OMX_DBG_DOMAIN__
    104 #undef  __OMX_DBG_LEVEL__
    105 #undef  __OMX_DBG_4ISERROR__
    106 #undef  __OMX_DBG_ANDROID__
    107 
    108 /*
    109  *  OMX Debug levels specify the importance of the debug print
    110  *
    111  *  0 - very verbose      -- any details, such as system return values, etc.
    112  *  1 - quite verbose     -- details
    113  *  2 - verbose           -- main details
    114  *  3 - normal            -- what an average user would want to see
    115  *  4 - quiet             -- only important messages -- this would not be
    116  *                           normally used by OMX components except for error
    117  *                           messages as they don't output anything normally.
    118  *                           This could be used by applications and tests.
    119  *  5 - very quiet        -- crucial/error messages - goes to error file
    120  */
    121 
    122 /* this is used as a bitmask currently, so must be 2^n-1 */
    123 #define OMX_DBG_MAX_LEVEL 0x0F
    124 
    125 /*
    126  *  OMX Debug domains specify the system that the messages relate to
    127  */
    128 #define OMX_DBG_DOM_ERROR  0x1ul         /* an error */
    129 #define OMX_DBG_DOM_PRINT  0x10ul        /* generic prints */
    130 #define OMX_DBG_DOM_SYSTEM 0x100ul       /* generic OS systems: memory, etc. */
    131 #define OMX_DBG_DOM_STATE  0x1000ul      /* state transitions */
    132 #define OMX_DBG_DOM_BUFFER 0x10000ul     /* buffer transfer between */
    133 #define OMX_DBG_DOM_DSP    0x100000ul    /* DSP communication/transfer */
    134 #define OMX_DBG_DOM_COMM   0x1000000ul   /* communication */
    135 #define OMX_DBG_DOM_MGR    0x10000000ul  /* communication with managers */
    136 
    137 #define OMX_DBG_BASEMASK   0x33333333ul  /* all domains at normal verbosity */
    138 
    139 /*
    140  *  Generic DEBUG Settings
    141  */
    142 struct OMX_TI_Debug
    143 {
    144     FILE *out;    /* standard output file */
    145     FILE *err;    /* error output file - used for the error domain
    146                      and crucial messages */
    147     FILE *out_opened;  /* opened output file */
    148     FILE *err_opened;  /* opened error file */
    149     OMX_U32 mask; /* debug mask */
    150 };
    151 
    152 /*
    153  *  :TRICKY: do { } while (0) makes this behave like any other C function call
    154  *           even though it contains several statements
    155  */
    156 
    157 /* This macro sets the debug mask in the debug structure based on a mask
    158    string */
    159 #define OMX_DBG_SET_MASK(dbg, mask_str) \
    160     do { \
    161         if (mask_str) { \
    162             sscanf((mask_str), "%lx", &(dbg).mask); \
    163             if (strlen(mask_str) < 8) { \
    164                 (dbg).mask &= ~0ul >> (32 - 4 * strlen(mask_str)); \
    165                 (dbg).mask |= OMX_DBG_BASEMASK << (4 * strlen(mask_str)); \
    166             } \
    167         } else { \
    168             (dbg).mask = OMX_DBG_BASEMASK; \
    169         } \
    170     } while (0)
    171 
    172 /* This macro initializes the debug structure.  Default configuration is
    173    stdout/stderr output and base mask. */
    174 #define OMX_DBG_INIT_BASE(dbg) \
    175     do { \
    176         (dbg).err = stderr; \
    177         (dbg).out = stdout; \
    178         (dbg).out_opened = (dbg).err_opened = NULL; \
    179         (dbg).mask = OMX_DBG_BASEMASK; \
    180     } while (0)
    181 
    182 /* This macro initializes the debug structure.  Default configuration is
    183    stdout/stderr output and base mask.  If the OMX_DBG_CONFIG environment
    184    variable is defined, the file given by this variable is opened and each line
    185    is compared to the tag string followed by _OUT, _ERR or _LEVEL to specify
    186    the output and error file names, or the debug level.  If the debug level
    187    string is less than 8 hexadecimal digits, the remaining domain mask levels
    188    are set to the base mask (3). */
    189 #define OMX_DBG_INITALL(dbg, tag_str, file) \
    190     do { \
    191         (dbg).err = stderr; \
    192         (dbg).out = stdout; \
    193         (dbg).out_opened = (dbg).err_opened = NULL; \
    194         (dbg).mask = OMX_DBG_BASEMASK; \
    195         char *config_file = getenv("OMX_DBG_CONFIG"); \
    196         FILE *config = (config_file && *config_file) ? fopen(config_file, "rt") : NULL; \
    197         if (config) { \
    198             char line[80], *ptr, *end, out[75], err[75]; \
    199             out[0] = err[0] = '\0'; \
    200             while (fgets(line, sizeof(line), config)) { \
    201                 for (ptr = line; isspace(*ptr); ptr++); \
    202                 if (!strncmp(ptr, tag_str, strlen(tag_str))) { \
    203                     ptr += strlen(tag_str); \
    204                     end = ptr + strlen(ptr); \
    205                     while (end > ptr && isspace(end[-1])) *--end = '\0'; \
    206                     if (file && !strncmp(ptr, "_ERR", 4) && isspace(ptr[4])) { \
    207                         ptr += 4; \
    208                         while (isspace(*ptr)) ptr++; \
    209                         strcpy(err, ptr); \
    210                     } else if (file && !strncmp(ptr, "_OUT", 4) && isspace(ptr[4])) { \
    211                         ptr += 4; \
    212                         while (isspace(*ptr)) ptr++; \
    213                         strcpy(out, ptr); \
    214                     } else if (!strncmp(ptr, "_LEVEL", 6) && isspace(ptr[6])) { \
    215                         ptr += 6; \
    216                         while (isspace(*ptr)) ptr++; \
    217                         OMX_DBG_SET_MASK(dbg, ptr); \
    218                     } \
    219                 } \
    220             } \
    221             if (file) { \
    222                 if (!strcmp(out, "stdout")) {} \
    223                 else if (!strcmp(out, "stderr")) (dbg).out = stderr; \
    224                 else if (!strcmp(out, "null")) (dbg).out = NULL; \
    225                 else if (*out) (dbg).out_opened = (dbg).out = fopen(out, "w"); \
    226                 if (!strcmp(err, "stderr")) {} \
    227                 else if (!strcmp(err, "stdout")) (dbg).err = stdout; \
    228                 else if (!strcmp(err, "null")) (dbg).err = NULL; \
    229                 else if (!strcmp(err, out)) (dbg).err = (dbg).out; \
    230                 else if (*err) (dbg).err_opened = (dbg).err = fopen(err, "w"); \
    231             } \
    232             fclose(config); \
    233         } \
    234     } while (0)
    235 
    236 
    237 #define OMX_DBG_INIT(dbg, tag_str)      OMX_DBG_INITALL(dbg, tag_str, 1)
    238 #define OMX_DBG_INIT_MASK(dbg, tag_str) OMX_DBG_INITALL(dbg, tag_str, 0)
    239 
    240 
    241 /* Use this macro to copy a OMX_TI_Debug config received. */
    242 #define OMX_DBG_SETCONFIG(dbg, pConfig) \
    243     do { \
    244         struct OMX_TI_Debug *pConfDbg = (struct OMX_TI_Debug *) pConfig; \
    245         (dbg).mask = pConfDbg->mask; \
    246         (dbg).out = pConfDbg->out; \
    247         (dbg).err = pConfDbg->err; \
    248     } while (0)
    249 
    250 /* Use this macro to copy a OMX_TI_Debug config to be sent. */
    251 #define OMX_DBG_GETCONFIG(dbg, pConfig) \
    252     do { \
    253         struct OMX_TI_Debug *pConfDbg = (struct OMX_TI_Debug *) pConfig; \
    254         pConfDbg->mask = dbg.mask; \
    255         pConfDbg->out = dbg.out; \
    256         pConfDbg->err = dbg.err; \
    257         pConfDbg->err_opened = pConfDbg->out_opened = NULL; \
    258     } while (0)
    259 
    260 /* Use this macro to close any opened file that was opened by OMX_DBG. */
    261 #define OMX_DBG_CLOSE(dbg) \
    262     do { \
    263         if ((dbg).err_opened) { \
    264             if ((dbg).err == (dbg).err_opened) (dbg).err = stderr; \
    265             fclose((dbg).err_opened); \
    266         } \
    267         if ((dbg).out_opened) { \
    268             if ((dbg).out == (dbg).out_opened) (dbg).out = stdout; \
    269             if ((dbg).err == (dbg).out_opened) (dbg).err = stderr; \
    270             fclose((dbg).out_opened); \
    271         } \
    272         (dbg).err_opened = (dbg).out_opened = NULL; \
    273     } while (0)
    274 
    275 #ifdef __OMX_DEBUG__
    276 
    277 /*
    278  *  GENERIC OMX TI DEBUG STATEMENT
    279  *
    280  *  file   - output of the debug message
    281  *  level  - level of the debug message
    282  *  domain - domain of the debug message
    283  *  mask   - debug print mask, only messages for domains marked, and that have
    284  *           levels at least of the mask's level will be printed
    285  *  format, list - debug message
    286  */
    287 
    288 #ifdef ANDROID
    289 #ifdef __OMX_DEBUG_ANDROID__
    290     #define OMX_DBG_PRINT(file, domain, level, mask, format, list...) \
    291         do {\
    292             if ((file) && (OMX_U32) (level * domain) >= (OMX_U32) ((mask) & (domain * OMX_DBG_MAX_LEVEL))) \
    293                 ALOGD(OMX_DBG_FN_FMT OMX_DBG_LINE_FMT OMX_DBG_FMT \
    294                     format OMX_DBG_FN OMX_DBG_LINE, ##list); \
    295         } while (0)
    296 #else
    297     #define OMX_DBG_PRINT(file, domain, level, mask, format, list...) \
    298         do {\
    299             if ((file) && (OMX_U32) (level * domain) >= (OMX_U32) ((mask) & (domain * OMX_DBG_MAX_LEVEL))) { \
    300                 if (file == stderr || file == stdout) { \
    301                     ALOGD(OMX_DBG_FN_FMT OMX_DBG_LINE_FMT OMX_DBG_FMT \
    302                         format OMX_DBG_FN OMX_DBG_LINE, ##list); \
    303                 } else { \
    304                 fprintf((file), \
    305                         OMX_DBG_FILE OMX_DBG_FN_FMT OMX_DBG_LINE_FMT OMX_DBG_FMT \
    306                         format OMX_DBG_FN OMX_DBG_LINE, ##list); \
    307                 } \
    308             } \
    309         } while (0)
    310 #endif
    311 #else
    312     #define OMX_DBG_PRINT(file, domain, level, mask, format, list...) \
    313         do {\
    314             if ((file) && (OMX_U32) (level * domain) >= (OMX_U32) ((mask) & (domain * OMX_DBG_MAX_LEVEL))) \
    315                 fprintf((file), \
    316                         OMX_DBG_FILE OMX_DBG_FN_FMT OMX_DBG_LINE_FMT OMX_DBG_FMT \
    317                         format OMX_DBG_FN OMX_DBG_LINE, ##list); \
    318         } while (0)
    319 #endif
    320 
    321 /*  Alternate mask understanding implementation.  Use this if we cannot specify a
    322     level for each domain */
    323 /*
    324     #define OMX_DBG_PRINT(file, domain, level, mask, format, list...) \
    325         do {\
    326             if (file && (mask & domain) && level >= (mask & OMX_MASK_LEVEL)) \
    327                 fprintf(file, \
    328                         OMX_DBG_FILE OMX_DBG_FN_FMT OMX_DBG_LINE_FMT OMX_DBG_FMT \
    329                         format, OMX_DBG_FN OMX_DBG_LINE ##list); \
    330         } while (0)
    331 */
    332 
    333 #else
    334 /* empty definitions */
    335     #define OMX_DBG_PRINT(file, domain, level, mask, format, list...)
    336 #endif
    337 
    338 /*
    339  *  OMX BAIL Shortcut macros
    340  */
    341 #define OMX_DBG_BAIL_IF_ERROR(_eError, dbg, cmd, format, list...) \
    342     do { \
    343         if (_eError) { \
    344             cmd(dbg, format, ##list); \
    345             OMX_CONF_BAIL_IF_ERROR(_eError); \
    346         } \
    347     } while (0)
    348 
    349 #define OMX_DBG_SET_ERROR_BAIL(_eError, _eErrorValue, dbg, cmd, format, list...) \
    350     do { \
    351         cmd(dbg, format, ##list); \
    352         OMX_CONF_SET_ERROR_BAIL(_eError, _eErrorValue); \
    353     } while (0)
    354 
    355 #define OMX_DBG_CHECK_CMD(dbg, _ptr1, _ptr2, _ptr3) \
    356     do { \
    357         if(!_ptr1) OMX_ERROR4(dbg, "NULL parameter (" #_ptr1 ").\n"); \
    358         else if(!_ptr2) OMX_ERROR4(dbg, "NULL parameter (" #_ptr2 ").\n"); \
    359         else if(!_ptr3) OMX_ERROR4(dbg, "NULL parameter (" #_ptr3 ").\n"); \
    360         OMX_CONF_CHECK_CMD(_ptr1, _ptr2, _ptr3); \
    361     } while (0)
    362 
    363 
    364 /*
    365  *  GENERIC OMX TI DEBUG Shortcut macros
    366  */
    367 
    368 /* This variant uses a shortcut for the domain notation, but is not traceable
    369    by source understanders.  It also adds the color to the format string. */
    370 #define OMXDBG_PRINT(file, domain, level, mask, format, list...) \
    371    OMX_DBG_PRINT(file, OMX_DBG_DOM_##domain, level, mask, \
    372                  OMX_DBG_COL_##domain OMX_DBG_DOM_##domain##_STR OMX_DBG_LEVEL(level) format OMX_DBG_COL_WHITE, ##list)
    373 
    374 /* Shortcuts */
    375 #define OMX_ERROR0(dbg, format, list...) OMXDBG_PRINT((dbg).err, ERROR, 0, (dbg).mask, format, ##list)
    376 #define OMX_ERROR1(dbg, format, list...) OMXDBG_PRINT((dbg).err, ERROR, 1, (dbg).mask, format, ##list)
    377 #define OMX_ERROR2(dbg, format, list...) OMXDBG_PRINT((dbg).err, ERROR, 2, (dbg).mask, format, ##list)
    378 #define OMX_ERROR3(dbg, format, list...) OMXDBG_PRINT((dbg).err, ERROR, 3, (dbg).mask, format, ##list)
    379 #define OMX_ERROR4(dbg, format, list...) OMXDBG_PRINT((dbg).err, ERROR, 4, (dbg).mask, format, ##list)
    380 #define OMX_ERROR5(dbg, format, list...) OMXDBG_PRINT((dbg).err, ERROR, 5, (dbg).mask, format, ##list)
    381 #define OMX_TRACE0(dbg, format, list...) OMXDBG_PRINT((dbg).out, SYSTEM, 0, (dbg).mask, format, ##list)
    382 #define OMX_TRACE1(dbg, format, list...) OMXDBG_PRINT((dbg).out, SYSTEM, 1, (dbg).mask, format, ##list)
    383 #define OMX_TRACE2(dbg, format, list...) OMXDBG_PRINT((dbg).out, SYSTEM, 2, (dbg).mask, format, ##list)
    384 #define OMX_TRACE3(dbg, format, list...) OMXDBG_PRINT((dbg).out, SYSTEM, 3, (dbg).mask, format, ##list)
    385 #define OMX_TRACE4(dbg, format, list...) OMXDBG_PRINT((dbg).OMX_DBG_LEVEL4, SYSTEM, 4, (dbg).mask, format, ##list)
    386 #define OMX_TRACE5(dbg, format, list...) OMXDBG_PRINT((dbg).err, SYSTEM, 5, (dbg).mask, format, ##list)
    387 #define OMX_PRINT0(dbg, format, list...) OMXDBG_PRINT((dbg).out, PRINT, 0, (dbg).mask, format, ##list)
    388 #define OMX_PRINT1(dbg, format, list...) OMXDBG_PRINT((dbg).out, PRINT, 1, (dbg).mask, format, ##list)
    389 #define OMX_PRINT2(dbg, format, list...) OMXDBG_PRINT((dbg).out, PRINT, 2, (dbg).mask, format, ##list)
    390 #define OMX_PRINT3(dbg, format, list...) OMXDBG_PRINT((dbg).out, PRINT, 3, (dbg).mask, format, ##list)
    391 #define OMX_PRINT4(dbg, format, list...) OMXDBG_PRINT((dbg).OMX_DBG_LEVEL4, PRINT, 4, (dbg).mask, format, ##list)
    392 #define OMX_PRINT5(dbg, format, list...) OMXDBG_PRINT((dbg).err, PRINT, 5, (dbg).mask, format, ##list)
    393 #define OMX_PRBUFFER0(dbg, format, list...) OMXDBG_PRINT((dbg).out, BUFFER, 0, (dbg).mask, format, ##list)
    394 #define OMX_PRBUFFER1(dbg, format, list...) OMXDBG_PRINT((dbg).out, BUFFER, 1, (dbg).mask, format, ##list)
    395 #define OMX_PRBUFFER2(dbg, format, list...) OMXDBG_PRINT((dbg).out, BUFFER, 2, (dbg).mask, format, ##list)
    396 #define OMX_PRBUFFER3(dbg, format, list...) OMXDBG_PRINT((dbg).out, BUFFER, 3, (dbg).mask, format, ##list)
    397 #define OMX_PRBUFFER4(dbg, format, list...) OMXDBG_PRINT((dbg).OMX_DBG_LEVEL4, BUFFER, 4, (dbg).mask, format, ##list)
    398 #define OMX_PRBUFFER5(dbg, format, list...) OMXDBG_PRINT((dbg).err, BUFFER, 5, (dbg).mask, format, ##list)
    399 #define OMX_PRMGR0(dbg, format, list...) OMXDBG_PRINT((dbg).out, MGR, 0, (dbg).mask, format, ##list)
    400 #define OMX_PRMGR1(dbg, format, list...) OMXDBG_PRINT((dbg).out, MGR, 1, (dbg).mask, format, ##list)
    401 #define OMX_PRMGR2(dbg, format, list...) OMXDBG_PRINT((dbg).out, MGR, 2, (dbg).mask, format, ##list)
    402 #define OMX_PRMGR3(dbg, format, list...) OMXDBG_PRINT((dbg).out, MGR, 3, (dbg).mask, format, ##list)
    403 #define OMX_PRMGR4(dbg, format, list...) OMXDBG_PRINT((dbg).OMX_DBG_LEVEL4, MGR, 4, (dbg).mask, format, ##list)
    404 #define OMX_PRMGR5(dbg, format, list...) OMXDBG_PRINT((dbg).err, MGR, 5, (dbg).mask, format, ##list)
    405 #define OMX_PRDSP0(dbg, format, list...) OMXDBG_PRINT((dbg).out, DSP, 0, (dbg).mask, format, ##list)
    406 #define OMX_PRDSP1(dbg, format, list...) OMXDBG_PRINT((dbg).out, DSP, 1, (dbg).mask, format, ##list)
    407 #define OMX_PRDSP2(dbg, format, list...) OMXDBG_PRINT((dbg).out, DSP, 2, (dbg).mask, format, ##list)
    408 #define OMX_PRDSP3(dbg, format, list...) OMXDBG_PRINT((dbg).out, DSP, 3, (dbg).mask, format, ##list)
    409 #define OMX_PRDSP4(dbg, format, list...) OMXDBG_PRINT((dbg).OMX_DBG_LEVEL4, DSP, 4, (dbg).mask, format, ##list)
    410 #define OMX_PRDSP5(dbg, format, list...) OMXDBG_PRINT((dbg).err, DSP, 5, (dbg).mask, format, ##list)
    411 #define OMX_PRCOMM0(dbg, format, list...) OMXDBG_PRINT((dbg).out, COMM, 0, (dbg).mask, format, ##list)
    412 #define OMX_PRCOMM1(dbg, format, list...) OMXDBG_PRINT((dbg).out, COMM, 1, (dbg).mask, format, ##list)
    413 #define OMX_PRCOMM2(dbg, format, list...) OMXDBG_PRINT((dbg).out, COMM, 2, (dbg).mask, format, ##list)
    414 #define OMX_PRCOMM3(dbg, format, list...) OMXDBG_PRINT((dbg).out, COMM, 3, (dbg).mask, format, ##list)
    415 #define OMX_PRCOMM4(dbg, format, list...) OMXDBG_PRINT((dbg).OMX_DBG_LEVEL4, COMM, 4, (dbg).mask, format, ##list)
    416 #define OMX_PRCOMM5(dbg, format, list...) OMXDBG_PRINT((dbg).err, COMM, 5, (dbg).mask, format, ##list)
    417 #define OMX_PRSTATE0(dbg, format, list...) OMXDBG_PRINT((dbg).out, STATE, 0, (dbg).mask, format, ##list)
    418 #define OMX_PRSTATE1(dbg, format, list...) OMXDBG_PRINT((dbg).out, STATE, 1, (dbg).mask, format, ##list)
    419 #define OMX_PRSTATE2(dbg, format, list...) OMXDBG_PRINT((dbg).out, STATE, 2, (dbg).mask, format, ##list)
    420 #define OMX_PRSTATE3(dbg, format, list...) OMXDBG_PRINT((dbg).out, STATE, 3, (dbg).mask, format, ##list)
    421 #define OMX_PRSTATE4(dbg, format, list...) OMXDBG_PRINT((dbg).OMX_DBG_LEVEL4, STATE, 4, (dbg).mask, format, ##list)
    422 #define OMX_PRSTATE5(dbg, format, list...) OMXDBG_PRINT((dbg).err, STATE, 5, (dbg).mask, format, ##list)
    423 
    424 /*
    425  *  Compile Time Customizations
    426  */
    427 
    428 /*
    429  *  Context
    430  */
    431 #ifdef __OMX_DBG_FN__
    432     #define OMX_DBG_FN_FMT "%s()"
    433     #define OMX_DBG_FN , __FUNCTION__
    434 #else
    435     #define OMX_DBG_FN_FMT
    436     #define OMX_DBG_FN
    437 #endif
    438 
    439 #ifdef __OMX_DBG_LINE__
    440     #define OMX_DBG_LINE_FMT ":%d"
    441     #define OMX_DBG_LINE , __LINE__
    442 #else
    443     #define OMX_DBG_LINE_FMT
    444     #define OMX_DBG_LINE
    445 #endif
    446 
    447 #ifdef __OMX_DBG_FILE__
    448     #ifdef __OMX_DBG_FN__
    449         #define OMX_DBG_FILE __FILE__ ":"
    450     #else
    451         #define OMX_DBG_FILE __FILE__
    452     #endif
    453 #else
    454     #define OMX_DBG_FILE
    455 #endif
    456 
    457 #if defined(__OMX_DBG_LEVEL__)
    458     #define OMX_DBG_LEVEL(level) "<" #level "> "
    459 #elif defined(__OMX_DBG_DOMAIN__)
    460     #define OMX_DBG_LEVEL(level) " "
    461 #else
    462     #define OMX_DBG_LEVEL(level)
    463 #endif
    464 
    465 #ifdef __OMX_DBG_DOMAIN__
    466     #define OMX_DBG_DOM_ERROR_STR  "ERR"
    467     #define OMX_DBG_DOM_BUFFER_STR "BUF"
    468     #define OMX_DBG_DOM_COMM_STR   "COM"
    469     #define OMX_DBG_DOM_DSP_STR    "DSP"
    470     #define OMX_DBG_DOM_SYSTEM_STR "SYS"
    471     #define OMX_DBG_DOM_MGR_STR    "MGR"
    472     #define OMX_DBG_DOM_STATE_STR  "STA"
    473     #define OMX_DBG_DOM_PRINT_STR  "GEN"
    474 #else
    475     #define OMX_DBG_DOM_ERROR_STR
    476     #define OMX_DBG_DOM_BUFFER_STR
    477     #define OMX_DBG_DOM_COMM_STR
    478     #define OMX_DBG_DOM_DSP_STR
    479     #define OMX_DBG_DOM_SYSTEM_STR
    480     #define OMX_DBG_DOM_MGR_STR
    481     #define OMX_DBG_DOM_STATE_STR
    482     #define OMX_DBG_DOM_PRINT_STR
    483 #endif
    484 
    485 #ifdef __OMX_DBG_4ISERROR__
    486     #define OMX_DBG_LEVEL4 err
    487 #else
    488     #define OMX_DBG_LEVEL4 out
    489 #endif
    490 
    491 #if defined(__OMX_DBG_LINE__) || defined(__OMX_DBG_FN__) || defined(__OMX_DBG_FILE__)
    492     #define OMX_DBG_FMT " "
    493 #else
    494     #define OMX_DBG_FMT
    495 #endif
    496 
    497 /*
    498  *  Color (ANSI escape sequences)
    499  */
    500 #ifdef __OMX_DBG_COLOR__
    501     #define OMX_DBG_COL_RED     "\x1b[1;31;40m"
    502     #define OMX_DBG_COL_GREEN   "\x1b[1;32;40m"
    503     #define OMX_DBG_COL_YELLOW  "\x1b[1;33;40m"
    504     #define OMX_DBG_COL_BLUE    "\x1b[1;34;40m"
    505     #define OMX_DBG_COL_MAGENTA "\x1b[1;35;40m"
    506     #define OMX_DBG_COL_CYAN    "\x1b[1;36;40m"
    507     #define OMX_DBG_COL_WHITE   "\x1b[1;37;40m"
    508 #else
    509     #define OMX_DBG_COL_BLUE
    510     #define OMX_DBG_COL_CYAN
    511     #define OMX_DBG_COL_GREEN
    512     #define OMX_DBG_COL_MAGENTA
    513     #define OMX_DBG_COL_RED
    514     #define OMX_DBG_COL_WHITE
    515     #define OMX_DBG_COL_YELLOW
    516 #endif
    517 
    518 /*
    519  *  Domain colors - these can be predefined differently
    520  */
    521 
    522 #ifndef OMX_DBG_COL_ERROR
    523 #define OMX_DBG_COL_ERROR OMX_DBG_COL_RED
    524 #endif
    525 #ifndef OMX_DBG_COL_SYSTEM
    526 #define OMX_DBG_COL_SYSTEM OMX_DBG_COL_WHITE
    527 #endif
    528 #ifndef OMX_DBG_COL_PRINT
    529 #define OMX_DBG_COL_PRINT OMX_DBG_COL_WHITE
    530 #endif
    531 #ifndef OMX_DBG_COL_BUFFER
    532 #define OMX_DBG_COL_BUFFER OMX_DBG_COL_GREEN
    533 #endif
    534 #ifndef OMX_DBG_COL_MGR
    535 #define OMX_DBG_COL_MGR OMX_DBG_COL_MAGENTA
    536 #endif
    537 #ifndef OMX_DBG_COL_DSP
    538 #define OMX_DBG_COL_DSP OMX_DBG_COL_CYAN
    539 #endif
    540 #ifndef OMX_DBG_COL_COMM
    541 #define OMX_DBG_COL_COMM OMX_DBG_COL_YELLOW
    542 #endif
    543 #ifndef OMX_DBG_COL_STATE
    544 #define OMX_DBG_COL_STATE OMX_DBG_COL_BLUE
    545 #endif
    546 
    547 #ifdef OMX_MEMDEBUG
    548 #define mem_array_size=500;
    549 
    550 void *arr[mem_array_size];
    551 int lines[mem_array_size];
    552 int bytes[mem_array_size];
    553 char file[mem_array_size][50];
    554 
    555 #define newmalloc(x) mymalloc(__LINE__,__FILE__,x)
    556 #define newfree(z) myfree(z,__LINE__,__FILE__)
    557 
    558 void * mymalloc(int line, char *s, int size);
    559 int myfree(void *dp, int line, char *s);
    560 
    561 void * mymalloc(int line, char *s, int size)
    562 {
    563    void *p;
    564    int e=0;
    565    p = malloc(size);
    566    if(p==NULL){
    567        OMXDBG_PRINT(stderr, ERROR, 4, 0, "Memory not available\n");
    568        /* ddexit(1); */
    569        }
    570    else{
    571          while((lines[e]!=0)&& (e<(mem_array_size - 1)) ){
    572               e++;
    573          }
    574          arr[e]=p;
    575          lines[e]=line;
    576          bytes[e]=size;
    577          strcpy(file[e],s);
    578          OMXDBG_PRINT(stderr, BUFFER, 2, 0,
    579             "Allocating %d bytes on address %p, line %d file %s pos %d\n", size, p, line, s, e);
    580    }
    581    return p;
    582 }
    583 
    584 int myfree(void *dp, int line, char *s){
    585     int q;
    586     for(q=0;q<mem_array_size;q++){
    587         if(arr[q]==dp){
    588            OMXDBG_PRINT(stderr, PRINT, 2, 0, "Deleting %d bytes on address %p, line %d file %s\n",
    589                    bytes[q],dp, line, s);
    590            free(dp);
    591            dp = NULL;
    592            lines[q]=0;
    593            strcpy(file[q],"");
    594            break;
    595         }
    596      }
    597      if(mem_array_size==q){
    598          OMXDBG_PRINT(stderr, PRINT, 2, 0, "\n\nPointer not found. Line:%d    File%s!!\n\n",line, s);
    599      }
    600 }
    601 
    602 #else
    603 
    604 #define newmalloc(x) malloc(x)
    605 #define newfree(z) free(z)
    606 
    607 #endif
    608 
    609 
    610 #endif
    611