Home | History | Annotate | Download | only in inc
      1 /*--------------------------------------------------------------------------
      2 Copyright (c) 2010-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 are
      6 met:
      7     * Redistributions of source code must retain the above copyright
      8       notice, this list of conditions and the following disclaimer.
      9     * Redistributions in binary form must reproduce the above
     10       copyright notice, this list of conditions and the following
     11       disclaimer in the documentation and/or other materials provided
     12       with the distribution.
     13     * Neither the name of The Linux Foundation nor the names of its
     14       contributors may be used to endorse or promote products derived
     15       from this software without specific prior written permission.
     16 
     17 THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
     18 WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
     19 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
     20 ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
     21 BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     22 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     23 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
     24 BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
     25 WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
     26 OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
     27 IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     28 --------------------------------------------------------------------------*/
     29 
     30 #ifndef __OMX_VIDEO_BASE_H__
     31 #define __OMX_VIDEO_BASE_H__
     32 /*============================================================================
     33                             O p e n M A X   Component
     34                                 Video Encoder
     35 
     36 *//** @file comx_video_base.h
     37   This module contains the class definition for openMAX decoder component.
     38 
     39 *//*========================================================================*/
     40 
     41 //////////////////////////////////////////////////////////////////////////////
     42 //                             Include Files
     43 //////////////////////////////////////////////////////////////////////////////
     44 
     45 #define LOG_TAG "OMX-VENC"
     46 #include <stdlib.h>
     47 #include <stdio.h>
     48 #include <sys/mman.h>
     49 #ifdef _ANDROID_
     50 #include <binder/MemoryHeapBase.h>
     51 #ifdef _ANDROID_ICS_
     52 #include "QComOMXMetadata.h"
     53 #endif
     54 #endif // _ANDROID_
     55 #include <pthread.h>
     56 #include <semaphore.h>
     57 #include <linux/msm_vidc_enc.h>
     58 #include "OMX_Core.h"
     59 #include "OMX_QCOMExtns.h"
     60 #include "OMX_VideoExt.h"
     61 #include "OMX_IndexExt.h"
     62 #include "qc_omx_component.h"
     63 #include "omx_video_common.h"
     64 #include "extra_data_handler.h"
     65 #include <linux/videodev2.h>
     66 #include <dlfcn.h>
     67 #include "C2DColorConverter.h"
     68 #include "vidc_debug.h"
     69 
     70 #ifdef _ANDROID_
     71 using namespace android;
     72 // local pmem heap object
     73 class VideoHeap : public MemoryHeapBase
     74 {
     75     public:
     76         VideoHeap(int fd, size_t size, void* base);
     77         virtual ~VideoHeap() {}
     78 };
     79 
     80 #include <utils/Log.h>
     81 
     82 #endif // _ANDROID_
     83 
     84 #ifdef USE_ION
     85 static const char* MEM_DEVICE = "/dev/ion";
     86 #if defined(MAX_RES_720P) && !defined(_MSM8974_)
     87 #define MEM_HEAP_ID ION_CAMERA_HEAP_ID
     88 #else
     89 #ifdef _MSM8974_
     90 #define MEM_HEAP_ID ION_IOMMU_HEAP_ID
     91 #else
     92 #define MEM_HEAP_ID ION_CP_MM_HEAP_ID
     93 #endif
     94 #endif
     95 #elif MAX_RES_720P
     96 static const char* MEM_DEVICE = "/dev/pmem_adsp";
     97 #elif MAX_RES_1080P_EBI
     98 static const char* MEM_DEVICE  = "/dev/pmem_adsp";
     99 #elif MAX_RES_1080P
    100 static const char* MEM_DEVICE = "/dev/pmem_smipool";
    101 #else
    102 #error MEM_DEVICE cannot be determined.
    103 #endif
    104 
    105 #ifdef _ION_HEAP_MASK_COMPATIBILITY_WA
    106     #define ION_HEAP_MASK heap_mask
    107 #else
    108     #define ION_HEAP_MASK heap_id_mask
    109 #endif
    110 
    111 //////////////////////////////////////////////////////////////////////////////
    112 //                       Module specific globals
    113 //////////////////////////////////////////////////////////////////////////////
    114 
    115 #define OMX_SPEC_VERSION  0x00000101
    116 
    117 
    118 //////////////////////////////////////////////////////////////////////////////
    119 //               Macros
    120 //////////////////////////////////////////////////////////////////////////////
    121 #define PrintFrameHdr(bufHdr) DEBUG_PRINT("bufHdr %x buf %x size %d TS %d\n",\
    122         (unsigned) bufHdr,\
    123         (unsigned)((OMX_BUFFERHEADERTYPE *)bufHdr)->pBuffer,\
    124         (unsigned)((OMX_BUFFERHEADERTYPE *)bufHdr)->nFilledLen,\
    125         (unsigned)((OMX_BUFFERHEADERTYPE *)bufHdr)->nTimeStamp)
    126 
    127 // BitMask Management logic
    128 #define BITS_PER_INDEX        64
    129 #define BITMASK_SIZE(mIndex) (((mIndex) + BITS_PER_INDEX - 1)/BITS_PER_INDEX)
    130 #define BITMASK_OFFSET(mIndex) ((mIndex)/BITS_PER_INDEX)
    131 #define BITMASK_FLAG(mIndex) ((uint64_t)1 << ((mIndex) % BITS_PER_INDEX))
    132 #define BITMASK_CLEAR(mArray,mIndex) (mArray)[BITMASK_OFFSET(mIndex)] \
    133     &=  ~(BITMASK_FLAG(mIndex))
    134 #define BITMASK_SET(mArray,mIndex)  (mArray)[BITMASK_OFFSET(mIndex)] \
    135     |=  BITMASK_FLAG(mIndex)
    136 #define BITMASK_PRESENT(mArray,mIndex) ((mArray)[BITMASK_OFFSET(mIndex)] \
    137         & BITMASK_FLAG(mIndex))
    138 #define BITMASK_ABSENT(mArray,mIndex) (((mArray)[BITMASK_OFFSET(mIndex)] \
    139             & BITMASK_FLAG(mIndex)) == 0x0)
    140 #define BITMASK_PRESENT(mArray,mIndex) ((mArray)[BITMASK_OFFSET(mIndex)] \
    141         & BITMASK_FLAG(mIndex))
    142 #define BITMASK_ABSENT(mArray,mIndex) (((mArray)[BITMASK_OFFSET(mIndex)] \
    143             & BITMASK_FLAG(mIndex)) == 0x0)
    144 
    145 #define MAX_NUM_INPUT_BUFFERS 64
    146 #define MAX_NUM_OUTPUT_BUFFERS 64
    147 
    148 void* message_thread(void *);
    149 
    150 // OMX video class
    151 class omx_video: public qc_omx_component
    152 {
    153     protected:
    154 #ifdef _ANDROID_ICS_
    155         bool meta_mode_enable;
    156         bool c2d_opened;
    157         encoder_media_buffer_type meta_buffers[MAX_NUM_INPUT_BUFFERS];
    158         OMX_BUFFERHEADERTYPE *opaque_buffer_hdr[MAX_NUM_INPUT_BUFFERS];
    159         bool get_syntaxhdr_enable;
    160         OMX_BUFFERHEADERTYPE  *psource_frame;
    161         OMX_BUFFERHEADERTYPE  *pdest_frame;
    162         bool secure_session;
    163         bool hier_b_enabled;
    164         //intermediate conversion buffer queued to encoder in case of invalid EOS input
    165         OMX_BUFFERHEADERTYPE  *mEmptyEosBuffer;
    166 
    167         class omx_c2d_conv
    168         {
    169             public:
    170                 omx_c2d_conv();
    171                 ~omx_c2d_conv();
    172                 bool init();
    173                 bool open(unsigned int height,unsigned int width,
    174                         ColorConvertFormat src,
    175                         ColorConvertFormat dest,unsigned int src_stride);
    176                 bool convert(int src_fd, void *src_base, void *src_viraddr,
    177                         int dest_fd, void *dest_base, void *dest_viraddr);
    178                 bool get_buffer_size(int port,unsigned int &buf_size);
    179                 int get_src_format();
    180                 void close();
    181             private:
    182                 C2DColorConverterBase *c2dcc;
    183                 pthread_mutex_t c_lock;
    184                 void *mLibHandle;
    185                 ColorConvertFormat src_format;
    186                 createC2DColorConverter_t *mConvertOpen;
    187                 destroyC2DColorConverter_t *mConvertClose;
    188         };
    189         omx_c2d_conv c2d_conv;
    190 #endif
    191     public:
    192 
    193         bool mUseProxyColorFormat;
    194         //RGB or non-native input, and we have pre-allocated conversion buffers
    195         bool mUsesColorConversion;
    196 
    197         omx_video();  // constructor
    198         virtual ~omx_video();  // destructor
    199 
    200         // virtual int async_message_process (void *context, void* message);
    201         void process_event_cb(void *ctxt,unsigned char id);
    202 
    203         OMX_ERRORTYPE allocate_buffer(
    204                 OMX_HANDLETYPE hComp,
    205                 OMX_BUFFERHEADERTYPE **bufferHdr,
    206                 OMX_U32 port,
    207                 OMX_PTR appData,
    208                 OMX_U32 bytes
    209                 );
    210 
    211 
    212         virtual OMX_ERRORTYPE component_deinit(OMX_HANDLETYPE hComp)= 0;
    213 
    214         virtual OMX_ERRORTYPE component_init(OMX_STRING role)= 0;
    215 
    216         virtual OMX_U32 dev_stop(void) = 0;
    217         virtual OMX_U32 dev_pause(void) = 0;
    218         virtual OMX_U32 dev_start(void) = 0;
    219         virtual OMX_U32 dev_flush(unsigned) = 0;
    220         virtual OMX_U32 dev_resume(void) = 0;
    221         virtual OMX_U32 dev_start_done(void) = 0;
    222         virtual OMX_U32 dev_set_message_thread_id(pthread_t) = 0;
    223         virtual bool dev_use_buf(void *,unsigned,unsigned) = 0;
    224         virtual bool dev_free_buf(void *,unsigned) = 0;
    225         virtual bool dev_empty_buf(void *, void *,unsigned,unsigned) = 0;
    226         virtual bool dev_fill_buf(void *buffer, void *,unsigned,unsigned) = 0;
    227         virtual bool dev_get_buf_req(OMX_U32 *,OMX_U32 *,OMX_U32 *,OMX_U32) = 0;
    228         virtual bool dev_get_seq_hdr(void *, unsigned, unsigned *) = 0;
    229         virtual bool dev_loaded_start(void) = 0;
    230         virtual bool dev_loaded_stop(void) = 0;
    231         virtual bool dev_loaded_start_done(void) = 0;
    232         virtual bool dev_loaded_stop_done(void) = 0;
    233         virtual bool is_secure_session(void) = 0;
    234 #ifdef _MSM8974_
    235         virtual int dev_handle_extradata(void*, int) = 0;
    236         virtual int dev_set_format(int) = 0;
    237 #endif
    238         virtual bool dev_is_video_session_supported(OMX_U32 width, OMX_U32 height) = 0;
    239         virtual bool dev_get_capability_ltrcount(OMX_U32 *, OMX_U32 *, OMX_U32 *) = 0;
    240         virtual bool dev_get_performance_level(OMX_U32 *) = 0;
    241         virtual bool dev_get_vui_timing_info(OMX_U32 *) = 0;
    242         virtual bool dev_get_peak_bitrate(OMX_U32 *) = 0;
    243         virtual bool dev_get_temporal_layer_caps(OMX_U32 * /*nMaxLayers*/,
    244                 OMX_U32 * /*nMaxBLayers*/) = 0;
    245 #ifdef _ANDROID_ICS_
    246         void omx_release_meta_buffer(OMX_BUFFERHEADERTYPE *buffer);
    247 #endif
    248         virtual bool dev_color_align(OMX_BUFFERHEADERTYPE *buffer, OMX_U32 width,
    249                         OMX_U32 height) = 0;
    250         virtual bool dev_get_output_log_flag() = 0;
    251         virtual int dev_output_log_buffers(const char *buffer_addr, int buffer_len) = 0;
    252         virtual int dev_extradata_log_buffers(char *buffer_addr) = 0;
    253         OMX_ERRORTYPE component_role_enum(
    254                 OMX_HANDLETYPE hComp,
    255                 OMX_U8 *role,
    256                 OMX_U32 index
    257                 );
    258 
    259         OMX_ERRORTYPE component_tunnel_request(
    260                 OMX_HANDLETYPE hComp,
    261                 OMX_U32 port,
    262                 OMX_HANDLETYPE  peerComponent,
    263                 OMX_U32 peerPort,
    264                 OMX_TUNNELSETUPTYPE *tunnelSetup
    265                 );
    266 
    267         OMX_ERRORTYPE empty_this_buffer(
    268                 OMX_HANDLETYPE hComp,
    269                 OMX_BUFFERHEADERTYPE *buffer
    270                 );
    271 
    272 
    273 
    274         OMX_ERRORTYPE fill_this_buffer(
    275                 OMX_HANDLETYPE hComp,
    276                 OMX_BUFFERHEADERTYPE *buffer
    277                 );
    278 
    279 
    280         OMX_ERRORTYPE free_buffer(
    281                 OMX_HANDLETYPE hComp,
    282                 OMX_U32 port,
    283                 OMX_BUFFERHEADERTYPE *buffer
    284                 );
    285 
    286         OMX_ERRORTYPE get_component_version(
    287                 OMX_HANDLETYPE hComp,
    288                 OMX_STRING componentName,
    289                 OMX_VERSIONTYPE *componentVersion,
    290                 OMX_VERSIONTYPE *specVersion,
    291                 OMX_UUIDTYPE *componentUUID
    292                 );
    293 
    294         OMX_ERRORTYPE get_config(
    295                 OMX_HANDLETYPE hComp,
    296                 OMX_INDEXTYPE configIndex,
    297                 OMX_PTR configData
    298                 );
    299 
    300         OMX_ERRORTYPE get_extension_index(
    301                 OMX_HANDLETYPE hComp,
    302                 OMX_STRING paramName,
    303                 OMX_INDEXTYPE *indexType
    304                 );
    305 
    306         OMX_ERRORTYPE get_parameter(OMX_HANDLETYPE hComp,
    307                 OMX_INDEXTYPE  paramIndex,
    308                 OMX_PTR        paramData);
    309 
    310         OMX_ERRORTYPE get_state(OMX_HANDLETYPE hComp,
    311                 OMX_STATETYPE *state);
    312 
    313 
    314 
    315         OMX_ERRORTYPE send_command(OMX_HANDLETYPE  hComp,
    316                 OMX_COMMANDTYPE cmd,
    317                 OMX_U32         param1,
    318                 OMX_PTR         cmdData);
    319 
    320 
    321         OMX_ERRORTYPE set_callbacks(OMX_HANDLETYPE   hComp,
    322                 OMX_CALLBACKTYPE *callbacks,
    323                 OMX_PTR          appData);
    324 
    325         virtual OMX_ERRORTYPE set_config(OMX_HANDLETYPE hComp,
    326                 OMX_INDEXTYPE  configIndex,
    327                 OMX_PTR        configData) = 0;
    328 
    329         virtual OMX_ERRORTYPE set_parameter(OMX_HANDLETYPE hComp,
    330                 OMX_INDEXTYPE  paramIndex,
    331                 OMX_PTR        paramData) =0;
    332 
    333         OMX_ERRORTYPE use_buffer(OMX_HANDLETYPE      hComp,
    334                 OMX_BUFFERHEADERTYPE **bufferHdr,
    335                 OMX_U32              port,
    336                 OMX_PTR              appData,
    337                 OMX_U32              bytes,
    338                 OMX_U8               *buffer);
    339 
    340 
    341         OMX_ERRORTYPE use_EGL_image(OMX_HANDLETYPE     hComp,
    342                 OMX_BUFFERHEADERTYPE **bufferHdr,
    343                 OMX_U32              port,
    344                 OMX_PTR              appData,
    345                 void *               eglImage);
    346 
    347 
    348 
    349         int  m_pipe_in;
    350         int  m_pipe_out;
    351 
    352         pthread_t msg_thread_id;
    353         pthread_t async_thread_id;
    354         bool async_thread_created;
    355         bool msg_thread_created;
    356 
    357         OMX_U8 m_nkind[128];
    358 
    359 
    360         //int *input_pmem_fd;
    361         //int *output_pmem_fd;
    362         struct pmem *m_pInput_pmem;
    363         struct pmem *m_pOutput_pmem;
    364 #ifdef USE_ION
    365         struct venc_ion *m_pInput_ion;
    366         struct venc_ion *m_pOutput_ion;
    367 #endif
    368 
    369 
    370 
    371     public:
    372         // Bit Positions
    373         enum flags_bit_positions {
    374             // Defer transition to IDLE
    375             OMX_COMPONENT_IDLE_PENDING            =0x1,
    376             // Defer transition to LOADING
    377             OMX_COMPONENT_LOADING_PENDING         =0x2,
    378             // First  Buffer Pending
    379             OMX_COMPONENT_FIRST_BUFFER_PENDING    =0x3,
    380             // Second Buffer Pending
    381             OMX_COMPONENT_SECOND_BUFFER_PENDING   =0x4,
    382             // Defer transition to Enable
    383             OMX_COMPONENT_INPUT_ENABLE_PENDING    =0x5,
    384             // Defer transition to Enable
    385             OMX_COMPONENT_OUTPUT_ENABLE_PENDING   =0x6,
    386             // Defer transition to Disable
    387             OMX_COMPONENT_INPUT_DISABLE_PENDING   =0x7,
    388             // Defer transition to Disable
    389             OMX_COMPONENT_OUTPUT_DISABLE_PENDING  =0x8,
    390             //defer flush notification
    391             OMX_COMPONENT_OUTPUT_FLUSH_PENDING    =0x9,
    392             OMX_COMPONENT_INPUT_FLUSH_PENDING    =0xA,
    393             OMX_COMPONENT_PAUSE_PENDING          =0xB,
    394             OMX_COMPONENT_EXECUTE_PENDING        =0xC,
    395             OMX_COMPONENT_LOADED_START_PENDING = 0xD,
    396             OMX_COMPONENT_LOADED_STOP_PENDING = 0xF,
    397 
    398         };
    399 
    400         // Deferred callback identifiers
    401         enum {
    402             //Event Callbacks from the venc component thread context
    403             OMX_COMPONENT_GENERATE_EVENT       = 0x1,
    404             //Buffer Done callbacks from the venc component thread context
    405             OMX_COMPONENT_GENERATE_BUFFER_DONE = 0x2,
    406             //Frame Done callbacks from the venc component thread context
    407             OMX_COMPONENT_GENERATE_FRAME_DONE  = 0x3,
    408             //Buffer Done callbacks from the venc component thread context
    409             OMX_COMPONENT_GENERATE_FTB         = 0x4,
    410             //Frame Done callbacks from the venc component thread context
    411             OMX_COMPONENT_GENERATE_ETB         = 0x5,
    412             //Command
    413             OMX_COMPONENT_GENERATE_COMMAND     = 0x6,
    414             //Push-Pending Buffers
    415             OMX_COMPONENT_PUSH_PENDING_BUFS    = 0x7,
    416             // Empty Buffer Done callbacks
    417             OMX_COMPONENT_GENERATE_EBD         = 0x8,
    418             //Flush Event Callbacks from the venc component thread context
    419             OMX_COMPONENT_GENERATE_EVENT_FLUSH       = 0x9,
    420             OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH = 0x0A,
    421             OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH = 0x0B,
    422             OMX_COMPONENT_GENERATE_FBD = 0xc,
    423             OMX_COMPONENT_GENERATE_START_DONE = 0xD,
    424             OMX_COMPONENT_GENERATE_PAUSE_DONE = 0xE,
    425             OMX_COMPONENT_GENERATE_RESUME_DONE = 0xF,
    426             OMX_COMPONENT_GENERATE_STOP_DONE = 0x10,
    427             OMX_COMPONENT_GENERATE_HARDWARE_ERROR = 0x11,
    428             OMX_COMPONENT_GENERATE_LTRUSE_FAILED = 0x12,
    429             OMX_COMPONENT_GENERATE_ETB_OPQ = 0x13
    430         };
    431 
    432         struct omx_event {
    433             unsigned long param1;
    434             unsigned long param2;
    435             unsigned long id;
    436         };
    437 
    438         struct omx_cmd_queue {
    439             omx_event m_q[OMX_CORE_CONTROL_CMDQ_SIZE];
    440             unsigned long m_read;
    441             unsigned long m_write;
    442             unsigned long m_size;
    443 
    444             omx_cmd_queue();
    445             ~omx_cmd_queue();
    446             bool insert_entry(unsigned long p1, unsigned long p2, unsigned long id);
    447             bool pop_entry(unsigned long *p1,unsigned long *p2, unsigned long *id);
    448             // get msgtype of the first ele from the queue
    449             unsigned get_q_msg_type();
    450 
    451         };
    452 
    453         bool allocate_done(void);
    454         bool allocate_input_done(void);
    455         bool allocate_output_done(void);
    456 
    457         OMX_ERRORTYPE free_input_buffer(OMX_BUFFERHEADERTYPE *bufferHdr);
    458         OMX_ERRORTYPE free_output_buffer(OMX_BUFFERHEADERTYPE *bufferHdr);
    459 
    460         OMX_ERRORTYPE allocate_input_buffer(OMX_HANDLETYPE       hComp,
    461                 OMX_BUFFERHEADERTYPE **bufferHdr,
    462                 OMX_U32              port,
    463                 OMX_PTR              appData,
    464                 OMX_U32              bytes);
    465 #ifdef _ANDROID_ICS_
    466         OMX_ERRORTYPE allocate_input_meta_buffer(OMX_HANDLETYPE       hComp,
    467                 OMX_BUFFERHEADERTYPE **bufferHdr,
    468                 OMX_PTR              appData,
    469                 OMX_U32              bytes);
    470 #endif
    471         OMX_ERRORTYPE allocate_output_buffer(OMX_HANDLETYPE       hComp,
    472                 OMX_BUFFERHEADERTYPE **bufferHdr,
    473                 OMX_U32 port,OMX_PTR appData,
    474                 OMX_U32              bytes);
    475 
    476         OMX_ERRORTYPE use_input_buffer(OMX_HANDLETYPE hComp,
    477                 OMX_BUFFERHEADERTYPE  **bufferHdr,
    478                 OMX_U32               port,
    479                 OMX_PTR               appData,
    480                 OMX_U32               bytes,
    481                 OMX_U8                *buffer);
    482 
    483         OMX_ERRORTYPE use_output_buffer(OMX_HANDLETYPE hComp,
    484                 OMX_BUFFERHEADERTYPE   **bufferHdr,
    485                 OMX_U32                port,
    486                 OMX_PTR                appData,
    487                 OMX_U32                bytes,
    488                 OMX_U8                 *buffer);
    489 
    490         bool execute_omx_flush(OMX_U32);
    491         bool execute_output_flush(void);
    492         bool execute_input_flush(void);
    493 #ifdef _MSM8974_
    494         bool execute_flush_all(void);
    495 #endif
    496         OMX_ERRORTYPE empty_buffer_done(OMX_HANDLETYPE hComp,
    497                 OMX_BUFFERHEADERTYPE * buffer);
    498 
    499         OMX_ERRORTYPE fill_buffer_done(OMX_HANDLETYPE hComp,
    500                 OMX_BUFFERHEADERTYPE * buffer);
    501         OMX_ERRORTYPE empty_this_buffer_proxy(OMX_HANDLETYPE hComp,
    502                 OMX_BUFFERHEADERTYPE *buffer);
    503         OMX_ERRORTYPE empty_this_buffer_opaque(OMX_HANDLETYPE hComp,
    504                 OMX_BUFFERHEADERTYPE *buffer);
    505         OMX_ERRORTYPE push_input_buffer(OMX_HANDLETYPE hComp);
    506         OMX_ERRORTYPE convert_queue_buffer(OMX_HANDLETYPE hComp,
    507                 struct pmem &Input_pmem_info,unsigned long &index);
    508         OMX_ERRORTYPE queue_meta_buffer(OMX_HANDLETYPE hComp,
    509                 struct pmem &Input_pmem_info);
    510         OMX_ERRORTYPE push_empty_eos_buffer(OMX_HANDLETYPE hComp,
    511                 OMX_BUFFERHEADERTYPE *buffer);
    512         OMX_ERRORTYPE fill_this_buffer_proxy(OMX_HANDLETYPE hComp,
    513                 OMX_BUFFERHEADERTYPE *buffer);
    514         bool release_done();
    515 
    516         bool release_output_done();
    517         bool release_input_done();
    518 
    519         OMX_ERRORTYPE send_command_proxy(OMX_HANDLETYPE  hComp,
    520                 OMX_COMMANDTYPE cmd,
    521                 OMX_U32         param1,
    522                 OMX_PTR         cmdData);
    523         bool post_event( unsigned long p1,
    524                 unsigned long p2,
    525                 unsigned long id
    526                    );
    527         OMX_ERRORTYPE get_supported_profile_level(OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType);
    528         inline void omx_report_error () {
    529             if (m_pCallbacks.EventHandler && !m_error_propogated) {
    530                 m_error_propogated = true;
    531                 DEBUG_PRINT_ERROR("ERROR: send OMX_ErrorHardware to Client");
    532                 m_pCallbacks.EventHandler(&m_cmp,m_app_data,
    533                         OMX_EventError,OMX_ErrorHardware,0,NULL);
    534             }
    535         }
    536 
    537         inline void omx_report_hw_overload ()
    538         {
    539             if (m_pCallbacks.EventHandler && !m_error_propogated) {
    540                 m_error_propogated = true;
    541                 DEBUG_PRINT_ERROR("ERROR: send OMX_ErrorInsufficientResources to Client");
    542                 m_pCallbacks.EventHandler(&m_cmp, m_app_data,
    543                         OMX_EventError, OMX_ErrorInsufficientResources, 0, NULL);
    544             }
    545         }
    546 
    547         inline void omx_report_unsupported_setting () {
    548             if (m_pCallbacks.EventHandler && !m_error_propogated) {
    549                 m_error_propogated = true;
    550                 m_pCallbacks.EventHandler(&m_cmp,m_app_data,
    551                         OMX_EventError,OMX_ErrorUnsupportedSetting,0,NULL);
    552             }
    553         }
    554 
    555         void complete_pending_buffer_done_cbs();
    556 
    557 #ifdef USE_ION
    558         int alloc_map_ion_memory(int size,
    559                                  struct ion_allocation_data *alloc_data,
    560                                  struct ion_fd_data *fd_data,int flag);
    561         void free_ion_memory(struct venc_ion *buf_ion_info);
    562 #endif
    563 
    564         //*************************************************************
    565         //*******************MEMBER VARIABLES *************************
    566         //*************************************************************
    567 
    568         pthread_mutex_t       m_lock;
    569         sem_t                 m_cmd_lock;
    570         bool              m_error_propogated;
    571 
    572         //sem to handle the minimum procesing of commands
    573 
    574 
    575         // compression format
    576         //OMX_VIDEO_CODINGTYPE eCompressionFormat;
    577         // OMX State
    578         OMX_STATETYPE m_state;
    579         // Application data
    580         OMX_PTR m_app_data;
    581         OMX_BOOL m_use_input_pmem;
    582         OMX_BOOL m_use_output_pmem;
    583         // Application callbacks
    584         OMX_CALLBACKTYPE m_pCallbacks;
    585         OMX_PORT_PARAM_TYPE m_sPortParam;
    586         OMX_VIDEO_PARAM_PROFILELEVELTYPE m_sParamProfileLevel;
    587         OMX_VIDEO_PARAM_PORTFORMATTYPE m_sInPortFormat;
    588         OMX_VIDEO_PARAM_PORTFORMATTYPE m_sOutPortFormat;
    589         OMX_PARAM_PORTDEFINITIONTYPE m_sInPortDef;
    590         OMX_PARAM_PORTDEFINITIONTYPE m_sOutPortDef;
    591         OMX_VIDEO_PARAM_MPEG4TYPE m_sParamMPEG4;
    592         OMX_VIDEO_PARAM_H263TYPE m_sParamH263;
    593         OMX_VIDEO_PARAM_AVCTYPE m_sParamAVC;
    594         OMX_VIDEO_PARAM_VP8TYPE m_sParamVP8;
    595         OMX_VIDEO_PARAM_HEVCTYPE m_sParamHEVC;
    596         OMX_PORT_PARAM_TYPE m_sPortParam_img;
    597         OMX_PORT_PARAM_TYPE m_sPortParam_audio;
    598         OMX_VIDEO_CONFIG_BITRATETYPE m_sConfigBitrate;
    599         OMX_CONFIG_FRAMERATETYPE m_sConfigFramerate;
    600         OMX_VIDEO_PARAM_BITRATETYPE m_sParamBitrate;
    601         OMX_PRIORITYMGMTTYPE m_sPriorityMgmt;
    602         OMX_PARAM_BUFFERSUPPLIERTYPE m_sInBufSupplier;
    603         OMX_PARAM_BUFFERSUPPLIERTYPE m_sOutBufSupplier;
    604         OMX_CONFIG_ROTATIONTYPE m_sConfigFrameRotation;
    605         OMX_CONFIG_INTRAREFRESHVOPTYPE m_sConfigIntraRefreshVOP;
    606         OMX_VIDEO_PARAM_QUANTIZATIONTYPE m_sSessionQuantization;
    607         OMX_QCOM_VIDEO_PARAM_QPRANGETYPE m_sSessionQPRange;
    608         OMX_VIDEO_PARAM_AVCSLICEFMO m_sAVCSliceFMO;
    609         QOMX_VIDEO_INTRAPERIODTYPE m_sIntraperiod;
    610         OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE m_sErrorCorrection;
    611         OMX_VIDEO_PARAM_INTRAREFRESHTYPE m_sIntraRefresh;
    612         QOMX_VIDEO_PARAM_LTRMODE_TYPE m_sParamLTRMode;
    613         QOMX_VIDEO_PARAM_LTRCOUNT_TYPE m_sParamLTRCount;
    614         QOMX_VIDEO_CONFIG_LTRPERIOD_TYPE m_sConfigLTRPeriod;
    615         QOMX_VIDEO_CONFIG_LTRUSE_TYPE m_sConfigLTRUse;
    616         OMX_VIDEO_CONFIG_AVCINTRAPERIOD m_sConfigAVCIDRPeriod;
    617         OMX_VIDEO_CONFIG_DEINTERLACE m_sConfigDeinterlace;
    618         OMX_VIDEO_VP8REFERENCEFRAMETYPE m_sConfigVp8ReferenceFrame;
    619         QOMX_VIDEO_HIERARCHICALLAYERS m_sHierLayers;
    620         QOMX_EXTNINDEX_VIDEO_INITIALQP m_sParamInitqp;
    621         OMX_VIDEO_PARAM_ANDROID_TEMPORALLAYERINGTYPE m_sParamTemporalLayers;
    622         OMX_VIDEO_CONFIG_ANDROID_TEMPORALLAYERINGTYPE m_sConfigTemporalLayers;
    623         OMX_U32 m_sExtraData;
    624         OMX_U32 m_input_msg_id;
    625         OMX_VIDEO_CONFIG_ANDROID_INTRAREFRESHTYPE m_sConfigIntraRefresh;
    626 
    627         // fill this buffer queue
    628         omx_cmd_queue m_ftb_q;
    629         // Command Q for rest of the events
    630         omx_cmd_queue m_cmd_q;
    631         omx_cmd_queue m_etb_q;
    632         // Input memory pointer
    633         OMX_BUFFERHEADERTYPE *m_inp_mem_ptr;
    634         // Output memory pointer
    635         OMX_BUFFERHEADERTYPE *m_out_mem_ptr;
    636         omx_cmd_queue m_opq_meta_q;
    637         omx_cmd_queue m_opq_pmem_q;
    638         OMX_BUFFERHEADERTYPE meta_buffer_hdr[MAX_NUM_INPUT_BUFFERS];
    639 
    640         bool input_flush_progress;
    641         bool output_flush_progress;
    642         bool input_use_buffer;
    643         bool output_use_buffer;
    644         int pending_input_buffers;
    645         int pending_output_buffers;
    646 
    647         uint64_t m_out_bm_count;
    648         uint64_t m_inp_bm_count;
    649         uint64_t m_flags;
    650         uint64_t m_etb_count;
    651         uint64_t m_fbd_count;
    652 #ifdef _ANDROID_
    653         // Heap pointer to frame buffers
    654         sp<MemoryHeapBase>    m_heap_ptr;
    655 #endif //_ANDROID_
    656         // to know whether Event Port Settings change has been triggered or not.
    657         bool m_event_port_settings_sent;
    658         OMX_U8                m_cRole[OMX_MAX_STRINGNAME_SIZE];
    659         extra_data_handler extra_data_handle;
    660         bool hw_overload;
    661 
    662 };
    663 
    664 #endif // __OMX_VIDEO_BASE_H__
    665