You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
308 lines
10 KiB
308 lines
10 KiB
/* |
|
* Copyright (C) 2012 Intel Corporation. All rights reserved. |
|
* |
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
|
* you may not use this file except in compliance with the License. |
|
* You may obtain a copy of the License at |
|
* |
|
* http://www.apache.org/licenses/LICENSE-2.0 |
|
* |
|
* Unless required by applicable law or agreed to in writing, software |
|
* distributed under the License is distributed on an "AS IS" BASIS, |
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|
* See the License for the specific language governing permissions and |
|
* limitations under the License. |
|
* |
|
*/ |
|
|
|
|
|
#ifndef ISV_OMXCOMPONENT_H_ |
|
|
|
#define ISV_OMXCOMPONENT_H_ |
|
|
|
#include <utils/Mutex.h> |
|
#include <utils/Vector.h> |
|
#include <utils/RefBase.h> |
|
#include "isv_omxcore.h" |
|
#include "isv_processor.h" |
|
#include "isv_profile.h" |
|
#include "isv_worker.h" |
|
#include "isv_bufmanager.h" |
|
|
|
#define ISV_COMPONENT_DEBUG 0 |
|
|
|
#ifdef TARGET_VPP_USE_GEN |
|
#define MIN_INPUT_NUM (3) |
|
#define MIN_OUTPUT_NUM (3) |
|
#else |
|
#define MIN_INPUT_NUM (4) // forward reference frame number is 3 for merrifield/moorefield |
|
#define MIN_OUTPUT_NUM (10) // 2.5FRC need hold 2 + 3 + 2 + 3= 10 buffers, without FRC we set to 6 |
|
#endif |
|
#define MIN_ISV_BUFFER_NUM ((MIN_OUTPUT_NUM) + (MIN_INPUT_NUM)) |
|
#define UNDEQUEUED_NUM (4) // display system hold 4 buffers |
|
|
|
using namespace android; |
|
class ISVComponent; |
|
|
|
class ISVProcThreadObserver: public ISVProcessorObserver |
|
{ |
|
public: |
|
ISVProcThreadObserver(OMX_COMPONENTTYPE *pBaseComponent, OMX_COMPONENTTYPE *pComponent, OMX_CALLBACKTYPE *pCallBacks, sp<ISVBufferManager> bufferManager); |
|
~ISVProcThreadObserver(); |
|
|
|
virtual OMX_ERRORTYPE releaseBuffer(PORT_INDEX index, OMX_BUFFERHEADERTYPE* pBuffer, bool flush); |
|
virtual OMX_ERRORTYPE reportOutputCrop(); |
|
private: |
|
OMX_COMPONENTTYPE *mBaseComponent; |
|
OMX_COMPONENTTYPE *mComponent; |
|
OMX_CALLBACKTYPE *mpCallBacks; |
|
sp<ISVBufferManager> mISVBufferManager; |
|
}; |
|
|
|
class ISVComponent //: public RefBase |
|
{ |
|
public: |
|
/* |
|
* construct & destruct |
|
*/ |
|
ISVComponent(OMX_PTR); |
|
~ISVComponent(); |
|
|
|
// replace component callbacks |
|
OMX_CALLBACKTYPE *getCallBacks(OMX_CALLBACKTYPE*); |
|
// pass down the real component&core |
|
void setComponent(OMX_COMPONENTTYPE *pComp, ISVOMXCore *pCore){mComponent = pComp; mCore = pCore;return;} |
|
// free the real component |
|
OMX_ERRORTYPE freeComponent(){return (*(mCore->mFreeHandle))(static_cast<OMX_HANDLETYPE>(mComponent));} |
|
// return ISV component handle |
|
OMX_COMPONENTTYPE *getBaseComponent(){return &mBaseComponent;} |
|
|
|
OMX_HANDLETYPE getComponent(){return static_cast<OMX_HANDLETYPE>(mComponent);} |
|
|
|
static Vector<ISVComponent*> g_isv_components; |
|
private: |
|
/* |
|
* component methods & helpers |
|
*/ |
|
|
|
static OMX_ERRORTYPE SendCommand( |
|
OMX_IN OMX_HANDLETYPE hComponent, |
|
OMX_IN OMX_COMMANDTYPE Cmd, |
|
OMX_IN OMX_U32 nParam1, |
|
OMX_IN OMX_PTR pCmdData); |
|
OMX_ERRORTYPE ISV_SendCommand( |
|
OMX_IN OMX_COMMANDTYPE Cmd, |
|
OMX_IN OMX_U32 nParam1, |
|
OMX_IN OMX_PTR pCmdData); |
|
|
|
static OMX_ERRORTYPE GetParameter( |
|
OMX_IN OMX_HANDLETYPE hComponent, |
|
OMX_IN OMX_INDEXTYPE nParamIndex, |
|
OMX_INOUT OMX_PTR pComponentParameterStructure); |
|
OMX_ERRORTYPE ISV_GetParameter( |
|
OMX_IN OMX_INDEXTYPE nParamIndex, |
|
OMX_INOUT OMX_PTR pComponentParameterStructure); |
|
|
|
static OMX_ERRORTYPE SetParameter( |
|
OMX_IN OMX_HANDLETYPE hComponent, |
|
OMX_IN OMX_INDEXTYPE nIndex, |
|
OMX_IN OMX_PTR pComponentParameterStructure); |
|
OMX_ERRORTYPE ISV_SetParameter( |
|
OMX_IN OMX_INDEXTYPE nIndex, |
|
OMX_IN OMX_PTR pComponentParameterStructure); |
|
|
|
static OMX_ERRORTYPE GetConfig( |
|
OMX_IN OMX_HANDLETYPE hComponent, |
|
OMX_IN OMX_INDEXTYPE nIndex, |
|
OMX_INOUT OMX_PTR pComponentConfigStructure); |
|
OMX_ERRORTYPE ISV_GetConfig( |
|
OMX_IN OMX_INDEXTYPE nIndex, |
|
OMX_INOUT OMX_PTR pComponentConfigStructure); |
|
|
|
static OMX_ERRORTYPE SetConfig( |
|
OMX_IN OMX_HANDLETYPE hComponent, |
|
OMX_IN OMX_INDEXTYPE nIndex, |
|
OMX_IN OMX_PTR pComponentConfigStructure); |
|
OMX_ERRORTYPE ISV_SetConfig( |
|
OMX_IN OMX_INDEXTYPE nIndex, |
|
OMX_IN OMX_PTR pComponentConfigStructure); |
|
|
|
static OMX_ERRORTYPE GetExtensionIndex( |
|
OMX_IN OMX_HANDLETYPE hComponent, |
|
OMX_IN OMX_STRING cParameterName, |
|
OMX_OUT OMX_INDEXTYPE* pIndexType); |
|
OMX_ERRORTYPE ISV_GetExtensionIndex( |
|
OMX_IN OMX_STRING cParameterName, |
|
OMX_OUT OMX_INDEXTYPE* pIndexType); |
|
|
|
static OMX_ERRORTYPE GetState( |
|
OMX_IN OMX_HANDLETYPE hComponent, |
|
OMX_OUT OMX_STATETYPE* pState); |
|
OMX_ERRORTYPE ISV_GetState( |
|
OMX_OUT OMX_STATETYPE* pState); |
|
|
|
static OMX_ERRORTYPE UseBuffer( |
|
OMX_IN OMX_HANDLETYPE hComponent, |
|
OMX_INOUT OMX_BUFFERHEADERTYPE** ppBufferHdr, |
|
OMX_IN OMX_U32 nPortIndex, |
|
OMX_IN OMX_PTR pAppPrivate, |
|
OMX_IN OMX_U32 nSizeBytes, |
|
OMX_IN OMX_U8* pBuffer); |
|
OMX_ERRORTYPE ISV_UseBuffer( |
|
OMX_INOUT OMX_BUFFERHEADERTYPE** ppBufferHdr, |
|
OMX_IN OMX_U32 nPortIndex, |
|
OMX_IN OMX_PTR pAppPrivate, |
|
OMX_IN OMX_U32 nSizeBytes, |
|
OMX_IN OMX_U8* pBuffer); |
|
|
|
static OMX_ERRORTYPE AllocateBuffer( |
|
OMX_IN OMX_HANDLETYPE hComponent, |
|
OMX_INOUT OMX_BUFFERHEADERTYPE** ppBuffer, |
|
OMX_IN OMX_U32 nPortIndex, |
|
OMX_IN OMX_PTR pAppPrivate, |
|
OMX_IN OMX_U32 nSizeBytes); |
|
OMX_ERRORTYPE ISV_AllocateBuffer( |
|
OMX_INOUT OMX_BUFFERHEADERTYPE** ppBuffer, |
|
OMX_IN OMX_U32 nPortIndex, |
|
OMX_IN OMX_PTR pAppPrivate, |
|
OMX_IN OMX_U32 nSizeBytes); |
|
|
|
static OMX_ERRORTYPE FreeBuffer( |
|
OMX_IN OMX_HANDLETYPE hComponent, |
|
OMX_IN OMX_U32 nPortIndex, |
|
OMX_IN OMX_BUFFERHEADERTYPE* pBuffer); |
|
OMX_ERRORTYPE ISV_FreeBuffer( |
|
OMX_IN OMX_U32 nPortIndex, |
|
OMX_IN OMX_BUFFERHEADERTYPE* pBuffer); |
|
|
|
static OMX_ERRORTYPE EmptyThisBuffer( |
|
OMX_IN OMX_HANDLETYPE hComponent, |
|
OMX_IN OMX_BUFFERHEADERTYPE* pBuffer); |
|
OMX_ERRORTYPE ISV_EmptyThisBuffer( |
|
OMX_IN OMX_BUFFERHEADERTYPE* pBuffer); |
|
|
|
static OMX_ERRORTYPE FillThisBuffer( |
|
OMX_IN OMX_HANDLETYPE hComponent, |
|
OMX_IN OMX_BUFFERHEADERTYPE* pBuffer); |
|
OMX_ERRORTYPE ISV_FillThisBuffer( |
|
OMX_IN OMX_BUFFERHEADERTYPE* pBuffer); |
|
|
|
static OMX_ERRORTYPE SetCallbacks( |
|
OMX_IN OMX_HANDLETYPE hComponent, |
|
OMX_IN OMX_CALLBACKTYPE* pCallbacks, |
|
OMX_IN OMX_PTR pAppData); |
|
OMX_ERRORTYPE ISV_SetCallbacks( |
|
OMX_IN OMX_CALLBACKTYPE* pCallbacks, |
|
OMX_IN OMX_PTR pAppData); |
|
|
|
static OMX_ERRORTYPE ComponentRoleEnum( |
|
OMX_IN OMX_HANDLETYPE hComponent, |
|
OMX_OUT OMX_U8 *cRole, |
|
OMX_IN OMX_U32 nIndex); |
|
OMX_ERRORTYPE ISV_ComponentRoleEnum( |
|
OMX_OUT OMX_U8 *cRole, |
|
OMX_IN OMX_U32 nIndex); |
|
|
|
static OMX_ERRORTYPE FillBufferDone( |
|
OMX_OUT OMX_HANDLETYPE hComponent, |
|
OMX_OUT OMX_PTR pAppData, |
|
OMX_OUT OMX_BUFFERHEADERTYPE* pBuffer); |
|
OMX_ERRORTYPE ISV_FillBufferDone( |
|
OMX_OUT OMX_HANDLETYPE hComponent, |
|
OMX_OUT OMX_PTR pAppData, |
|
OMX_OUT OMX_BUFFERHEADERTYPE* pBuffer); |
|
|
|
static OMX_ERRORTYPE EventHandler( |
|
OMX_IN OMX_HANDLETYPE hComponent, |
|
OMX_IN OMX_PTR pAppData, |
|
OMX_IN OMX_EVENTTYPE eEvent, |
|
OMX_IN OMX_U32 nData1, |
|
OMX_IN OMX_U32 nData2, |
|
OMX_IN OMX_PTR pEventData); |
|
OMX_ERRORTYPE ISV_EventHandler( |
|
OMX_IN OMX_HANDLETYPE hComponent, |
|
OMX_IN OMX_PTR pAppData, |
|
OMX_IN OMX_EVENTTYPE eEvent, |
|
OMX_IN OMX_U32 nData1, |
|
OMX_IN OMX_U32 nData2, |
|
OMX_IN OMX_PTR pEventData); |
|
/* end of component methods & helpers */ |
|
|
|
void SetTypeHeader(OMX_PTR type, OMX_U32 size); |
|
|
|
// init & deinit functions |
|
status_t init(int32_t width, int32_t height); |
|
void deinit(); |
|
|
|
const static OMX_U8 OMX_SPEC_VERSION_MAJOR = 1; |
|
const static OMX_U8 OMX_SPEC_VERSION_MINOR = 0; |
|
const static OMX_U8 OMX_SPEC_VERSION_REVISION = 0; |
|
const static OMX_U8 OMX_SPEC_VERSION_STEP = 0; |
|
|
|
const static OMX_U32 OMX_SPEC_VERSION = 0 |
|
| (OMX_SPEC_VERSION_MAJOR << 0) |
|
| (OMX_SPEC_VERSION_MINOR << 8) |
|
| (OMX_SPEC_VERSION_REVISION << 16) |
|
| (OMX_SPEC_VERSION_STEP << 24); |
|
|
|
typedef enum OMX_ISVINDEXEXTTYPE { |
|
OMX_IndexISVStartUsed = OMX_IndexVendorStartUnused + 0x0000F000, |
|
OMX_IndexExtSetISVMode, /**< reference: OMX_U32 */ |
|
} OMX_ISVINDEXEXTTYPE; |
|
|
|
typedef enum { |
|
ISV_DISABLE = 0, |
|
ISV_AUTO, |
|
} ISV_MODE; |
|
|
|
private: |
|
OMX_COMPONENTTYPE mBaseComponent; //returned by GetComponetHandle() |
|
OMX_COMPONENTTYPE *mComponent; // passed from the real OMX core |
|
OMX_CALLBACKTYPE *mpCallBacks; |
|
ISVOMXCore *mCore; // owend by mComponent |
|
OMX_CALLBACKTYPE *mpISVCallBacks; |
|
|
|
// buffer manager |
|
sp<ISVBufferManager> mISVBufferManager; |
|
|
|
bool mThreadRunning; |
|
|
|
// vpp thread observer |
|
sp<ISVProcThreadObserver> mProcThreadObserver; |
|
|
|
// vpp input buffer count + output buffer count |
|
int32_t mNumISVBuffers; |
|
int32_t mNumDecoderBuffers; |
|
int32_t mNumDecoderBuffersBak; |
|
/* To speed up the start up output decoder buffer directly |
|
* for certain frames. ISV worker pipeline set up is hide by (in parallel with) |
|
* display these output frames. |
|
*/ |
|
int32_t mOutputDecoderBufferNum; |
|
uint32_t mWidth; |
|
uint32_t mHeight; |
|
uint32_t mUseAndroidNativeBufferIndex; |
|
uint32_t mStoreMetaDataInBuffersIndex; |
|
uint32_t mHackFormat; |
|
|
|
bool mUseAndroidNativeBuffer; |
|
bool mUseAndroidNativeBuffer2; |
|
|
|
bool mVPPEnabled; |
|
bool mVPPOn; |
|
bool mVPPFlushing; |
|
bool mOutputCropChanged; |
|
bool mInitialized; |
|
#ifdef TARGET_VPP_USE_GEN |
|
// vpp thread |
|
sp<ISVProcessor> mProcThread; |
|
#else |
|
static sp<ISVProcessor> mProcThread; |
|
#endif |
|
// protect create mProcThread instance |
|
bool mOwnProcessor; |
|
static pthread_mutex_t ProcThreadInstanceLock; |
|
Mutex mDecoderBufLock; |
|
}; |
|
|
|
#endif // #define ISV_OMXCOMPONENT_H_
|
|
|