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