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