1 /*-------------------------------------------------------------------------- 2 Copyright (c) 2013, 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_HEVC_H__ 31 #define __OMX_VDEC_HEVC_H__ 32 /*============================================================================ 33 O p e n M A X Component 34 Video Decoder 35 36 *//** @file comx_vdec_hevc.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 51 static ptrdiff_t x; 52 53 #ifdef _ANDROID_ 54 #ifdef MAX_RES_720P 55 #define LOG_TAG "OMX-VDEC-720P" 56 #elif MAX_RES_1080P 57 #define LOG_TAG "OMX-VDEC-1080P" 58 #else 59 #define LOG_TAG "OMX-VDEC" 60 #endif 61 62 #ifdef USE_ION 63 #include <linux/msm_ion.h> 64 #endif 65 #include <binder/MemoryHeapBase.h> 66 #include <ui/ANativeObjectBase.h> 67 extern "C" { 68 #include <utils/Log.h> 69 } 70 #include <linux/videodev2.h> 71 #include <poll.h> 72 #include "hevc_utils.h" 73 #define TIMEOUT 5000 74 75 #else //_ANDROID_ 76 #define DEBUG_PRINT_LOW printf 77 #define DEBUG_PRINT_HIGH printf 78 #define DEBUG_PRINT_ERROR printf 79 #endif // _ANDROID_ 80 81 82 #if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_) 83 #include <media/hardware/HardwareAPI.h> 84 #endif 85 86 #include <unistd.h> 87 88 #if defined (_ANDROID_ICS_) 89 #include <gralloc_priv.h> 90 #endif 91 92 #include <pthread.h> 93 #ifndef PC_DEBUG 94 #include <semaphore.h> 95 #endif 96 #include "OMX_Core.h" 97 #include "OMX_QCOMExtns.h" 98 #include "qc_omx_component.h" 99 #include <linux/msm_vidc_dec.h> 100 #include <media/msm_vidc.h> 101 #include "frameparser.h" 102 #ifdef MAX_RES_1080P 103 #include "mp4_utils.h" 104 #endif 105 #include <linux/android_pmem.h> 106 #include "extra_data_handler.h" 107 #include "ts_parser.h" 108 #include "vidc_color_converter.h" 109 extern "C" { 110 OMX_API void * get_omx_component_factory_fn(void); 111 } 112 113 #ifdef _ANDROID_ 114 using namespace android; 115 #ifdef USE_ION 116 class VideoHeap : public MemoryHeapBase 117 { 118 public: 119 VideoHeap(int devicefd, size_t size, void* base,struct ion_handle *handle,int mapfd); 120 virtual ~VideoHeap() {} 121 private: 122 int m_ion_device_fd; 123 struct ion_handle *m_ion_handle; 124 }; 125 #else 126 // local pmem heap object 127 class VideoHeap : public MemoryHeapBase 128 { 129 public: 130 VideoHeap(int fd, size_t size, void* base); 131 virtual ~VideoHeap() {} 132 }; 133 #endif 134 #endif // _ANDROID_ 135 ////////////////////////////////////////////////////////////////////////////// 136 // Module specific globals 137 ////////////////////////////////////////////////////////////////////////////// 138 #define OMX_SPEC_VERSION 0x00000101 139 140 141 ////////////////////////////////////////////////////////////////////////////// 142 // Macros 143 ////////////////////////////////////////////////////////////////////////////// 144 #define PrintFrameHdr(bufHdr) DEBUG_PRINT("bufHdr %x buf %x size %d TS %d\n",\ 145 (unsigned) bufHdr,\ 146 (unsigned)((OMX_BUFFERHEADERTYPE *)bufHdr)->pBuffer,\ 147 (unsigned)((OMX_BUFFERHEADERTYPE *)bufHdr)->nFilledLen,\ 148 (unsigned)((OMX_BUFFERHEADERTYPE *)bufHdr)->nTimeStamp) 149 150 // BitMask Management logic 151 #define BITS_PER_BYTE 32 152 #define BITMASK_SIZE(mIndex) (((mIndex) + BITS_PER_BYTE - 1)/BITS_PER_BYTE) 153 #define BITMASK_OFFSET(mIndex) ((mIndex)/BITS_PER_BYTE) 154 #define BITMASK_FLAG(mIndex) (1 << ((mIndex) % BITS_PER_BYTE)) 155 #define BITMASK_CLEAR(mArray,mIndex) (mArray)[BITMASK_OFFSET(mIndex)] \ 156 &= ~(BITMASK_FLAG(mIndex)) 157 #define BITMASK_SET(mArray,mIndex) (mArray)[BITMASK_OFFSET(mIndex)] \ 158 |= BITMASK_FLAG(mIndex) 159 #define BITMASK_PRESENT(mArray,mIndex) ((mArray)[BITMASK_OFFSET(mIndex)] \ 160 & BITMASK_FLAG(mIndex)) 161 #define BITMASK_ABSENT(mArray,mIndex) (((mArray)[BITMASK_OFFSET(mIndex)] \ 162 & BITMASK_FLAG(mIndex)) == 0x0) 163 #define BITMASK_PRESENT(mArray,mIndex) ((mArray)[BITMASK_OFFSET(mIndex)] \ 164 & BITMASK_FLAG(mIndex)) 165 #define BITMASK_ABSENT(mArray,mIndex) (((mArray)[BITMASK_OFFSET(mIndex)] \ 166 & BITMASK_FLAG(mIndex)) == 0x0) 167 168 #define OMX_CORE_CONTROL_CMDQ_SIZE 100 169 #define OMX_CORE_QCIF_HEIGHT 144 170 #define OMX_CORE_QCIF_WIDTH 176 171 #define OMX_CORE_VGA_HEIGHT 480 172 #define OMX_CORE_VGA_WIDTH 640 173 #define OMX_CORE_WVGA_HEIGHT 480 174 #define OMX_CORE_WVGA_WIDTH 800 175 176 #define DESC_BUFFER_SIZE (8192 * 16) 177 178 #ifdef _ANDROID_ 179 #define MAX_NUM_INPUT_OUTPUT_BUFFERS 32 180 #endif 181 182 #define OMX_FRAMEINFO_EXTRADATA 0x00010000 183 #define OMX_INTERLACE_EXTRADATA 0x00020000 184 #define OMX_TIMEINFO_EXTRADATA 0x00040000 185 #define OMX_PORTDEF_EXTRADATA 0x00080000 186 #define OMX_EXTNUSER_EXTRADATA 0x00100000 187 #define DRIVER_EXTRADATA_MASK 0x0000FFFF 188 189 #define OMX_INTERLACE_EXTRADATA_SIZE ((sizeof(OMX_OTHER_EXTRADATATYPE) +\ 190 sizeof(OMX_STREAMINTERLACEFORMAT) + 3)&(~3)) 191 #define OMX_FRAMEINFO_EXTRADATA_SIZE ((sizeof(OMX_OTHER_EXTRADATATYPE) +\ 192 sizeof(OMX_QCOM_EXTRADATA_FRAMEINFO) + 3)&(~3)) 193 #define OMX_PORTDEF_EXTRADATA_SIZE ((sizeof(OMX_OTHER_EXTRADATATYPE) +\ 194 sizeof(OMX_PARAM_PORTDEFINITIONTYPE) + 3)&(~3)) 195 196 // Define next macro with required values to enable default extradata, 197 // VDEC_EXTRADATA_MB_ERROR_MAP 198 // OMX_INTERLACE_EXTRADATA 199 // OMX_FRAMEINFO_EXTRADATA 200 // OMX_TIMEINFO_EXTRADATA 201 202 //#define DEFAULT_EXTRADATA (OMX_FRAMEINFO_EXTRADATA|OMX_INTERLACE_EXTRADATA) 203 204 enum port_indexes { 205 OMX_CORE_INPUT_PORT_INDEX =0, 206 OMX_CORE_OUTPUT_PORT_INDEX =1 207 }; 208 #ifdef USE_ION 209 struct vdec_ion { 210 int ion_device_fd; 211 struct ion_fd_data fd_ion_data; 212 struct ion_allocation_data ion_alloc_data; 213 }; 214 #endif 215 216 #ifdef _MSM8974_ 217 struct extradata_buffer_info { 218 int buffer_size; 219 char* uaddr; 220 int count; 221 int size; 222 #ifdef USE_ION 223 struct vdec_ion ion; 224 #endif 225 }; 226 #endif 227 228 struct video_driver_context { 229 int video_driver_fd; 230 enum vdec_codec decoder_format; 231 enum vdec_output_fromat output_format; 232 enum vdec_interlaced_format interlace; 233 enum vdec_output_order picture_order; 234 struct vdec_picsize video_resolution; 235 struct vdec_allocatorproperty ip_buf; 236 struct vdec_allocatorproperty op_buf; 237 struct vdec_bufferpayload *ptr_inputbuffer; 238 struct vdec_bufferpayload *ptr_outputbuffer; 239 struct vdec_output_frameinfo *ptr_respbuffer; 240 #ifdef USE_ION 241 struct vdec_ion *ip_buf_ion_info; 242 struct vdec_ion *op_buf_ion_info; 243 struct vdec_ion h264_mv; 244 struct vdec_ion meta_buffer; 245 struct vdec_ion meta_buffer_iommu; 246 #endif 247 struct vdec_framerate frame_rate; 248 unsigned extradata; 249 bool timestamp_adjust; 250 char kind[128]; 251 bool idr_only_decoding; 252 unsigned disable_dmx; 253 #ifdef _MSM8974_ 254 struct extradata_buffer_info extradata_info; 255 int num_planes; 256 #endif 257 }; 258 259 #ifdef _ANDROID_ 260 class DivXDrmDecrypt; 261 #endif //_ANDROID_ 262 263 // OMX video decoder class 264 class omx_vdec: public qc_omx_component 265 { 266 267 public: 268 omx_vdec(); // constructor 269 virtual ~omx_vdec(); // destructor 270 271 static int async_message_process (void *context, void* message); 272 static void process_event_cb(void *ctxt,unsigned char id); 273 274 OMX_ERRORTYPE allocate_buffer( 275 OMX_HANDLETYPE hComp, 276 OMX_BUFFERHEADERTYPE **bufferHdr, 277 OMX_U32 port, 278 OMX_PTR appData, 279 OMX_U32 bytes 280 ); 281 282 283 OMX_ERRORTYPE component_deinit(OMX_HANDLETYPE hComp); 284 285 OMX_ERRORTYPE component_init(OMX_STRING role); 286 287 OMX_ERRORTYPE component_role_enum( 288 OMX_HANDLETYPE hComp, 289 OMX_U8 *role, 290 OMX_U32 index 291 ); 292 293 OMX_ERRORTYPE component_tunnel_request( 294 OMX_HANDLETYPE hComp, 295 OMX_U32 port, 296 OMX_HANDLETYPE peerComponent, 297 OMX_U32 peerPort, 298 OMX_TUNNELSETUPTYPE *tunnelSetup 299 ); 300 301 OMX_ERRORTYPE empty_this_buffer( 302 OMX_HANDLETYPE hComp, 303 OMX_BUFFERHEADERTYPE *buffer 304 ); 305 306 307 308 OMX_ERRORTYPE fill_this_buffer( 309 OMX_HANDLETYPE hComp, 310 OMX_BUFFERHEADERTYPE *buffer 311 ); 312 313 314 OMX_ERRORTYPE free_buffer( 315 OMX_HANDLETYPE hComp, 316 OMX_U32 port, 317 OMX_BUFFERHEADERTYPE *buffer 318 ); 319 320 OMX_ERRORTYPE get_component_version( 321 OMX_HANDLETYPE hComp, 322 OMX_STRING componentName, 323 OMX_VERSIONTYPE *componentVersion, 324 OMX_VERSIONTYPE *specVersion, 325 OMX_UUIDTYPE *componentUUID 326 ); 327 328 OMX_ERRORTYPE get_config( 329 OMX_HANDLETYPE hComp, 330 OMX_INDEXTYPE configIndex, 331 OMX_PTR configData 332 ); 333 334 OMX_ERRORTYPE get_extension_index( 335 OMX_HANDLETYPE hComp, 336 OMX_STRING paramName, 337 OMX_INDEXTYPE *indexType 338 ); 339 340 OMX_ERRORTYPE get_parameter(OMX_HANDLETYPE hComp, 341 OMX_INDEXTYPE paramIndex, 342 OMX_PTR paramData); 343 344 OMX_ERRORTYPE get_state(OMX_HANDLETYPE hComp, 345 OMX_STATETYPE *state); 346 347 348 349 OMX_ERRORTYPE send_command(OMX_HANDLETYPE hComp, 350 OMX_COMMANDTYPE cmd, 351 OMX_U32 param1, 352 OMX_PTR cmdData); 353 354 355 OMX_ERRORTYPE set_callbacks(OMX_HANDLETYPE hComp, 356 OMX_CALLBACKTYPE *callbacks, 357 OMX_PTR appData); 358 359 OMX_ERRORTYPE set_config(OMX_HANDLETYPE hComp, 360 OMX_INDEXTYPE configIndex, 361 OMX_PTR configData); 362 363 OMX_ERRORTYPE set_parameter(OMX_HANDLETYPE hComp, 364 OMX_INDEXTYPE paramIndex, 365 OMX_PTR paramData); 366 367 OMX_ERRORTYPE use_buffer(OMX_HANDLETYPE hComp, 368 OMX_BUFFERHEADERTYPE **bufferHdr, 369 OMX_U32 port, 370 OMX_PTR appData, 371 OMX_U32 bytes, 372 OMX_U8 *buffer); 373 374 OMX_ERRORTYPE use_input_heap_buffers( 375 OMX_HANDLETYPE hComp, 376 OMX_BUFFERHEADERTYPE** bufferHdr, 377 OMX_U32 port, 378 OMX_PTR appData, 379 OMX_U32 bytes, 380 OMX_U8* buffer); 381 382 OMX_ERRORTYPE use_EGL_image(OMX_HANDLETYPE hComp, 383 OMX_BUFFERHEADERTYPE **bufferHdr, 384 OMX_U32 port, 385 OMX_PTR appData, 386 void * eglImage); 387 void complete_pending_buffer_done_cbs(); 388 struct video_driver_context drv_ctx; 389 #ifdef _MSM8974_ 390 OMX_ERRORTYPE allocate_extradata(); 391 void free_extradata(); 392 void update_resolution(int width, int height); 393 #endif 394 int m_pipe_in; 395 int m_pipe_out; 396 pthread_t msg_thread_id; 397 pthread_t async_thread_id; 398 bool is_component_secure(); 399 400 private: 401 // Bit Positions 402 enum flags_bit_positions { 403 // Defer transition to IDLE 404 OMX_COMPONENT_IDLE_PENDING =0x1, 405 // Defer transition to LOADING 406 OMX_COMPONENT_LOADING_PENDING =0x2, 407 // First Buffer Pending 408 OMX_COMPONENT_FIRST_BUFFER_PENDING =0x3, 409 // Second Buffer Pending 410 OMX_COMPONENT_SECOND_BUFFER_PENDING =0x4, 411 // Defer transition to Enable 412 OMX_COMPONENT_INPUT_ENABLE_PENDING =0x5, 413 // Defer transition to Enable 414 OMX_COMPONENT_OUTPUT_ENABLE_PENDING =0x6, 415 // Defer transition to Disable 416 OMX_COMPONENT_INPUT_DISABLE_PENDING =0x7, 417 // Defer transition to Disable 418 OMX_COMPONENT_OUTPUT_DISABLE_PENDING =0x8, 419 //defer flush notification 420 OMX_COMPONENT_OUTPUT_FLUSH_PENDING =0x9, 421 OMX_COMPONENT_INPUT_FLUSH_PENDING =0xA, 422 OMX_COMPONENT_PAUSE_PENDING =0xB, 423 OMX_COMPONENT_EXECUTE_PENDING =0xC, 424 OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING =0xD, 425 OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED=0xE 426 }; 427 428 // Deferred callback identifiers 429 enum { 430 //Event Callbacks from the vdec component thread context 431 OMX_COMPONENT_GENERATE_EVENT = 0x1, 432 //Buffer Done callbacks from the vdec component thread context 433 OMX_COMPONENT_GENERATE_BUFFER_DONE = 0x2, 434 //Frame Done callbacks from the vdec component thread context 435 OMX_COMPONENT_GENERATE_FRAME_DONE = 0x3, 436 //Buffer Done callbacks from the vdec component thread context 437 OMX_COMPONENT_GENERATE_FTB = 0x4, 438 //Frame Done callbacks from the vdec component thread context 439 OMX_COMPONENT_GENERATE_ETB = 0x5, 440 //Command 441 OMX_COMPONENT_GENERATE_COMMAND = 0x6, 442 //Push-Pending Buffers 443 OMX_COMPONENT_PUSH_PENDING_BUFS = 0x7, 444 // Empty Buffer Done callbacks 445 OMX_COMPONENT_GENERATE_EBD = 0x8, 446 //Flush Event Callbacks from the vdec component thread context 447 OMX_COMPONENT_GENERATE_EVENT_FLUSH = 0x9, 448 OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH = 0x0A, 449 OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH = 0x0B, 450 OMX_COMPONENT_GENERATE_FBD = 0xc, 451 OMX_COMPONENT_GENERATE_START_DONE = 0xD, 452 OMX_COMPONENT_GENERATE_PAUSE_DONE = 0xE, 453 OMX_COMPONENT_GENERATE_RESUME_DONE = 0xF, 454 OMX_COMPONENT_GENERATE_STOP_DONE = 0x10, 455 OMX_COMPONENT_GENERATE_HARDWARE_ERROR = 0x11, 456 OMX_COMPONENT_GENERATE_ETB_ARBITRARY = 0x12, 457 OMX_COMPONENT_GENERATE_PORT_RECONFIG = 0x13, 458 OMX_COMPONENT_GENERATE_EOS_DONE = 0x14, 459 OMX_COMPONENT_GENERATE_INFO_PORT_RECONFIG = 0x15, 460 OMX_COMPONENT_GENERATE_INFO_FIELD_DROPPED = 0x16, 461 }; 462 463 enum vc1_profile_type { 464 VC1_SP_MP_RCV = 1, 465 VC1_AP = 2 466 }; 467 468 #ifdef _MSM8974_ 469 enum v4l2_ports { 470 CAPTURE_PORT, 471 OUTPUT_PORT, 472 MAX_PORT 473 }; 474 #endif 475 476 struct omx_event { 477 unsigned param1; 478 unsigned param2; 479 unsigned id; 480 }; 481 482 struct omx_cmd_queue { 483 omx_event m_q[OMX_CORE_CONTROL_CMDQ_SIZE]; 484 unsigned m_read; 485 unsigned m_write; 486 unsigned m_size; 487 488 omx_cmd_queue(); 489 ~omx_cmd_queue(); 490 bool insert_entry(unsigned p1, unsigned p2, unsigned id); 491 bool pop_entry(unsigned *p1,unsigned *p2, unsigned *id); 492 // get msgtype of the first ele from the queue 493 unsigned get_q_msg_type(); 494 495 }; 496 497 #ifdef _ANDROID_ 498 struct ts_entry { 499 OMX_TICKS timestamp; 500 bool valid; 501 }; 502 503 struct ts_arr_list { 504 ts_entry m_ts_arr_list[MAX_NUM_INPUT_OUTPUT_BUFFERS]; 505 506 ts_arr_list(); 507 ~ts_arr_list(); 508 509 bool insert_ts(OMX_TICKS ts); 510 bool pop_min_ts(OMX_TICKS &ts); 511 bool reset_ts_list(); 512 }; 513 #endif 514 515 struct desc_buffer_hdr { 516 OMX_U8 *buf_addr; 517 OMX_U32 desc_data_size; 518 }; 519 bool allocate_done(void); 520 bool allocate_input_done(void); 521 bool allocate_output_done(void); 522 523 OMX_ERRORTYPE free_input_buffer(OMX_BUFFERHEADERTYPE *bufferHdr); 524 OMX_ERRORTYPE free_input_buffer(unsigned int bufferindex, 525 OMX_BUFFERHEADERTYPE *pmem_bufferHdr); 526 OMX_ERRORTYPE free_output_buffer(OMX_BUFFERHEADERTYPE *bufferHdr); 527 void free_output_buffer_header(); 528 void free_input_buffer_header(); 529 530 OMX_ERRORTYPE allocate_input_heap_buffer(OMX_HANDLETYPE hComp, 531 OMX_BUFFERHEADERTYPE **bufferHdr, 532 OMX_U32 port, 533 OMX_PTR appData, 534 OMX_U32 bytes); 535 536 537 OMX_ERRORTYPE allocate_input_buffer(OMX_HANDLETYPE hComp, 538 OMX_BUFFERHEADERTYPE **bufferHdr, 539 OMX_U32 port, 540 OMX_PTR appData, 541 OMX_U32 bytes); 542 543 OMX_ERRORTYPE allocate_output_buffer(OMX_HANDLETYPE hComp, 544 OMX_BUFFERHEADERTYPE **bufferHdr, 545 OMX_U32 port,OMX_PTR appData, 546 OMX_U32 bytes); 547 OMX_ERRORTYPE use_output_buffer(OMX_HANDLETYPE hComp, 548 OMX_BUFFERHEADERTYPE **bufferHdr, 549 OMX_U32 port, 550 OMX_PTR appData, 551 OMX_U32 bytes, 552 OMX_U8 *buffer); 553 #ifdef MAX_RES_720P 554 OMX_ERRORTYPE get_supported_profile_level_for_720p(OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType); 555 #endif 556 #ifdef MAX_RES_1080P 557 OMX_ERRORTYPE get_supported_profile_level_for_1080p(OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType); 558 #endif 559 560 OMX_ERRORTYPE allocate_desc_buffer(OMX_U32 index); 561 OMX_ERRORTYPE allocate_output_headers(); 562 bool execute_omx_flush(OMX_U32); 563 bool execute_output_flush(); 564 bool execute_input_flush(); 565 OMX_ERRORTYPE empty_buffer_done(OMX_HANDLETYPE hComp, 566 OMX_BUFFERHEADERTYPE * buffer); 567 568 OMX_ERRORTYPE fill_buffer_done(OMX_HANDLETYPE hComp, 569 OMX_BUFFERHEADERTYPE * buffer); 570 OMX_ERRORTYPE empty_this_buffer_proxy(OMX_HANDLETYPE hComp, 571 OMX_BUFFERHEADERTYPE *buffer); 572 573 OMX_ERRORTYPE empty_this_buffer_proxy_arbitrary(OMX_HANDLETYPE hComp, 574 OMX_BUFFERHEADERTYPE *buffer 575 ); 576 577 OMX_ERRORTYPE push_input_buffer (OMX_HANDLETYPE hComp); 578 OMX_ERRORTYPE push_input_sc_codec (OMX_HANDLETYPE hComp); 579 OMX_ERRORTYPE push_input_h264 (OMX_HANDLETYPE hComp); 580 OMX_ERRORTYPE push_input_hevc (OMX_HANDLETYPE hComp); 581 OMX_ERRORTYPE push_input_vc1 (OMX_HANDLETYPE hComp); 582 583 OMX_ERRORTYPE fill_this_buffer_proxy(OMX_HANDLETYPE hComp, 584 OMX_BUFFERHEADERTYPE *buffer); 585 bool release_done(); 586 587 bool release_output_done(); 588 bool release_input_done(); 589 OMX_ERRORTYPE get_buffer_req(vdec_allocatorproperty *buffer_prop); 590 OMX_ERRORTYPE set_buffer_req(vdec_allocatorproperty *buffer_prop); 591 OMX_ERRORTYPE start_port_reconfig(); 592 OMX_ERRORTYPE update_picture_resolution(); 593 int stream_off(OMX_U32 port); 594 void adjust_timestamp(OMX_S64 &act_timestamp); 595 void set_frame_rate(OMX_S64 act_timestamp); 596 void handle_extradata_secure(OMX_BUFFERHEADERTYPE *p_buf_hdr); 597 void handle_extradata(OMX_BUFFERHEADERTYPE *p_buf_hdr); 598 void print_debug_extradata(OMX_OTHER_EXTRADATATYPE *extra); 599 #ifdef _MSM8974_ 600 void append_interlace_extradata(OMX_OTHER_EXTRADATATYPE *extra, 601 OMX_U32 interlaced_format_type); 602 OMX_ERRORTYPE enable_extradata(OMX_U32 requested_extradata, bool is_internal, 603 bool enable = true); 604 void append_frame_info_extradata(OMX_OTHER_EXTRADATATYPE *extra, 605 OMX_U32 num_conceal_mb, 606 OMX_U32 picture_type, 607 OMX_U32 frame_rate, 608 struct msm_vidc_panscan_window_payload *panscan_payload, 609 struct vdec_aspectratioinfo *aspect_ratio_info); 610 #else 611 void append_interlace_extradata(OMX_OTHER_EXTRADATATYPE *extra, 612 OMX_U32 interlaced_format_type, OMX_U32 buf_index); 613 OMX_ERRORTYPE enable_extradata(OMX_U32 requested_extradata, bool enable = true); 614 #endif 615 void append_frame_info_extradata(OMX_OTHER_EXTRADATATYPE *extra, 616 OMX_U32 num_conceal_mb, 617 OMX_U32 picture_type, 618 OMX_S64 timestamp, 619 OMX_U32 frame_rate, 620 struct vdec_aspectratioinfo *aspect_ratio_info); 621 void fill_aspect_ratio_info(struct vdec_aspectratioinfo *aspect_ratio_info, 622 OMX_QCOM_EXTRADATA_FRAMEINFO *frame_info); 623 void append_terminator_extradata(OMX_OTHER_EXTRADATATYPE *extra); 624 OMX_ERRORTYPE update_portdef(OMX_PARAM_PORTDEFINITIONTYPE *portDefn); 625 void append_portdef_extradata(OMX_OTHER_EXTRADATATYPE *extra); 626 void append_extn_extradata(OMX_OTHER_EXTRADATATYPE *extra, OMX_OTHER_EXTRADATATYPE *p_extn); 627 void append_user_extradata(OMX_OTHER_EXTRADATATYPE *extra, OMX_OTHER_EXTRADATATYPE *p_user); 628 void insert_demux_addr_offset(OMX_U32 address_offset); 629 void extract_demux_addr_offsets(OMX_BUFFERHEADERTYPE *buf_hdr); 630 OMX_ERRORTYPE handle_demux_data(OMX_BUFFERHEADERTYPE *buf_hdr); 631 OMX_U32 count_MB_in_extradata(OMX_OTHER_EXTRADATATYPE *extra); 632 633 bool align_pmem_buffers(int pmem_fd, OMX_U32 buffer_size, 634 OMX_U32 alignment); 635 #ifdef USE_ION 636 int alloc_map_ion_memory(OMX_U32 buffer_size, 637 OMX_U32 alignment, struct ion_allocation_data *alloc_data, 638 struct ion_fd_data *fd_data,int flag); 639 void free_ion_memory(struct vdec_ion *buf_ion_info); 640 #endif 641 642 643 OMX_ERRORTYPE send_command_proxy(OMX_HANDLETYPE hComp, 644 OMX_COMMANDTYPE cmd, 645 OMX_U32 param1, 646 OMX_PTR cmdData); 647 bool post_event( unsigned int p1, 648 unsigned int p2, 649 unsigned int id 650 ); 651 inline int clip2(int x) { 652 x = x -1; 653 x = x | x >> 1; 654 x = x | x >> 2; 655 x = x | x >> 4; 656 x = x | x >> 16; 657 x = x + 1; 658 return x; 659 } 660 661 #ifdef MAX_RES_1080P 662 OMX_ERRORTYPE vdec_alloc_h264_mv(); 663 void vdec_dealloc_h264_mv(); 664 OMX_ERRORTYPE vdec_alloc_meta_buffers(); 665 void vdec_dealloc_meta_buffers(); 666 #endif 667 668 inline void omx_report_error () { 669 if (m_cb.EventHandler && !m_error_propogated) { 670 ALOGE("\nERROR: Sending OMX_EventError to Client"); 671 m_error_propogated = true; 672 m_cb.EventHandler(&m_cmp,m_app_data, 673 OMX_EventError,OMX_ErrorHardware,0,NULL); 674 } 675 } 676 #ifdef _ANDROID_ 677 OMX_ERRORTYPE createDivxDrmContext(); 678 #endif //_ANDROID_ 679 #if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_) 680 OMX_ERRORTYPE use_android_native_buffer(OMX_IN OMX_HANDLETYPE hComp, OMX_PTR data); 681 #endif 682 #if defined (_ANDROID_ICS_) 683 struct nativebuffer { 684 native_handle_t *nativehandle; 685 private_handle_t *privatehandle; 686 int inuse; 687 }; 688 nativebuffer native_buffer[MAX_NUM_INPUT_OUTPUT_BUFFERS]; 689 #endif 690 691 692 //************************************************************* 693 //*******************MEMBER VARIABLES ************************* 694 //************************************************************* 695 pthread_mutex_t m_lock; 696 pthread_mutex_t c_lock; 697 //sem to handle the minimum procesing of commands 698 sem_t m_cmd_lock; 699 bool m_error_propogated; 700 // compression format 701 OMX_VIDEO_CODINGTYPE eCompressionFormat; 702 // OMX State 703 OMX_STATETYPE m_state; 704 // Application data 705 OMX_PTR m_app_data; 706 // Application callbacks 707 OMX_CALLBACKTYPE m_cb; 708 OMX_PRIORITYMGMTTYPE m_priority_mgm ; 709 OMX_PARAM_BUFFERSUPPLIERTYPE m_buffer_supplier; 710 // fill this buffer queue 711 omx_cmd_queue m_ftb_q; 712 // Command Q for rest of the events 713 omx_cmd_queue m_cmd_q; 714 omx_cmd_queue m_etb_q; 715 // Input memory pointer 716 OMX_BUFFERHEADERTYPE *m_inp_mem_ptr; 717 // Output memory pointer 718 OMX_BUFFERHEADERTYPE *m_out_mem_ptr; 719 // number of input bitstream error frame count 720 unsigned int m_inp_err_count; 721 #ifdef _ANDROID_ 722 // Timestamp list 723 ts_arr_list m_timestamp_list; 724 #endif 725 726 bool input_flush_progress; 727 bool output_flush_progress; 728 bool input_use_buffer; 729 bool output_use_buffer; 730 bool ouput_egl_buffers; 731 OMX_BOOL m_use_output_pmem; 732 OMX_BOOL m_out_mem_region_smi; 733 OMX_BOOL m_out_pvt_entry_pmem; 734 735 int pending_input_buffers; 736 int pending_output_buffers; 737 // bitmask array size for output side 738 unsigned int m_out_bm_count; 739 // bitmask array size for input side 740 unsigned int m_inp_bm_count; 741 //Input port Populated 742 OMX_BOOL m_inp_bPopulated; 743 //Output port Populated 744 OMX_BOOL m_out_bPopulated; 745 // encapsulate the waiting states. 746 unsigned int m_flags; 747 748 #ifdef _ANDROID_ 749 // Heap pointer to frame buffers 750 struct vidc_heap { 751 sp<MemoryHeapBase> video_heap_ptr; 752 }; 753 struct vidc_heap *m_heap_ptr; 754 unsigned int m_heap_count; 755 #endif //_ANDROID_ 756 // store I/P PORT state 757 OMX_BOOL m_inp_bEnabled; 758 // store O/P PORT state 759 OMX_BOOL m_out_bEnabled; 760 OMX_U32 m_in_alloc_cnt; 761 OMX_U8 m_cRole[OMX_MAX_STRINGNAME_SIZE]; 762 // Platform specific details 763 OMX_QCOM_PLATFORM_PRIVATE_LIST *m_platform_list; 764 OMX_QCOM_PLATFORM_PRIVATE_ENTRY *m_platform_entry; 765 OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *m_pmem_info; 766 // SPS+PPS sent as part of set_config 767 OMX_VENDOR_EXTRADATATYPE m_vendor_config; 768 769 /*Variables for arbitrary Byte parsing support*/ 770 frame_parse m_frame_parser; 771 omx_cmd_queue m_input_pending_q; 772 omx_cmd_queue m_input_free_q; 773 bool arbitrary_bytes; 774 OMX_BUFFERHEADERTYPE h264_scratch; 775 OMX_BUFFERHEADERTYPE *psource_frame; 776 OMX_BUFFERHEADERTYPE *pdest_frame; 777 OMX_BUFFERHEADERTYPE *m_inp_heap_ptr; 778 OMX_BUFFERHEADERTYPE **m_phdr_pmem_ptr; 779 unsigned int m_heap_inp_bm_count; 780 codec_type codec_type_parse; 781 bool first_frame_meta; 782 unsigned frame_count; 783 unsigned nal_count; 784 unsigned nal_length; 785 bool look_ahead_nal; 786 int first_frame; 787 unsigned char *first_buffer; 788 int first_frame_size; 789 unsigned char m_hwdevice_name[80]; 790 FILE *m_device_file_ptr; 791 enum vc1_profile_type m_vc1_profile; 792 OMX_S64 h264_last_au_ts; 793 OMX_U32 h264_last_au_flags; 794 OMX_U32 m_demux_offsets[8192]; 795 OMX_U32 m_demux_entries; 796 OMX_U32 m_disp_hor_size; 797 OMX_U32 m_disp_vert_size; 798 799 OMX_S64 prev_ts; 800 bool rst_prev_ts; 801 OMX_U32 frm_int; 802 803 struct vdec_allocatorproperty op_buf_rcnfg; 804 bool in_reconfig; 805 OMX_NATIVE_WINDOWTYPE m_display_id; 806 h264_stream_parser *h264_parser; 807 OMX_U32 client_extradata; 808 #ifdef _ANDROID_ 809 bool m_debug_timestamp; 810 bool perf_flag; 811 OMX_U32 proc_frms, latency; 812 perf_metrics fps_metrics; 813 perf_metrics dec_time; 814 bool m_enable_android_native_buffers; 815 bool m_use_android_native_buffers; 816 bool m_debug_extradata; 817 bool m_debug_concealedmb; 818 #endif 819 #ifdef MAX_RES_1080P 820 MP4_Utils mp4_headerparser; 821 #endif 822 823 struct h264_mv_buffer { 824 unsigned char* buffer; 825 int size; 826 int count; 827 int pmem_fd; 828 int offset; 829 }; 830 h264_mv_buffer h264_mv_buff; 831 832 struct meta_buffer { 833 unsigned char* buffer; 834 int size; 835 int count; 836 int pmem_fd; 837 int pmem_fd_iommu; 838 int offset; 839 }; 840 meta_buffer meta_buff; 841 extra_data_handler extra_data_handle; 842 #ifdef _ANDROID_ 843 DivXDrmDecrypt* iDivXDrmDecrypt; 844 #endif //_ANDROID_ 845 OMX_PARAM_PORTDEFINITIONTYPE m_port_def; 846 omx_time_stamp_reorder time_stamp_dts; 847 desc_buffer_hdr *m_desc_buffer_ptr; 848 bool secure_mode; 849 bool external_meta_buffer; 850 bool external_meta_buffer_iommu; 851 OMX_QCOM_EXTRADATA_FRAMEINFO *m_extradata; 852 bool codec_config_flag; 853 #ifdef _MSM8974_ 854 int capture_capability; 855 int output_capability; 856 bool streaming[MAX_PORT]; 857 OMX_CONFIG_RECTTYPE rectangle; 858 #endif 859 bool m_power_hinted; 860 OMX_ERRORTYPE power_module_register(); 861 OMX_ERRORTYPE power_module_deregister(); 862 bool msg_thread_created; 863 bool async_thread_created; 864 865 unsigned int m_fill_output_msg; 866 class allocate_color_convert_buf 867 { 868 public: 869 allocate_color_convert_buf(); 870 ~allocate_color_convert_buf(); 871 void set_vdec_client(void *); 872 void update_client(); 873 bool set_color_format(OMX_COLOR_FORMATTYPE dest_color_format); 874 bool get_color_format(OMX_COLOR_FORMATTYPE &dest_color_format); 875 bool update_buffer_req(); 876 bool get_buffer_req(unsigned int &buffer_size); 877 OMX_BUFFERHEADERTYPE* get_il_buf_hdr(); 878 OMX_BUFFERHEADERTYPE* get_il_buf_hdr(OMX_BUFFERHEADERTYPE *input_hdr); 879 OMX_BUFFERHEADERTYPE* get_dr_buf_hdr(OMX_BUFFERHEADERTYPE *input_hdr); 880 OMX_BUFFERHEADERTYPE* convert(OMX_BUFFERHEADERTYPE *header); 881 OMX_BUFFERHEADERTYPE* queue_buffer(OMX_BUFFERHEADERTYPE *header); 882 OMX_ERRORTYPE allocate_buffers_color_convert(OMX_HANDLETYPE hComp, 883 OMX_BUFFERHEADERTYPE **bufferHdr,OMX_U32 port,OMX_PTR appData, 884 OMX_U32 bytes); 885 OMX_ERRORTYPE free_output_buffer(OMX_BUFFERHEADERTYPE *bufferHdr); 886 private: 887 #define MAX_COUNT 32 888 omx_vdec *omx; 889 bool enabled; 890 OMX_COLOR_FORMATTYPE ColorFormat; 891 void init_members(); 892 bool color_convert_mode; 893 ColorConvertFormat dest_format; 894 class omx_c2d_conv c2d; 895 unsigned int allocated_count; 896 unsigned int buffer_size_req; 897 unsigned int buffer_alignment_req; 898 OMX_QCOM_PLATFORM_PRIVATE_LIST m_platform_list_client[MAX_COUNT]; 899 OMX_QCOM_PLATFORM_PRIVATE_ENTRY m_platform_entry_client[MAX_COUNT]; 900 OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO m_pmem_info_client[MAX_COUNT]; 901 OMX_BUFFERHEADERTYPE m_out_mem_ptr_client[MAX_COUNT]; 902 #ifdef USE_ION 903 struct vdec_ion op_buf_ion_info[MAX_COUNT]; 904 #endif 905 unsigned char *pmem_baseaddress[MAX_COUNT]; 906 int pmem_fd[MAX_COUNT]; 907 struct vidc_heap { 908 sp<MemoryHeapBase> video_heap_ptr; 909 }; 910 struct vidc_heap m_heap_ptr[MAX_COUNT]; 911 }; 912 #if defined (_MSM8960_) || defined (_MSM8974_) 913 allocate_color_convert_buf client_buffers; 914 #endif 915 HEVC_Utils mHEVCutils; 916 }; 917 918 #ifdef _MSM8974_ 919 enum instance_state { 920 MSM_VIDC_CORE_UNINIT_DONE = 0x0001, 921 MSM_VIDC_CORE_INIT, 922 MSM_VIDC_CORE_INIT_DONE, 923 MSM_VIDC_OPEN, 924 MSM_VIDC_OPEN_DONE, 925 MSM_VIDC_LOAD_RESOURCES, 926 MSM_VIDC_LOAD_RESOURCES_DONE, 927 MSM_VIDC_START, 928 MSM_VIDC_START_DONE, 929 MSM_VIDC_STOP, 930 MSM_VIDC_STOP_DONE, 931 MSM_VIDC_RELEASE_RESOURCES, 932 MSM_VIDC_RELEASE_RESOURCES_DONE, 933 MSM_VIDC_CLOSE, 934 MSM_VIDC_CLOSE_DONE, 935 MSM_VIDC_CORE_UNINIT, 936 }; 937 938 enum vidc_resposes_id { 939 MSM_VIDC_DECODER_FLUSH_DONE = 0x11, 940 MSM_VIDC_DECODER_EVENT_CHANGE, 941 }; 942 943 #endif // _MSM8974_ 944 945 #endif // __OMX_VDEC_H__ 946