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