Home | History | Annotate | Download | only in include
      1 /*
      2  * Copyright (C) 2012 Intel Corporation.  All rights reserved.
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  *
     16  */
     17 
     18 
     19 #ifndef ISV_OMXCOMPONENT_H_
     20 
     21 #define ISV_OMXCOMPONENT_H_
     22 
     23 #include <utils/Mutex.h>
     24 #include <utils/Vector.h>
     25 #include <utils/RefBase.h>
     26 #include "isv_omxcore.h"
     27 #include "isv_processor.h"
     28 #include "isv_profile.h"
     29 #include "isv_worker.h"
     30 #include "isv_bufmanager.h"
     31 
     32 #define ISV_COMPONENT_DEBUG 0
     33 
     34 #ifdef TARGET_VPP_USE_GEN
     35 #define MIN_INPUT_NUM           (3)
     36 #define MIN_OUTPUT_NUM          (3)
     37 #else
     38 #define MIN_INPUT_NUM           (4)    // forward reference frame number is 3 for merrifield/moorefield
     39 #define MIN_OUTPUT_NUM          (10)   // 2.5FRC need hold 2 + 3 + 2 + 3= 10 buffers, without FRC we set to 6
     40 #endif
     41 #define MIN_ISV_BUFFER_NUM      ((MIN_OUTPUT_NUM) + (MIN_INPUT_NUM))
     42 #define UNDEQUEUED_NUM          (4)   // display system hold 4 buffers
     43 
     44 using namespace android;
     45 class ISVComponent;
     46 
     47 class ISVProcThreadObserver: public ISVProcessorObserver
     48 {
     49 public:
     50     ISVProcThreadObserver(OMX_COMPONENTTYPE *pBaseComponent, OMX_COMPONENTTYPE *pComponent, OMX_CALLBACKTYPE *pCallBacks, sp<ISVBufferManager> bufferManager);
     51     ~ISVProcThreadObserver();
     52 
     53     virtual OMX_ERRORTYPE releaseBuffer(PORT_INDEX index, OMX_BUFFERHEADERTYPE* pBuffer, bool flush);
     54     virtual OMX_ERRORTYPE reportOutputCrop();
     55 private:
     56     OMX_COMPONENTTYPE *mBaseComponent;
     57     OMX_COMPONENTTYPE *mComponent;
     58     OMX_CALLBACKTYPE *mpCallBacks;
     59     sp<ISVBufferManager> mISVBufferManager;
     60 };
     61 
     62 class ISVComponent //: public RefBase
     63 {
     64 public:
     65     /*
     66      * construct & destruct
     67      */
     68     ISVComponent(OMX_PTR);
     69     ~ISVComponent();
     70 
     71     // replace component callbacks
     72     OMX_CALLBACKTYPE *getCallBacks(OMX_CALLBACKTYPE*);
     73     // pass down the real component&core
     74     void setComponent(OMX_COMPONENTTYPE *pComp, ISVOMXCore *pCore){mComponent = pComp; mCore = pCore;return;}
     75     // free the real component
     76     OMX_ERRORTYPE freeComponent(){return (*(mCore->mFreeHandle))(static_cast<OMX_HANDLETYPE>(mComponent));}
     77     // return ISV component handle
     78     OMX_COMPONENTTYPE *getBaseComponent(){return &mBaseComponent;}
     79 
     80     OMX_HANDLETYPE getComponent(){return static_cast<OMX_HANDLETYPE>(mComponent);}
     81 
     82     static Vector<ISVComponent*> g_isv_components;
     83 private:
     84     /*
     85      * component methods & helpers
     86      */
     87 
     88     static OMX_ERRORTYPE SendCommand(
     89         OMX_IN  OMX_HANDLETYPE hComponent,
     90         OMX_IN  OMX_COMMANDTYPE Cmd,
     91         OMX_IN  OMX_U32 nParam1,
     92         OMX_IN  OMX_PTR pCmdData);
     93     OMX_ERRORTYPE ISV_SendCommand(
     94         OMX_IN  OMX_COMMANDTYPE Cmd,
     95         OMX_IN  OMX_U32 nParam1,
     96         OMX_IN  OMX_PTR pCmdData);
     97 
     98     static OMX_ERRORTYPE GetParameter(
     99         OMX_IN  OMX_HANDLETYPE hComponent,
    100         OMX_IN  OMX_INDEXTYPE nParamIndex,
    101         OMX_INOUT OMX_PTR pComponentParameterStructure);
    102     OMX_ERRORTYPE ISV_GetParameter(
    103         OMX_IN  OMX_INDEXTYPE nParamIndex,
    104         OMX_INOUT OMX_PTR pComponentParameterStructure);
    105 
    106     static OMX_ERRORTYPE SetParameter(
    107         OMX_IN  OMX_HANDLETYPE hComponent,
    108         OMX_IN  OMX_INDEXTYPE nIndex,
    109         OMX_IN  OMX_PTR pComponentParameterStructure);
    110     OMX_ERRORTYPE ISV_SetParameter(
    111         OMX_IN  OMX_INDEXTYPE nIndex,
    112         OMX_IN  OMX_PTR pComponentParameterStructure);
    113 
    114     static OMX_ERRORTYPE GetConfig(
    115         OMX_IN  OMX_HANDLETYPE hComponent,
    116         OMX_IN  OMX_INDEXTYPE nIndex,
    117         OMX_INOUT OMX_PTR pComponentConfigStructure);
    118     OMX_ERRORTYPE ISV_GetConfig(
    119         OMX_IN  OMX_INDEXTYPE nIndex,
    120         OMX_INOUT OMX_PTR pComponentConfigStructure);
    121 
    122     static OMX_ERRORTYPE SetConfig(
    123         OMX_IN  OMX_HANDLETYPE hComponent,
    124         OMX_IN  OMX_INDEXTYPE nIndex,
    125         OMX_IN  OMX_PTR pComponentConfigStructure);
    126     OMX_ERRORTYPE ISV_SetConfig(
    127         OMX_IN  OMX_INDEXTYPE nIndex,
    128         OMX_IN  OMX_PTR pComponentConfigStructure);
    129 
    130     static OMX_ERRORTYPE GetExtensionIndex(
    131         OMX_IN  OMX_HANDLETYPE hComponent,
    132         OMX_IN  OMX_STRING cParameterName,
    133         OMX_OUT OMX_INDEXTYPE* pIndexType);
    134     OMX_ERRORTYPE ISV_GetExtensionIndex(
    135         OMX_IN  OMX_STRING cParameterName,
    136         OMX_OUT OMX_INDEXTYPE* pIndexType);
    137 
    138     static OMX_ERRORTYPE GetState(
    139         OMX_IN  OMX_HANDLETYPE hComponent,
    140         OMX_OUT OMX_STATETYPE* pState);
    141     OMX_ERRORTYPE ISV_GetState(
    142         OMX_OUT OMX_STATETYPE* pState);
    143 
    144     static OMX_ERRORTYPE UseBuffer(
    145         OMX_IN OMX_HANDLETYPE hComponent,
    146         OMX_INOUT OMX_BUFFERHEADERTYPE** ppBufferHdr,
    147         OMX_IN OMX_U32 nPortIndex,
    148         OMX_IN OMX_PTR pAppPrivate,
    149         OMX_IN OMX_U32 nSizeBytes,
    150         OMX_IN OMX_U8* pBuffer);
    151     OMX_ERRORTYPE ISV_UseBuffer(
    152         OMX_INOUT OMX_BUFFERHEADERTYPE** ppBufferHdr,
    153         OMX_IN OMX_U32 nPortIndex,
    154         OMX_IN OMX_PTR pAppPrivate,
    155         OMX_IN OMX_U32 nSizeBytes,
    156         OMX_IN OMX_U8* pBuffer);
    157 
    158     static OMX_ERRORTYPE AllocateBuffer(
    159         OMX_IN OMX_HANDLETYPE hComponent,
    160         OMX_INOUT OMX_BUFFERHEADERTYPE** ppBuffer,
    161         OMX_IN OMX_U32 nPortIndex,
    162         OMX_IN OMX_PTR pAppPrivate,
    163         OMX_IN OMX_U32 nSizeBytes);
    164     OMX_ERRORTYPE ISV_AllocateBuffer(
    165         OMX_INOUT OMX_BUFFERHEADERTYPE** ppBuffer,
    166         OMX_IN OMX_U32 nPortIndex,
    167         OMX_IN OMX_PTR pAppPrivate,
    168         OMX_IN OMX_U32 nSizeBytes);
    169 
    170     static OMX_ERRORTYPE FreeBuffer(
    171         OMX_IN  OMX_HANDLETYPE hComponent,
    172         OMX_IN  OMX_U32 nPortIndex,
    173         OMX_IN  OMX_BUFFERHEADERTYPE* pBuffer);
    174     OMX_ERRORTYPE ISV_FreeBuffer(
    175         OMX_IN  OMX_U32 nPortIndex,
    176         OMX_IN  OMX_BUFFERHEADERTYPE* pBuffer);
    177 
    178     static OMX_ERRORTYPE EmptyThisBuffer(
    179         OMX_IN  OMX_HANDLETYPE hComponent,
    180         OMX_IN  OMX_BUFFERHEADERTYPE* pBuffer);
    181     OMX_ERRORTYPE ISV_EmptyThisBuffer(
    182         OMX_IN  OMX_BUFFERHEADERTYPE* pBuffer);
    183 
    184     static OMX_ERRORTYPE FillThisBuffer(
    185         OMX_IN  OMX_HANDLETYPE hComponent,
    186         OMX_IN  OMX_BUFFERHEADERTYPE* pBuffer);
    187     OMX_ERRORTYPE ISV_FillThisBuffer(
    188         OMX_IN  OMX_BUFFERHEADERTYPE* pBuffer);
    189 
    190     static OMX_ERRORTYPE SetCallbacks(
    191         OMX_IN  OMX_HANDLETYPE hComponent,
    192         OMX_IN  OMX_CALLBACKTYPE* pCallbacks,
    193         OMX_IN  OMX_PTR pAppData);
    194     OMX_ERRORTYPE ISV_SetCallbacks(
    195         OMX_IN  OMX_CALLBACKTYPE* pCallbacks,
    196         OMX_IN  OMX_PTR pAppData);
    197 
    198     static OMX_ERRORTYPE ComponentRoleEnum(
    199         OMX_IN OMX_HANDLETYPE hComponent,
    200         OMX_OUT OMX_U8 *cRole,
    201         OMX_IN OMX_U32 nIndex);
    202     OMX_ERRORTYPE ISV_ComponentRoleEnum(
    203         OMX_OUT OMX_U8 *cRole,
    204         OMX_IN OMX_U32 nIndex);
    205 
    206     static OMX_ERRORTYPE FillBufferDone(
    207         OMX_OUT OMX_HANDLETYPE hComponent,
    208         OMX_OUT OMX_PTR pAppData,
    209         OMX_OUT OMX_BUFFERHEADERTYPE* pBuffer);
    210     OMX_ERRORTYPE ISV_FillBufferDone(
    211         OMX_OUT OMX_HANDLETYPE hComponent,
    212         OMX_OUT OMX_PTR pAppData,
    213         OMX_OUT OMX_BUFFERHEADERTYPE* pBuffer);
    214 
    215     static OMX_ERRORTYPE EventHandler(
    216             OMX_IN OMX_HANDLETYPE hComponent,
    217             OMX_IN OMX_PTR pAppData,
    218             OMX_IN OMX_EVENTTYPE eEvent,
    219             OMX_IN OMX_U32 nData1,
    220             OMX_IN OMX_U32 nData2,
    221             OMX_IN OMX_PTR pEventData);
    222     OMX_ERRORTYPE ISV_EventHandler(
    223             OMX_IN OMX_HANDLETYPE hComponent,
    224             OMX_IN OMX_PTR pAppData,
    225             OMX_IN OMX_EVENTTYPE eEvent,
    226             OMX_IN OMX_U32 nData1,
    227             OMX_IN OMX_U32 nData2,
    228             OMX_IN OMX_PTR pEventData);
    229     /* end of component methods & helpers */
    230 
    231     void SetTypeHeader(OMX_PTR type, OMX_U32 size);
    232 
    233     // init & deinit functions
    234     status_t init(int32_t width, int32_t height);
    235     void deinit();
    236 
    237     const static OMX_U8 OMX_SPEC_VERSION_MAJOR = 1;
    238     const static OMX_U8 OMX_SPEC_VERSION_MINOR = 0;
    239     const static OMX_U8 OMX_SPEC_VERSION_REVISION = 0;
    240     const static OMX_U8 OMX_SPEC_VERSION_STEP = 0;
    241 
    242     const static OMX_U32 OMX_SPEC_VERSION = 0
    243         | (OMX_SPEC_VERSION_MAJOR << 0)
    244         | (OMX_SPEC_VERSION_MINOR << 8)
    245         | (OMX_SPEC_VERSION_REVISION << 16)
    246         | (OMX_SPEC_VERSION_STEP << 24);
    247 
    248     typedef enum OMX_ISVINDEXEXTTYPE {
    249         OMX_IndexISVStartUsed = OMX_IndexVendorStartUnused + 0x0000F000,
    250         OMX_IndexExtSetISVMode,                  /**< reference: OMX_U32 */
    251     } OMX_ISVINDEXEXTTYPE;
    252 
    253     typedef enum {
    254         ISV_DISABLE = 0,
    255         ISV_AUTO,
    256     } ISV_MODE;
    257 
    258 private:
    259     OMX_COMPONENTTYPE mBaseComponent;  //returned by GetComponetHandle()
    260     OMX_COMPONENTTYPE *mComponent;      // passed from the real OMX core
    261     OMX_CALLBACKTYPE *mpCallBacks;
    262     ISVOMXCore *mCore;                  // owend by mComponent
    263     OMX_CALLBACKTYPE *mpISVCallBacks;
    264 
    265     // buffer manager
    266     sp<ISVBufferManager> mISVBufferManager;
    267 
    268     bool mThreadRunning;
    269 
    270     // vpp thread observer
    271     sp<ISVProcThreadObserver> mProcThreadObserver;
    272 
    273     // vpp input buffer count + output buffer count
    274     int32_t mNumISVBuffers;
    275     int32_t mNumDecoderBuffers;
    276     int32_t mNumDecoderBuffersBak;
    277     /* To speed up the start up output decoder buffer directly
    278      * for certain frames. ISV worker pipeline set up is hide by (in parallel with)
    279      * display these output frames.
    280      */
    281     int32_t mOutputDecoderBufferNum;
    282     uint32_t mWidth;
    283     uint32_t mHeight;
    284     uint32_t mUseAndroidNativeBufferIndex;
    285     uint32_t mStoreMetaDataInBuffersIndex;
    286     uint32_t mHackFormat;
    287 
    288     bool mUseAndroidNativeBuffer;
    289     bool mUseAndroidNativeBuffer2;
    290 
    291     bool mVPPEnabled;
    292     bool mVPPOn;
    293     bool mVPPFlushing;
    294     bool mOutputCropChanged;
    295     bool mInitialized;
    296 #ifdef TARGET_VPP_USE_GEN
    297     // vpp thread
    298     sp<ISVProcessor> mProcThread;
    299 #else
    300     static sp<ISVProcessor> mProcThread;
    301 #endif
    302     // protect create mProcThread instance
    303     bool mOwnProcessor;
    304     static pthread_mutex_t ProcThreadInstanceLock;
    305     Mutex mDecoderBufLock;
    306 };
    307 
    308 #endif  // #define ISV_OMXCOMPONENT_H_
    309