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