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