1 /*-------------------------------------------------------------------------- 2 Copyright (c) 2010-2016, 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 <media/hardware/HardwareAPI.h> 59 #include "OMX_Core.h" 60 #include "OMX_QCOMExtns.h" 61 #include "OMX_Skype_VideoExtensions.h" 62 #include "OMX_VideoExt.h" 63 #include "OMX_IndexExt.h" 64 #include "qc_omx_component.h" 65 #include "omx_video_common.h" 66 #include "extra_data_handler.h" 67 #include <linux/videodev2.h> 68 #include <dlfcn.h> 69 #include "C2DColorConverter.h" 70 #include "vidc_debug.h" 71 72 #ifdef _ANDROID_ 73 using namespace android; 74 // local pmem heap object 75 class VideoHeap : public MemoryHeapBase 76 { 77 public: 78 VideoHeap(int fd, size_t size, void* base); 79 virtual ~VideoHeap() {} 80 }; 81 82 #include <utils/Log.h> 83 84 #endif // _ANDROID_ 85 86 #ifdef USE_ION 87 static const char* MEM_DEVICE = "/dev/ion"; 88 #if defined(MAX_RES_720P) && !defined(_MSM8974_) 89 #define MEM_HEAP_ID ION_CAMERA_HEAP_ID 90 #else 91 #ifdef _MSM8974_ 92 #define MEM_HEAP_ID ION_IOMMU_HEAP_ID 93 #else 94 #define MEM_HEAP_ID ION_CP_MM_HEAP_ID 95 #endif 96 #endif 97 #elif MAX_RES_720P 98 static const char* MEM_DEVICE = "/dev/pmem_adsp"; 99 #elif MAX_RES_1080P_EBI 100 static const char* MEM_DEVICE = "/dev/pmem_adsp"; 101 #elif MAX_RES_1080P 102 static const char* MEM_DEVICE = "/dev/pmem_smipool"; 103 #else 104 #error MEM_DEVICE cannot be determined. 105 #endif 106 107 ////////////////////////////////////////////////////////////////////////////// 108 // Module specific globals 109 ////////////////////////////////////////////////////////////////////////////// 110 111 #define OMX_SPEC_VERSION 0x00000101 112 113 ////////////////////////////////////////////////////////////////////////////// 114 // Macros 115 ////////////////////////////////////////////////////////////////////////////// 116 #define PrintFrameHdr(bufHdr) DEBUG_PRINT("bufHdr %x buf %x size %d TS %d\n",\ 117 (unsigned) bufHdr,\ 118 (unsigned)((OMX_BUFFERHEADERTYPE *)bufHdr)->pBuffer,\ 119 (unsigned)((OMX_BUFFERHEADERTYPE *)bufHdr)->nFilledLen,\ 120 (unsigned)((OMX_BUFFERHEADERTYPE *)bufHdr)->nTimeStamp) 121 122 // BitMask Management logic 123 #define BITS_PER_INDEX 64 124 #define BITMASK_SIZE(mIndex) (((mIndex) + BITS_PER_INDEX - 1)/BITS_PER_INDEX) 125 #define BITMASK_OFFSET(mIndex) ((mIndex)/BITS_PER_INDEX) 126 #define BITMASK_FLAG(mIndex) ((uint64_t)1 << ((mIndex) % BITS_PER_INDEX)) 127 #define BITMASK_CLEAR(mArray,mIndex) (mArray)[BITMASK_OFFSET(mIndex)] \ 128 &= ~(BITMASK_FLAG(mIndex)) 129 #define BITMASK_SET(mArray,mIndex) (mArray)[BITMASK_OFFSET(mIndex)] \ 130 |= BITMASK_FLAG(mIndex) 131 #define BITMASK_PRESENT(mArray,mIndex) ((mArray)[BITMASK_OFFSET(mIndex)] \ 132 & BITMASK_FLAG(mIndex)) 133 #define BITMASK_ABSENT(mArray,mIndex) (((mArray)[BITMASK_OFFSET(mIndex)] \ 134 & BITMASK_FLAG(mIndex)) == 0x0) 135 #define BITMASK_PRESENT(mArray,mIndex) ((mArray)[BITMASK_OFFSET(mIndex)] \ 136 & BITMASK_FLAG(mIndex)) 137 #define BITMASK_ABSENT(mArray,mIndex) (((mArray)[BITMASK_OFFSET(mIndex)] \ 138 & BITMASK_FLAG(mIndex)) == 0x0) 139 140 #define MAX_NUM_INPUT_BUFFERS 64 141 #define MAX_NUM_OUTPUT_BUFFERS 64 142 143 void* message_thread(void *); 144 145 enum omx_venc_extradata_types { 146 VENC_EXTRADATA_SLICEINFO = 0x100, 147 VENC_EXTRADATA_MBINFO = 0x400, 148 VENC_EXTRADATA_FRAMEDIMENSION = 0x1000000, 149 VENC_EXTRADATA_YUV_STATS = 0x800, 150 VENC_EXTRADATA_VQZIP = 0x02000000, 151 }; 152 153 // OMX video class 154 class omx_video: public qc_omx_component 155 { 156 protected: 157 #ifdef _ANDROID_ICS_ 158 bool meta_mode_enable; 159 bool c2d_opened; 160 encoder_media_buffer_type meta_buffers[MAX_NUM_INPUT_BUFFERS]; 161 OMX_BUFFERHEADERTYPE *opaque_buffer_hdr[MAX_NUM_INPUT_BUFFERS]; 162 bool get_syntaxhdr_enable; 163 OMX_BUFFERHEADERTYPE *psource_frame; 164 OMX_BUFFERHEADERTYPE *pdest_frame; 165 bool secure_session; 166 bool hier_b_enabled; 167 //intermediate conversion buffer queued to encoder in case of invalid EOS input 168 OMX_BUFFERHEADERTYPE *mEmptyEosBuffer; 169 170 class omx_c2d_conv 171 { 172 public: 173 omx_c2d_conv(); 174 ~omx_c2d_conv(); 175 bool init(); 176 bool open(unsigned int height,unsigned int width, 177 ColorConvertFormat src, 178 ColorConvertFormat dest,unsigned int src_stride); 179 bool convert(int src_fd, void *src_base, void *src_viraddr, 180 int dest_fd, void *dest_base, void *dest_viraddr); 181 bool get_buffer_size(int port,unsigned int &buf_size); 182 int get_src_format(); 183 void close(); 184 private: 185 C2DColorConverterBase *c2dcc; 186 pthread_mutex_t c_lock; 187 void *mLibHandle; 188 ColorConvertFormat src_format; 189 createC2DColorConverter_t *mConvertOpen; 190 destroyC2DColorConverter_t *mConvertClose; 191 }; 192 omx_c2d_conv c2d_conv; 193 #endif 194 public: 195 196 bool mUseProxyColorFormat; 197 //RGB or non-native input, and we have pre-allocated conversion buffers 198 bool mUsesColorConversion; 199 200 omx_video(); // constructor 201 virtual ~omx_video(); // destructor 202 203 // virtual int async_message_process (void *context, void* message); 204 void process_event_cb(void *ctxt,unsigned char id); 205 206 OMX_ERRORTYPE allocate_buffer( 207 OMX_HANDLETYPE hComp, 208 OMX_BUFFERHEADERTYPE **bufferHdr, 209 OMX_U32 port, 210 OMX_PTR appData, 211 OMX_U32 bytes 212 ); 213 214 215 virtual OMX_ERRORTYPE component_deinit(OMX_HANDLETYPE hComp)= 0; 216 217 virtual OMX_ERRORTYPE component_init(OMX_STRING role)= 0; 218 219 virtual OMX_U32 dev_stop(void) = 0; 220 virtual OMX_U32 dev_pause(void) = 0; 221 virtual OMX_U32 dev_start(void) = 0; 222 virtual OMX_U32 dev_flush(unsigned) = 0; 223 virtual OMX_U32 dev_resume(void) = 0; 224 virtual OMX_U32 dev_start_done(void) = 0; 225 virtual OMX_U32 dev_set_message_thread_id(pthread_t) = 0; 226 virtual bool dev_use_buf(void *,unsigned,unsigned) = 0; 227 virtual bool dev_free_buf(void *,unsigned) = 0; 228 virtual bool dev_empty_buf(void *, void *,unsigned,unsigned) = 0; 229 virtual bool dev_fill_buf(void *buffer, void *,unsigned,unsigned) = 0; 230 virtual bool dev_get_buf_req(OMX_U32 *,OMX_U32 *,OMX_U32 *,OMX_U32) = 0; 231 virtual bool dev_get_seq_hdr(void *, unsigned, unsigned *) = 0; 232 virtual bool dev_loaded_start(void) = 0; 233 virtual bool dev_loaded_stop(void) = 0; 234 virtual bool dev_loaded_start_done(void) = 0; 235 virtual bool dev_loaded_stop_done(void) = 0; 236 virtual bool is_secure_session(void) = 0; 237 virtual int dev_handle_output_extradata(void*) = 0; 238 virtual int dev_handle_input_extradata(void*, int) = 0; 239 virtual void dev_set_extradata_cookie(void*) = 0; 240 virtual int dev_set_format(int) = 0; 241 virtual bool dev_is_video_session_supported(OMX_U32 width, OMX_U32 height) = 0; 242 virtual bool dev_get_capability_ltrcount(OMX_U32 *, OMX_U32 *, OMX_U32 *) = 0; 243 virtual bool dev_get_performance_level(OMX_U32 *) = 0; 244 virtual bool dev_get_vui_timing_info(OMX_U32 *) = 0; 245 virtual bool dev_get_vqzip_sei_info(OMX_U32 *) = 0; 246 virtual bool dev_get_peak_bitrate(OMX_U32 *) = 0; 247 virtual bool dev_get_batch_size(OMX_U32 *) = 0; 248 virtual bool dev_get_temporal_layer_caps(OMX_U32 * /*nMaxLayers*/, 249 OMX_U32 * /*nMaxBLayers*/) = 0; 250 #ifdef _ANDROID_ICS_ 251 void omx_release_meta_buffer(OMX_BUFFERHEADERTYPE *buffer); 252 #endif 253 virtual bool dev_color_align(OMX_BUFFERHEADERTYPE *buffer, OMX_U32 width, 254 OMX_U32 height) = 0; 255 virtual bool dev_get_output_log_flag() = 0; 256 virtual int dev_output_log_buffers(const char *buffer_addr, int buffer_len) = 0; 257 virtual int dev_extradata_log_buffers(char *buffer_addr) = 0; 258 OMX_ERRORTYPE component_role_enum( 259 OMX_HANDLETYPE hComp, 260 OMX_U8 *role, 261 OMX_U32 index 262 ); 263 264 OMX_ERRORTYPE component_tunnel_request( 265 OMX_HANDLETYPE hComp, 266 OMX_U32 port, 267 OMX_HANDLETYPE peerComponent, 268 OMX_U32 peerPort, 269 OMX_TUNNELSETUPTYPE *tunnelSetup 270 ); 271 272 OMX_ERRORTYPE empty_this_buffer( 273 OMX_HANDLETYPE hComp, 274 OMX_BUFFERHEADERTYPE *buffer 275 ); 276 277 278 279 OMX_ERRORTYPE fill_this_buffer( 280 OMX_HANDLETYPE hComp, 281 OMX_BUFFERHEADERTYPE *buffer 282 ); 283 284 285 OMX_ERRORTYPE free_buffer( 286 OMX_HANDLETYPE hComp, 287 OMX_U32 port, 288 OMX_BUFFERHEADERTYPE *buffer 289 ); 290 291 OMX_ERRORTYPE get_component_version( 292 OMX_HANDLETYPE hComp, 293 OMX_STRING componentName, 294 OMX_VERSIONTYPE *componentVersion, 295 OMX_VERSIONTYPE *specVersion, 296 OMX_UUIDTYPE *componentUUID 297 ); 298 299 OMX_ERRORTYPE get_config( 300 OMX_HANDLETYPE hComp, 301 OMX_INDEXTYPE configIndex, 302 OMX_PTR configData 303 ); 304 305 OMX_ERRORTYPE get_extension_index( 306 OMX_HANDLETYPE hComp, 307 OMX_STRING paramName, 308 OMX_INDEXTYPE *indexType 309 ); 310 311 OMX_ERRORTYPE get_parameter(OMX_HANDLETYPE hComp, 312 OMX_INDEXTYPE paramIndex, 313 OMX_PTR paramData); 314 315 OMX_ERRORTYPE get_state(OMX_HANDLETYPE hComp, 316 OMX_STATETYPE *state); 317 318 319 320 OMX_ERRORTYPE send_command(OMX_HANDLETYPE hComp, 321 OMX_COMMANDTYPE cmd, 322 OMX_U32 param1, 323 OMX_PTR cmdData); 324 325 326 OMX_ERRORTYPE set_callbacks(OMX_HANDLETYPE hComp, 327 OMX_CALLBACKTYPE *callbacks, 328 OMX_PTR appData); 329 330 virtual OMX_ERRORTYPE set_config(OMX_HANDLETYPE hComp, 331 OMX_INDEXTYPE configIndex, 332 OMX_PTR configData) = 0; 333 334 virtual OMX_ERRORTYPE set_parameter(OMX_HANDLETYPE hComp, 335 OMX_INDEXTYPE paramIndex, 336 OMX_PTR paramData) =0; 337 338 OMX_ERRORTYPE use_buffer(OMX_HANDLETYPE hComp, 339 OMX_BUFFERHEADERTYPE **bufferHdr, 340 OMX_U32 port, 341 OMX_PTR appData, 342 OMX_U32 bytes, 343 OMX_U8 *buffer); 344 345 346 OMX_ERRORTYPE use_EGL_image(OMX_HANDLETYPE hComp, 347 OMX_BUFFERHEADERTYPE **bufferHdr, 348 OMX_U32 port, 349 OMX_PTR appData, 350 void * eglImage); 351 352 353 354 int m_pipe_in; 355 int m_pipe_out; 356 357 pthread_t msg_thread_id; 358 pthread_t async_thread_id; 359 bool async_thread_created; 360 bool msg_thread_created; 361 volatile bool msg_thread_stop; 362 363 OMX_U8 m_nkind[128]; 364 365 366 //int *input_pmem_fd; 367 //int *output_pmem_fd; 368 struct pmem *m_pInput_pmem; 369 struct pmem *m_pOutput_pmem; 370 #ifdef USE_ION 371 struct venc_ion *m_pInput_ion; 372 struct venc_ion *m_pOutput_ion; 373 #endif 374 375 376 377 public: 378 // Bit Positions 379 enum flags_bit_positions { 380 // Defer transition to IDLE 381 OMX_COMPONENT_IDLE_PENDING =0x1, 382 // Defer transition to LOADING 383 OMX_COMPONENT_LOADING_PENDING =0x2, 384 // First Buffer Pending 385 OMX_COMPONENT_FIRST_BUFFER_PENDING =0x3, 386 // Second Buffer Pending 387 OMX_COMPONENT_SECOND_BUFFER_PENDING =0x4, 388 // Defer transition to Enable 389 OMX_COMPONENT_INPUT_ENABLE_PENDING =0x5, 390 // Defer transition to Enable 391 OMX_COMPONENT_OUTPUT_ENABLE_PENDING =0x6, 392 // Defer transition to Disable 393 OMX_COMPONENT_INPUT_DISABLE_PENDING =0x7, 394 // Defer transition to Disable 395 OMX_COMPONENT_OUTPUT_DISABLE_PENDING =0x8, 396 //defer flush notification 397 OMX_COMPONENT_OUTPUT_FLUSH_PENDING =0x9, 398 OMX_COMPONENT_INPUT_FLUSH_PENDING =0xA, 399 OMX_COMPONENT_PAUSE_PENDING =0xB, 400 OMX_COMPONENT_EXECUTE_PENDING =0xC, 401 OMX_COMPONENT_LOADED_START_PENDING = 0xD, 402 OMX_COMPONENT_LOADED_STOP_PENDING = 0xF, 403 404 }; 405 406 // Deferred callback identifiers 407 enum { 408 //Event Callbacks from the venc component thread context 409 OMX_COMPONENT_GENERATE_EVENT = 0x1, 410 //Buffer Done callbacks from the venc component thread context 411 OMX_COMPONENT_GENERATE_BUFFER_DONE = 0x2, 412 //Frame Done callbacks from the venc component thread context 413 OMX_COMPONENT_GENERATE_FRAME_DONE = 0x3, 414 //Buffer Done callbacks from the venc component thread context 415 OMX_COMPONENT_GENERATE_FTB = 0x4, 416 //Frame Done callbacks from the venc component thread context 417 OMX_COMPONENT_GENERATE_ETB = 0x5, 418 //Command 419 OMX_COMPONENT_GENERATE_COMMAND = 0x6, 420 //Push-Pending Buffers 421 OMX_COMPONENT_PUSH_PENDING_BUFS = 0x7, 422 // Empty Buffer Done callbacks 423 OMX_COMPONENT_GENERATE_EBD = 0x8, 424 //Flush Event Callbacks from the venc component thread context 425 OMX_COMPONENT_GENERATE_EVENT_FLUSH = 0x9, 426 OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH = 0x0A, 427 OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH = 0x0B, 428 OMX_COMPONENT_GENERATE_FBD = 0xc, 429 OMX_COMPONENT_GENERATE_START_DONE = 0xD, 430 OMX_COMPONENT_GENERATE_PAUSE_DONE = 0xE, 431 OMX_COMPONENT_GENERATE_RESUME_DONE = 0xF, 432 OMX_COMPONENT_GENERATE_STOP_DONE = 0x10, 433 OMX_COMPONENT_GENERATE_HARDWARE_ERROR = 0x11, 434 OMX_COMPONENT_GENERATE_LTRUSE_FAILED = 0x12, 435 OMX_COMPONENT_GENERATE_ETB_OPQ = 0x13, 436 OMX_COMPONENT_GENERATE_UNSUPPORTED_SETTING = 0x14, 437 OMX_COMPONENT_GENERATE_HARDWARE_OVERLOAD = 0x15, 438 OMX_COMPONENT_CLOSE_MSG = 0x16 439 }; 440 441 struct omx_event { 442 unsigned long param1; 443 unsigned long param2; 444 unsigned long id; 445 }; 446 447 struct omx_cmd_queue { 448 omx_event m_q[OMX_CORE_CONTROL_CMDQ_SIZE]; 449 unsigned long m_read; 450 unsigned long m_write; 451 unsigned long m_size; 452 453 omx_cmd_queue(); 454 ~omx_cmd_queue(); 455 bool insert_entry(unsigned long p1, unsigned long p2, unsigned long id); 456 bool pop_entry(unsigned long *p1,unsigned long *p2, unsigned long *id); 457 // get msgtype of the first ele from the queue 458 unsigned get_q_msg_type(); 459 460 }; 461 462 bool allocate_done(void); 463 bool allocate_input_done(void); 464 bool allocate_output_done(void); 465 466 OMX_ERRORTYPE free_input_buffer(OMX_BUFFERHEADERTYPE *bufferHdr); 467 OMX_ERRORTYPE free_output_buffer(OMX_BUFFERHEADERTYPE *bufferHdr); 468 469 OMX_ERRORTYPE allocate_input_buffer(OMX_HANDLETYPE hComp, 470 OMX_BUFFERHEADERTYPE **bufferHdr, 471 OMX_U32 port, 472 OMX_PTR appData, 473 OMX_U32 bytes); 474 #ifdef _ANDROID_ICS_ 475 OMX_ERRORTYPE allocate_input_meta_buffer(OMX_HANDLETYPE hComp, 476 OMX_BUFFERHEADERTYPE **bufferHdr, 477 OMX_PTR appData, 478 OMX_U32 bytes); 479 #endif 480 OMX_ERRORTYPE allocate_output_buffer(OMX_HANDLETYPE hComp, 481 OMX_BUFFERHEADERTYPE **bufferHdr, 482 OMX_U32 port,OMX_PTR appData, 483 OMX_U32 bytes); 484 485 OMX_ERRORTYPE use_input_buffer(OMX_HANDLETYPE hComp, 486 OMX_BUFFERHEADERTYPE **bufferHdr, 487 OMX_U32 port, 488 OMX_PTR appData, 489 OMX_U32 bytes, 490 OMX_U8 *buffer); 491 492 OMX_ERRORTYPE use_output_buffer(OMX_HANDLETYPE hComp, 493 OMX_BUFFERHEADERTYPE **bufferHdr, 494 OMX_U32 port, 495 OMX_PTR appData, 496 OMX_U32 bytes, 497 OMX_U8 *buffer); 498 499 bool execute_omx_flush(OMX_U32); 500 bool execute_output_flush(void); 501 bool execute_input_flush(void); 502 #ifdef _MSM8974_ 503 bool execute_flush_all(void); 504 #endif 505 OMX_ERRORTYPE empty_buffer_done(OMX_HANDLETYPE hComp, 506 OMX_BUFFERHEADERTYPE * buffer); 507 508 OMX_ERRORTYPE fill_buffer_done(OMX_HANDLETYPE hComp, 509 OMX_BUFFERHEADERTYPE * buffer); 510 OMX_ERRORTYPE empty_this_buffer_proxy(OMX_HANDLETYPE hComp, 511 OMX_BUFFERHEADERTYPE *buffer); 512 OMX_ERRORTYPE empty_this_buffer_opaque(OMX_HANDLETYPE hComp, 513 OMX_BUFFERHEADERTYPE *buffer); 514 OMX_ERRORTYPE push_input_buffer(OMX_HANDLETYPE hComp); 515 OMX_ERRORTYPE convert_queue_buffer(OMX_HANDLETYPE hComp, 516 struct pmem &Input_pmem_info,unsigned long &index); 517 OMX_ERRORTYPE queue_meta_buffer(OMX_HANDLETYPE hComp, 518 struct pmem &Input_pmem_info); 519 OMX_ERRORTYPE push_empty_eos_buffer(OMX_HANDLETYPE hComp, 520 OMX_BUFFERHEADERTYPE *buffer); 521 OMX_ERRORTYPE fill_this_buffer_proxy(OMX_HANDLETYPE hComp, 522 OMX_BUFFERHEADERTYPE *buffer); 523 bool release_done(); 524 525 bool release_output_done(); 526 bool release_input_done(); 527 528 OMX_ERRORTYPE send_command_proxy(OMX_HANDLETYPE hComp, 529 OMX_COMMANDTYPE cmd, 530 OMX_U32 param1, 531 OMX_PTR cmdData); 532 bool post_event( unsigned long p1, 533 unsigned long p2, 534 unsigned long id 535 ); 536 OMX_ERRORTYPE get_supported_profile_level(OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType); 537 inline void omx_report_error () { 538 if (m_pCallbacks.EventHandler && !m_error_propogated && m_state != OMX_StateLoaded) { 539 m_error_propogated = true; 540 DEBUG_PRINT_ERROR("ERROR: send OMX_ErrorHardware to Client"); 541 m_pCallbacks.EventHandler(&m_cmp,m_app_data, 542 OMX_EventError,OMX_ErrorHardware,0,NULL); 543 } 544 } 545 546 inline void omx_report_hw_overload () 547 { 548 if (m_pCallbacks.EventHandler && !m_error_propogated && m_state != OMX_StateLoaded) { 549 m_error_propogated = true; 550 DEBUG_PRINT_ERROR("ERROR: send OMX_ErrorInsufficientResources to Client"); 551 m_pCallbacks.EventHandler(&m_cmp, m_app_data, 552 OMX_EventError, OMX_ErrorInsufficientResources, 0, NULL); 553 } 554 } 555 556 inline void omx_report_unsupported_setting () { 557 if (m_pCallbacks.EventHandler && !m_error_propogated && m_state != OMX_StateLoaded) { 558 m_error_propogated = true; 559 m_pCallbacks.EventHandler(&m_cmp,m_app_data, 560 OMX_EventError,OMX_ErrorUnsupportedSetting,0,NULL); 561 } 562 } 563 564 void complete_pending_buffer_done_cbs(); 565 bool is_conv_needed(int, int); 566 void print_debug_color_aspects(ColorAspects *aspects, const char *prefix); 567 568 #ifdef USE_ION 569 int alloc_map_ion_memory(int size, 570 struct ion_allocation_data *alloc_data, 571 struct ion_fd_data *fd_data,int flag); 572 void free_ion_memory(struct venc_ion *buf_ion_info); 573 #endif 574 575 //************************************************************* 576 //*******************MEMBER VARIABLES ************************* 577 //************************************************************* 578 579 pthread_mutex_t m_lock; 580 sem_t m_cmd_lock; 581 bool m_error_propogated; 582 583 //sem to handle the minimum procesing of commands 584 585 586 // compression format 587 //OMX_VIDEO_CODINGTYPE eCompressionFormat; 588 // OMX State 589 OMX_STATETYPE m_state; 590 // Application data 591 OMX_PTR m_app_data; 592 OMX_BOOL m_use_input_pmem; 593 OMX_BOOL m_use_output_pmem; 594 // Application callbacks 595 OMX_CALLBACKTYPE m_pCallbacks; 596 OMX_PORT_PARAM_TYPE m_sPortParam; 597 OMX_VIDEO_PARAM_PROFILELEVELTYPE m_sParamProfileLevel; 598 OMX_VIDEO_PARAM_PORTFORMATTYPE m_sInPortFormat; 599 OMX_VIDEO_PARAM_PORTFORMATTYPE m_sOutPortFormat; 600 OMX_PARAM_PORTDEFINITIONTYPE m_sInPortDef; 601 OMX_PARAM_PORTDEFINITIONTYPE m_sOutPortDef; 602 OMX_VIDEO_PARAM_MPEG4TYPE m_sParamMPEG4; 603 OMX_VIDEO_PARAM_H263TYPE m_sParamH263; 604 OMX_VIDEO_PARAM_AVCTYPE m_sParamAVC; 605 OMX_VIDEO_PARAM_VP8TYPE m_sParamVP8; 606 OMX_VIDEO_PARAM_HEVCTYPE m_sParamHEVC; 607 OMX_PORT_PARAM_TYPE m_sPortParam_img; 608 OMX_PORT_PARAM_TYPE m_sPortParam_audio; 609 OMX_VIDEO_CONFIG_BITRATETYPE m_sConfigBitrate; 610 OMX_CONFIG_FRAMERATETYPE m_sConfigFramerate; 611 OMX_VIDEO_PARAM_BITRATETYPE m_sParamBitrate; 612 OMX_PRIORITYMGMTTYPE m_sPriorityMgmt; 613 OMX_PARAM_BUFFERSUPPLIERTYPE m_sInBufSupplier; 614 OMX_PARAM_BUFFERSUPPLIERTYPE m_sOutBufSupplier; 615 OMX_CONFIG_ROTATIONTYPE m_sConfigFrameRotation; 616 OMX_CONFIG_INTRAREFRESHVOPTYPE m_sConfigIntraRefreshVOP; 617 OMX_VIDEO_PARAM_QUANTIZATIONTYPE m_sSessionQuantization; 618 OMX_QCOM_VIDEO_PARAM_QPRANGETYPE m_sSessionQPRange; 619 OMX_VIDEO_PARAM_AVCSLICEFMO m_sAVCSliceFMO; 620 QOMX_VIDEO_INTRAPERIODTYPE m_sIntraperiod; 621 OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE m_sErrorCorrection; 622 OMX_VIDEO_PARAM_INTRAREFRESHTYPE m_sIntraRefresh; 623 QOMX_VIDEO_PARAM_LTRMODE_TYPE m_sParamLTRMode; 624 QOMX_VIDEO_PARAM_LTRCOUNT_TYPE m_sParamLTRCount; 625 QOMX_VIDEO_CONFIG_LTRPERIOD_TYPE m_sConfigLTRPeriod; 626 QOMX_VIDEO_CONFIG_LTRUSE_TYPE m_sConfigLTRUse; 627 OMX_VIDEO_CONFIG_AVCINTRAPERIOD m_sConfigAVCIDRPeriod; 628 OMX_VIDEO_CONFIG_DEINTERLACE m_sConfigDeinterlace; 629 OMX_VIDEO_VP8REFERENCEFRAMETYPE m_sConfigVp8ReferenceFrame; 630 QOMX_VIDEO_HIERARCHICALLAYERS m_sHierLayers; 631 OMX_QOMX_VIDEO_MBI_STATISTICS m_sMBIStatistics; 632 QOMX_EXTNINDEX_VIDEO_INITIALQP m_sParamInitqp; 633 QOMX_EXTNINDEX_VIDEO_HIER_P_LAYERS m_sHPlayers; 634 OMX_SKYPE_VIDEO_CONFIG_BASELAYERPID m_sBaseLayerID; 635 OMX_SKYPE_VIDEO_PARAM_DRIVERVER m_sDriverVer; 636 OMX_SKYPE_VIDEO_CONFIG_QP m_sConfigQP; 637 QOMX_EXTNINDEX_VIDEO_VENC_SAR m_sSar; 638 PrependSPSPPSToIDRFramesParams m_sPrependSPSPPS; 639 OMX_U32 m_sExtraData; 640 OMX_U32 m_input_msg_id; 641 OMX_VIDEO_CONFIG_ANDROID_INTRAREFRESHTYPE m_sConfigIntraRefresh; 642 OMX_VIDEO_PARAM_ANDROID_TEMPORALLAYERINGTYPE m_sParamTemporalLayers; 643 OMX_VIDEO_CONFIG_ANDROID_TEMPORALLAYERINGTYPE m_sConfigTemporalLayers; 644 DescribeColorAspectsParams m_sConfigColorAspects; 645 646 // fill this buffer queue 647 omx_cmd_queue m_ftb_q; 648 // Command Q for rest of the events 649 omx_cmd_queue m_cmd_q; 650 omx_cmd_queue m_etb_q; 651 // Input memory pointer 652 OMX_BUFFERHEADERTYPE *m_inp_mem_ptr; 653 // Output memory pointer 654 OMX_BUFFERHEADERTYPE *m_out_mem_ptr; 655 omx_cmd_queue m_opq_meta_q; 656 omx_cmd_queue m_opq_pmem_q; 657 OMX_BUFFERHEADERTYPE meta_buffer_hdr[MAX_NUM_INPUT_BUFFERS]; 658 659 bool input_flush_progress; 660 bool output_flush_progress; 661 bool input_use_buffer; 662 bool output_use_buffer; 663 int pending_input_buffers; 664 int pending_output_buffers; 665 666 uint64_t m_out_bm_count; 667 uint64_t m_inp_bm_count; 668 uint64_t m_flags; 669 uint64_t m_etb_count; 670 uint64_t m_fbd_count; 671 #ifdef _ANDROID_ 672 // Heap pointer to frame buffers 673 sp<MemoryHeapBase> m_heap_ptr; 674 #endif //_ANDROID_ 675 // to know whether Event Port Settings change has been triggered or not. 676 bool m_event_port_settings_sent; 677 OMX_U8 m_cRole[OMX_MAX_STRINGNAME_SIZE]; 678 extra_data_handler extra_data_handle; 679 bool hw_overload; 680 OMX_U32 m_graphicBufferSize; 681 }; 682 683 #endif // __OMX_VIDEO_BASE_H__ 684