111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/*--------------------------------------------------------------------------
211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelCopyright (c) 2013 - 2016, The Linux Foundation. All rights reserved.
311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelRedistribution and use in source and binary forms, with or without
511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelmodification, are permitted provided that the following conditions are met:
611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    * Redistributions of source code must retain the above copyright
711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      notice, this list of conditions and the following disclaimer.
811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    * Redistributions in binary form must reproduce the above copyright
911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      notice, this list of conditions and the following disclaimer in the
1011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      documentation and/or other materials provided with the distribution.
1111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    * Neither the name of The Linux Foundation nor
1211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      the names of its contributors may be used to endorse or promote
1311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      products derived from this software without specific prior written
1411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      permission.
1511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
1711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelIMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
1911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelNON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
2011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelCONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
2111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelEXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
2211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelPROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
2311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
2411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelWHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
2511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
2611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel--------------------------------------------------------------------------*/
2811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
2911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifndef __VIDC_DEBUG_H__
3011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define __VIDC_DEBUG_H__
3111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
3211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_
3311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <cstdio>
3411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <pthread.h>
352601808ee2992a94c325d05e4065aba60b01840bThierry Strudel#include <sys/mman.h>
3611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
3711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelenum {
3811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PRIO_ERROR=0x1,
3911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PRIO_INFO=0x1,
4011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   PRIO_HIGH=0x2,
41b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel   PRIO_LOW=0x4,
42b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel   PRIO_TRACE_HIGH = 0x10,
43b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel   PRIO_TRACE_LOW = 0x20,
4411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel};
4511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
4611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelextern int debug_level;
4711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
4811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#undef DEBUG_PRINT_ERROR
4911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define DEBUG_PRINT_ERROR(fmt, args...) ({ \
5011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      if (debug_level & PRIO_ERROR) \
5111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel          ALOGE(fmt,##args); \
5211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      })
5311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#undef DEBUG_PRINT_INFO
5411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define DEBUG_PRINT_INFO(fmt, args...) ({ \
5511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      if (debug_level & PRIO_INFO) \
5611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel          ALOGI(fmt,##args); \
5711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      })
5811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#undef DEBUG_PRINT_LOW
5911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define DEBUG_PRINT_LOW(fmt, args...) ({ \
6011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      if (debug_level & PRIO_LOW) \
6111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel          ALOGD(fmt,##args); \
6211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      })
6311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#undef DEBUG_PRINT_HIGH
6411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define DEBUG_PRINT_HIGH(fmt, args...) ({ \
6511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      if (debug_level & PRIO_HIGH) \
6611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel          ALOGD(fmt,##args); \
6711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      })
6811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#else
6911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define DEBUG_PRINT_ERROR printf
7011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define DEBUG_PRINT_INFO printf
7111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define DEBUG_PRINT_LOW printf
7211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define DEBUG_PRINT_HIGH printf
7311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
7411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
7511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define VALIDATE_OMX_PARAM_DATA(ptr, paramType)                                \
7611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {                                                                          \
7711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (ptr == NULL) { return OMX_ErrorBadParameter; }                     \
7811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        paramType *p = reinterpret_cast<paramType *>(ptr);                     \
7911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (p->nSize < sizeof(paramType)) {                                    \
8011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            ALOGE("Insufficient object size(%u) v/s expected(%zu) for type %s",\
8111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    (unsigned int)p->nSize, sizeof(paramType), #paramType);    \
8211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorBadParameter;                                      \
8311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }                                                                      \
8411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }                                                                          \
8511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
8611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelclass auto_lock {
8711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    public:
8811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        auto_lock(pthread_mutex_t &lock)
8911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            : mLock(lock) {
9011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pthread_mutex_lock(&mLock);
9111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
9211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ~auto_lock() {
9311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            pthread_mutex_unlock(&mLock);
9411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
9511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    private:
9611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        pthread_mutex_t &mLock;
9711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel};
9811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
992601808ee2992a94c325d05e4065aba60b01840bThierry Strudelclass AutoUnmap {
1002601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    void *vaddr;
1012601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    int size;
1022601808ee2992a94c325d05e4065aba60b01840bThierry Strudel
1032601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    public:
1042601808ee2992a94c325d05e4065aba60b01840bThierry Strudel        AutoUnmap(void *vaddr, int size) {
1052601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            this->vaddr = vaddr;
1062601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            this->size = size;
1072601808ee2992a94c325d05e4065aba60b01840bThierry Strudel        }
1082601808ee2992a94c325d05e4065aba60b01840bThierry Strudel
1092601808ee2992a94c325d05e4065aba60b01840bThierry Strudel        ~AutoUnmap() {
1102601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            if (vaddr)
1112601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                munmap(vaddr, size);
1122601808ee2992a94c325d05e4065aba60b01840bThierry Strudel        }
1132601808ee2992a94c325d05e4065aba60b01840bThierry Strudel};
1142601808ee2992a94c325d05e4065aba60b01840bThierry Strudel
115b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel#ifdef _ANDROID_
116b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel#define ATRACE_TAG ATRACE_TAG_VIDEO
117b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel#include <utils/Trace.h>
118b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel
119b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudelclass AutoTracer {
120b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    int mPrio;
121b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudelpublic:
122b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    AutoTracer(int prio, const char* msg)
123b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        : mPrio(prio) {
124b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        if (debug_level & prio) {
125b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel            ATRACE_BEGIN(msg);
126b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        }
127b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    }
128b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    ~AutoTracer() {
129b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        if (debug_level & mPrio) {
130b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel            ATRACE_END();
131b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        }
132b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    }
133b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel};
134b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel
135b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel#define VIDC_TRACE_NAME_LOW(_name) AutoTracer _tracer(PRIO_TRACE_LOW, _name);
136b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel#define VIDC_TRACE_NAME_HIGH(_name) AutoTracer _tracer(PRIO_TRACE_HIGH, _name);
137b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel
138b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel#define VIDC_TRACE_INT_LOW(_name, _int) \
139b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    if (debug_level & PRIO_TRACE_LOW) { \
140b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        ATRACE_INT(_name, _int);        \
141b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    }
142b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel
143b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel#define VIDC_TRACE_INT_HIGH(_name, _int) \
144b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    if (debug_level & PRIO_TRACE_HIGH) { \
145b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        ATRACE_INT(_name, _int);        \
146b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    }
147b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel
148b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel#else // _ANDROID_
149b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel
150b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel#define VIDC_TRACE_NAME_LOW(_name)
151b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel#define VIDC_TRACE_NAME_HIGH(_name)
152b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel#define VIDC_TRACE_INT_LOW(_name, _int)
153b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel#define VIDC_TRACE_INT_HIGH(_name, _int)
154b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel
155b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel#endif // !_ANDROID_
156b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel
15711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
158