125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang/*
225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang * Copyright (C) 2012 Intel Corporation.  All rights reserved.
325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang *
425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang * Licensed under the Apache License, Version 2.0 (the "License");
525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang * you may not use this file except in compliance with the License.
625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang * You may obtain a copy of the License at
725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang *
825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang *      http://www.apache.org/licenses/LICENSE-2.0
925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang *
1025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang * Unless required by applicable law or agreed to in writing, software
1125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang * distributed under the License is distributed on an "AS IS" BASIS,
1225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang * See the License for the specific language governing permissions and
1425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang * limitations under the License.
1525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang *
1625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang */
1725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang
1825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang
1925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#ifndef ISV_OMXCOMPONENT_H_
2025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang
2125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#define ISV_OMXCOMPONENT_H_
2225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang
2325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#include <utils/Mutex.h>
2425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#include <utils/Vector.h>
2525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#include <utils/RefBase.h>
2625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#include "isv_omxcore.h"
2725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#include "isv_processor.h"
2825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#include "isv_profile.h"
2925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#include "isv_worker.h"
3025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#include "isv_bufmanager.h"
3125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang
3225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#define ISV_COMPONENT_DEBUG 0
3325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang
34d6acef05e41af96ff00f2c579e3f9c96cb1a0530Xigui Wang#ifdef TARGET_VPP_USE_GEN
35d6acef05e41af96ff00f2c579e3f9c96cb1a0530Xigui Wang#define MIN_INPUT_NUM           (3)
36d6acef05e41af96ff00f2c579e3f9c96cb1a0530Xigui Wang#define MIN_OUTPUT_NUM          (3)
37d6acef05e41af96ff00f2c579e3f9c96cb1a0530Xigui Wang#else
38d6acef05e41af96ff00f2c579e3f9c96cb1a0530Xigui Wang#define MIN_INPUT_NUM           (4)    // forward reference frame number is 3 for merrifield/moorefield
3925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#define MIN_OUTPUT_NUM          (10)   // 2.5FRC need hold 2 + 3 + 2 + 3= 10 buffers, without FRC we set to 6
40d6acef05e41af96ff00f2c579e3f9c96cb1a0530Xigui Wang#endif
41d6acef05e41af96ff00f2c579e3f9c96cb1a0530Xigui Wang#define MIN_ISV_BUFFER_NUM      ((MIN_OUTPUT_NUM) + (MIN_INPUT_NUM))
4225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#define UNDEQUEUED_NUM          (4)   // display system hold 4 buffers
4325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang
4425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wangusing namespace android;
4525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wangclass ISVComponent;
4625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang
4725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wangclass ISVProcThreadObserver: public ISVProcessorObserver
4825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang{
4925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wangpublic:
50e5aad73d4992d6c8fbd9e9e3c9cc89abfc83b775Xigui Wang    ISVProcThreadObserver(OMX_COMPONENTTYPE *pBaseComponent, OMX_COMPONENTTYPE *pComponent, OMX_CALLBACKTYPE *pCallBacks, sp<ISVBufferManager> bufferManager);
5125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    ~ISVProcThreadObserver();
5225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang
5325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    virtual OMX_ERRORTYPE releaseBuffer(PORT_INDEX index, OMX_BUFFERHEADERTYPE* pBuffer, bool flush);
54e5aad73d4992d6c8fbd9e9e3c9cc89abfc83b775Xigui Wang    virtual OMX_ERRORTYPE reportOutputCrop();
5525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wangprivate:
5625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    OMX_COMPONENTTYPE *mBaseComponent;
5725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    OMX_COMPONENTTYPE *mComponent;
5825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    OMX_CALLBACKTYPE *mpCallBacks;
59e5aad73d4992d6c8fbd9e9e3c9cc89abfc83b775Xigui Wang    sp<ISVBufferManager> mISVBufferManager;
6025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang};
6125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang
6225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wangclass ISVComponent //: public RefBase
6325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang{
6425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wangpublic:
6525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    /*
6625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang     * construct & destruct
6725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang     */
6825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    ISVComponent(OMX_PTR);
6925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    ~ISVComponent();
7025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang
7125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    // replace component callbacks
7225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    OMX_CALLBACKTYPE *getCallBacks(OMX_CALLBACKTYPE*);
7325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    // pass down the real component&core
7425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    void setComponent(OMX_COMPONENTTYPE *pComp, ISVOMXCore *pCore){mComponent = pComp; mCore = pCore;return;}
7525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    // free the real component
7625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    OMX_ERRORTYPE freeComponent(){return (*(mCore->mFreeHandle))(static_cast<OMX_HANDLETYPE>(mComponent));}
7725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    // return ISV component handle
7825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    OMX_COMPONENTTYPE *getBaseComponent(){return &mBaseComponent;}
7925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang
809042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang    OMX_HANDLETYPE getComponent(){return static_cast<OMX_HANDLETYPE>(mComponent);}
819042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang
8225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    static Vector<ISVComponent*> g_isv_components;
8325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wangprivate:
8425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    /*
8525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang     * component methods & helpers
8625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang     */
8725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang
8825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    static OMX_ERRORTYPE SendCommand(
8925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        OMX_IN  OMX_HANDLETYPE hComponent,
9025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        OMX_IN  OMX_COMMANDTYPE Cmd,
9125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        OMX_IN  OMX_U32 nParam1,
9225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        OMX_IN  OMX_PTR pCmdData);
9325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    OMX_ERRORTYPE ISV_SendCommand(
9425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        OMX_IN  OMX_COMMANDTYPE Cmd,
9525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        OMX_IN  OMX_U32 nParam1,
9625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        OMX_IN  OMX_PTR pCmdData);
9725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang
9825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    static OMX_ERRORTYPE GetParameter(
9925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        OMX_IN  OMX_HANDLETYPE hComponent,
10025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        OMX_IN  OMX_INDEXTYPE nParamIndex,
10125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        OMX_INOUT OMX_PTR pComponentParameterStructure);
10225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    OMX_ERRORTYPE ISV_GetParameter(
10325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        OMX_IN  OMX_INDEXTYPE nParamIndex,
10425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        OMX_INOUT OMX_PTR pComponentParameterStructure);
10525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang
10625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    static OMX_ERRORTYPE SetParameter(
10725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        OMX_IN  OMX_HANDLETYPE hComponent,
10825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        OMX_IN  OMX_INDEXTYPE nIndex,
10925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        OMX_IN  OMX_PTR pComponentParameterStructure);
11025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    OMX_ERRORTYPE ISV_SetParameter(
11125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        OMX_IN  OMX_INDEXTYPE nIndex,
11225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        OMX_IN  OMX_PTR pComponentParameterStructure);
11325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang
11425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    static OMX_ERRORTYPE GetConfig(
11525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        OMX_IN  OMX_HANDLETYPE hComponent,
11625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        OMX_IN  OMX_INDEXTYPE nIndex,
11725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        OMX_INOUT OMX_PTR pComponentConfigStructure);
11825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    OMX_ERRORTYPE ISV_GetConfig(
11925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        OMX_IN  OMX_INDEXTYPE nIndex,
12025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        OMX_INOUT OMX_PTR pComponentConfigStructure);
12125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang
12225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    static OMX_ERRORTYPE SetConfig(
12325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        OMX_IN  OMX_HANDLETYPE hComponent,
12425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        OMX_IN  OMX_INDEXTYPE nIndex,
12525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        OMX_IN  OMX_PTR pComponentConfigStructure);
12625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    OMX_ERRORTYPE ISV_SetConfig(
12725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        OMX_IN  OMX_INDEXTYPE nIndex,
12825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        OMX_IN  OMX_PTR pComponentConfigStructure);
12925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang
13025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    static OMX_ERRORTYPE GetExtensionIndex(
13125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        OMX_IN  OMX_HANDLETYPE hComponent,
13225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        OMX_IN  OMX_STRING cParameterName,
13325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        OMX_OUT OMX_INDEXTYPE* pIndexType);
13425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    OMX_ERRORTYPE ISV_GetExtensionIndex(
13525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        OMX_IN  OMX_STRING cParameterName,
13625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        OMX_OUT OMX_INDEXTYPE* pIndexType);
13725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang
13825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    static OMX_ERRORTYPE GetState(
13925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        OMX_IN  OMX_HANDLETYPE hComponent,
14025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        OMX_OUT OMX_STATETYPE* pState);
14125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    OMX_ERRORTYPE ISV_GetState(
14225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        OMX_OUT OMX_STATETYPE* pState);
14325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang
14425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    static OMX_ERRORTYPE UseBuffer(
14525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        OMX_IN OMX_HANDLETYPE hComponent,
14625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        OMX_INOUT OMX_BUFFERHEADERTYPE** ppBufferHdr,
14725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        OMX_IN OMX_U32 nPortIndex,
14825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        OMX_IN OMX_PTR pAppPrivate,
14925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        OMX_IN OMX_U32 nSizeBytes,
15025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        OMX_IN OMX_U8* pBuffer);
15125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    OMX_ERRORTYPE ISV_UseBuffer(
15225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        OMX_INOUT OMX_BUFFERHEADERTYPE** ppBufferHdr,
15325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        OMX_IN OMX_U32 nPortIndex,
15425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        OMX_IN OMX_PTR pAppPrivate,
15525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        OMX_IN OMX_U32 nSizeBytes,
15625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        OMX_IN OMX_U8* pBuffer);
15725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang
15825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    static OMX_ERRORTYPE AllocateBuffer(
15925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        OMX_IN OMX_HANDLETYPE hComponent,
16025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        OMX_INOUT OMX_BUFFERHEADERTYPE** ppBuffer,
16125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        OMX_IN OMX_U32 nPortIndex,
16225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        OMX_IN OMX_PTR pAppPrivate,
16325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        OMX_IN OMX_U32 nSizeBytes);
16425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    OMX_ERRORTYPE ISV_AllocateBuffer(
16525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        OMX_INOUT OMX_BUFFERHEADERTYPE** ppBuffer,
16625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        OMX_IN OMX_U32 nPortIndex,
16725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        OMX_IN OMX_PTR pAppPrivate,
16825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        OMX_IN OMX_U32 nSizeBytes);
16925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang
17025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    static OMX_ERRORTYPE FreeBuffer(
17125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        OMX_IN  OMX_HANDLETYPE hComponent,
17225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        OMX_IN  OMX_U32 nPortIndex,
17325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        OMX_IN  OMX_BUFFERHEADERTYPE* pBuffer);
17425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    OMX_ERRORTYPE ISV_FreeBuffer(
17525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        OMX_IN  OMX_U32 nPortIndex,
17625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        OMX_IN  OMX_BUFFERHEADERTYPE* pBuffer);
17725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang
17825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    static OMX_ERRORTYPE EmptyThisBuffer(
17925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        OMX_IN  OMX_HANDLETYPE hComponent,
18025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        OMX_IN  OMX_BUFFERHEADERTYPE* pBuffer);
18125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    OMX_ERRORTYPE ISV_EmptyThisBuffer(
18225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        OMX_IN  OMX_BUFFERHEADERTYPE* pBuffer);
18325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang
18425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    static OMX_ERRORTYPE FillThisBuffer(
18525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        OMX_IN  OMX_HANDLETYPE hComponent,
18625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        OMX_IN  OMX_BUFFERHEADERTYPE* pBuffer);
18725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    OMX_ERRORTYPE ISV_FillThisBuffer(
18825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        OMX_IN  OMX_BUFFERHEADERTYPE* pBuffer);
18925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang
19025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    static OMX_ERRORTYPE SetCallbacks(
19125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        OMX_IN  OMX_HANDLETYPE hComponent,
19225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        OMX_IN  OMX_CALLBACKTYPE* pCallbacks,
19325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        OMX_IN  OMX_PTR pAppData);
19425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    OMX_ERRORTYPE ISV_SetCallbacks(
19525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        OMX_IN  OMX_CALLBACKTYPE* pCallbacks,
19625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        OMX_IN  OMX_PTR pAppData);
19725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang
19825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    static OMX_ERRORTYPE ComponentRoleEnum(
19925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        OMX_IN OMX_HANDLETYPE hComponent,
20025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        OMX_OUT OMX_U8 *cRole,
20125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        OMX_IN OMX_U32 nIndex);
20225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    OMX_ERRORTYPE ISV_ComponentRoleEnum(
20325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        OMX_OUT OMX_U8 *cRole,
20425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        OMX_IN OMX_U32 nIndex);
20525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang
20625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    static OMX_ERRORTYPE FillBufferDone(
20725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        OMX_OUT OMX_HANDLETYPE hComponent,
20825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        OMX_OUT OMX_PTR pAppData,
20925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        OMX_OUT OMX_BUFFERHEADERTYPE* pBuffer);
21025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    OMX_ERRORTYPE ISV_FillBufferDone(
21125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        OMX_OUT OMX_HANDLETYPE hComponent,
21225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        OMX_OUT OMX_PTR pAppData,
21325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        OMX_OUT OMX_BUFFERHEADERTYPE* pBuffer);
21425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang
21525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    static OMX_ERRORTYPE EventHandler(
21625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang            OMX_IN OMX_HANDLETYPE hComponent,
21725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang            OMX_IN OMX_PTR pAppData,
21825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang            OMX_IN OMX_EVENTTYPE eEvent,
21925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang            OMX_IN OMX_U32 nData1,
22025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang            OMX_IN OMX_U32 nData2,
22125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang            OMX_IN OMX_PTR pEventData);
22225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    OMX_ERRORTYPE ISV_EventHandler(
22325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang            OMX_IN OMX_HANDLETYPE hComponent,
22425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang            OMX_IN OMX_PTR pAppData,
22525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang            OMX_IN OMX_EVENTTYPE eEvent,
22625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang            OMX_IN OMX_U32 nData1,
22725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang            OMX_IN OMX_U32 nData2,
22825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang            OMX_IN OMX_PTR pEventData);
22925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    /* end of component methods & helpers */
23025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang
23125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    void SetTypeHeader(OMX_PTR type, OMX_U32 size);
23225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang
23325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    // init & deinit functions
23425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    status_t init(int32_t width, int32_t height);
23525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    void deinit();
23625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang
23725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    const static OMX_U8 OMX_SPEC_VERSION_MAJOR = 1;
23825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    const static OMX_U8 OMX_SPEC_VERSION_MINOR = 0;
23925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    const static OMX_U8 OMX_SPEC_VERSION_REVISION = 0;
24025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    const static OMX_U8 OMX_SPEC_VERSION_STEP = 0;
24125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang
24225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    const static OMX_U32 OMX_SPEC_VERSION = 0
24325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        | (OMX_SPEC_VERSION_MAJOR << 0)
24425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        | (OMX_SPEC_VERSION_MINOR << 8)
24525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        | (OMX_SPEC_VERSION_REVISION << 16)
24625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        | (OMX_SPEC_VERSION_STEP << 24);
24725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang
24825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    typedef enum OMX_ISVINDEXEXTTYPE {
24925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        OMX_IndexISVStartUsed = OMX_IndexVendorStartUnused + 0x0000F000,
25025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        OMX_IndexExtSetISVMode,                  /**< reference: OMX_U32 */
25125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    } OMX_ISVINDEXEXTTYPE;
25225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang
25325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    typedef enum {
25425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        ISV_DISABLE = 0,
25525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang        ISV_AUTO,
25625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    } ISV_MODE;
25725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang
25825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wangprivate:
25925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    OMX_COMPONENTTYPE mBaseComponent;  //returned by GetComponetHandle()
26025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    OMX_COMPONENTTYPE *mComponent;      // passed from the real OMX core
26125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    OMX_CALLBACKTYPE *mpCallBacks;
26225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    ISVOMXCore *mCore;                  // owend by mComponent
26325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    OMX_CALLBACKTYPE *mpISVCallBacks;
26425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang
26525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    // buffer manager
26625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    sp<ISVBufferManager> mISVBufferManager;
26725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang
26825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    bool mThreadRunning;
26925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang
27025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    // vpp thread observer
27125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    sp<ISVProcThreadObserver> mProcThreadObserver;
27225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang
27325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    // vpp input buffer count + output buffer count
27425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    int32_t mNumISVBuffers;
27525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    int32_t mNumDecoderBuffers;
27625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    int32_t mNumDecoderBuffersBak;
27789be4f7c8a434378432d1a39850a3c9dea334e96Xigui Wang    /* To speed up the start up output decoder buffer directly
27889be4f7c8a434378432d1a39850a3c9dea334e96Xigui Wang     * for certain frames. ISV worker pipeline set up is hide by (in parallel with)
27989be4f7c8a434378432d1a39850a3c9dea334e96Xigui Wang     * display these output frames.
28089be4f7c8a434378432d1a39850a3c9dea334e96Xigui Wang     */
28189be4f7c8a434378432d1a39850a3c9dea334e96Xigui Wang    int32_t mOutputDecoderBufferNum;
28225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    uint32_t mWidth;
28325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    uint32_t mHeight;
28425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    uint32_t mUseAndroidNativeBufferIndex;
28525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    uint32_t mStoreMetaDataInBuffersIndex;
286d6acef05e41af96ff00f2c579e3f9c96cb1a0530Xigui Wang    uint32_t mHackFormat;
28725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang
28825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    bool mUseAndroidNativeBuffer;
28925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    bool mUseAndroidNativeBuffer2;
29025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang
29125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    bool mVPPEnabled;
29225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    bool mVPPOn;
29325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    bool mVPPFlushing;
294e5aad73d4992d6c8fbd9e9e3c9cc89abfc83b775Xigui Wang    bool mOutputCropChanged;
29525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    bool mInitialized;
29625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#ifdef TARGET_VPP_USE_GEN
29725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    // vpp thread
29825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    sp<ISVProcessor> mProcThread;
29925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#else
30025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    static sp<ISVProcessor> mProcThread;
30125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#endif
30225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    // protect create mProcThread instance
30325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    bool mOwnProcessor;
30425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang    static pthread_mutex_t ProcThreadInstanceLock;
30589be4f7c8a434378432d1a39850a3c9dea334e96Xigui Wang    Mutex mDecoderBufLock;
30625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang};
30725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang
30825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#endif  // #define ISV_OMXCOMPONENT_H_
309