1 /** 2 * @copyright 3 * 4 * Copyright (c) 2015, The Linux Foundation. All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions are met: 8 * 9 * * Redistributions of source code must retain the above copyright notice, 10 * this list of conditions and the following disclaimer. 11 * * Redistributions in binary form must reproduce the above copyright notice, 12 * this list of conditions and the following disclaimer in the documentation 13 * and/or other materials provided with the distribution. 14 * * Neither the name of The Linux Foundation nor the names of its 15 * contributors may be used to endorse or promote products derived from 16 * this software without specific prior written permission. 17 * 18 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, 19 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, 20 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE DISCLAIMED. 21 * IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY 22 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 23 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 24 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 25 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 26 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 27 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH 28 * DAMAGE. 29 * 30 * @file 31 * 32 * omx_swvdec_utils.h 33 * 34 * @brief 35 * 36 * OMX software video decoder utility functions header. 37 */ 38 39 #ifndef _OMX_SWVDEC_UTILS_H_ 40 #define _OMX_SWVDEC_UTILS_H_ 41 42 #include <pthread.h> 43 44 #include <cutils/log.h> 45 46 extern unsigned int g_omx_swvdec_logmask; 47 ///< global OMX SwVdec logmask variable extern declaration 48 49 void omx_swvdec_log_init(); 50 51 #define OMX_SWVDEC_LOGMASK_LOW 4 ///< 100: logmask for low priority logs 52 #define OMX_SWVDEC_LOGMASK_HIGH 2 ///< 010: logmask for high priority logs 53 #define OMX_SWVDEC_LOGMASK_ERROR 1 ///< 001: logmask for error priority logs 54 55 #ifdef LOG_TAG 56 #undef LOG_TAG 57 #endif 58 #define LOG_TAG "OMX_SWVDEC" ///< OMX SwVdec log tag 59 60 /// low priority log message 61 #define OMX_SWVDEC_LOG_LOW(string, ...) \ 62 do { \ 63 if (g_omx_swvdec_logmask & OMX_SWVDEC_LOGMASK_LOW) \ 64 ALOGD("--- %s(): " string, __FUNCTION__, ##__VA_ARGS__); \ 65 } while (0) 66 67 /// high priority log message 68 #define OMX_SWVDEC_LOG_HIGH(string, ...) \ 69 do { \ 70 if (g_omx_swvdec_logmask & OMX_SWVDEC_LOGMASK_HIGH) \ 71 ALOGI("--- %s(): " string, __FUNCTION__, ##__VA_ARGS__); \ 72 } while (0) 73 74 /// error priority log message 75 #define OMX_SWVDEC_LOG_ERROR(string, ...) \ 76 do { \ 77 if (g_omx_swvdec_logmask & OMX_SWVDEC_LOGMASK_ERROR) \ 78 ALOGE("!!! %s(): " string, __FUNCTION__, ##__VA_ARGS__); \ 79 } while (0) 80 81 /// high priority log message for OMX SwVdec API calls 82 #define OMX_SWVDEC_LOG_API(string, ...) \ 83 do { \ 84 if (g_omx_swvdec_logmask & OMX_SWVDEC_LOGMASK_HIGH) \ 85 ALOGI(">>> %s(): " string, __FUNCTION__, ##__VA_ARGS__); \ 86 } while (0) 87 88 /// high priority log message for OMX SwVdec callbacks 89 #define OMX_SWVDEC_LOG_CALLBACK(string, ...) \ 90 do { \ 91 if (g_omx_swvdec_logmask & OMX_SWVDEC_LOGMASK_HIGH) \ 92 ALOGI("<<< %s(): " string, __FUNCTION__, ##__VA_ARGS__); \ 93 } while (0) 94 95 #define OMX_SWVDEC_QUEUE_ELEMENTS 100 ///< number of elements in queue 96 97 /// OMX SwVdec event information structure 98 typedef struct { 99 unsigned long event_id; ///< event ID 100 unsigned long event_param1; ///< event parameter 1 101 unsigned long event_param2; ///< event parameter 2 102 } OMX_SWVDEC_EVENT_INFO; 103 104 /// OMX SwVdec queue class 105 class omx_swvdec_queue 106 { 107 public: 108 omx_swvdec_queue(); 109 ~omx_swvdec_queue(); 110 111 bool push(OMX_SWVDEC_EVENT_INFO *p_event_info); 112 bool pop(OMX_SWVDEC_EVENT_INFO *p_event_info); 113 114 private: 115 OMX_SWVDEC_EVENT_INFO m_queue[OMX_SWVDEC_QUEUE_ELEMENTS]; 116 ///< event queue 117 unsigned int m_count_total; ///< count of total elements 118 unsigned int m_count_filled; ///< count of filled elements 119 unsigned int m_index_write; ///< queue index for writing 120 unsigned int m_index_read; ///< queue index for reading 121 pthread_mutex_t m_mutex; ///< mutex for queue access 122 }; 123 124 #define OMX_SWVDEC_TS_LIST_ELEMENTS 100 125 ///< number of elements in timestamp list 126 127 /// OMX SwVdec timestamp element structure. 128 typedef struct { 129 bool filled; ///< element filled? 130 long long timestamp; ///< timestamp 131 } OMX_SWVDEC_TS_ELEMENT; 132 133 /// OMX SwVdec timestamp list class 134 class omx_swvdec_ts_list 135 { 136 public: 137 omx_swvdec_ts_list(); 138 ~omx_swvdec_ts_list(); 139 140 void reset(); 141 bool push(long long timestamp); 142 bool pop(long long *p_timestamp); 143 144 private: 145 OMX_SWVDEC_TS_ELEMENT m_list[OMX_SWVDEC_TS_LIST_ELEMENTS]; 146 ///< list of timestamp elements 147 int m_count_filled; ///< count of filled elements 148 pthread_mutex_t m_mutex; ///< mutex for list access 149 }; 150 151 #define DIAG_FILENAME_IP "/data/misc/media/input.bin" ///< input filename 152 #define DIAG_FILENAME_OP "/data/misc/media/output.yuv" ///< output filename 153 154 /// OMX SwVdec diagnostics class 155 class omx_swvdec_diag 156 { 157 public: 158 omx_swvdec_diag(); 159 ~omx_swvdec_diag(); 160 161 void dump_ip(unsigned char *p_buffer, unsigned int filled_length); 162 void dump_op(unsigned char *p_buffer, 163 unsigned int width, 164 unsigned int height, 165 unsigned int stride, 166 unsigned int scanlines); 167 168 private: 169 unsigned int m_dump_ip; ///< dump input bitstream 170 unsigned int m_dump_op; ///< dump output YUV 171 172 char *m_filename_ip; ///< input filename string 173 char *m_filename_op; ///< output filename string 174 175 FILE *m_file_ip; ///< input file handle 176 FILE *m_file_op; ///< output file handle 177 }; 178 179 #endif // #ifndef _OMX_SWVDEC_UTILS_H_ 180