Home | History | Annotate | Download | only in inc
      1 /*--------------------------------------------------------------------------
      2 Copyright (c) 2010-2014, The Linux Foundation. All rights reserved.
      3 
      4 Redistribution and use in source and binary forms, with or without
      5 modification, are permitted provided that the following conditions 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 #ifdef _ANDROID_ICS_
    145 #define MAX_NUM_INPUT_BUFFERS 64
    146 #endif
    147 void* message_thread(void *);
    148 
    149 // OMX video class
    150 class omx_video: public qc_omx_component
    151 {
    152     protected:
    153 #ifdef _ANDROID_ICS_
    154         bool meta_mode_enable;
    155         bool c2d_opened;
    156         encoder_media_buffer_type meta_buffers[MAX_NUM_INPUT_BUFFERS];
    157         OMX_BUFFERHEADERTYPE *opaque_buffer_hdr[MAX_NUM_INPUT_BUFFERS];
    158         bool get_syntaxhdr_enable;
    159         OMX_BUFFERHEADERTYPE  *psource_frame;
    160         OMX_BUFFERHEADERTYPE  *pdest_frame;
    161         bool secure_session;
    162         bool hier_b_enabled;
    163         //intermediate conversion buffer queued to encoder in case of invalid EOS input
    164         OMX_BUFFERHEADERTYPE  *mEmptyEosBuffer;
    165 
    166         class omx_c2d_conv
    167         {
    168             public:
    169                 omx_c2d_conv();
    170                 ~omx_c2d_conv();
    171                 bool init();
    172                 bool open(unsigned int height,unsigned int width,
    173                         ColorConvertFormat src,
    174                         ColorConvertFormat dest,unsigned int src_stride);
    175                 bool convert(int src_fd, void *src_base, void *src_viraddr,
    176                         int dest_fd, void *dest_base, void *dest_viraddr);
    177                 bool get_buffer_size(int port,unsigned int &buf_size);
    178                 int get_src_format();
    179                 void close();
    180             private:
    181                 C2DColorConverterBase *c2dcc;
    182                 pthread_mutex_t c_lock;
    183                 void *mLibHandle;
    184                 ColorConvertFormat src_format;
    185                 createC2DColorConverter_t *mConvertOpen;
    186                 destroyC2DColorConverter_t *mConvertClose;
    187         };
    188         omx_c2d_conv c2d_conv;
    189 #endif
    190     public:
    191 
    192         bool mUseProxyColorFormat;
    193         //RGB or non-native input, and we have pre-allocated conversion buffers
    194         bool mUsesColorConversion;
    195 
    196         omx_video();  // constructor
    197         virtual ~omx_video();  // destructor
    198 
    199         // virtual int async_message_process (void *context, void* message);
    200         void process_event_cb(void *ctxt,unsigned char id);
    201 
    202         OMX_ERRORTYPE allocate_buffer(
    203                 OMX_HANDLETYPE hComp,
    204                 OMX_BUFFERHEADERTYPE **bufferHdr,
    205                 OMX_U32 port,
    206                 OMX_PTR appData,
    207                 OMX_U32 bytes
    208                 );
    209 
    210 
    211         virtual OMX_ERRORTYPE component_deinit(OMX_HANDLETYPE hComp)= 0;
    212 
    213         virtual OMX_ERRORTYPE component_init(OMX_STRING role)= 0;
    214 
    215         virtual OMX_U32 dev_stop(void) = 0;
    216         virtual OMX_U32 dev_pause(void) = 0;
    217         virtual OMX_U32 dev_start(void) = 0;
    218         virtual OMX_U32 dev_flush(unsigned) = 0;
    219         virtual OMX_U32 dev_resume(void) = 0;
    220         virtual OMX_U32 dev_start_done(void) = 0;
    221         virtual OMX_U32 dev_set_message_thread_id(pthread_t) = 0;
    222         virtual bool dev_use_buf(void *,unsigned,unsigned) = 0;
    223         virtual bool dev_free_buf(void *,unsigned) = 0;
    224         virtual bool dev_empty_buf(void *, void *,unsigned,unsigned) = 0;
    225         virtual bool dev_fill_buf(void *buffer, void *,unsigned,unsigned) = 0;
    226         virtual bool dev_get_buf_req(OMX_U32 *,OMX_U32 *,OMX_U32 *,OMX_U32) = 0;
    227         virtual bool dev_get_seq_hdr(void *, unsigned, unsigned *) = 0;
    228         virtual bool dev_loaded_start(void) = 0;
    229         virtual bool dev_loaded_stop(void) = 0;
    230         virtual bool dev_loaded_start_done(void) = 0;
    231         virtual bool dev_loaded_stop_done(void) = 0;
    232         virtual bool is_secure_session(void) = 0;
    233 #ifdef _MSM8974_
    234         virtual int dev_handle_extradata(void*, int) = 0;
    235         virtual int dev_set_format(int) = 0;
    236 #endif
    237         virtual bool dev_is_video_session_supported(OMX_U32 width, OMX_U32 height) = 0;
    238         virtual bool dev_get_capability_ltrcount(OMX_U32 *, OMX_U32 *, OMX_U32 *) = 0;
    239         virtual bool dev_get_performance_level(OMX_U32 *) = 0;
    240         virtual bool dev_get_vui_timing_info(OMX_U32 *) = 0;
    241         virtual bool dev_get_peak_bitrate(OMX_U32 *) = 0;
    242 #ifdef _ANDROID_ICS_
    243         void omx_release_meta_buffer(OMX_BUFFERHEADERTYPE *buffer);
    244 #endif
    245         virtual bool dev_color_align(OMX_BUFFERHEADERTYPE *buffer, OMX_U32 width,
    246                         OMX_U32 height) = 0;
    247         virtual bool dev_get_output_log_flag() = 0;
    248         virtual int dev_output_log_buffers(const char *buffer_addr, int buffer_len) = 0;
    249         virtual int dev_extradata_log_buffers(char *buffer_addr) = 0;
    250         OMX_ERRORTYPE component_role_enum(
    251                 OMX_HANDLETYPE hComp,
    252                 OMX_U8 *role,
    253                 OMX_U32 index
    254                 );
    255 
    256         OMX_ERRORTYPE component_tunnel_request(
    257                 OMX_HANDLETYPE hComp,
    258                 OMX_U32 port,
    259                 OMX_HANDLETYPE  peerComponent,
    260                 OMX_U32 peerPort,
    261                 OMX_TUNNELSETUPTYPE *tunnelSetup
    262                 );
    263 
    264         OMX_ERRORTYPE empty_this_buffer(
    265                 OMX_HANDLETYPE hComp,
    266                 OMX_BUFFERHEADERTYPE *buffer
    267                 );
    268 
    269 
    270 
    271         OMX_ERRORTYPE fill_this_buffer(
    272                 OMX_HANDLETYPE hComp,
    273                 OMX_BUFFERHEADERTYPE *buffer
    274                 );
    275 
    276 
    277         OMX_ERRORTYPE free_buffer(
    278                 OMX_HANDLETYPE hComp,
    279                 OMX_U32 port,
    280                 OMX_BUFFERHEADERTYPE *buffer
    281                 );
    282 
    283         OMX_ERRORTYPE get_component_version(
    284                 OMX_HANDLETYPE hComp,
    285                 OMX_STRING componentName,
    286                 OMX_VERSIONTYPE *componentVersion,
    287                 OMX_VERSIONTYPE *specVersion,
    288                 OMX_UUIDTYPE *componentUUID
    289                 );
    290 
    291         OMX_ERRORTYPE get_config(
    292                 OMX_HANDLETYPE hComp,
    293                 OMX_INDEXTYPE configIndex,
    294                 OMX_PTR configData
    295                 );
    296 
    297         OMX_ERRORTYPE get_extension_index(
    298                 OMX_HANDLETYPE hComp,
    299                 OMX_STRING paramName,
    300                 OMX_INDEXTYPE *indexType
    301                 );
    302 
    303         OMX_ERRORTYPE get_parameter(OMX_HANDLETYPE hComp,
    304                 OMX_INDEXTYPE  paramIndex,
    305                 OMX_PTR        paramData);
    306 
    307         OMX_ERRORTYPE get_state(OMX_HANDLETYPE hComp,
    308                 OMX_STATETYPE *state);
    309 
    310 
    311 
    312         OMX_ERRORTYPE send_command(OMX_HANDLETYPE  hComp,
    313                 OMX_COMMANDTYPE cmd,
    314                 OMX_U32         param1,
    315                 OMX_PTR         cmdData);
    316 
    317 
    318         OMX_ERRORTYPE set_callbacks(OMX_HANDLETYPE   hComp,
    319                 OMX_CALLBACKTYPE *callbacks,
    320                 OMX_PTR          appData);
    321 
    322         virtual OMX_ERRORTYPE set_config(OMX_HANDLETYPE hComp,
    323                 OMX_INDEXTYPE  configIndex,
    324                 OMX_PTR        configData) = 0;
    325 
    326         virtual OMX_ERRORTYPE set_parameter(OMX_HANDLETYPE hComp,
    327                 OMX_INDEXTYPE  paramIndex,
    328                 OMX_PTR        paramData) =0;
    329 
    330         OMX_ERRORTYPE use_buffer(OMX_HANDLETYPE      hComp,
    331                 OMX_BUFFERHEADERTYPE **bufferHdr,
    332                 OMX_U32              port,
    333                 OMX_PTR              appData,
    334                 OMX_U32              bytes,
    335                 OMX_U8               *buffer);
    336 
    337 
    338         OMX_ERRORTYPE use_EGL_image(OMX_HANDLETYPE     hComp,
    339                 OMX_BUFFERHEADERTYPE **bufferHdr,
    340                 OMX_U32              port,
    341                 OMX_PTR              appData,
    342                 void *               eglImage);
    343 
    344 
    345 
    346         int  m_pipe_in;
    347         int  m_pipe_out;
    348 
    349         pthread_t msg_thread_id;
    350         pthread_t async_thread_id;
    351         bool async_thread_created;
    352         bool msg_thread_created;
    353 
    354         OMX_U8 m_nkind[128];
    355 
    356 
    357         //int *input_pmem_fd;
    358         //int *output_pmem_fd;
    359         struct pmem *m_pInput_pmem;
    360         struct pmem *m_pOutput_pmem;
    361 #ifdef USE_ION
    362         struct venc_ion *m_pInput_ion;
    363         struct venc_ion *m_pOutput_ion;
    364 #endif
    365 
    366 
    367 
    368     public:
    369         // Bit Positions
    370         enum flags_bit_positions {
    371             // Defer transition to IDLE
    372             OMX_COMPONENT_IDLE_PENDING            =0x1,
    373             // Defer transition to LOADING
    374             OMX_COMPONENT_LOADING_PENDING         =0x2,
    375             // First  Buffer Pending
    376             OMX_COMPONENT_FIRST_BUFFER_PENDING    =0x3,
    377             // Second Buffer Pending
    378             OMX_COMPONENT_SECOND_BUFFER_PENDING   =0x4,
    379             // Defer transition to Enable
    380             OMX_COMPONENT_INPUT_ENABLE_PENDING    =0x5,
    381             // Defer transition to Enable
    382             OMX_COMPONENT_OUTPUT_ENABLE_PENDING   =0x6,
    383             // Defer transition to Disable
    384             OMX_COMPONENT_INPUT_DISABLE_PENDING   =0x7,
    385             // Defer transition to Disable
    386             OMX_COMPONENT_OUTPUT_DISABLE_PENDING  =0x8,
    387             //defer flush notification
    388             OMX_COMPONENT_OUTPUT_FLUSH_PENDING    =0x9,
    389             OMX_COMPONENT_INPUT_FLUSH_PENDING    =0xA,
    390             OMX_COMPONENT_PAUSE_PENDING          =0xB,
    391             OMX_COMPONENT_EXECUTE_PENDING        =0xC,
    392             OMX_COMPONENT_LOADED_START_PENDING = 0xD,
    393             OMX_COMPONENT_LOADED_STOP_PENDING = 0xF,
    394 
    395         };
    396 
    397         // Deferred callback identifiers
    398         enum {
    399             //Event Callbacks from the venc component thread context
    400             OMX_COMPONENT_GENERATE_EVENT       = 0x1,
    401             //Buffer Done callbacks from the venc component thread context
    402             OMX_COMPONENT_GENERATE_BUFFER_DONE = 0x2,
    403             //Frame Done callbacks from the venc component thread context
    404             OMX_COMPONENT_GENERATE_FRAME_DONE  = 0x3,
    405             //Buffer Done callbacks from the venc component thread context
    406             OMX_COMPONENT_GENERATE_FTB         = 0x4,
    407             //Frame Done callbacks from the venc component thread context
    408             OMX_COMPONENT_GENERATE_ETB         = 0x5,
    409             //Command
    410             OMX_COMPONENT_GENERATE_COMMAND     = 0x6,
    411             //Push-Pending Buffers
    412             OMX_COMPONENT_PUSH_PENDING_BUFS    = 0x7,
    413             // Empty Buffer Done callbacks
    414             OMX_COMPONENT_GENERATE_EBD         = 0x8,
    415             //Flush Event Callbacks from the venc component thread context
    416             OMX_COMPONENT_GENERATE_EVENT_FLUSH       = 0x9,
    417             OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH = 0x0A,
    418             OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH = 0x0B,
    419             OMX_COMPONENT_GENERATE_FBD = 0xc,
    420             OMX_COMPONENT_GENERATE_START_DONE = 0xD,
    421             OMX_COMPONENT_GENERATE_PAUSE_DONE = 0xE,
    422             OMX_COMPONENT_GENERATE_RESUME_DONE = 0xF,
    423             OMX_COMPONENT_GENERATE_STOP_DONE = 0x10,
    424             OMX_COMPONENT_GENERATE_HARDWARE_ERROR = 0x11,
    425             OMX_COMPONENT_GENERATE_LTRUSE_FAILED = 0x12,
    426             OMX_COMPONENT_GENERATE_ETB_OPQ = 0x13
    427         };
    428 
    429         struct omx_event {
    430             unsigned long param1;
    431             unsigned long param2;
    432             unsigned long id;
    433         };
    434 
    435         struct omx_cmd_queue {
    436             omx_event m_q[OMX_CORE_CONTROL_CMDQ_SIZE];
    437             unsigned long m_read;
    438             unsigned long m_write;
    439             unsigned long m_size;
    440 
    441             omx_cmd_queue();
    442             ~omx_cmd_queue();
    443             bool insert_entry(unsigned long p1, unsigned long p2, unsigned long id);
    444             bool pop_entry(unsigned long *p1,unsigned long *p2, unsigned long *id);
    445             // get msgtype of the first ele from the queue
    446             unsigned get_q_msg_type();
    447 
    448         };
    449 
    450         bool allocate_done(void);
    451         bool allocate_input_done(void);
    452         bool allocate_output_done(void);
    453 
    454         OMX_ERRORTYPE free_input_buffer(OMX_BUFFERHEADERTYPE *bufferHdr);
    455         OMX_ERRORTYPE free_output_buffer(OMX_BUFFERHEADERTYPE *bufferHdr);
    456 
    457         OMX_ERRORTYPE allocate_input_buffer(OMX_HANDLETYPE       hComp,
    458                 OMX_BUFFERHEADERTYPE **bufferHdr,
    459                 OMX_U32              port,
    460                 OMX_PTR              appData,
    461                 OMX_U32              bytes);
    462 #ifdef _ANDROID_ICS_
    463         OMX_ERRORTYPE allocate_input_meta_buffer(OMX_HANDLETYPE       hComp,
    464                 OMX_BUFFERHEADERTYPE **bufferHdr,
    465                 OMX_PTR              appData,
    466                 OMX_U32              bytes);
    467 #endif
    468         OMX_ERRORTYPE allocate_output_buffer(OMX_HANDLETYPE       hComp,
    469                 OMX_BUFFERHEADERTYPE **bufferHdr,
    470                 OMX_U32 port,OMX_PTR appData,
    471                 OMX_U32              bytes);
    472 
    473         OMX_ERRORTYPE use_input_buffer(OMX_HANDLETYPE hComp,
    474                 OMX_BUFFERHEADERTYPE  **bufferHdr,
    475                 OMX_U32               port,
    476                 OMX_PTR               appData,
    477                 OMX_U32               bytes,
    478                 OMX_U8                *buffer);
    479 
    480         OMX_ERRORTYPE use_output_buffer(OMX_HANDLETYPE hComp,
    481                 OMX_BUFFERHEADERTYPE   **bufferHdr,
    482                 OMX_U32                port,
    483                 OMX_PTR                appData,
    484                 OMX_U32                bytes,
    485                 OMX_U8                 *buffer);
    486 
    487         bool execute_omx_flush(OMX_U32);
    488         bool execute_output_flush(void);
    489         bool execute_input_flush(void);
    490 #ifdef _MSM8974_
    491         bool execute_flush_all(void);
    492 #endif
    493         OMX_ERRORTYPE empty_buffer_done(OMX_HANDLETYPE hComp,
    494                 OMX_BUFFERHEADERTYPE * buffer);
    495 
    496         OMX_ERRORTYPE fill_buffer_done(OMX_HANDLETYPE hComp,
    497                 OMX_BUFFERHEADERTYPE * buffer);
    498         OMX_ERRORTYPE empty_this_buffer_proxy(OMX_HANDLETYPE hComp,
    499                 OMX_BUFFERHEADERTYPE *buffer);
    500         OMX_ERRORTYPE empty_this_buffer_opaque(OMX_HANDLETYPE hComp,
    501                 OMX_BUFFERHEADERTYPE *buffer);
    502         OMX_ERRORTYPE push_input_buffer(OMX_HANDLETYPE hComp);
    503         OMX_ERRORTYPE convert_queue_buffer(OMX_HANDLETYPE hComp,
    504                 struct pmem &Input_pmem_info,unsigned long &index);
    505         OMX_ERRORTYPE queue_meta_buffer(OMX_HANDLETYPE hComp,
    506                 struct pmem &Input_pmem_info);
    507         OMX_ERRORTYPE push_empty_eos_buffer(OMX_HANDLETYPE hComp,
    508                 OMX_BUFFERHEADERTYPE *buffer);
    509         OMX_ERRORTYPE fill_this_buffer_proxy(OMX_HANDLETYPE hComp,
    510                 OMX_BUFFERHEADERTYPE *buffer);
    511         bool release_done();
    512 
    513         bool release_output_done();
    514         bool release_input_done();
    515 
    516         OMX_ERRORTYPE send_command_proxy(OMX_HANDLETYPE  hComp,
    517                 OMX_COMMANDTYPE cmd,
    518                 OMX_U32         param1,
    519                 OMX_PTR         cmdData);
    520         bool post_event( unsigned long p1,
    521                 unsigned long p2,
    522                 unsigned long id
    523                    );
    524         OMX_ERRORTYPE get_supported_profile_level(OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType);
    525         inline void omx_report_error () {
    526             if (m_pCallbacks.EventHandler && !m_error_propogated) {
    527                 m_error_propogated = true;
    528                 DEBUG_PRINT_ERROR("ERROR: send OMX_ErrorHardware to Client");
    529                 m_pCallbacks.EventHandler(&m_cmp,m_app_data,
    530                         OMX_EventError,OMX_ErrorHardware,0,NULL);
    531             }
    532         }
    533 
    534         inline void omx_report_hw_overload ()
    535         {
    536             if (m_pCallbacks.EventHandler && !m_error_propogated) {
    537                 m_error_propogated = true;
    538                 DEBUG_PRINT_ERROR("ERROR: send OMX_ErrorInsufficientResources to Client");
    539                 m_pCallbacks.EventHandler(&m_cmp, m_app_data,
    540                         OMX_EventError, OMX_ErrorInsufficientResources, 0, NULL);
    541             }
    542         }
    543 
    544         inline void omx_report_unsupported_setting () {
    545             if (m_pCallbacks.EventHandler && !m_error_propogated) {
    546                 m_error_propogated = true;
    547                 m_pCallbacks.EventHandler(&m_cmp,m_app_data,
    548                         OMX_EventError,OMX_ErrorUnsupportedSetting,0,NULL);
    549             }
    550         }
    551 
    552         void complete_pending_buffer_done_cbs();
    553 
    554 #ifdef USE_ION
    555         int alloc_map_ion_memory(int size,
    556                                  struct ion_allocation_data *alloc_data,
    557                                  struct ion_fd_data *fd_data,int flag);
    558         void free_ion_memory(struct venc_ion *buf_ion_info);
    559 #endif
    560 
    561         //*************************************************************
    562         //*******************MEMBER VARIABLES *************************
    563         //*************************************************************
    564 
    565         pthread_mutex_t       m_lock;
    566         sem_t                 m_cmd_lock;
    567         bool              m_error_propogated;
    568 
    569         //sem to handle the minimum procesing of commands
    570 
    571 
    572         // compression format
    573         //OMX_VIDEO_CODINGTYPE eCompressionFormat;
    574         // OMX State
    575         OMX_STATETYPE m_state;
    576         // Application data
    577         OMX_PTR m_app_data;
    578         OMX_BOOL m_use_input_pmem;
    579         OMX_BOOL m_use_output_pmem;
    580         // Application callbacks
    581         OMX_CALLBACKTYPE m_pCallbacks;
    582         OMX_PORT_PARAM_TYPE m_sPortParam;
    583         OMX_VIDEO_PARAM_PROFILELEVELTYPE m_sParamProfileLevel;
    584         OMX_VIDEO_PARAM_PORTFORMATTYPE m_sInPortFormat;
    585         OMX_VIDEO_PARAM_PORTFORMATTYPE m_sOutPortFormat;
    586         OMX_PARAM_PORTDEFINITIONTYPE m_sInPortDef;
    587         OMX_PARAM_PORTDEFINITIONTYPE m_sOutPortDef;
    588         OMX_VIDEO_PARAM_MPEG4TYPE m_sParamMPEG4;
    589         OMX_VIDEO_PARAM_H263TYPE m_sParamH263;
    590         OMX_VIDEO_PARAM_AVCTYPE m_sParamAVC;
    591         OMX_VIDEO_PARAM_VP8TYPE m_sParamVP8;
    592         OMX_VIDEO_PARAM_HEVCTYPE m_sParamHEVC;
    593         OMX_PORT_PARAM_TYPE m_sPortParam_img;
    594         OMX_PORT_PARAM_TYPE m_sPortParam_audio;
    595         OMX_VIDEO_CONFIG_BITRATETYPE m_sConfigBitrate;
    596         OMX_CONFIG_FRAMERATETYPE m_sConfigFramerate;
    597         OMX_VIDEO_PARAM_BITRATETYPE m_sParamBitrate;
    598         OMX_PRIORITYMGMTTYPE m_sPriorityMgmt;
    599         OMX_PARAM_BUFFERSUPPLIERTYPE m_sInBufSupplier;
    600         OMX_PARAM_BUFFERSUPPLIERTYPE m_sOutBufSupplier;
    601         OMX_CONFIG_ROTATIONTYPE m_sConfigFrameRotation;
    602         OMX_CONFIG_INTRAREFRESHVOPTYPE m_sConfigIntraRefreshVOP;
    603         OMX_VIDEO_PARAM_QUANTIZATIONTYPE m_sSessionQuantization;
    604         OMX_QCOM_VIDEO_PARAM_QPRANGETYPE m_sSessionQPRange;
    605         OMX_VIDEO_PARAM_AVCSLICEFMO m_sAVCSliceFMO;
    606         QOMX_VIDEO_INTRAPERIODTYPE m_sIntraperiod;
    607         OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE m_sErrorCorrection;
    608         OMX_VIDEO_PARAM_INTRAREFRESHTYPE m_sIntraRefresh;
    609         QOMX_VIDEO_PARAM_LTRMODE_TYPE m_sParamLTRMode;
    610         QOMX_VIDEO_PARAM_LTRCOUNT_TYPE m_sParamLTRCount;
    611         QOMX_VIDEO_CONFIG_LTRPERIOD_TYPE m_sConfigLTRPeriod;
    612         QOMX_VIDEO_CONFIG_LTRUSE_TYPE m_sConfigLTRUse;
    613         OMX_VIDEO_CONFIG_AVCINTRAPERIOD m_sConfigAVCIDRPeriod;
    614         OMX_VIDEO_CONFIG_DEINTERLACE m_sConfigDeinterlace;
    615         OMX_VIDEO_VP8REFERENCEFRAMETYPE m_sConfigVp8ReferenceFrame;
    616         QOMX_VIDEO_HIERARCHICALLAYERS m_sHierLayers;
    617         QOMX_EXTNINDEX_VIDEO_INITIALQP m_sParamInitqp;
    618         OMX_U32 m_sExtraData;
    619         OMX_U32 m_input_msg_id;
    620 
    621         // fill this buffer queue
    622         omx_cmd_queue m_ftb_q;
    623         // Command Q for rest of the events
    624         omx_cmd_queue m_cmd_q;
    625         omx_cmd_queue m_etb_q;
    626         // Input memory pointer
    627         OMX_BUFFERHEADERTYPE *m_inp_mem_ptr;
    628         // Output memory pointer
    629         OMX_BUFFERHEADERTYPE *m_out_mem_ptr;
    630         omx_cmd_queue m_opq_meta_q;
    631         omx_cmd_queue m_opq_pmem_q;
    632         OMX_BUFFERHEADERTYPE meta_buffer_hdr[MAX_NUM_INPUT_BUFFERS];
    633 
    634         bool input_flush_progress;
    635         bool output_flush_progress;
    636         bool input_use_buffer;
    637         bool output_use_buffer;
    638         int pending_input_buffers;
    639         int pending_output_buffers;
    640 
    641         uint64_t m_out_bm_count;
    642         uint64_t m_inp_bm_count;
    643         uint64_t m_flags;
    644         uint64_t m_etb_count;
    645         uint64_t m_fbd_count;
    646 #ifdef _ANDROID_
    647         // Heap pointer to frame buffers
    648         sp<MemoryHeapBase>    m_heap_ptr;
    649 #endif //_ANDROID_
    650         // to know whether Event Port Settings change has been triggered or not.
    651         bool m_event_port_settings_sent;
    652         OMX_U8                m_cRole[OMX_MAX_STRINGNAME_SIZE];
    653         extra_data_handler extra_data_handle;
    654         bool hw_overload;
    655 
    656 };
    657 
    658 #endif // __OMX_VIDEO_BASE_H__
    659