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