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