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