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