1 /*-------------------------------------------------------------------------- 2 Copyright (c) 2010-2014, The Linux Foundation. All rights reserved. 3 4 Redistribution and use in source and binary forms, with or without 5 modification, are permitted provided that the following conditions are 6 met: 7 * Redistributions of source code must retain the above copyright 8 notice, this list of conditions and the following disclaimer. 9 * Redistributions in binary form must reproduce the above 10 copyright notice, this list of conditions and the following 11 disclaimer in the documentation and/or other materials provided 12 with the distribution. 13 * Neither the name of The Linux Foundation nor the names of its 14 contributors may be used to endorse or promote products derived 15 from this software without specific prior written permission. 16 17 THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 18 WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 19 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 20 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 21 BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 22 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 23 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 24 BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 25 WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 26 OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 27 IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 --------------------------------------------------------------------------*/ 29 30 #ifndef __OMX_VIDEO_BASE_H__ 31 #define __OMX_VIDEO_BASE_H__ 32 /*============================================================================ 33 O p e n M A X Component 34 Video Encoder 35 36 *//** @file comx_video_base.h 37 This module contains the class definition for openMAX decoder component. 38 39 *//*========================================================================*/ 40 41 ////////////////////////////////////////////////////////////////////////////// 42 // Include Files 43 ////////////////////////////////////////////////////////////////////////////// 44 45 #define LOG_TAG "OMX-VENC" 46 #include <stdlib.h> 47 #include <stdio.h> 48 #include <sys/mman.h> 49 #ifdef _ANDROID_ 50 #include <binder/MemoryHeapBase.h> 51 #ifdef _ANDROID_ICS_ 52 #include "QComOMXMetadata.h" 53 #endif 54 #endif // _ANDROID_ 55 #include <pthread.h> 56 #include <semaphore.h> 57 #include <linux/msm_vidc_enc.h> 58 #include "OMX_Core.h" 59 #include "OMX_QCOMExtns.h" 60 #include "OMX_VideoExt.h" 61 #include "OMX_IndexExt.h" 62 #include "qc_omx_component.h" 63 #include "omx_video_common.h" 64 #include "extra_data_handler.h" 65 #include <linux/videodev2.h> 66 #include <dlfcn.h> 67 #include "C2DColorConverter.h" 68 #include "vidc_debug.h" 69 70 #ifdef _ANDROID_ 71 using namespace android; 72 // local pmem heap object 73 class VideoHeap : public MemoryHeapBase 74 { 75 public: 76 VideoHeap(int fd, size_t size, void* base); 77 virtual ~VideoHeap() {} 78 }; 79 80 #include <utils/Log.h> 81 82 #endif // _ANDROID_ 83 84 #ifdef USE_ION 85 static const char* MEM_DEVICE = "/dev/ion"; 86 #if defined(MAX_RES_720P) && !defined(_MSM8974_) 87 #define MEM_HEAP_ID ION_CAMERA_HEAP_ID 88 #else 89 #ifdef _MSM8974_ 90 #define MEM_HEAP_ID ION_IOMMU_HEAP_ID 91 #else 92 #define MEM_HEAP_ID ION_CP_MM_HEAP_ID 93 #endif 94 #endif 95 #elif MAX_RES_720P 96 static const char* MEM_DEVICE = "/dev/pmem_adsp"; 97 #elif MAX_RES_1080P_EBI 98 static const char* MEM_DEVICE = "/dev/pmem_adsp"; 99 #elif MAX_RES_1080P 100 static const char* MEM_DEVICE = "/dev/pmem_smipool"; 101 #else 102 #error MEM_DEVICE cannot be determined. 103 #endif 104 105 #ifdef _ION_HEAP_MASK_COMPATIBILITY_WA 106 #define ION_HEAP_MASK heap_mask 107 #else 108 #define ION_HEAP_MASK heap_id_mask 109 #endif 110 111 ////////////////////////////////////////////////////////////////////////////// 112 // Module specific globals 113 ////////////////////////////////////////////////////////////////////////////// 114 115 #define OMX_SPEC_VERSION 0x00000101 116 117 118 ////////////////////////////////////////////////////////////////////////////// 119 // Macros 120 ////////////////////////////////////////////////////////////////////////////// 121 #define PrintFrameHdr(bufHdr) DEBUG_PRINT("bufHdr %x buf %x size %d TS %d\n",\ 122 (unsigned) bufHdr,\ 123 (unsigned)((OMX_BUFFERHEADERTYPE *)bufHdr)->pBuffer,\ 124 (unsigned)((OMX_BUFFERHEADERTYPE *)bufHdr)->nFilledLen,\ 125 (unsigned)((OMX_BUFFERHEADERTYPE *)bufHdr)->nTimeStamp) 126 127 // BitMask Management logic 128 #define BITS_PER_INDEX 64 129 #define BITMASK_SIZE(mIndex) (((mIndex) + BITS_PER_INDEX - 1)/BITS_PER_INDEX) 130 #define BITMASK_OFFSET(mIndex) ((mIndex)/BITS_PER_INDEX) 131 #define BITMASK_FLAG(mIndex) ((uint64_t)1 << ((mIndex) % BITS_PER_INDEX)) 132 #define BITMASK_CLEAR(mArray,mIndex) (mArray)[BITMASK_OFFSET(mIndex)] \ 133 &= ~(BITMASK_FLAG(mIndex)) 134 #define BITMASK_SET(mArray,mIndex) (mArray)[BITMASK_OFFSET(mIndex)] \ 135 |= BITMASK_FLAG(mIndex) 136 #define BITMASK_PRESENT(mArray,mIndex) ((mArray)[BITMASK_OFFSET(mIndex)] \ 137 & BITMASK_FLAG(mIndex)) 138 #define BITMASK_ABSENT(mArray,mIndex) (((mArray)[BITMASK_OFFSET(mIndex)] \ 139 & BITMASK_FLAG(mIndex)) == 0x0) 140 #define BITMASK_PRESENT(mArray,mIndex) ((mArray)[BITMASK_OFFSET(mIndex)] \ 141 & BITMASK_FLAG(mIndex)) 142 #define BITMASK_ABSENT(mArray,mIndex) (((mArray)[BITMASK_OFFSET(mIndex)] \ 143 & BITMASK_FLAG(mIndex)) == 0x0) 144 #ifdef _ANDROID_ICS_ 145 #define MAX_NUM_INPUT_BUFFERS 64 146 #endif 147 void* message_thread(void *); 148 149 // OMX video class 150 class omx_video: public qc_omx_component 151 { 152 protected: 153 #ifdef _ANDROID_ICS_ 154 bool meta_mode_enable; 155 bool c2d_opened; 156 encoder_media_buffer_type meta_buffers[MAX_NUM_INPUT_BUFFERS]; 157 OMX_BUFFERHEADERTYPE *opaque_buffer_hdr[MAX_NUM_INPUT_BUFFERS]; 158 bool get_syntaxhdr_enable; 159 OMX_BUFFERHEADERTYPE *psource_frame; 160 OMX_BUFFERHEADERTYPE *pdest_frame; 161 bool secure_session; 162 bool hier_b_enabled; 163 //intermediate conversion buffer queued to encoder in case of invalid EOS input 164 OMX_BUFFERHEADERTYPE *mEmptyEosBuffer; 165 166 class omx_c2d_conv 167 { 168 public: 169 omx_c2d_conv(); 170 ~omx_c2d_conv(); 171 bool init(); 172 bool open(unsigned int height,unsigned int width, 173 ColorConvertFormat src, 174 ColorConvertFormat dest,unsigned int src_stride); 175 bool convert(int src_fd, void *src_base, void *src_viraddr, 176 int dest_fd, void *dest_base, void *dest_viraddr); 177 bool get_buffer_size(int port,unsigned int &buf_size); 178 int get_src_format(); 179 void close(); 180 private: 181 C2DColorConverterBase *c2dcc; 182 pthread_mutex_t c_lock; 183 void *mLibHandle; 184 ColorConvertFormat src_format; 185 createC2DColorConverter_t *mConvertOpen; 186 destroyC2DColorConverter_t *mConvertClose; 187 }; 188 omx_c2d_conv c2d_conv; 189 #endif 190 public: 191 192 bool mUseProxyColorFormat; 193 //RGB or non-native input, and we have pre-allocated conversion buffers 194 bool mUsesColorConversion; 195 196 omx_video(); // constructor 197 virtual ~omx_video(); // destructor 198 199 // virtual int async_message_process (void *context, void* message); 200 void process_event_cb(void *ctxt,unsigned char id); 201 202 OMX_ERRORTYPE allocate_buffer( 203 OMX_HANDLETYPE hComp, 204 OMX_BUFFERHEADERTYPE **bufferHdr, 205 OMX_U32 port, 206 OMX_PTR appData, 207 OMX_U32 bytes 208 ); 209 210 211 virtual OMX_ERRORTYPE component_deinit(OMX_HANDLETYPE hComp)= 0; 212 213 virtual OMX_ERRORTYPE component_init(OMX_STRING role)= 0; 214 215 virtual OMX_U32 dev_stop(void) = 0; 216 virtual OMX_U32 dev_pause(void) = 0; 217 virtual OMX_U32 dev_start(void) = 0; 218 virtual OMX_U32 dev_flush(unsigned) = 0; 219 virtual OMX_U32 dev_resume(void) = 0; 220 virtual OMX_U32 dev_start_done(void) = 0; 221 virtual OMX_U32 dev_set_message_thread_id(pthread_t) = 0; 222 virtual bool dev_use_buf(void *,unsigned,unsigned) = 0; 223 virtual bool dev_free_buf(void *,unsigned) = 0; 224 virtual bool dev_empty_buf(void *, void *,unsigned,unsigned) = 0; 225 virtual bool dev_fill_buf(void *buffer, void *,unsigned,unsigned) = 0; 226 virtual bool dev_get_buf_req(OMX_U32 *,OMX_U32 *,OMX_U32 *,OMX_U32) = 0; 227 virtual bool dev_get_seq_hdr(void *, unsigned, unsigned *) = 0; 228 virtual bool dev_loaded_start(void) = 0; 229 virtual bool dev_loaded_stop(void) = 0; 230 virtual bool dev_loaded_start_done(void) = 0; 231 virtual bool dev_loaded_stop_done(void) = 0; 232 virtual bool is_secure_session(void) = 0; 233 #ifdef _MSM8974_ 234 virtual int dev_handle_extradata(void*, int) = 0; 235 virtual int dev_set_format(int) = 0; 236 #endif 237 virtual bool dev_is_video_session_supported(OMX_U32 width, OMX_U32 height) = 0; 238 virtual bool dev_get_capability_ltrcount(OMX_U32 *, OMX_U32 *, OMX_U32 *) = 0; 239 virtual bool dev_get_performance_level(OMX_U32 *) = 0; 240 virtual bool dev_get_vui_timing_info(OMX_U32 *) = 0; 241 virtual bool dev_get_peak_bitrate(OMX_U32 *) = 0; 242 #ifdef _ANDROID_ICS_ 243 void omx_release_meta_buffer(OMX_BUFFERHEADERTYPE *buffer); 244 #endif 245 virtual bool dev_color_align(OMX_BUFFERHEADERTYPE *buffer, OMX_U32 width, 246 OMX_U32 height) = 0; 247 virtual bool dev_get_output_log_flag() = 0; 248 virtual int dev_output_log_buffers(const char *buffer_addr, int buffer_len) = 0; 249 virtual int dev_extradata_log_buffers(char *buffer_addr) = 0; 250 OMX_ERRORTYPE component_role_enum( 251 OMX_HANDLETYPE hComp, 252 OMX_U8 *role, 253 OMX_U32 index 254 ); 255 256 OMX_ERRORTYPE component_tunnel_request( 257 OMX_HANDLETYPE hComp, 258 OMX_U32 port, 259 OMX_HANDLETYPE peerComponent, 260 OMX_U32 peerPort, 261 OMX_TUNNELSETUPTYPE *tunnelSetup 262 ); 263 264 OMX_ERRORTYPE empty_this_buffer( 265 OMX_HANDLETYPE hComp, 266 OMX_BUFFERHEADERTYPE *buffer 267 ); 268 269 270 271 OMX_ERRORTYPE fill_this_buffer( 272 OMX_HANDLETYPE hComp, 273 OMX_BUFFERHEADERTYPE *buffer 274 ); 275 276 277 OMX_ERRORTYPE free_buffer( 278 OMX_HANDLETYPE hComp, 279 OMX_U32 port, 280 OMX_BUFFERHEADERTYPE *buffer 281 ); 282 283 OMX_ERRORTYPE get_component_version( 284 OMX_HANDLETYPE hComp, 285 OMX_STRING componentName, 286 OMX_VERSIONTYPE *componentVersion, 287 OMX_VERSIONTYPE *specVersion, 288 OMX_UUIDTYPE *componentUUID 289 ); 290 291 OMX_ERRORTYPE get_config( 292 OMX_HANDLETYPE hComp, 293 OMX_INDEXTYPE configIndex, 294 OMX_PTR configData 295 ); 296 297 OMX_ERRORTYPE get_extension_index( 298 OMX_HANDLETYPE hComp, 299 OMX_STRING paramName, 300 OMX_INDEXTYPE *indexType 301 ); 302 303 OMX_ERRORTYPE get_parameter(OMX_HANDLETYPE hComp, 304 OMX_INDEXTYPE paramIndex, 305 OMX_PTR paramData); 306 307 OMX_ERRORTYPE get_state(OMX_HANDLETYPE hComp, 308 OMX_STATETYPE *state); 309 310 311 312 OMX_ERRORTYPE send_command(OMX_HANDLETYPE hComp, 313 OMX_COMMANDTYPE cmd, 314 OMX_U32 param1, 315 OMX_PTR cmdData); 316 317 318 OMX_ERRORTYPE set_callbacks(OMX_HANDLETYPE hComp, 319 OMX_CALLBACKTYPE *callbacks, 320 OMX_PTR appData); 321 322 virtual OMX_ERRORTYPE set_config(OMX_HANDLETYPE hComp, 323 OMX_INDEXTYPE configIndex, 324 OMX_PTR configData) = 0; 325 326 virtual OMX_ERRORTYPE set_parameter(OMX_HANDLETYPE hComp, 327 OMX_INDEXTYPE paramIndex, 328 OMX_PTR paramData) =0; 329 330 OMX_ERRORTYPE use_buffer(OMX_HANDLETYPE hComp, 331 OMX_BUFFERHEADERTYPE **bufferHdr, 332 OMX_U32 port, 333 OMX_PTR appData, 334 OMX_U32 bytes, 335 OMX_U8 *buffer); 336 337 338 OMX_ERRORTYPE use_EGL_image(OMX_HANDLETYPE hComp, 339 OMX_BUFFERHEADERTYPE **bufferHdr, 340 OMX_U32 port, 341 OMX_PTR appData, 342 void * eglImage); 343 344 345 346 int m_pipe_in; 347 int m_pipe_out; 348 349 pthread_t msg_thread_id; 350 pthread_t async_thread_id; 351 bool async_thread_created; 352 bool msg_thread_created; 353 354 OMX_U8 m_nkind[128]; 355 356 357 //int *input_pmem_fd; 358 //int *output_pmem_fd; 359 struct pmem *m_pInput_pmem; 360 struct pmem *m_pOutput_pmem; 361 #ifdef USE_ION 362 struct venc_ion *m_pInput_ion; 363 struct venc_ion *m_pOutput_ion; 364 #endif 365 366 367 368 public: 369 // Bit Positions 370 enum flags_bit_positions { 371 // Defer transition to IDLE 372 OMX_COMPONENT_IDLE_PENDING =0x1, 373 // Defer transition to LOADING 374 OMX_COMPONENT_LOADING_PENDING =0x2, 375 // First Buffer Pending 376 OMX_COMPONENT_FIRST_BUFFER_PENDING =0x3, 377 // Second Buffer Pending 378 OMX_COMPONENT_SECOND_BUFFER_PENDING =0x4, 379 // Defer transition to Enable 380 OMX_COMPONENT_INPUT_ENABLE_PENDING =0x5, 381 // Defer transition to Enable 382 OMX_COMPONENT_OUTPUT_ENABLE_PENDING =0x6, 383 // Defer transition to Disable 384 OMX_COMPONENT_INPUT_DISABLE_PENDING =0x7, 385 // Defer transition to Disable 386 OMX_COMPONENT_OUTPUT_DISABLE_PENDING =0x8, 387 //defer flush notification 388 OMX_COMPONENT_OUTPUT_FLUSH_PENDING =0x9, 389 OMX_COMPONENT_INPUT_FLUSH_PENDING =0xA, 390 OMX_COMPONENT_PAUSE_PENDING =0xB, 391 OMX_COMPONENT_EXECUTE_PENDING =0xC, 392 OMX_COMPONENT_LOADED_START_PENDING = 0xD, 393 OMX_COMPONENT_LOADED_STOP_PENDING = 0xF, 394 395 }; 396 397 // Deferred callback identifiers 398 enum { 399 //Event Callbacks from the venc component thread context 400 OMX_COMPONENT_GENERATE_EVENT = 0x1, 401 //Buffer Done callbacks from the venc component thread context 402 OMX_COMPONENT_GENERATE_BUFFER_DONE = 0x2, 403 //Frame Done callbacks from the venc component thread context 404 OMX_COMPONENT_GENERATE_FRAME_DONE = 0x3, 405 //Buffer Done callbacks from the venc component thread context 406 OMX_COMPONENT_GENERATE_FTB = 0x4, 407 //Frame Done callbacks from the venc component thread context 408 OMX_COMPONENT_GENERATE_ETB = 0x5, 409 //Command 410 OMX_COMPONENT_GENERATE_COMMAND = 0x6, 411 //Push-Pending Buffers 412 OMX_COMPONENT_PUSH_PENDING_BUFS = 0x7, 413 // Empty Buffer Done callbacks 414 OMX_COMPONENT_GENERATE_EBD = 0x8, 415 //Flush Event Callbacks from the venc component thread context 416 OMX_COMPONENT_GENERATE_EVENT_FLUSH = 0x9, 417 OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH = 0x0A, 418 OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH = 0x0B, 419 OMX_COMPONENT_GENERATE_FBD = 0xc, 420 OMX_COMPONENT_GENERATE_START_DONE = 0xD, 421 OMX_COMPONENT_GENERATE_PAUSE_DONE = 0xE, 422 OMX_COMPONENT_GENERATE_RESUME_DONE = 0xF, 423 OMX_COMPONENT_GENERATE_STOP_DONE = 0x10, 424 OMX_COMPONENT_GENERATE_HARDWARE_ERROR = 0x11, 425 OMX_COMPONENT_GENERATE_LTRUSE_FAILED = 0x12, 426 OMX_COMPONENT_GENERATE_ETB_OPQ = 0x13 427 }; 428 429 struct omx_event { 430 unsigned long param1; 431 unsigned long param2; 432 unsigned long id; 433 }; 434 435 struct omx_cmd_queue { 436 omx_event m_q[OMX_CORE_CONTROL_CMDQ_SIZE]; 437 unsigned long m_read; 438 unsigned long m_write; 439 unsigned long m_size; 440 441 omx_cmd_queue(); 442 ~omx_cmd_queue(); 443 bool insert_entry(unsigned long p1, unsigned long p2, unsigned long id); 444 bool pop_entry(unsigned long *p1,unsigned long *p2, unsigned long *id); 445 // get msgtype of the first ele from the queue 446 unsigned get_q_msg_type(); 447 448 }; 449 450 bool allocate_done(void); 451 bool allocate_input_done(void); 452 bool allocate_output_done(void); 453 454 OMX_ERRORTYPE free_input_buffer(OMX_BUFFERHEADERTYPE *bufferHdr); 455 OMX_ERRORTYPE free_output_buffer(OMX_BUFFERHEADERTYPE *bufferHdr); 456 457 OMX_ERRORTYPE allocate_input_buffer(OMX_HANDLETYPE hComp, 458 OMX_BUFFERHEADERTYPE **bufferHdr, 459 OMX_U32 port, 460 OMX_PTR appData, 461 OMX_U32 bytes); 462 #ifdef _ANDROID_ICS_ 463 OMX_ERRORTYPE allocate_input_meta_buffer(OMX_HANDLETYPE hComp, 464 OMX_BUFFERHEADERTYPE **bufferHdr, 465 OMX_PTR appData, 466 OMX_U32 bytes); 467 #endif 468 OMX_ERRORTYPE allocate_output_buffer(OMX_HANDLETYPE hComp, 469 OMX_BUFFERHEADERTYPE **bufferHdr, 470 OMX_U32 port,OMX_PTR appData, 471 OMX_U32 bytes); 472 473 OMX_ERRORTYPE use_input_buffer(OMX_HANDLETYPE hComp, 474 OMX_BUFFERHEADERTYPE **bufferHdr, 475 OMX_U32 port, 476 OMX_PTR appData, 477 OMX_U32 bytes, 478 OMX_U8 *buffer); 479 480 OMX_ERRORTYPE use_output_buffer(OMX_HANDLETYPE hComp, 481 OMX_BUFFERHEADERTYPE **bufferHdr, 482 OMX_U32 port, 483 OMX_PTR appData, 484 OMX_U32 bytes, 485 OMX_U8 *buffer); 486 487 bool execute_omx_flush(OMX_U32); 488 bool execute_output_flush(void); 489 bool execute_input_flush(void); 490 #ifdef _MSM8974_ 491 bool execute_flush_all(void); 492 #endif 493 OMX_ERRORTYPE empty_buffer_done(OMX_HANDLETYPE hComp, 494 OMX_BUFFERHEADERTYPE * buffer); 495 496 OMX_ERRORTYPE fill_buffer_done(OMX_HANDLETYPE hComp, 497 OMX_BUFFERHEADERTYPE * buffer); 498 OMX_ERRORTYPE empty_this_buffer_proxy(OMX_HANDLETYPE hComp, 499 OMX_BUFFERHEADERTYPE *buffer); 500 OMX_ERRORTYPE empty_this_buffer_opaque(OMX_HANDLETYPE hComp, 501 OMX_BUFFERHEADERTYPE *buffer); 502 OMX_ERRORTYPE push_input_buffer(OMX_HANDLETYPE hComp); 503 OMX_ERRORTYPE convert_queue_buffer(OMX_HANDLETYPE hComp, 504 struct pmem &Input_pmem_info,unsigned long &index); 505 OMX_ERRORTYPE queue_meta_buffer(OMX_HANDLETYPE hComp, 506 struct pmem &Input_pmem_info); 507 OMX_ERRORTYPE push_empty_eos_buffer(OMX_HANDLETYPE hComp, 508 OMX_BUFFERHEADERTYPE *buffer); 509 OMX_ERRORTYPE fill_this_buffer_proxy(OMX_HANDLETYPE hComp, 510 OMX_BUFFERHEADERTYPE *buffer); 511 bool release_done(); 512 513 bool release_output_done(); 514 bool release_input_done(); 515 516 OMX_ERRORTYPE send_command_proxy(OMX_HANDLETYPE hComp, 517 OMX_COMMANDTYPE cmd, 518 OMX_U32 param1, 519 OMX_PTR cmdData); 520 bool post_event( unsigned long p1, 521 unsigned long p2, 522 unsigned long id 523 ); 524 OMX_ERRORTYPE get_supported_profile_level(OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType); 525 inline void omx_report_error () { 526 if (m_pCallbacks.EventHandler && !m_error_propogated) { 527 m_error_propogated = true; 528 DEBUG_PRINT_ERROR("ERROR: send OMX_ErrorHardware to Client"); 529 m_pCallbacks.EventHandler(&m_cmp,m_app_data, 530 OMX_EventError,OMX_ErrorHardware,0,NULL); 531 } 532 } 533 534 inline void omx_report_hw_overload () 535 { 536 if (m_pCallbacks.EventHandler && !m_error_propogated) { 537 m_error_propogated = true; 538 DEBUG_PRINT_ERROR("ERROR: send OMX_ErrorInsufficientResources to Client"); 539 m_pCallbacks.EventHandler(&m_cmp, m_app_data, 540 OMX_EventError, OMX_ErrorInsufficientResources, 0, NULL); 541 } 542 } 543 544 inline void omx_report_unsupported_setting () { 545 if (m_pCallbacks.EventHandler && !m_error_propogated) { 546 m_error_propogated = true; 547 m_pCallbacks.EventHandler(&m_cmp,m_app_data, 548 OMX_EventError,OMX_ErrorUnsupportedSetting,0,NULL); 549 } 550 } 551 552 void complete_pending_buffer_done_cbs(); 553 554 #ifdef USE_ION 555 int alloc_map_ion_memory(int size, 556 struct ion_allocation_data *alloc_data, 557 struct ion_fd_data *fd_data,int flag); 558 void free_ion_memory(struct venc_ion *buf_ion_info); 559 #endif 560 561 //************************************************************* 562 //*******************MEMBER VARIABLES ************************* 563 //************************************************************* 564 565 pthread_mutex_t m_lock; 566 sem_t m_cmd_lock; 567 bool m_error_propogated; 568 569 //sem to handle the minimum procesing of commands 570 571 572 // compression format 573 //OMX_VIDEO_CODINGTYPE eCompressionFormat; 574 // OMX State 575 OMX_STATETYPE m_state; 576 // Application data 577 OMX_PTR m_app_data; 578 OMX_BOOL m_use_input_pmem; 579 OMX_BOOL m_use_output_pmem; 580 // Application callbacks 581 OMX_CALLBACKTYPE m_pCallbacks; 582 OMX_PORT_PARAM_TYPE m_sPortParam; 583 OMX_VIDEO_PARAM_PROFILELEVELTYPE m_sParamProfileLevel; 584 OMX_VIDEO_PARAM_PORTFORMATTYPE m_sInPortFormat; 585 OMX_VIDEO_PARAM_PORTFORMATTYPE m_sOutPortFormat; 586 OMX_PARAM_PORTDEFINITIONTYPE m_sInPortDef; 587 OMX_PARAM_PORTDEFINITIONTYPE m_sOutPortDef; 588 OMX_VIDEO_PARAM_MPEG4TYPE m_sParamMPEG4; 589 OMX_VIDEO_PARAM_H263TYPE m_sParamH263; 590 OMX_VIDEO_PARAM_AVCTYPE m_sParamAVC; 591 OMX_VIDEO_PARAM_VP8TYPE m_sParamVP8; 592 OMX_VIDEO_PARAM_HEVCTYPE m_sParamHEVC; 593 OMX_PORT_PARAM_TYPE m_sPortParam_img; 594 OMX_PORT_PARAM_TYPE m_sPortParam_audio; 595 OMX_VIDEO_CONFIG_BITRATETYPE m_sConfigBitrate; 596 OMX_CONFIG_FRAMERATETYPE m_sConfigFramerate; 597 OMX_VIDEO_PARAM_BITRATETYPE m_sParamBitrate; 598 OMX_PRIORITYMGMTTYPE m_sPriorityMgmt; 599 OMX_PARAM_BUFFERSUPPLIERTYPE m_sInBufSupplier; 600 OMX_PARAM_BUFFERSUPPLIERTYPE m_sOutBufSupplier; 601 OMX_CONFIG_ROTATIONTYPE m_sConfigFrameRotation; 602 OMX_CONFIG_INTRAREFRESHVOPTYPE m_sConfigIntraRefreshVOP; 603 OMX_VIDEO_PARAM_QUANTIZATIONTYPE m_sSessionQuantization; 604 OMX_QCOM_VIDEO_PARAM_QPRANGETYPE m_sSessionQPRange; 605 OMX_VIDEO_PARAM_AVCSLICEFMO m_sAVCSliceFMO; 606 QOMX_VIDEO_INTRAPERIODTYPE m_sIntraperiod; 607 OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE m_sErrorCorrection; 608 OMX_VIDEO_PARAM_INTRAREFRESHTYPE m_sIntraRefresh; 609 QOMX_VIDEO_PARAM_LTRMODE_TYPE m_sParamLTRMode; 610 QOMX_VIDEO_PARAM_LTRCOUNT_TYPE m_sParamLTRCount; 611 QOMX_VIDEO_CONFIG_LTRPERIOD_TYPE m_sConfigLTRPeriod; 612 QOMX_VIDEO_CONFIG_LTRUSE_TYPE m_sConfigLTRUse; 613 OMX_VIDEO_CONFIG_AVCINTRAPERIOD m_sConfigAVCIDRPeriod; 614 OMX_VIDEO_CONFIG_DEINTERLACE m_sConfigDeinterlace; 615 OMX_VIDEO_VP8REFERENCEFRAMETYPE m_sConfigVp8ReferenceFrame; 616 QOMX_VIDEO_HIERARCHICALLAYERS m_sHierLayers; 617 QOMX_EXTNINDEX_VIDEO_INITIALQP m_sParamInitqp; 618 OMX_U32 m_sExtraData; 619 OMX_U32 m_input_msg_id; 620 621 // fill this buffer queue 622 omx_cmd_queue m_ftb_q; 623 // Command Q for rest of the events 624 omx_cmd_queue m_cmd_q; 625 omx_cmd_queue m_etb_q; 626 // Input memory pointer 627 OMX_BUFFERHEADERTYPE *m_inp_mem_ptr; 628 // Output memory pointer 629 OMX_BUFFERHEADERTYPE *m_out_mem_ptr; 630 omx_cmd_queue m_opq_meta_q; 631 omx_cmd_queue m_opq_pmem_q; 632 OMX_BUFFERHEADERTYPE meta_buffer_hdr[MAX_NUM_INPUT_BUFFERS]; 633 634 bool input_flush_progress; 635 bool output_flush_progress; 636 bool input_use_buffer; 637 bool output_use_buffer; 638 int pending_input_buffers; 639 int pending_output_buffers; 640 641 uint64_t m_out_bm_count; 642 uint64_t m_inp_bm_count; 643 uint64_t m_flags; 644 uint64_t m_etb_count; 645 uint64_t m_fbd_count; 646 #ifdef _ANDROID_ 647 // Heap pointer to frame buffers 648 sp<MemoryHeapBase> m_heap_ptr; 649 #endif //_ANDROID_ 650 // to know whether Event Port Settings change has been triggered or not. 651 bool m_event_port_settings_sent; 652 OMX_U8 m_cRole[OMX_MAX_STRINGNAME_SIZE]; 653 extra_data_handler extra_data_handle; 654 bool hw_overload; 655 656 }; 657 658 #endif // __OMX_VIDEO_BASE_H__ 659