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