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