Home | History | Annotate | Download | only in inc
      1 /*--------------------------------------------------------------------------
      2 Copyright (c) 2010-2017, 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 <media/hardware/HardwareAPI.h>
     59 #include "OMX_Core.h"
     60 #include "OMX_QCOMExtns.h"
     61 #include "OMX_Skype_VideoExtensions.h"
     62 #include "OMX_VideoExt.h"
     63 #include "OMX_IndexExt.h"
     64 #include "qc_omx_component.h"
     65 #include "omx_video_common.h"
     66 #include "extra_data_handler.h"
     67 #include <linux/videodev2.h>
     68 #include <dlfcn.h>
     69 #include "C2DColorConverter.h"
     70 #include "vidc_debug.h"
     71 #include <vector>
     72 #include "vidc_vendor_extensions.h"
     73 
     74 #ifdef _ANDROID_
     75 using namespace android;
     76 // local pmem heap object
     77 class VideoHeap : public MemoryHeapBase
     78 {
     79     public:
     80         VideoHeap(int fd, size_t size, void* base);
     81         virtual ~VideoHeap() {}
     82 };
     83 
     84 #include <utils/Log.h>
     85 
     86 #endif // _ANDROID_
     87 
     88 #ifdef USE_ION
     89 static const char* MEM_DEVICE = "/dev/ion";
     90 #if defined(MAX_RES_720P) && !defined(_MSM8974_)
     91 #define MEM_HEAP_ID ION_CAMERA_HEAP_ID
     92 #else
     93 #ifdef _MSM8974_
     94 #define MEM_HEAP_ID ION_IOMMU_HEAP_ID
     95 #else
     96 #define MEM_HEAP_ID ION_CP_MM_HEAP_ID
     97 #endif
     98 #endif
     99 #elif MAX_RES_720P
    100 static const char* MEM_DEVICE = "/dev/pmem_adsp";
    101 #elif MAX_RES_1080P_EBI
    102 static const char* MEM_DEVICE  = "/dev/pmem_adsp";
    103 #elif MAX_RES_1080P
    104 static const char* MEM_DEVICE = "/dev/pmem_smipool";
    105 #else
    106 #error MEM_DEVICE cannot be determined.
    107 #endif
    108 
    109 //////////////////////////////////////////////////////////////////////////////
    110 //                       Module specific globals
    111 //////////////////////////////////////////////////////////////////////////////
    112 
    113 #define OMX_SPEC_VERSION  0x00000101
    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_INDEX        64
    126 #define BITMASK_SIZE(mIndex) (((mIndex) + BITS_PER_INDEX - 1)/BITS_PER_INDEX)
    127 #define BITMASK_OFFSET(mIndex) ((mIndex)/BITS_PER_INDEX)
    128 #define BITMASK_FLAG(mIndex) ((uint64_t)1 << ((mIndex) % BITS_PER_INDEX))
    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 
    142 #define MAX_NUM_INPUT_BUFFERS 64
    143 #define MAX_NUM_OUTPUT_BUFFERS 64
    144 
    145 void* message_thread(void *);
    146 
    147 enum omx_venc_extradata_types {
    148     VENC_EXTRADATA_SLICEINFO = 0x100,
    149     VENC_EXTRADATA_MBINFO = 0x400,
    150     VENC_EXTRADATA_FRAMEDIMENSION = 0x1000000,
    151     VENC_EXTRADATA_YUV_STATS = 0x800,
    152     VENC_EXTRADATA_VQZIP = 0x02000000,
    153 };
    154 
    155 // OMX video class
    156 class omx_video: public qc_omx_component
    157 {
    158     protected:
    159 #ifdef _ANDROID_ICS_
    160         bool meta_mode_enable;
    161         bool c2d_opened;
    162         encoder_media_buffer_type meta_buffers[MAX_NUM_INPUT_BUFFERS];
    163         OMX_BUFFERHEADERTYPE *opaque_buffer_hdr[MAX_NUM_INPUT_BUFFERS];
    164         bool get_syntaxhdr_enable;
    165         OMX_BUFFERHEADERTYPE  *psource_frame;
    166         OMX_BUFFERHEADERTYPE  *pdest_frame;
    167         bool secure_session;
    168         bool hier_b_enabled;
    169         //intermediate conversion buffer queued to encoder in case of invalid EOS input
    170         OMX_BUFFERHEADERTYPE  *mEmptyEosBuffer;
    171 
    172         class omx_c2d_conv
    173         {
    174             public:
    175                 omx_c2d_conv();
    176                 ~omx_c2d_conv();
    177                 bool init();
    178                 bool open(unsigned int height,unsigned int width,
    179                         ColorConvertFormat src,
    180                         ColorConvertFormat dest,unsigned int src_stride);
    181                 bool convert(int src_fd, void *src_base, void *src_viraddr,
    182                         int dest_fd, void *dest_base, void *dest_viraddr);
    183                 bool get_buffer_size(int port,unsigned int &buf_size);
    184                 int get_src_format();
    185                 void close();
    186             private:
    187                 C2DColorConverterBase *c2dcc;
    188                 pthread_mutex_t c_lock;
    189                 void *mLibHandle;
    190                 ColorConvertFormat src_format;
    191                 createC2DColorConverter_t *mConvertOpen;
    192                 destroyC2DColorConverter_t *mConvertClose;
    193         };
    194         omx_c2d_conv c2d_conv;
    195 #endif
    196     public:
    197 
    198         bool mUseProxyColorFormat;
    199         //RGB or non-native input, and we have pre-allocated conversion buffers
    200         bool mUsesColorConversion;
    201 
    202         omx_video();  // constructor
    203         virtual ~omx_video();  // destructor
    204 
    205         // virtual int async_message_process (void *context, void* message);
    206         void process_event_cb(void *ctxt,unsigned char id);
    207 
    208         OMX_ERRORTYPE allocate_buffer(
    209                 OMX_HANDLETYPE hComp,
    210                 OMX_BUFFERHEADERTYPE **bufferHdr,
    211                 OMX_U32 port,
    212                 OMX_PTR appData,
    213                 OMX_U32 bytes
    214                 );
    215 
    216 
    217         virtual OMX_ERRORTYPE component_deinit(OMX_HANDLETYPE hComp)= 0;
    218 
    219         virtual OMX_ERRORTYPE component_init(OMX_STRING role)= 0;
    220 
    221         virtual OMX_U32 dev_stop(void) = 0;
    222         virtual OMX_U32 dev_pause(void) = 0;
    223         virtual OMX_U32 dev_start(void) = 0;
    224         virtual OMX_U32 dev_flush(unsigned) = 0;
    225         virtual OMX_U32 dev_resume(void) = 0;
    226         virtual OMX_U32 dev_start_done(void) = 0;
    227         virtual OMX_U32 dev_set_message_thread_id(pthread_t) = 0;
    228         virtual bool dev_use_buf(void *,unsigned,unsigned) = 0;
    229         virtual bool dev_free_buf(void *,unsigned) = 0;
    230         virtual bool dev_empty_buf(void *, void *,unsigned,unsigned) = 0;
    231         virtual bool dev_fill_buf(void *buffer, void *,unsigned,unsigned) = 0;
    232         virtual bool dev_get_buf_req(OMX_U32 *,OMX_U32 *,OMX_U32 *,OMX_U32) = 0;
    233         virtual bool dev_get_seq_hdr(void *, unsigned, unsigned *) = 0;
    234         virtual bool dev_loaded_start(void) = 0;
    235         virtual bool dev_loaded_stop(void) = 0;
    236         virtual bool dev_loaded_start_done(void) = 0;
    237         virtual bool dev_loaded_stop_done(void) = 0;
    238         virtual bool is_secure_session(void) = 0;
    239         virtual int dev_handle_output_extradata(void*) = 0;
    240         virtual int dev_handle_input_extradata(void*, int) = 0;
    241         virtual void dev_set_extradata_cookie(void*) = 0;
    242         virtual int dev_set_format(int) = 0;
    243         virtual bool dev_is_video_session_supported(OMX_U32 width, OMX_U32 height) = 0;
    244         virtual bool dev_get_capability_ltrcount(OMX_U32 *, OMX_U32 *, OMX_U32 *) = 0;
    245         virtual bool dev_get_performance_level(OMX_U32 *) = 0;
    246         virtual bool dev_get_vui_timing_info(OMX_U32 *) = 0;
    247         virtual bool dev_get_vqzip_sei_info(OMX_U32 *) = 0;
    248         virtual bool dev_get_peak_bitrate(OMX_U32 *) = 0;
    249         virtual bool dev_get_batch_size(OMX_U32 *) = 0;
    250         virtual bool dev_get_temporal_layer_caps(OMX_U32 * /*nMaxLayers*/,
    251                 OMX_U32 * /*nMaxBLayers*/) = 0;
    252 #ifdef _ANDROID_ICS_
    253         void omx_release_meta_buffer(OMX_BUFFERHEADERTYPE *buffer);
    254 #endif
    255         virtual bool dev_color_align(OMX_BUFFERHEADERTYPE *buffer, OMX_U32 width,
    256                         OMX_U32 height) = 0;
    257         virtual bool dev_get_output_log_flag() = 0;
    258         virtual int dev_output_log_buffers(const char *buffer_addr, int buffer_len) = 0;
    259         virtual int dev_extradata_log_buffers(char *buffer_addr) = 0;
    260         OMX_ERRORTYPE component_role_enum(
    261                 OMX_HANDLETYPE hComp,
    262                 OMX_U8 *role,
    263                 OMX_U32 index
    264                 );
    265 
    266         OMX_ERRORTYPE component_tunnel_request(
    267                 OMX_HANDLETYPE hComp,
    268                 OMX_U32 port,
    269                 OMX_HANDLETYPE  peerComponent,
    270                 OMX_U32 peerPort,
    271                 OMX_TUNNELSETUPTYPE *tunnelSetup
    272                 );
    273 
    274         OMX_ERRORTYPE empty_this_buffer(
    275                 OMX_HANDLETYPE hComp,
    276                 OMX_BUFFERHEADERTYPE *buffer
    277                 );
    278 
    279 
    280 
    281         OMX_ERRORTYPE fill_this_buffer(
    282                 OMX_HANDLETYPE hComp,
    283                 OMX_BUFFERHEADERTYPE *buffer
    284                 );
    285 
    286 
    287         OMX_ERRORTYPE free_buffer(
    288                 OMX_HANDLETYPE hComp,
    289                 OMX_U32 port,
    290                 OMX_BUFFERHEADERTYPE *buffer
    291                 );
    292 
    293         OMX_ERRORTYPE get_component_version(
    294                 OMX_HANDLETYPE hComp,
    295                 OMX_STRING componentName,
    296                 OMX_VERSIONTYPE *componentVersion,
    297                 OMX_VERSIONTYPE *specVersion,
    298                 OMX_UUIDTYPE *componentUUID
    299                 );
    300 
    301         OMX_ERRORTYPE get_config(
    302                 OMX_HANDLETYPE hComp,
    303                 OMX_INDEXTYPE configIndex,
    304                 OMX_PTR configData
    305                 );
    306 
    307         OMX_ERRORTYPE get_extension_index(
    308                 OMX_HANDLETYPE hComp,
    309                 OMX_STRING paramName,
    310                 OMX_INDEXTYPE *indexType
    311                 );
    312 
    313         OMX_ERRORTYPE get_parameter(OMX_HANDLETYPE hComp,
    314                 OMX_INDEXTYPE  paramIndex,
    315                 OMX_PTR        paramData);
    316 
    317         OMX_ERRORTYPE get_state(OMX_HANDLETYPE hComp,
    318                 OMX_STATETYPE *state);
    319 
    320 
    321 
    322         OMX_ERRORTYPE send_command(OMX_HANDLETYPE  hComp,
    323                 OMX_COMMANDTYPE cmd,
    324                 OMX_U32         param1,
    325                 OMX_PTR         cmdData);
    326 
    327 
    328         OMX_ERRORTYPE set_callbacks(OMX_HANDLETYPE   hComp,
    329                 OMX_CALLBACKTYPE *callbacks,
    330                 OMX_PTR          appData);
    331 
    332         virtual OMX_ERRORTYPE set_config(OMX_HANDLETYPE hComp,
    333                 OMX_INDEXTYPE  configIndex,
    334                 OMX_PTR        configData) = 0;
    335 
    336         virtual OMX_ERRORTYPE set_parameter(OMX_HANDLETYPE hComp,
    337                 OMX_INDEXTYPE  paramIndex,
    338                 OMX_PTR        paramData) =0;
    339 
    340         OMX_ERRORTYPE use_buffer(OMX_HANDLETYPE      hComp,
    341                 OMX_BUFFERHEADERTYPE **bufferHdr,
    342                 OMX_U32              port,
    343                 OMX_PTR              appData,
    344                 OMX_U32              bytes,
    345                 OMX_U8               *buffer);
    346 
    347 
    348         OMX_ERRORTYPE use_EGL_image(OMX_HANDLETYPE     hComp,
    349                 OMX_BUFFERHEADERTYPE **bufferHdr,
    350                 OMX_U32              port,
    351                 OMX_PTR              appData,
    352                 void *               eglImage);
    353 
    354 
    355 
    356         int  m_pipe_in;
    357         int  m_pipe_out;
    358 
    359         pthread_t msg_thread_id;
    360         pthread_t async_thread_id;
    361         bool async_thread_created;
    362         bool msg_thread_created;
    363         volatile bool msg_thread_stop;
    364 
    365         OMX_U8 m_nkind[128];
    366 
    367 
    368         //int *input_pmem_fd;
    369         //int *output_pmem_fd;
    370         struct pmem *m_pInput_pmem;
    371         struct pmem *m_pOutput_pmem;
    372 #ifdef USE_ION
    373         struct venc_ion *m_pInput_ion;
    374         struct venc_ion *m_pOutput_ion;
    375 #endif
    376 
    377 
    378 
    379     public:
    380         // Bit Positions
    381         enum flags_bit_positions {
    382             // Defer transition to IDLE
    383             OMX_COMPONENT_IDLE_PENDING            =0x1,
    384             // Defer transition to LOADING
    385             OMX_COMPONENT_LOADING_PENDING         =0x2,
    386             // First  Buffer Pending
    387             OMX_COMPONENT_FIRST_BUFFER_PENDING    =0x3,
    388             // Second Buffer Pending
    389             OMX_COMPONENT_SECOND_BUFFER_PENDING   =0x4,
    390             // Defer transition to Enable
    391             OMX_COMPONENT_INPUT_ENABLE_PENDING    =0x5,
    392             // Defer transition to Enable
    393             OMX_COMPONENT_OUTPUT_ENABLE_PENDING   =0x6,
    394             // Defer transition to Disable
    395             OMX_COMPONENT_INPUT_DISABLE_PENDING   =0x7,
    396             // Defer transition to Disable
    397             OMX_COMPONENT_OUTPUT_DISABLE_PENDING  =0x8,
    398             //defer flush notification
    399             OMX_COMPONENT_OUTPUT_FLUSH_PENDING    =0x9,
    400             OMX_COMPONENT_INPUT_FLUSH_PENDING    =0xA,
    401             OMX_COMPONENT_PAUSE_PENDING          =0xB,
    402             OMX_COMPONENT_EXECUTE_PENDING        =0xC,
    403             OMX_COMPONENT_LOADED_START_PENDING = 0xD,
    404             OMX_COMPONENT_LOADED_STOP_PENDING = 0xF,
    405 
    406         };
    407 
    408         // Deferred callback identifiers
    409         enum {
    410             //Event Callbacks from the venc component thread context
    411             OMX_COMPONENT_GENERATE_EVENT       = 0x1,
    412             //Buffer Done callbacks from the venc component thread context
    413             OMX_COMPONENT_GENERATE_BUFFER_DONE = 0x2,
    414             //Frame Done callbacks from the venc component thread context
    415             OMX_COMPONENT_GENERATE_FRAME_DONE  = 0x3,
    416             //Buffer Done callbacks from the venc component thread context
    417             OMX_COMPONENT_GENERATE_FTB         = 0x4,
    418             //Frame Done callbacks from the venc component thread context
    419             OMX_COMPONENT_GENERATE_ETB         = 0x5,
    420             //Command
    421             OMX_COMPONENT_GENERATE_COMMAND     = 0x6,
    422             //Push-Pending Buffers
    423             OMX_COMPONENT_PUSH_PENDING_BUFS    = 0x7,
    424             // Empty Buffer Done callbacks
    425             OMX_COMPONENT_GENERATE_EBD         = 0x8,
    426             //Flush Event Callbacks from the venc component thread context
    427             OMX_COMPONENT_GENERATE_EVENT_FLUSH       = 0x9,
    428             OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH = 0x0A,
    429             OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH = 0x0B,
    430             OMX_COMPONENT_GENERATE_FBD = 0xc,
    431             OMX_COMPONENT_GENERATE_START_DONE = 0xD,
    432             OMX_COMPONENT_GENERATE_PAUSE_DONE = 0xE,
    433             OMX_COMPONENT_GENERATE_RESUME_DONE = 0xF,
    434             OMX_COMPONENT_GENERATE_STOP_DONE = 0x10,
    435             OMX_COMPONENT_GENERATE_HARDWARE_ERROR = 0x11,
    436             OMX_COMPONENT_GENERATE_LTRUSE_FAILED = 0x12,
    437             OMX_COMPONENT_GENERATE_ETB_OPQ = 0x13,
    438             OMX_COMPONENT_GENERATE_UNSUPPORTED_SETTING = 0x14,
    439             OMX_COMPONENT_GENERATE_HARDWARE_OVERLOAD = 0x15,
    440             OMX_COMPONENT_CLOSE_MSG = 0x16
    441         };
    442 
    443         struct omx_event {
    444             unsigned long param1;
    445             unsigned long param2;
    446             unsigned long id;
    447         };
    448 
    449         struct omx_cmd_queue {
    450             omx_event m_q[OMX_CORE_CONTROL_CMDQ_SIZE];
    451             unsigned long m_read;
    452             unsigned long m_write;
    453             unsigned long m_size;
    454 
    455             omx_cmd_queue();
    456             ~omx_cmd_queue();
    457             bool insert_entry(unsigned long p1, unsigned long p2, unsigned long id);
    458             bool pop_entry(unsigned long *p1,unsigned long *p2, unsigned long *id);
    459             // get msgtype of the first ele from the queue
    460             unsigned get_q_msg_type();
    461 
    462         };
    463 
    464         bool allocate_done(void);
    465         bool allocate_input_done(void);
    466         bool allocate_output_done(void);
    467 
    468         OMX_ERRORTYPE free_input_buffer(OMX_BUFFERHEADERTYPE *bufferHdr);
    469         OMX_ERRORTYPE free_output_buffer(OMX_BUFFERHEADERTYPE *bufferHdr);
    470 
    471         OMX_ERRORTYPE allocate_input_buffer(OMX_HANDLETYPE       hComp,
    472                 OMX_BUFFERHEADERTYPE **bufferHdr,
    473                 OMX_U32              port,
    474                 OMX_PTR              appData,
    475                 OMX_U32              bytes);
    476 #ifdef _ANDROID_ICS_
    477         OMX_ERRORTYPE allocate_input_meta_buffer(OMX_HANDLETYPE       hComp,
    478                 OMX_BUFFERHEADERTYPE **bufferHdr,
    479                 OMX_PTR              appData,
    480                 OMX_U32              bytes);
    481 #endif
    482         OMX_ERRORTYPE allocate_output_buffer(OMX_HANDLETYPE       hComp,
    483                 OMX_BUFFERHEADERTYPE **bufferHdr,
    484                 OMX_U32 port,OMX_PTR appData,
    485                 OMX_U32              bytes);
    486 
    487         OMX_ERRORTYPE use_input_buffer(OMX_HANDLETYPE hComp,
    488                 OMX_BUFFERHEADERTYPE  **bufferHdr,
    489                 OMX_U32               port,
    490                 OMX_PTR               appData,
    491                 OMX_U32               bytes,
    492                 OMX_U8                *buffer);
    493 
    494         OMX_ERRORTYPE use_output_buffer(OMX_HANDLETYPE hComp,
    495                 OMX_BUFFERHEADERTYPE   **bufferHdr,
    496                 OMX_U32                port,
    497                 OMX_PTR                appData,
    498                 OMX_U32                bytes,
    499                 OMX_U8                 *buffer);
    500 
    501         bool execute_omx_flush(OMX_U32);
    502         bool execute_output_flush(void);
    503         bool execute_input_flush(void);
    504 #ifdef _MSM8974_
    505         bool execute_flush_all(void);
    506 #endif
    507         OMX_ERRORTYPE empty_buffer_done(OMX_HANDLETYPE hComp,
    508                 OMX_BUFFERHEADERTYPE * buffer);
    509 
    510         OMX_ERRORTYPE fill_buffer_done(OMX_HANDLETYPE hComp,
    511                 OMX_BUFFERHEADERTYPE * buffer);
    512         OMX_ERRORTYPE empty_this_buffer_proxy(OMX_HANDLETYPE hComp,
    513                 OMX_BUFFERHEADERTYPE *buffer);
    514         OMX_ERRORTYPE empty_this_buffer_opaque(OMX_HANDLETYPE hComp,
    515                 OMX_BUFFERHEADERTYPE *buffer);
    516         OMX_ERRORTYPE push_input_buffer(OMX_HANDLETYPE hComp);
    517         OMX_ERRORTYPE convert_queue_buffer(OMX_HANDLETYPE hComp,
    518                 struct pmem &Input_pmem_info,unsigned long &index);
    519         OMX_ERRORTYPE queue_meta_buffer(OMX_HANDLETYPE hComp,
    520                 struct pmem &Input_pmem_info);
    521         OMX_ERRORTYPE push_empty_eos_buffer(OMX_HANDLETYPE hComp,
    522                 OMX_BUFFERHEADERTYPE *buffer);
    523         OMX_ERRORTYPE fill_this_buffer_proxy(OMX_HANDLETYPE hComp,
    524                 OMX_BUFFERHEADERTYPE *buffer);
    525         bool release_done();
    526 
    527         bool release_output_done();
    528         bool release_input_done();
    529 
    530         OMX_ERRORTYPE send_command_proxy(OMX_HANDLETYPE  hComp,
    531                 OMX_COMMANDTYPE cmd,
    532                 OMX_U32         param1,
    533                 OMX_PTR         cmdData);
    534         bool post_event( unsigned long p1,
    535                 unsigned long p2,
    536                 unsigned long id
    537                    );
    538         OMX_ERRORTYPE get_supported_profile_level(OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType);
    539         inline void omx_report_error () {
    540             if (m_pCallbacks.EventHandler && !m_error_propogated && m_state != OMX_StateLoaded) {
    541                 m_error_propogated = true;
    542                 DEBUG_PRINT_ERROR("ERROR: send OMX_ErrorHardware to Client");
    543                 m_pCallbacks.EventHandler(&m_cmp,m_app_data,
    544                         OMX_EventError,OMX_ErrorHardware,0,NULL);
    545             }
    546         }
    547 
    548         inline void omx_report_hw_overload ()
    549         {
    550             if (m_pCallbacks.EventHandler && !m_error_propogated && m_state != OMX_StateLoaded) {
    551                 m_error_propogated = true;
    552                 DEBUG_PRINT_ERROR("ERROR: send OMX_ErrorInsufficientResources to Client");
    553                 m_pCallbacks.EventHandler(&m_cmp, m_app_data,
    554                         OMX_EventError, OMX_ErrorInsufficientResources, 0, NULL);
    555             }
    556         }
    557 
    558         inline void omx_report_unsupported_setting () {
    559             if (m_pCallbacks.EventHandler && !m_error_propogated && m_state != OMX_StateLoaded) {
    560                 m_error_propogated = true;
    561                 m_pCallbacks.EventHandler(&m_cmp,m_app_data,
    562                         OMX_EventError,OMX_ErrorUnsupportedSetting,0,NULL);
    563             }
    564         }
    565 
    566         void complete_pending_buffer_done_cbs();
    567         bool is_conv_needed(int, int);
    568         void print_debug_color_aspects(ColorAspects *aspects, const char *prefix);
    569 
    570         OMX_ERRORTYPE get_vendor_extension_config(
    571                 OMX_CONFIG_ANDROID_VENDOR_EXTENSIONTYPE *ext);
    572         OMX_ERRORTYPE set_vendor_extension_config(
    573                 OMX_CONFIG_ANDROID_VENDOR_EXTENSIONTYPE *ext);
    574         void init_vendor_extensions(VendorExtensionStore&);
    575         // Extensions-store is immutable after initialization (i.e cannot add/remove/change
    576         //  extensions once added !)
    577         const VendorExtensionStore mVendorExtensionStore;
    578 
    579 #ifdef USE_ION
    580         int alloc_map_ion_memory(int size,
    581                                  struct ion_allocation_data *alloc_data,
    582                                  struct ion_fd_data *fd_data,int flag);
    583         void free_ion_memory(struct venc_ion *buf_ion_info);
    584 #endif
    585 
    586         //*************************************************************
    587         //*******************MEMBER VARIABLES *************************
    588         //*************************************************************
    589 
    590         pthread_mutex_t       m_lock;
    591         sem_t                 m_cmd_lock;
    592         bool              m_error_propogated;
    593 
    594         //sem to handle the minimum procesing of commands
    595 
    596 
    597         // compression format
    598         //OMX_VIDEO_CODINGTYPE eCompressionFormat;
    599         // OMX State
    600         OMX_STATETYPE m_state;
    601         // Application data
    602         OMX_PTR m_app_data;
    603         OMX_BOOL m_use_input_pmem;
    604         OMX_BOOL m_use_output_pmem;
    605         // Application callbacks
    606         OMX_CALLBACKTYPE m_pCallbacks;
    607         OMX_PORT_PARAM_TYPE m_sPortParam;
    608         OMX_VIDEO_PARAM_PROFILELEVELTYPE m_sParamProfileLevel;
    609         OMX_VIDEO_PARAM_PORTFORMATTYPE m_sInPortFormat;
    610         OMX_VIDEO_PARAM_PORTFORMATTYPE m_sOutPortFormat;
    611         OMX_PARAM_PORTDEFINITIONTYPE m_sInPortDef;
    612         OMX_PARAM_PORTDEFINITIONTYPE m_sOutPortDef;
    613         OMX_VIDEO_PARAM_MPEG4TYPE m_sParamMPEG4;
    614         OMX_VIDEO_PARAM_H263TYPE m_sParamH263;
    615         OMX_VIDEO_PARAM_AVCTYPE m_sParamAVC;
    616         OMX_VIDEO_PARAM_VP8TYPE m_sParamVP8;
    617         OMX_VIDEO_PARAM_HEVCTYPE m_sParamHEVC;
    618         OMX_PORT_PARAM_TYPE m_sPortParam_img;
    619         OMX_PORT_PARAM_TYPE m_sPortParam_audio;
    620         OMX_VIDEO_CONFIG_BITRATETYPE m_sConfigBitrate;
    621         OMX_CONFIG_FRAMERATETYPE m_sConfigFramerate;
    622         OMX_VIDEO_PARAM_BITRATETYPE m_sParamBitrate;
    623         OMX_PRIORITYMGMTTYPE m_sPriorityMgmt;
    624         OMX_PARAM_BUFFERSUPPLIERTYPE m_sInBufSupplier;
    625         OMX_PARAM_BUFFERSUPPLIERTYPE m_sOutBufSupplier;
    626         OMX_CONFIG_ROTATIONTYPE m_sConfigFrameRotation;
    627         OMX_CONFIG_INTRAREFRESHVOPTYPE m_sConfigIntraRefreshVOP;
    628         OMX_VIDEO_PARAM_QUANTIZATIONTYPE m_sSessionQuantization;
    629         OMX_QCOM_VIDEO_PARAM_QPRANGETYPE m_sSessionQPRange;
    630         OMX_VIDEO_PARAM_AVCSLICEFMO m_sAVCSliceFMO;
    631         QOMX_VIDEO_INTRAPERIODTYPE m_sIntraperiod;
    632         OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE m_sErrorCorrection;
    633         OMX_VIDEO_PARAM_INTRAREFRESHTYPE m_sIntraRefresh;
    634         QOMX_VIDEO_PARAM_LTRMODE_TYPE m_sParamLTRMode;
    635         QOMX_VIDEO_PARAM_LTRCOUNT_TYPE m_sParamLTRCount;
    636         QOMX_VIDEO_CONFIG_LTRPERIOD_TYPE m_sConfigLTRPeriod;
    637         QOMX_VIDEO_CONFIG_LTRUSE_TYPE m_sConfigLTRUse;
    638         OMX_VIDEO_CONFIG_AVCINTRAPERIOD m_sConfigAVCIDRPeriod;
    639         OMX_VIDEO_CONFIG_DEINTERLACE m_sConfigDeinterlace;
    640         OMX_VIDEO_VP8REFERENCEFRAMETYPE m_sConfigVp8ReferenceFrame;
    641         QOMX_VIDEO_HIERARCHICALLAYERS m_sHierLayers;
    642         OMX_QOMX_VIDEO_MBI_STATISTICS m_sMBIStatistics;
    643         QOMX_EXTNINDEX_VIDEO_INITIALQP m_sParamInitqp;
    644         QOMX_EXTNINDEX_VIDEO_HIER_P_LAYERS m_sHPlayers;
    645         OMX_SKYPE_VIDEO_CONFIG_BASELAYERPID m_sBaseLayerID;
    646         OMX_SKYPE_VIDEO_PARAM_DRIVERVER m_sDriverVer;
    647         OMX_SKYPE_VIDEO_CONFIG_QP m_sConfigQP;
    648         QOMX_EXTNINDEX_VIDEO_VENC_SAR m_sSar;
    649         PrependSPSPPSToIDRFramesParams m_sPrependSPSPPS;
    650         OMX_U32 m_sExtraData;
    651         OMX_U32 m_input_msg_id;
    652         OMX_VIDEO_CONFIG_ANDROID_INTRAREFRESHTYPE m_sConfigIntraRefresh;
    653         OMX_VIDEO_PARAM_ANDROID_TEMPORALLAYERINGTYPE m_sParamTemporalLayers;
    654         OMX_VIDEO_CONFIG_ANDROID_TEMPORALLAYERINGTYPE m_sConfigTemporalLayers;
    655         DescribeColorAspectsParams m_sConfigColorAspects;
    656         QOMX_ENABLETYPE m_sParamAVTimerTimestampMode;   // use VT-timestamps in gralloc-handle
    657 
    658         // fill this buffer queue
    659         omx_cmd_queue m_ftb_q;
    660         // Command Q for rest of the events
    661         omx_cmd_queue m_cmd_q;
    662         omx_cmd_queue m_etb_q;
    663         // Input memory pointer
    664         OMX_BUFFERHEADERTYPE *m_inp_mem_ptr;
    665         // Output memory pointer
    666         OMX_BUFFERHEADERTYPE *m_out_mem_ptr;
    667         omx_cmd_queue m_opq_meta_q;
    668         omx_cmd_queue m_opq_pmem_q;
    669         OMX_BUFFERHEADERTYPE meta_buffer_hdr[MAX_NUM_INPUT_BUFFERS];
    670         pthread_mutex_t m_buf_lock;
    671 
    672         bool input_flush_progress;
    673         bool output_flush_progress;
    674         bool input_use_buffer;
    675         bool output_use_buffer;
    676         int pending_input_buffers;
    677         int pending_output_buffers;
    678 
    679         uint64_t m_out_bm_count;
    680         uint64_t m_client_out_bm_count;
    681         uint64_t m_client_in_bm_count;
    682         uint64_t m_inp_bm_count;
    683         uint64_t m_flags;
    684         uint64_t m_etb_count;
    685         uint64_t m_fbd_count;
    686 #ifdef _ANDROID_
    687         // Heap pointer to frame buffers
    688         sp<MemoryHeapBase>    m_heap_ptr;
    689 #endif //_ANDROID_
    690         // to know whether Event Port Settings change has been triggered or not.
    691         bool m_event_port_settings_sent;
    692         OMX_U8                m_cRole[OMX_MAX_STRINGNAME_SIZE];
    693         extra_data_handler extra_data_handle;
    694         bool hw_overload;
    695         OMX_U32 m_graphicBufferSize;
    696 };
    697 
    698 #endif // __OMX_VIDEO_BASE_H__
    699