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