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