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