1 /*-------------------------------------------------------------------------- 2 Copyright (c) 2010 - 2016, 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 6 are met: 7 8 * Redistributions of source code must retain the above copyright 9 notice, this list of conditions and the following disclaimer. 10 * Redistributions in binary form must reproduce the above 11 copyright notice, this list of conditions and the following 12 disclaimer in the documentation and/or other materials provided 13 with the distribution. 14 * Neither the name of The Linux Foundation nor the names of its 15 contributors may be used to endorse or promote products derived 16 from this software without specific prior written permission. 17 18 THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 19 WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 20 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 21 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 22 BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 23 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 24 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 25 BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 26 WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 27 OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 28 IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 --------------------------------------------------------------------------*/ 30 #ifndef __OMX_VDEC_H__ 31 #define __OMX_VDEC_H__ 32 /*============================================================================ 33 O p e n M A X Component 34 Video Decoder 35 36 *//** @file comx_vdec.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 <string.h> 48 #include <inttypes.h> 49 #include <cstddef> 50 #include <cutils/atomic.h> 51 #include <qdMetaData.h> 52 53 static ptrdiff_t x; 54 55 #ifdef _ANDROID_ 56 #ifdef MAX_RES_720P 57 #define LOG_TAG "OMX-VDEC-720P" 58 #elif MAX_RES_1080P 59 #define LOG_TAG "OMX-VDEC-1080P" 60 #else 61 #define LOG_TAG "OMX-VDEC" 62 #endif 63 64 #ifdef USE_ION 65 #include <linux/msm_ion.h> 66 //#include <binder/MemoryHeapIon.h> 67 //#else 68 #endif 69 #include <binder/MemoryHeapBase.h> 70 #include <ui/ANativeObjectBase.h> 71 extern "C" { 72 #include <utils/Log.h> 73 } 74 #include <linux/videodev2.h> 75 #include <poll.h> 76 #include "hevc_utils.h" 77 #define TIMEOUT 5000 78 #endif // _ANDROID_ 79 80 #if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_) 81 #include <media/hardware/HardwareAPI.h> 82 #endif 83 84 #include <unistd.h> 85 86 #if defined (_ANDROID_ICS_) 87 #include <gralloc_priv.h> 88 #endif 89 90 #include <pthread.h> 91 #ifndef PC_DEBUG 92 #include <semaphore.h> 93 #endif 94 #include "OMX_Core.h" 95 #include "OMX_QCOMExtns.h" 96 #include "OMX_Skype_VideoExtensions.h" 97 #include "OMX_VideoExt.h" 98 #include "OMX_IndexExt.h" 99 #include "qc_omx_component.h" 100 #include <linux/msm_vidc_dec.h> 101 #include <media/msm_vidc.h> 102 #include "frameparser.h" 103 #ifdef MAX_RES_1080P 104 #include "mp4_utils.h" 105 #endif 106 #include "extra_data_handler.h" 107 #include "ts_parser.h" 108 #include "vidc_color_converter.h" 109 #include "vidc_debug.h" 110 #ifdef _ANDROID_ 111 #include <cutils/properties.h> 112 #else 113 #define PROPERTY_VALUE_MAX 92 114 #endif 115 extern "C" { 116 OMX_API void * get_omx_component_factory_fn(void); 117 } 118 119 #ifdef _ANDROID_ 120 using namespace android; 121 #ifdef USE_ION 122 class VideoHeap : public MemoryHeapBase 123 { 124 public: 125 VideoHeap(int devicefd, size_t size, void* base,ion_user_handle_t handle,int mapfd); 126 virtual ~VideoHeap() {} 127 private: 128 int m_ion_device_fd; 129 ion_user_handle_t m_ion_handle; 130 }; 131 #else 132 // local pmem heap object 133 class VideoHeap : public MemoryHeapBase 134 { 135 public: 136 VideoHeap(int fd, size_t size, void* base); 137 virtual ~VideoHeap() {} 138 }; 139 #endif 140 #endif // _ANDROID_ 141 ////////////////////////////////////////////////////////////////////////////// 142 // Module specific globals 143 ////////////////////////////////////////////////////////////////////////////// 144 #define OMX_SPEC_VERSION 0x00000101 145 146 147 ////////////////////////////////////////////////////////////////////////////// 148 // Macros 149 ////////////////////////////////////////////////////////////////////////////// 150 #define PrintFrameHdr(bufHdr) DEBUG_PRINT("bufHdr %x buf %x size %d TS %d\n",\ 151 (unsigned) bufHdr,\ 152 (unsigned)((OMX_BUFFERHEADERTYPE *)bufHdr)->pBuffer,\ 153 (unsigned)((OMX_BUFFERHEADERTYPE *)bufHdr)->nFilledLen,\ 154 (unsigned)((OMX_BUFFERHEADERTYPE *)bufHdr)->nTimeStamp) 155 156 // BitMask Management logic 157 #define BITS_PER_INDEX 64 158 #define BITMASK_SIZE(mIndex) (((mIndex) + BITS_PER_INDEX - 1)/BITS_PER_INDEX) 159 #define BITMASK_OFFSET(mIndex) ((mIndex)/BITS_PER_INDEX) 160 #define BITMASK_FLAG(mIndex) ((uint64_t)1 << ((mIndex) % BITS_PER_INDEX)) 161 #define BITMASK_CLEAR(mArray,mIndex) (mArray)[BITMASK_OFFSET(mIndex)] \ 162 &= ~(BITMASK_FLAG(mIndex)) 163 #define BITMASK_SET(mArray,mIndex) (mArray)[BITMASK_OFFSET(mIndex)] \ 164 |= BITMASK_FLAG(mIndex) 165 #define BITMASK_PRESENT(mArray,mIndex) ((mArray)[BITMASK_OFFSET(mIndex)] \ 166 & BITMASK_FLAG(mIndex)) 167 #define BITMASK_ABSENT(mArray,mIndex) (((mArray)[BITMASK_OFFSET(mIndex)] \ 168 & BITMASK_FLAG(mIndex)) == 0x0) 169 #define BITMASK_PRESENT(mArray,mIndex) ((mArray)[BITMASK_OFFSET(mIndex)] \ 170 & BITMASK_FLAG(mIndex)) 171 #define BITMASK_ABSENT(mArray,mIndex) (((mArray)[BITMASK_OFFSET(mIndex)] \ 172 & BITMASK_FLAG(mIndex)) == 0x0) 173 174 #define OMX_CORE_CONTROL_CMDQ_SIZE 100 175 #define OMX_CORE_QCIF_HEIGHT 144 176 #define OMX_CORE_QCIF_WIDTH 176 177 #define OMX_CORE_VGA_HEIGHT 480 178 #define OMX_CORE_VGA_WIDTH 640 179 #define OMX_CORE_WVGA_HEIGHT 480 180 #define OMX_CORE_WVGA_WIDTH 800 181 #define OMX_CORE_FWVGA_HEIGHT 480 182 #define OMX_CORE_FWVGA_WIDTH 864 183 184 #define DESC_BUFFER_SIZE (8192 * 16) 185 186 #ifdef _ANDROID_ 187 #define MAX_NUM_INPUT_OUTPUT_BUFFERS 64 188 #endif 189 190 #define OMX_FRAMEINFO_EXTRADATA 0x00010000 191 #define OMX_INTERLACE_EXTRADATA 0x00020000 192 #define OMX_TIMEINFO_EXTRADATA 0x00040000 193 #define OMX_PORTDEF_EXTRADATA 0x00080000 194 #define OMX_EXTNUSER_EXTRADATA 0x00100000 195 #define OMX_FRAMEDIMENSION_EXTRADATA 0x00200000 196 #define OMX_FRAMEPACK_EXTRADATA 0x00400000 197 #define OMX_QP_EXTRADATA 0x00800000 198 #define OMX_BITSINFO_EXTRADATA 0x01000000 199 #define OMX_VQZIPSEI_EXTRADATA 0x02000000 200 #define OMX_OUTPUTCROP_EXTRADATA 0x04000000 201 202 #define OMX_VUI_DISPLAY_INFO_EXTRADATA 0x08000000 203 #define OMX_MPEG2_SEQDISP_INFO_EXTRADATA 0x10000000 204 #define OMX_VPX_COLORSPACE_INFO_EXTRADATA 0x20000000 205 #define OMX_VC1_SEQDISP_INFO_EXTRADATA 0x40000000 206 #define OMX_DISPLAY_INFO_EXTRADATA 0x80000000 207 #define DRIVER_EXTRADATA_MASK 0x0000FFFF 208 209 #define OMX_INTERLACE_EXTRADATA_SIZE ((sizeof(OMX_OTHER_EXTRADATATYPE) +\ 210 sizeof(OMX_STREAMINTERLACEFORMAT) + 3)&(~3)) 211 #define OMX_FRAMEINFO_EXTRADATA_SIZE ((sizeof(OMX_OTHER_EXTRADATATYPE) +\ 212 sizeof(OMX_QCOM_EXTRADATA_FRAMEINFO) + 3)&(~3)) 213 #define OMX_PORTDEF_EXTRADATA_SIZE ((sizeof(OMX_OTHER_EXTRADATATYPE) +\ 214 sizeof(OMX_PARAM_PORTDEFINITIONTYPE) + 3)&(~3)) 215 #define OMX_FRAMEDIMENSION_EXTRADATA_SIZE (sizeof(OMX_OTHER_EXTRADATATYPE) +\ 216 sizeof(OMX_QCOM_EXTRADATA_FRAMEDIMENSION) + 3)&(~3) 217 #define OMX_FRAMEPACK_EXTRADATA_SIZE ((sizeof(OMX_OTHER_EXTRADATATYPE) +\ 218 sizeof(OMX_QCOM_FRAME_PACK_ARRANGEMENT) + 3)&(~3)) 219 #define OMX_QP_EXTRADATA_SIZE ((sizeof(OMX_OTHER_EXTRADATATYPE) +\ 220 sizeof(OMX_QCOM_EXTRADATA_QP) + 3)&(~3)) 221 #define OMX_BITSINFO_EXTRADATA_SIZE ((sizeof(OMX_OTHER_EXTRADATATYPE) +\ 222 sizeof(OMX_QCOM_EXTRADATA_BITS_INFO) + 3)&(~3)) 223 #define OMX_VQZIPSEI_EXTRADATA_SIZE ((sizeof(OMX_OTHER_EXTRADATATYPE) +\ 224 sizeof(OMX_QCOM_EXTRADATA_VQZIPSEI) + 3)&(~3)) 225 #define OMX_USERDATA_EXTRADATA_SIZE ((sizeof(OMX_OTHER_EXTRADATATYPE) +\ 226 + 3)&(~3)) 227 228 // Define next macro with required values to enable default extradata, 229 // VDEC_EXTRADATA_MB_ERROR_MAP 230 // OMX_INTERLACE_EXTRADATA 231 // OMX_FRAMEINFO_EXTRADATA 232 // OMX_TIMEINFO_EXTRADATA 233 234 //#define DEFAULT_EXTRADATA (OMX_FRAMEINFO_EXTRADATA|OMX_INTERLACE_EXTRADATA) 235 236 enum port_indexes { 237 OMX_CORE_INPUT_PORT_INDEX =0, 238 OMX_CORE_OUTPUT_PORT_INDEX =1 239 }; 240 enum vidc_perf_level { 241 VIDC_SVS = 0, 242 VIDC_NOMINAL = 1, 243 VIDC_TURBO = 2 244 }; 245 #ifdef USE_ION 246 struct vdec_ion { 247 int ion_device_fd; 248 struct ion_fd_data fd_ion_data; 249 struct ion_allocation_data ion_alloc_data; 250 }; 251 #endif 252 253 #ifdef _MSM8974_ 254 struct extradata_buffer_info { 255 unsigned long buffer_size; 256 char* uaddr; 257 int count; 258 int size; 259 #ifdef USE_ION 260 struct vdec_ion ion; 261 #endif 262 }; 263 #endif 264 265 struct video_driver_context { 266 int video_driver_fd; 267 enum vdec_codec decoder_format; 268 enum vdec_output_fromat output_format; 269 enum vdec_interlaced_format interlace; 270 enum vdec_output_order picture_order; 271 struct vdec_framesize frame_size; 272 struct vdec_picsize video_resolution; 273 struct vdec_allocatorproperty ip_buf; 274 struct vdec_allocatorproperty op_buf; 275 struct vdec_bufferpayload *ptr_inputbuffer; 276 struct vdec_bufferpayload *ptr_outputbuffer; 277 struct vdec_output_frameinfo *ptr_respbuffer; 278 #ifdef USE_ION 279 struct vdec_ion *ip_buf_ion_info; 280 struct vdec_ion *op_buf_ion_info; 281 struct vdec_ion h264_mv; 282 struct vdec_ion meta_buffer; 283 struct vdec_ion meta_buffer_iommu; 284 #endif 285 struct vdec_framerate frame_rate; 286 unsigned extradata; 287 bool timestamp_adjust; 288 char kind[128]; 289 bool idr_only_decoding; 290 unsigned disable_dmx; 291 #ifdef _MSM8974_ 292 struct extradata_buffer_info extradata_info; 293 int num_planes; 294 #endif 295 }; 296 297 struct video_decoder_capability { 298 unsigned int min_width; 299 unsigned int max_width; 300 unsigned int min_height; 301 unsigned int max_height; 302 }; 303 304 struct debug_cap { 305 bool in_buffer_log; 306 bool out_buffer_log; 307 bool out_meta_buffer_log; 308 char infile_name[PROPERTY_VALUE_MAX + 36]; 309 char outfile_name[PROPERTY_VALUE_MAX + 36]; 310 char out_ymetafile_name[PROPERTY_VALUE_MAX + 36]; 311 char out_uvmetafile_name[PROPERTY_VALUE_MAX + 36]; 312 char log_loc[PROPERTY_VALUE_MAX]; 313 FILE *infile; 314 FILE *outfile; 315 FILE *out_ymeta_file; 316 FILE *out_uvmeta_file; 317 }; 318 319 struct dynamic_buf_list { 320 long fd; 321 long dup_fd; 322 OMX_U32 offset; 323 OMX_U32 ref_count; 324 void *buffaddr; 325 long mapped_size; 326 }; 327 328 struct extradata_info { 329 OMX_BOOL output_crop_updated; 330 OMX_CONFIG_RECTTYPE output_crop_rect; 331 OMX_U32 output_width; 332 OMX_U32 output_height; 333 }; 334 335 // OMX video decoder class 336 class omx_vdec: public qc_omx_component 337 { 338 339 public: 340 omx_vdec(); // constructor 341 virtual ~omx_vdec(); // destructor 342 343 static int async_message_process (void *context, void* message); 344 static void process_event_cb(void *ctxt,unsigned char id); 345 346 OMX_ERRORTYPE allocate_buffer( 347 OMX_HANDLETYPE hComp, 348 OMX_BUFFERHEADERTYPE **bufferHdr, 349 OMX_U32 port, 350 OMX_PTR appData, 351 OMX_U32 bytes 352 ); 353 354 355 OMX_ERRORTYPE component_deinit(OMX_HANDLETYPE hComp); 356 357 OMX_ERRORTYPE component_init(OMX_STRING role); 358 359 OMX_ERRORTYPE component_role_enum( 360 OMX_HANDLETYPE hComp, 361 OMX_U8 *role, 362 OMX_U32 index 363 ); 364 365 OMX_ERRORTYPE component_tunnel_request( 366 OMX_HANDLETYPE hComp, 367 OMX_U32 port, 368 OMX_HANDLETYPE peerComponent, 369 OMX_U32 peerPort, 370 OMX_TUNNELSETUPTYPE *tunnelSetup 371 ); 372 373 OMX_ERRORTYPE empty_this_buffer( 374 OMX_HANDLETYPE hComp, 375 OMX_BUFFERHEADERTYPE *buffer 376 ); 377 378 379 380 OMX_ERRORTYPE fill_this_buffer( 381 OMX_HANDLETYPE hComp, 382 OMX_BUFFERHEADERTYPE *buffer 383 ); 384 385 386 OMX_ERRORTYPE free_buffer( 387 OMX_HANDLETYPE hComp, 388 OMX_U32 port, 389 OMX_BUFFERHEADERTYPE *buffer 390 ); 391 392 OMX_ERRORTYPE get_component_version( 393 OMX_HANDLETYPE hComp, 394 OMX_STRING componentName, 395 OMX_VERSIONTYPE *componentVersion, 396 OMX_VERSIONTYPE *specVersion, 397 OMX_UUIDTYPE *componentUUID 398 ); 399 400 OMX_ERRORTYPE get_config( 401 OMX_HANDLETYPE hComp, 402 OMX_INDEXTYPE configIndex, 403 OMX_PTR configData 404 ); 405 406 OMX_ERRORTYPE get_extension_index( 407 OMX_HANDLETYPE hComp, 408 OMX_STRING paramName, 409 OMX_INDEXTYPE *indexType 410 ); 411 412 OMX_ERRORTYPE get_parameter(OMX_HANDLETYPE hComp, 413 OMX_INDEXTYPE paramIndex, 414 OMX_PTR paramData); 415 416 OMX_ERRORTYPE get_state(OMX_HANDLETYPE hComp, 417 OMX_STATETYPE *state); 418 419 420 421 OMX_ERRORTYPE send_command(OMX_HANDLETYPE hComp, 422 OMX_COMMANDTYPE cmd, 423 OMX_U32 param1, 424 OMX_PTR cmdData); 425 426 427 OMX_ERRORTYPE set_callbacks(OMX_HANDLETYPE hComp, 428 OMX_CALLBACKTYPE *callbacks, 429 OMX_PTR appData); 430 431 OMX_ERRORTYPE set_config(OMX_HANDLETYPE hComp, 432 OMX_INDEXTYPE configIndex, 433 OMX_PTR configData); 434 435 OMX_ERRORTYPE set_parameter(OMX_HANDLETYPE hComp, 436 OMX_INDEXTYPE paramIndex, 437 OMX_PTR paramData); 438 439 OMX_ERRORTYPE use_buffer(OMX_HANDLETYPE hComp, 440 OMX_BUFFERHEADERTYPE **bufferHdr, 441 OMX_U32 port, 442 OMX_PTR appData, 443 OMX_U32 bytes, 444 OMX_U8 *buffer); 445 446 OMX_ERRORTYPE use_input_heap_buffers( 447 OMX_HANDLETYPE hComp, 448 OMX_BUFFERHEADERTYPE** bufferHdr, 449 OMX_U32 port, 450 OMX_PTR appData, 451 OMX_U32 bytes, 452 OMX_U8* buffer); 453 454 OMX_ERRORTYPE use_EGL_image(OMX_HANDLETYPE hComp, 455 OMX_BUFFERHEADERTYPE **bufferHdr, 456 OMX_U32 port, 457 OMX_PTR appData, 458 void * eglImage); 459 void complete_pending_buffer_done_cbs(); 460 struct video_driver_context drv_ctx; 461 int m_poll_efd; 462 #ifdef _MSM8974_ 463 OMX_ERRORTYPE allocate_extradata(); 464 void free_extradata(); 465 int update_resolution(int width, int height, int stride, int scan_lines); 466 OMX_ERRORTYPE is_video_session_supported(); 467 #endif 468 int m_pipe_in; 469 int m_pipe_out; 470 pthread_t msg_thread_id; 471 pthread_t async_thread_id; 472 bool is_component_secure(); 473 void buf_ref_add(int nPortIndex); 474 void buf_ref_remove(); 475 OMX_BUFFERHEADERTYPE* get_omx_output_buffer_header(int index); 476 OMX_ERRORTYPE set_dpb(bool is_split_mode, int dpb_color_format); 477 OMX_ERRORTYPE decide_dpb_buffer_mode(bool force_split_mode); 478 void request_perf_level(enum vidc_perf_level perf_level); 479 int dpb_bit_depth; 480 bool async_thread_force_stop; 481 volatile bool message_thread_stop; 482 struct extradata_info m_extradata_info; 483 int m_progressive; 484 485 private: 486 // Bit Positions 487 enum flags_bit_positions { 488 // Defer transition to IDLE 489 OMX_COMPONENT_IDLE_PENDING =0x1, 490 // Defer transition to LOADING 491 OMX_COMPONENT_LOADING_PENDING =0x2, 492 // First Buffer Pending 493 OMX_COMPONENT_FIRST_BUFFER_PENDING =0x3, 494 // Second Buffer Pending 495 OMX_COMPONENT_SECOND_BUFFER_PENDING =0x4, 496 // Defer transition to Enable 497 OMX_COMPONENT_INPUT_ENABLE_PENDING =0x5, 498 // Defer transition to Enable 499 OMX_COMPONENT_OUTPUT_ENABLE_PENDING =0x6, 500 // Defer transition to Disable 501 OMX_COMPONENT_INPUT_DISABLE_PENDING =0x7, 502 // Defer transition to Disable 503 OMX_COMPONENT_OUTPUT_DISABLE_PENDING =0x8, 504 //defer flush notification 505 OMX_COMPONENT_OUTPUT_FLUSH_PENDING =0x9, 506 OMX_COMPONENT_INPUT_FLUSH_PENDING =0xA, 507 OMX_COMPONENT_PAUSE_PENDING =0xB, 508 OMX_COMPONENT_EXECUTE_PENDING =0xC, 509 OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING =0xD, 510 OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED=0xE, 511 OMX_COMPONENT_FLUSH_DEFERRED = 0xF 512 }; 513 514 // Deferred callback identifiers 515 enum { 516 //Event Callbacks from the vdec component thread context 517 OMX_COMPONENT_GENERATE_EVENT = 0x1, 518 //Buffer Done callbacks from the vdec component thread context 519 OMX_COMPONENT_GENERATE_BUFFER_DONE = 0x2, 520 //Frame Done callbacks from the vdec component thread context 521 OMX_COMPONENT_GENERATE_FRAME_DONE = 0x3, 522 //Buffer Done callbacks from the vdec component thread context 523 OMX_COMPONENT_GENERATE_FTB = 0x4, 524 //Frame Done callbacks from the vdec component thread context 525 OMX_COMPONENT_GENERATE_ETB = 0x5, 526 //Command 527 OMX_COMPONENT_GENERATE_COMMAND = 0x6, 528 //Push-Pending Buffers 529 OMX_COMPONENT_PUSH_PENDING_BUFS = 0x7, 530 // Empty Buffer Done callbacks 531 OMX_COMPONENT_GENERATE_EBD = 0x8, 532 //Flush Event Callbacks from the vdec component thread context 533 OMX_COMPONENT_GENERATE_EVENT_FLUSH = 0x9, 534 OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH = 0x0A, 535 OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH = 0x0B, 536 OMX_COMPONENT_GENERATE_FBD = 0xc, 537 OMX_COMPONENT_GENERATE_START_DONE = 0xD, 538 OMX_COMPONENT_GENERATE_PAUSE_DONE = 0xE, 539 OMX_COMPONENT_GENERATE_RESUME_DONE = 0xF, 540 OMX_COMPONENT_GENERATE_STOP_DONE = 0x10, 541 OMX_COMPONENT_GENERATE_HARDWARE_ERROR = 0x11, 542 OMX_COMPONENT_GENERATE_ETB_ARBITRARY = 0x12, 543 OMX_COMPONENT_GENERATE_PORT_RECONFIG = 0x13, 544 OMX_COMPONENT_GENERATE_EOS_DONE = 0x14, 545 OMX_COMPONENT_GENERATE_INFO_PORT_RECONFIG = 0x15, 546 OMX_COMPONENT_GENERATE_INFO_FIELD_DROPPED = 0x16, 547 OMX_COMPONENT_GENERATE_UNSUPPORTED_SETTING = 0x17, 548 OMX_COMPONENT_GENERATE_HARDWARE_OVERLOAD = 0x18, 549 OMX_COMPONENT_CLOSE_MSG = 0x19 550 }; 551 552 enum vc1_profile_type { 553 VC1_SP_MP_RCV = 1, 554 VC1_AP = 2 555 }; 556 557 #ifdef _MSM8974_ 558 enum v4l2_ports { 559 CAPTURE_PORT, 560 OUTPUT_PORT, 561 MAX_PORT 562 }; 563 #endif 564 565 struct omx_event { 566 unsigned long param1; 567 unsigned long param2; 568 unsigned long id; 569 }; 570 571 struct omx_cmd_queue { 572 omx_event m_q[OMX_CORE_CONTROL_CMDQ_SIZE]; 573 unsigned long m_read; 574 unsigned long m_write; 575 unsigned long m_size; 576 577 omx_cmd_queue(); 578 ~omx_cmd_queue(); 579 bool insert_entry(unsigned long p1, unsigned long p2, unsigned long id); 580 bool pop_entry(unsigned long *p1,unsigned long *p2, unsigned long *id); 581 // get msgtype of the first ele from the queue 582 unsigned get_q_msg_type(); 583 584 }; 585 struct v4l2_capability cap; 586 #ifdef _ANDROID_ 587 struct ts_entry { 588 OMX_TICKS timestamp; 589 bool valid; 590 }; 591 592 struct ts_arr_list { 593 ts_entry m_ts_arr_list[MAX_NUM_INPUT_OUTPUT_BUFFERS]; 594 595 ts_arr_list(); 596 ~ts_arr_list(); 597 598 bool insert_ts(OMX_TICKS ts); 599 bool pop_min_ts(OMX_TICKS &ts); 600 bool reset_ts_list(); 601 }; 602 #endif 603 604 struct desc_buffer_hdr { 605 OMX_U8 *buf_addr; 606 OMX_U32 desc_data_size; 607 }; 608 bool allocate_done(void); 609 bool allocate_input_done(void); 610 bool allocate_output_done(void); 611 612 OMX_ERRORTYPE free_input_buffer(OMX_BUFFERHEADERTYPE *bufferHdr); 613 OMX_ERRORTYPE free_input_buffer(unsigned int bufferindex, 614 OMX_BUFFERHEADERTYPE *pmem_bufferHdr); 615 OMX_ERRORTYPE free_output_buffer(OMX_BUFFERHEADERTYPE *bufferHdr); 616 void free_output_buffer_header(); 617 void free_input_buffer_header(); 618 619 OMX_ERRORTYPE allocate_input_heap_buffer(OMX_HANDLETYPE hComp, 620 OMX_BUFFERHEADERTYPE **bufferHdr, 621 OMX_U32 port, 622 OMX_PTR appData, 623 OMX_U32 bytes); 624 625 626 OMX_ERRORTYPE allocate_input_buffer(OMX_HANDLETYPE hComp, 627 OMX_BUFFERHEADERTYPE **bufferHdr, 628 OMX_U32 port, 629 OMX_PTR appData, 630 OMX_U32 bytes); 631 632 OMX_ERRORTYPE allocate_output_buffer(OMX_HANDLETYPE hComp, 633 OMX_BUFFERHEADERTYPE **bufferHdr, 634 OMX_U32 port,OMX_PTR appData, 635 OMX_U32 bytes); 636 OMX_ERRORTYPE use_output_buffer(OMX_HANDLETYPE hComp, 637 OMX_BUFFERHEADERTYPE **bufferHdr, 638 OMX_U32 port, 639 OMX_PTR appData, 640 OMX_U32 bytes, 641 OMX_U8 *buffer); 642 OMX_ERRORTYPE get_supported_profile_level(OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType); 643 644 OMX_ERRORTYPE allocate_desc_buffer(OMX_U32 index); 645 OMX_ERRORTYPE allocate_output_headers(); 646 bool execute_omx_flush(OMX_U32); 647 bool execute_output_flush(); 648 bool execute_input_flush(); 649 OMX_ERRORTYPE empty_buffer_done(OMX_HANDLETYPE hComp, 650 OMX_BUFFERHEADERTYPE * buffer); 651 652 OMX_ERRORTYPE fill_buffer_done(OMX_HANDLETYPE hComp, 653 OMX_BUFFERHEADERTYPE * buffer); 654 OMX_ERRORTYPE empty_this_buffer_proxy(OMX_HANDLETYPE hComp, 655 OMX_BUFFERHEADERTYPE *buffer); 656 657 OMX_ERRORTYPE empty_this_buffer_proxy_arbitrary(OMX_HANDLETYPE hComp, 658 OMX_BUFFERHEADERTYPE *buffer 659 ); 660 661 OMX_ERRORTYPE push_input_buffer (OMX_HANDLETYPE hComp); 662 OMX_ERRORTYPE push_input_sc_codec (OMX_HANDLETYPE hComp); 663 OMX_ERRORTYPE push_input_h264 (OMX_HANDLETYPE hComp); 664 OMX_ERRORTYPE push_input_hevc (OMX_HANDLETYPE hComp); 665 OMX_ERRORTYPE push_input_vc1 (OMX_HANDLETYPE hComp); 666 667 OMX_ERRORTYPE fill_this_buffer_proxy(OMX_HANDLETYPE hComp, 668 OMX_BUFFERHEADERTYPE *buffer); 669 bool release_done(); 670 671 bool release_output_done(); 672 bool release_input_done(); 673 OMX_ERRORTYPE get_buffer_req(vdec_allocatorproperty *buffer_prop); 674 OMX_ERRORTYPE set_buffer_req(vdec_allocatorproperty *buffer_prop); 675 OMX_ERRORTYPE start_port_reconfig(); 676 OMX_ERRORTYPE update_picture_resolution(); 677 int stream_off(OMX_U32 port); 678 void adjust_timestamp(OMX_S64 &act_timestamp); 679 void set_frame_rate(OMX_S64 act_timestamp); 680 void handle_extradata_secure(OMX_BUFFERHEADERTYPE *p_buf_hdr); 681 void handle_extradata(OMX_BUFFERHEADERTYPE *p_buf_hdr); 682 void convert_color_space_info(OMX_U32 primaries, OMX_U32 range, 683 OMX_U32 transfer, OMX_U32 matrix, ColorSpace_t *color_space, 684 ColorAspects *aspects); 685 void handle_color_space_info(void *data, unsigned int buf_index); 686 void set_colorspace_in_handle(ColorSpace_t color, unsigned int buf_index); 687 void print_debug_color_aspects(ColorAspects *aspects, const char *prefix); 688 void print_debug_extradata(OMX_OTHER_EXTRADATATYPE *extra); 689 #ifdef _MSM8974_ 690 void append_interlace_extradata(OMX_OTHER_EXTRADATATYPE *extra, 691 OMX_U32 interlaced_format_type); 692 OMX_ERRORTYPE enable_extradata(OMX_U32 requested_extradata, bool is_internal, 693 bool enable = true); 694 void append_frame_info_extradata(OMX_OTHER_EXTRADATATYPE *extra, 695 OMX_U32 num_conceal_mb, 696 OMX_U32 picture_type, 697 OMX_U32 frame_rate, 698 OMX_TICKS time_stamp, 699 struct msm_vidc_panscan_window_payload *panscan_payload, 700 struct vdec_aspectratioinfo *aspect_ratio_info); 701 #else 702 void append_interlace_extradata(OMX_OTHER_EXTRADATATYPE *extra, 703 OMX_U32 interlaced_format_type, OMX_U32 buf_index); 704 OMX_ERRORTYPE enable_extradata(OMX_U32 requested_extradata, bool enable = true); 705 #endif 706 void append_frame_info_extradata(OMX_OTHER_EXTRADATATYPE *extra, 707 OMX_U32 num_conceal_mb, 708 OMX_U32 picture_type, 709 OMX_S64 timestamp, 710 OMX_U32 frame_rate, 711 struct vdec_aspectratioinfo *aspect_ratio_info); 712 void fill_aspect_ratio_info(struct vdec_aspectratioinfo *aspect_ratio_info, 713 OMX_QCOM_EXTRADATA_FRAMEINFO *frame_info); 714 void append_terminator_extradata(OMX_OTHER_EXTRADATATYPE *extra); 715 OMX_ERRORTYPE update_portdef(OMX_PARAM_PORTDEFINITIONTYPE *portDefn); 716 void append_portdef_extradata(OMX_OTHER_EXTRADATATYPE *extra); 717 void append_frame_dimension_extradata(OMX_OTHER_EXTRADATATYPE *extra); 718 void append_extn_extradata(OMX_OTHER_EXTRADATATYPE *extra, OMX_OTHER_EXTRADATATYPE *p_extn); 719 void append_user_extradata(OMX_OTHER_EXTRADATATYPE *extra, OMX_OTHER_EXTRADATATYPE *p_user); 720 void append_concealmb_extradata(OMX_OTHER_EXTRADATATYPE *extra, 721 OMX_OTHER_EXTRADATATYPE *p_concealmb, OMX_U8 *conceal_mb_data); 722 void append_framepack_extradata(OMX_OTHER_EXTRADATATYPE *extra, 723 struct msm_vidc_s3d_frame_packing_payload *s3d_frame_packing_payload); 724 void append_qp_extradata(OMX_OTHER_EXTRADATATYPE *extra, 725 struct msm_vidc_frame_qp_payload *qp_payload); 726 void append_bitsinfo_extradata(OMX_OTHER_EXTRADATATYPE *extra, 727 struct msm_vidc_frame_bits_info_payload *bits_payload); 728 void append_vqzip_extradata(OMX_OTHER_EXTRADATATYPE *extra, 729 struct msm_vidc_vqzip_sei_payload *vqzip_payload); 730 void insert_demux_addr_offset(OMX_U32 address_offset); 731 void extract_demux_addr_offsets(OMX_BUFFERHEADERTYPE *buf_hdr); 732 OMX_ERRORTYPE handle_demux_data(OMX_BUFFERHEADERTYPE *buf_hdr); 733 OMX_U32 count_MB_in_extradata(OMX_OTHER_EXTRADATATYPE *extra); 734 735 bool align_pmem_buffers(int pmem_fd, OMX_U32 buffer_size, 736 OMX_U32 alignment); 737 #ifdef USE_ION 738 int alloc_map_ion_memory(OMX_U32 buffer_size, 739 OMX_U32 alignment, struct ion_allocation_data *alloc_data, 740 struct ion_fd_data *fd_data,int flag); 741 void free_ion_memory(struct vdec_ion *buf_ion_info); 742 #endif 743 744 745 OMX_ERRORTYPE send_command_proxy(OMX_HANDLETYPE hComp, 746 OMX_COMMANDTYPE cmd, 747 OMX_U32 param1, 748 OMX_PTR cmdData); 749 bool post_event( unsigned long p1, 750 unsigned long p2, 751 unsigned long id 752 ); 753 inline int clip2(int x) { 754 x = x -1; 755 x = x | x >> 1; 756 x = x | x >> 2; 757 x = x | x >> 4; 758 x = x | x >> 16; 759 x = x + 1; 760 return x; 761 } 762 763 #ifdef MAX_RES_1080P 764 OMX_ERRORTYPE vdec_alloc_h264_mv(); 765 void vdec_dealloc_h264_mv(); 766 OMX_ERRORTYPE vdec_alloc_meta_buffers(); 767 void vdec_dealloc_meta_buffers(); 768 #endif 769 770 inline void omx_report_error () { 771 if (m_cb.EventHandler && !m_error_propogated && m_state != OMX_StateLoaded) { 772 DEBUG_PRINT_ERROR("ERROR: Sending OMX_ErrorHardware to Client"); 773 m_error_propogated = true; 774 m_cb.EventHandler(&m_cmp,m_app_data, 775 OMX_EventError,OMX_ErrorHardware,0,NULL); 776 } 777 } 778 779 inline void omx_report_unsupported_setting () { 780 if (m_cb.EventHandler && !m_error_propogated && m_state != OMX_StateLoaded) { 781 DEBUG_PRINT_ERROR( 782 "ERROR: Sending OMX_ErrorUnsupportedSetting to Client"); 783 m_error_propogated = true; 784 m_cb.EventHandler(&m_cmp, m_app_data, 785 OMX_EventError, OMX_ErrorUnsupportedSetting, 0, NULL); 786 } 787 } 788 inline void omx_report_hw_overload () { 789 if (m_cb.EventHandler && !m_error_propogated && m_state != OMX_StateLoaded) { 790 DEBUG_PRINT_ERROR( 791 "ERROR: Sending OMX_ErrorInsufficientResources to Client"); 792 m_error_propogated = true; 793 m_cb.EventHandler(&m_cmp, m_app_data, 794 OMX_EventError, OMX_ErrorInsufficientResources, 0, NULL); 795 } 796 } 797 798 #if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_) 799 OMX_ERRORTYPE use_android_native_buffer(OMX_IN OMX_HANDLETYPE hComp, OMX_PTR data); 800 #endif 801 #if defined (_ANDROID_ICS_) 802 struct nativebuffer { 803 native_handle_t *nativehandle; 804 private_handle_t *privatehandle; 805 int inuse; 806 }; 807 nativebuffer native_buffer[MAX_NUM_INPUT_OUTPUT_BUFFERS]; 808 #endif 809 810 //************************************************************* 811 //*******************MEMBER VARIABLES ************************* 812 //************************************************************* 813 pthread_mutex_t m_lock; 814 pthread_mutex_t c_lock; 815 pthread_mutex_t buf_lock; 816 //sem to handle the minimum procesing of commands 817 sem_t m_cmd_lock; 818 sem_t m_safe_flush; 819 bool m_error_propogated; 820 // compression format 821 OMX_VIDEO_CODINGTYPE eCompressionFormat; 822 // OMX State 823 OMX_STATETYPE m_state; 824 // Application data 825 OMX_PTR m_app_data; 826 // Application callbacks 827 OMX_CALLBACKTYPE m_cb; 828 OMX_PRIORITYMGMTTYPE m_priority_mgm ; 829 OMX_PARAM_BUFFERSUPPLIERTYPE m_buffer_supplier; 830 // fill this buffer queue 831 omx_cmd_queue m_ftb_q; 832 // Command Q for rest of the events 833 omx_cmd_queue m_cmd_q; 834 omx_cmd_queue m_etb_q; 835 // Input memory pointer 836 OMX_BUFFERHEADERTYPE *m_inp_mem_ptr; 837 // Output memory pointer 838 OMX_BUFFERHEADERTYPE *m_out_mem_ptr; 839 // number of input bitstream error frame count 840 unsigned int m_inp_err_count; 841 #ifdef _ANDROID_ 842 // Timestamp list 843 ts_arr_list m_timestamp_list; 844 #endif 845 846 bool input_flush_progress; 847 bool output_flush_progress; 848 bool input_use_buffer; 849 bool output_use_buffer; 850 bool ouput_egl_buffers; 851 OMX_BOOL m_use_output_pmem; 852 OMX_BOOL m_out_mem_region_smi; 853 OMX_BOOL m_out_pvt_entry_pmem; 854 855 int pending_input_buffers; 856 int pending_output_buffers; 857 // bitmask array size for output side 858 uint64_t m_out_bm_count; 859 // bitmask array size for input side 860 uint64_t m_inp_bm_count; 861 //Input port Populated 862 OMX_BOOL m_inp_bPopulated; 863 //Output port Populated 864 OMX_BOOL m_out_bPopulated; 865 // encapsulate the waiting states. 866 uint64_t m_flags; 867 868 #ifdef _ANDROID_ 869 // Heap pointer to frame buffers 870 struct vidc_heap { 871 sp<MemoryHeapBase> video_heap_ptr; 872 }; 873 struct vidc_heap *m_heap_ptr; 874 unsigned int m_heap_count; 875 #endif //_ANDROID_ 876 // store I/P PORT state 877 OMX_BOOL m_inp_bEnabled; 878 // store O/P PORT state 879 OMX_BOOL m_out_bEnabled; 880 OMX_U32 m_in_alloc_cnt; 881 OMX_U8 m_cRole[OMX_MAX_STRINGNAME_SIZE]; 882 // Platform specific details 883 OMX_QCOM_PLATFORM_PRIVATE_LIST *m_platform_list; 884 OMX_QCOM_PLATFORM_PRIVATE_ENTRY *m_platform_entry; 885 OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *m_pmem_info; 886 // SPS+PPS sent as part of set_config 887 OMX_VENDOR_EXTRADATATYPE m_vendor_config; 888 889 /*Variables for arbitrary Byte parsing support*/ 890 frame_parse m_frame_parser; 891 h264_stream_parser *h264_parser; 892 MP4_Utils mp4_headerparser; 893 HEVC_Utils m_hevc_utils; 894 895 omx_cmd_queue m_input_pending_q; 896 omx_cmd_queue m_input_free_q; 897 bool arbitrary_bytes; 898 OMX_BUFFERHEADERTYPE h264_scratch; 899 OMX_BUFFERHEADERTYPE *psource_frame; 900 OMX_BUFFERHEADERTYPE *pdest_frame; 901 OMX_BUFFERHEADERTYPE *m_inp_heap_ptr; 902 OMX_BUFFERHEADERTYPE **m_phdr_pmem_ptr; 903 unsigned int m_heap_inp_bm_count; 904 codec_type codec_type_parse; 905 bool first_frame_meta; 906 unsigned frame_count; 907 unsigned nal_count; 908 unsigned nal_length; 909 bool look_ahead_nal; 910 int first_frame; 911 unsigned char *first_buffer; 912 int first_frame_size; 913 unsigned char m_hwdevice_name[80]; 914 FILE *m_device_file_ptr; 915 enum vc1_profile_type m_vc1_profile; 916 OMX_S64 h264_last_au_ts; 917 OMX_U32 h264_last_au_flags; 918 OMX_U32 m_demux_offsets[8192]; 919 OMX_U32 m_demux_entries; 920 OMX_U32 m_disp_hor_size; 921 OMX_U32 m_disp_vert_size; 922 OMX_S64 prev_ts; 923 OMX_S64 prev_ts_actual; 924 bool rst_prev_ts; 925 OMX_U32 frm_int; 926 927 struct vdec_allocatorproperty op_buf_rcnfg; 928 bool in_reconfig; 929 OMX_NATIVE_WINDOWTYPE m_display_id; 930 OMX_U32 client_extradata; 931 #ifdef _ANDROID_ 932 bool m_debug_timestamp; 933 bool perf_flag; 934 OMX_U32 proc_frms, latency; 935 perf_metrics fps_metrics; 936 perf_metrics dec_time; 937 bool m_reject_avc_1080p_mp; 938 bool m_enable_android_native_buffers; 939 bool m_use_android_native_buffers; 940 bool m_debug_extradata; 941 bool m_debug_concealedmb; 942 bool m_disable_dynamic_buf_mode; 943 OMX_U32 m_conceal_color; 944 #endif 945 946 947 struct h264_mv_buffer { 948 unsigned char* buffer; 949 int size; 950 int count; 951 int pmem_fd; 952 int offset; 953 }; 954 h264_mv_buffer h264_mv_buff; 955 956 struct meta_buffer { 957 unsigned char* buffer; 958 int size; 959 int count; 960 int pmem_fd; 961 int pmem_fd_iommu; 962 int offset; 963 }; 964 meta_buffer meta_buff; 965 extra_data_handler extra_data_handle; 966 OMX_PARAM_PORTDEFINITIONTYPE m_port_def; 967 OMX_QCOM_FRAME_PACK_ARRANGEMENT m_frame_pack_arrangement; 968 omx_time_stamp_reorder time_stamp_dts; 969 desc_buffer_hdr *m_desc_buffer_ptr; 970 bool secure_mode; 971 bool allocate_native_handle; 972 bool external_meta_buffer; 973 bool external_meta_buffer_iommu; 974 OMX_QCOM_EXTRADATA_FRAMEINFO *m_extradata; 975 OMX_OTHER_EXTRADATATYPE *m_other_extradata; 976 bool codec_config_flag; 977 #ifdef _MSM8974_ 978 int capture_capability; 979 int output_capability; 980 bool streaming[MAX_PORT]; 981 OMX_FRAMESIZETYPE framesize; 982 OMX_CONFIG_RECTTYPE rectangle; 983 OMX_U32 prev_n_filled_len; 984 bool is_down_scalar_enabled; 985 bool m_force_down_scalar; 986 #endif 987 struct custom_buffersize { 988 OMX_U32 input_buffersize; 989 } m_custom_buffersize; 990 bool m_power_hinted; 991 bool is_q6_platform; 992 OMX_ERRORTYPE power_module_register(); 993 OMX_ERRORTYPE power_module_deregister(); 994 bool msg_thread_created; 995 bool async_thread_created; 996 997 OMX_VIDEO_PARAM_PROFILELEVELTYPE m_profile_lvl; 998 OMX_U32 m_profile; 999 1000 //variables to handle dynamic buffer mode 1001 bool dynamic_buf_mode; 1002 struct dynamic_buf_list *out_dynamic_list; 1003 OMX_U32 m_reconfig_width; 1004 OMX_U32 m_reconfig_height; 1005 bool m_smoothstreaming_mode; 1006 1007 bool m_input_pass_buffer_fd; 1008 DescribeColorAspectsParams m_client_color_space; 1009 DescribeColorAspectsParams m_internal_color_space; 1010 1011 OMX_U32 operating_frame_rate; 1012 bool high_fps; 1013 1014 OMX_U32 m_smoothstreaming_width; 1015 OMX_U32 m_smoothstreaming_height; 1016 OMX_ERRORTYPE enable_smoothstreaming(); 1017 OMX_ERRORTYPE enable_adaptive_playback(unsigned long width, unsigned long height); 1018 bool is_thulium_v1; 1019 bool m_disable_ubwc_mode; 1020 bool m_disable_split_mode; 1021 OMX_U32 m_downscalar_width; 1022 OMX_U32 m_downscalar_height; 1023 int decide_downscalar(); 1024 int enable_downscalar(); 1025 int disable_downscalar(); 1026 1027 unsigned int m_fill_output_msg; 1028 bool client_set_fps; 1029 unsigned int stereo_output_mode; 1030 class allocate_color_convert_buf 1031 { 1032 public: 1033 allocate_color_convert_buf(); 1034 ~allocate_color_convert_buf(); 1035 void set_vdec_client(void *); 1036 void update_client(); 1037 bool set_color_format(OMX_COLOR_FORMATTYPE dest_color_format); 1038 bool get_color_format(OMX_COLOR_FORMATTYPE &dest_color_format); 1039 bool update_buffer_req(); 1040 bool get_buffer_req(unsigned int &buffer_size); 1041 OMX_ERRORTYPE set_buffer_req(OMX_U32 buffer_size, OMX_U32 actual_count); 1042 OMX_BUFFERHEADERTYPE* get_il_buf_hdr(); 1043 OMX_BUFFERHEADERTYPE* get_il_buf_hdr(OMX_BUFFERHEADERTYPE *input_hdr); 1044 OMX_BUFFERHEADERTYPE* get_dr_buf_hdr(OMX_BUFFERHEADERTYPE *input_hdr); 1045 OMX_BUFFERHEADERTYPE* convert(OMX_BUFFERHEADERTYPE *header); 1046 OMX_BUFFERHEADERTYPE* queue_buffer(OMX_BUFFERHEADERTYPE *header); 1047 OMX_ERRORTYPE allocate_buffers_color_convert(OMX_HANDLETYPE hComp, 1048 OMX_BUFFERHEADERTYPE **bufferHdr,OMX_U32 port,OMX_PTR appData, 1049 OMX_U32 bytes); 1050 OMX_ERRORTYPE free_output_buffer(OMX_BUFFERHEADERTYPE *bufferHdr); 1051 bool is_color_conversion_enabled() {return enabled;} 1052 private: 1053 #define MAX_COUNT MAX_NUM_INPUT_OUTPUT_BUFFERS 1054 omx_vdec *omx; 1055 bool enabled; 1056 OMX_COLOR_FORMATTYPE ColorFormat; 1057 void init_members(); 1058 bool color_convert_mode; 1059 ColorConvertFormat dest_format; 1060 class omx_c2d_conv c2d; 1061 unsigned int allocated_count; 1062 unsigned int buffer_size_req; 1063 unsigned int buffer_alignment_req; 1064 OMX_U32 m_c2d_width; 1065 OMX_U32 m_c2d_height; 1066 OMX_QCOM_PLATFORM_PRIVATE_LIST m_platform_list_client[MAX_COUNT]; 1067 OMX_QCOM_PLATFORM_PRIVATE_ENTRY m_platform_entry_client[MAX_COUNT]; 1068 OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO m_pmem_info_client[MAX_COUNT]; 1069 OMX_BUFFERHEADERTYPE m_out_mem_ptr_client[MAX_COUNT]; 1070 #ifdef USE_ION 1071 struct vdec_ion op_buf_ion_info[MAX_COUNT]; 1072 #endif 1073 unsigned char *pmem_baseaddress[MAX_COUNT]; 1074 int pmem_fd[MAX_COUNT]; 1075 struct vidc_heap { 1076 sp<MemoryHeapBase> video_heap_ptr; 1077 }; 1078 struct vidc_heap m_heap_ptr[MAX_COUNT]; 1079 1080 OMX_ERRORTYPE cache_ops(unsigned int index, unsigned int cmd); 1081 inline OMX_ERRORTYPE cache_clean_buffer(unsigned int index) { 1082 return cache_ops(index, ION_IOC_CLEAN_CACHES); 1083 } 1084 OMX_ERRORTYPE cache_clean_invalidate_buffer(unsigned int index) { 1085 return cache_ops(index, ION_IOC_CLEAN_INV_CACHES); 1086 } 1087 }; 1088 #if defined (_MSM8960_) || defined (_MSM8974_) 1089 allocate_color_convert_buf client_buffers; 1090 #endif 1091 struct video_decoder_capability m_decoder_capability; 1092 struct debug_cap m_debug; 1093 int log_input_buffers(const char *, int); 1094 int log_output_buffers(OMX_BUFFERHEADERTYPE *); 1095 #ifdef _MSM8974_ 1096 void send_codec_config(); 1097 #endif 1098 OMX_TICKS m_last_rendered_TS; 1099 volatile int32_t m_queued_codec_config_count; 1100 OMX_U32 current_perf_level; 1101 bool secure_scaling_to_non_secure_opb; 1102 bool m_force_compressed_for_dpb; 1103 bool m_is_display_session; 1104 class perf_lock { 1105 private: 1106 pthread_mutex_t mlock; 1107 1108 public: 1109 perf_lock() { 1110 pthread_mutex_init(&mlock, NULL); 1111 } 1112 1113 ~perf_lock() { 1114 pthread_mutex_destroy(&mlock); 1115 } 1116 1117 void lock() { 1118 pthread_mutex_lock(&mlock); 1119 } 1120 1121 void unlock() { 1122 pthread_mutex_unlock(&mlock); 1123 } 1124 }; 1125 1126 class perf_control { 1127 // 2 cores will be requested if framerate is beyond 45 fps 1128 static const int MIN_FRAME_DURATION_FOR_PERF_REQUEST_US = (1e6 / 45); 1129 typedef int (*perf_lock_acquire_t)(int, int, int*, int); 1130 typedef int (*perf_lock_release_t)(int); 1131 1132 private: 1133 void *m_perf_lib; 1134 int m_perf_handle; 1135 perf_lock_acquire_t m_perf_lock_acquire; 1136 perf_lock_release_t m_perf_lock_release; 1137 bool load_lib(); 1138 struct mpctl_stats { 1139 int vid_inst_count; 1140 bool vid_acquired; 1141 int vid_disp_handle; 1142 }; 1143 static struct mpctl_stats mpctl_obj; 1144 static perf_lock m_perf_lock; 1145 1146 public: 1147 perf_control(); 1148 ~perf_control(); 1149 void request_cores(int frame_duration_us); 1150 void send_hint_to_mpctl(bool state); 1151 }; 1152 perf_control m_perf_control; 1153 1154 static OMX_COLOR_FORMATTYPE getPreferredColorFormatNonSurfaceMode(OMX_U32 index) { 1155 //On Android, we default to standard YUV formats for non-surface use-cases 1156 //where apps prefer known color formats. 1157 OMX_COLOR_FORMATTYPE formatsNonSurfaceMode[] = { 1158 [0] = OMX_COLOR_FormatYUV420SemiPlanar, 1159 [1] = OMX_COLOR_FormatYUV420Planar, 1160 [2] = (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m, 1161 [3] = (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mMultiView, 1162 [4] = (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mCompressed, 1163 }; 1164 return (index < sizeof(formatsNonSurfaceMode) / sizeof(OMX_COLOR_FORMATTYPE)) ? 1165 formatsNonSurfaceMode[index] : OMX_COLOR_FormatMax; 1166 } 1167 1168 OMX_COLOR_FORMATTYPE getPreferredColorFormatDefaultMode(OMX_U32 index) { 1169 //for surface mode (normal playback), advertise native/accelerated formats first 1170 OMX_COLOR_FORMATTYPE format = (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m; 1171 1172 if (!m_disable_ubwc_mode) { 1173 OMX_COLOR_FORMATTYPE formatsDefault[] = { 1174 [0] = (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mCompressed, 1175 [1] = (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m, 1176 [2] = OMX_COLOR_FormatYUV420SemiPlanar, 1177 [3] = OMX_COLOR_FormatYUV420Planar, 1178 [4] = (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mMultiView, 1179 }; 1180 format = (index < sizeof(formatsDefault) / sizeof(OMX_COLOR_FORMATTYPE)) ? 1181 formatsDefault[index] : OMX_COLOR_FormatMax; 1182 } else { 1183 OMX_COLOR_FORMATTYPE formatsDefault[] = { 1184 [0] = (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m, 1185 [1] = OMX_COLOR_FormatYUV420SemiPlanar, 1186 [2] = OMX_COLOR_FormatYUV420Planar, 1187 [3] = (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mMultiView, 1188 }; 1189 format = (index < sizeof(formatsDefault) / sizeof(OMX_COLOR_FORMATTYPE)) ? 1190 formatsDefault[index] : OMX_COLOR_FormatMax; 1191 } 1192 return format; 1193 } 1194 1195 static OMX_ERRORTYPE describeColorFormat(OMX_PTR params); 1196 void prefetchNewBuffers(); 1197 1198 class client_extradata_info { 1199 private: 1200 int fd; 1201 OMX_U32 total_size; 1202 OMX_U32 size; 1203 void *vaddr; 1204 public: 1205 client_extradata_info() { 1206 fd = -1; 1207 size = 0; 1208 total_size = 0; 1209 vaddr = NULL; 1210 } 1211 1212 void reset() { 1213 if (vaddr) { 1214 munmap(vaddr, total_size); 1215 vaddr = NULL; 1216 } 1217 if (fd != -1) { 1218 close(fd); 1219 fd = -1; 1220 } 1221 } 1222 1223 ~client_extradata_info() { 1224 reset(); 1225 } 1226 1227 bool set_extradata_info(int fd, OMX_U32 total_size, OMX_U32 size) { 1228 reset(); 1229 this->fd = fd; 1230 this->size = size; 1231 this->total_size = total_size; 1232 vaddr = (OMX_U8*)mmap(0, total_size, 1233 PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); 1234 if (vaddr == MAP_FAILED) { 1235 vaddr = NULL; 1236 reset(); 1237 return false; 1238 } 1239 return true; 1240 } 1241 1242 OMX_U8 *getBase() const { 1243 return (OMX_U8 *)vaddr; 1244 } 1245 1246 OMX_U32 getSize() const { 1247 return size; 1248 } 1249 }; 1250 client_extradata_info m_client_extradata_info; 1251 }; 1252 1253 #ifdef _MSM8974_ 1254 enum instance_state { 1255 MSM_VIDC_CORE_UNINIT_DONE = 0x0001, 1256 MSM_VIDC_CORE_INIT, 1257 MSM_VIDC_CORE_INIT_DONE, 1258 MSM_VIDC_OPEN, 1259 MSM_VIDC_OPEN_DONE, 1260 MSM_VIDC_LOAD_RESOURCES, 1261 MSM_VIDC_LOAD_RESOURCES_DONE, 1262 MSM_VIDC_START, 1263 MSM_VIDC_START_DONE, 1264 MSM_VIDC_STOP, 1265 MSM_VIDC_STOP_DONE, 1266 MSM_VIDC_RELEASE_RESOURCES, 1267 MSM_VIDC_RELEASE_RESOURCES_DONE, 1268 MSM_VIDC_CLOSE, 1269 MSM_VIDC_CLOSE_DONE, 1270 MSM_VIDC_CORE_UNINIT, 1271 }; 1272 1273 enum vidc_resposes_id { 1274 MSM_VIDC_DECODER_FLUSH_DONE = 0x11, 1275 MSM_VIDC_DECODER_EVENT_CHANGE, 1276 }; 1277 1278 #endif // _MSM8974_ 1279 1280 #endif // __OMX_VDEC_H__ 1281