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