120fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu/*
22f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu * componentbase.h, component base class
330bd6062e4b295f5f7bcaeb98165065310d29269Ho-Eun Ryu *
42f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu * Copyright (c) 2009-2010 Wind River Systems, Inc.
52f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu *
62f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu * Licensed under the Apache License, Version 2.0 (the "License");
72f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu * you may not use this file except in compliance with the License.
82f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu * You may obtain a copy of the License at
92f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu *
102f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu * http://www.apache.org/licenses/LICENSE-2.0
112f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu *
122f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu * Unless required by applicable law or agreed to in writing, software
132f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu * distributed under the License is distributed on an "AS IS" BASIS,
142f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
152f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu * See the License for the specific language governing permissions and
162f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu * limitations under the License.
1720fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu */
1820fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu
1920fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu#ifndef __COMPONENTBASE_H
2020fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu#define __COMPONENTBASE_H
2120fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu
2220fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu#include <OMX_Core.h>
2320fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu#include <OMX_Component.h>
245ab2f45a95344b12cad43f277a730c8679b42171Dan Liang#include <OMX_IntelIndexExt.h>
2520fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu#include <cmodule.h>
265ab694059dd6abe79303fdf2712a974d9d2e29d4Ho-Eun Ryu#include <portbase.h>
2720fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu
2820fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu#include <queue.h>
29cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu#include <workqueue.h>
3020fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu
31f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu/* retain buffers */
32f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryutypedef enum buffer_retain_e {
33f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu    BUFFER_RETAIN_NOT_RETAIN = 0,
34f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu    BUFFER_RETAIN_GETAGAIN,
35f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu    BUFFER_RETAIN_ACCUMULATE,
36705c231d1e4ff148d8cec637288d9ad41429f0e3Weian Chen    BUFFER_RETAIN_OVERRIDDEN,
3785d33bdb86649f8daa474948f3224cc0a6c160ceZhao Liang    BUFFER_RETAIN_CACHE,
38f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu} buffer_retain_t;
39f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu
40cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu/* ProcessCmdWork */
41cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryustruct cmd_s {
42cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu    OMX_COMMANDTYPE cmd;
43cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu    OMX_U32 param1;
44cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu    OMX_PTR cmddata;
45cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu};
46cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu
47cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryuclass CmdHandlerInterface
48cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu{
49cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryupublic:
50cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu    virtual ~CmdHandlerInterface() {};
51cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu    virtual void CmdHandler(struct cmd_s *cmd) = 0;
52cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu};
53cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu
54cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryuclass CmdProcessWork : public WorkableInterface
55cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu{
56cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryupublic:
57cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu    CmdProcessWork(CmdHandlerInterface *ci);
58cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu    ~CmdProcessWork();
59cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu
60cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu    OMX_ERRORTYPE PushCmdQueue(struct cmd_s *cmd);
61cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu
62cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryuprivate:
63cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu    struct cmd_s *PopCmdQueue(void);
64cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu
65cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu    virtual void Work(void); /* call ci->CmdHandler() */
66cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu
67cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu    WorkQueue *workq;
68cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu
69cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu    struct queue q;
70cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu    pthread_mutex_t lock;
71cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu
72cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu    CmdHandlerInterface *ci; /* to run ComponentBase::CmdHandler() */
73cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu};
74cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu
7522d9fa5479b936d58d92f54d16560d0f9f15d5b3Ho-Eun Ryuclass ComponentBase : public CmdHandlerInterface, public WorkableInterface
7620fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu{
7720fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryupublic:
7820fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu    /*
7920fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu     * constructor & destructor
8020fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu     */
8120fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu    ComponentBase();
8220fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu    ComponentBase(const OMX_STRING name);
8320fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu    virtual ~ComponentBase();
8420fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu
8520fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu    /*
8620fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu     * accessor
8720fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu     */
8820fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu    /* name */
8920fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu    void SetName(const OMX_STRING name);
903f7ceee13aa17ae32d4263aed2ce67eb9a37c58bywan    OMX_STRING GetName(void);
9120fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu
92656e873cff82a7d22ca3145dc1c8e041d95a1642Ho-Eun Ryu    /* working role */
933f7ceee13aa17ae32d4263aed2ce67eb9a37c58bywan    OMX_STRING GetWorkingRole(void);
94656e873cff82a7d22ca3145dc1c8e041d95a1642Ho-Eun Ryu
9520fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu    /* cmodule */
9620fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu    void SetCModule(CModule *cmodule);
9720fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu    CModule *GetCModule(void);
9820fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu
9920fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu    /* end of accessor */
10020fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu
10120fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu    /*
1029b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu     * core methods & helpers
1039b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu     */
1049b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu    /* roles */
1059b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu    OMX_ERRORTYPE SetRolesOfComponent(OMX_U32 nr_roles, const OMX_U8 **roles);
1069b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu
1073ee08716991119e541a439811c8c74988d7be754Ho-Eun Ryu    /* GetHandle & FreeHandle */
1083ee08716991119e541a439811c8c74988d7be754Ho-Eun Ryu    OMX_ERRORTYPE GetHandle(OMX_HANDLETYPE* pHandle,
1093ee08716991119e541a439811c8c74988d7be754Ho-Eun Ryu                            OMX_PTR pAppData,
1103ee08716991119e541a439811c8c74988d7be754Ho-Eun Ryu                            OMX_CALLBACKTYPE *pCallBacks);
1113ee08716991119e541a439811c8c74988d7be754Ho-Eun Ryu    OMX_ERRORTYPE FreeHandle(OMX_HANDLETYPE hComponent);
1123ee08716991119e541a439811c8c74988d7be754Ho-Eun Ryu
1139b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu    /* end of core methods & helpers */
1149b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu
1159b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu    /*
11620fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu     * component methods & helpers
11720fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu     */
11820fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu
11920fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu    static OMX_ERRORTYPE SendCommand(
12020fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu        OMX_IN  OMX_HANDLETYPE hComponent,
12120fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu        OMX_IN  OMX_COMMANDTYPE Cmd,
12220fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu        OMX_IN  OMX_U32 nParam1,
12320fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu        OMX_IN  OMX_PTR pCmdData);
12420fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu    OMX_ERRORTYPE CBaseSendCommand(
12520fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu        OMX_IN  OMX_HANDLETYPE hComponent,
12620fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu        OMX_IN  OMX_COMMANDTYPE Cmd,
12720fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu        OMX_IN  OMX_U32 nParam1,
12820fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu        OMX_IN  OMX_PTR pCmdData);
12920fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu
13020fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu    static OMX_ERRORTYPE GetParameter(
13120fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu        OMX_IN  OMX_HANDLETYPE hComponent,
13220fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu        OMX_IN  OMX_INDEXTYPE nParamIndex,
13320fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu        OMX_INOUT OMX_PTR pComponentParameterStructure);
13420fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu    OMX_ERRORTYPE CBaseGetParameter(
13520fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu        OMX_IN  OMX_HANDLETYPE hComponent,
13620fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu        OMX_IN  OMX_INDEXTYPE nParamIndex,
13720fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu        OMX_INOUT OMX_PTR pComponentParameterStructure);
13820fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu
13920fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu    static OMX_ERRORTYPE SetParameter(
14020fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu        OMX_IN  OMX_HANDLETYPE hComponent,
14120fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu        OMX_IN  OMX_INDEXTYPE nIndex,
14220fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu        OMX_IN  OMX_PTR pComponentParameterStructure);
14320fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu    OMX_ERRORTYPE CBaseSetParameter(
14420fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu        OMX_IN  OMX_HANDLETYPE hComponent,
14520fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu        OMX_IN  OMX_INDEXTYPE nIndex,
14620fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu        OMX_IN  OMX_PTR pComponentParameterStructure);
14720fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu
14820fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu    static OMX_ERRORTYPE GetConfig(
14920fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu        OMX_IN  OMX_HANDLETYPE hComponent,
15020fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu        OMX_IN  OMX_INDEXTYPE nIndex,
15120fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu        OMX_INOUT OMX_PTR pComponentConfigStructure);
15220fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu    OMX_ERRORTYPE CBaseGetConfig(
15320fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu        OMX_IN  OMX_HANDLETYPE hComponent,
15420fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu        OMX_IN  OMX_INDEXTYPE nIndex,
15520fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu        OMX_INOUT OMX_PTR pComponentConfigStructure);
15620fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu
15720fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu    static OMX_ERRORTYPE SetConfig(
15820fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu        OMX_IN  OMX_HANDLETYPE hComponent,
15920fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu        OMX_IN  OMX_INDEXTYPE nIndex,
16020fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu        OMX_IN  OMX_PTR pComponentConfigStructure);
16120fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu    OMX_ERRORTYPE CBaseSetConfig(
16220fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu        OMX_IN  OMX_HANDLETYPE hComponent,
16320fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu        OMX_IN  OMX_INDEXTYPE nIndex,
16420fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu        OMX_IN  OMX_PTR pComponentConfigStructure);
16520fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu
16620fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu    static OMX_ERRORTYPE GetExtensionIndex(
16720fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu        OMX_IN  OMX_HANDLETYPE hComponent,
16820fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu        OMX_IN  OMX_STRING cParameterName,
16920fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu        OMX_OUT OMX_INDEXTYPE* pIndexType);
17020fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu    OMX_ERRORTYPE CBaseGetExtensionIndex(
17120fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu        OMX_IN  OMX_HANDLETYPE hComponent,
17220fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu        OMX_IN  OMX_STRING cParameterName,
17320fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu        OMX_OUT OMX_INDEXTYPE* pIndexType);
17420fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu
17520fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu    static OMX_ERRORTYPE GetState(
17620fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu        OMX_IN  OMX_HANDLETYPE hComponent,
17720fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu        OMX_OUT OMX_STATETYPE* pState);
17820fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu    OMX_ERRORTYPE CBaseGetState(
17920fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu        OMX_IN  OMX_HANDLETYPE hComponent,
18020fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu        OMX_OUT OMX_STATETYPE* pState);
18120fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu
18220fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu    static OMX_ERRORTYPE UseBuffer(
18320fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu        OMX_IN OMX_HANDLETYPE hComponent,
18420fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu        OMX_INOUT OMX_BUFFERHEADERTYPE** ppBufferHdr,
18520fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu        OMX_IN OMX_U32 nPortIndex,
18620fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu        OMX_IN OMX_PTR pAppPrivate,
18720fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu        OMX_IN OMX_U32 nSizeBytes,
18820fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu        OMX_IN OMX_U8* pBuffer);
18920fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu    OMX_ERRORTYPE CBaseUseBuffer(
19020fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu        OMX_IN OMX_HANDLETYPE hComponent,
19120fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu        OMX_INOUT OMX_BUFFERHEADERTYPE** ppBufferHdr,
19220fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu        OMX_IN OMX_U32 nPortIndex,
19320fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu        OMX_IN OMX_PTR pAppPrivate,
19420fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu        OMX_IN OMX_U32 nSizeBytes,
19520fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu        OMX_IN OMX_U8* pBuffer);
19620fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu
19720fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu    static OMX_ERRORTYPE AllocateBuffer(
19820fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu        OMX_IN OMX_HANDLETYPE hComponent,
19920fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu        OMX_INOUT OMX_BUFFERHEADERTYPE** ppBuffer,
20020fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu        OMX_IN OMX_U32 nPortIndex,
20120fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu        OMX_IN OMX_PTR pAppPrivate,
20220fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu        OMX_IN OMX_U32 nSizeBytes);
20320fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu    OMX_ERRORTYPE CBaseAllocateBuffer(
20420fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu        OMX_IN OMX_HANDLETYPE hComponent,
20520fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu        OMX_INOUT OMX_BUFFERHEADERTYPE** ppBuffer,
20620fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu        OMX_IN OMX_U32 nPortIndex,
20720fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu        OMX_IN OMX_PTR pAppPrivate,
20820fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu        OMX_IN OMX_U32 nSizeBytes);
20920fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu
21020fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu    static OMX_ERRORTYPE FreeBuffer(
21120fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu        OMX_IN  OMX_HANDLETYPE hComponent,
21220fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu        OMX_IN  OMX_U32 nPortIndex,
21320fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu        OMX_IN  OMX_BUFFERHEADERTYPE* pBuffer);
21420fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu    OMX_ERRORTYPE CBaseFreeBuffer(
21520fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu        OMX_IN  OMX_HANDLETYPE hComponent,
21620fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu        OMX_IN  OMX_U32 nPortIndex,
21720fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu        OMX_IN  OMX_BUFFERHEADERTYPE* pBuffer);
21820fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu
21920fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu    static OMX_ERRORTYPE EmptyThisBuffer(
22020fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu        OMX_IN  OMX_HANDLETYPE hComponent,
22120fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu        OMX_IN  OMX_BUFFERHEADERTYPE* pBuffer);
22220fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu    OMX_ERRORTYPE CBaseEmptyThisBuffer(
22320fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu        OMX_IN  OMX_HANDLETYPE hComponent,
22420fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu        OMX_IN  OMX_BUFFERHEADERTYPE* pBuffer);
22520fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu
22620fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu    static OMX_ERRORTYPE FillThisBuffer(
22720fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu        OMX_IN  OMX_HANDLETYPE hComponent,
22820fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu        OMX_IN  OMX_BUFFERHEADERTYPE* pBuffer);
22920fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu    OMX_ERRORTYPE CBaseFillThisBuffer(
23020fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu        OMX_IN  OMX_HANDLETYPE hComponent,
23120fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu        OMX_IN  OMX_BUFFERHEADERTYPE* pBuffer);
23220fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu
23320fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu    static OMX_ERRORTYPE SetCallbacks(
23420fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu        OMX_IN  OMX_HANDLETYPE hComponent,
23520fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu        OMX_IN  OMX_CALLBACKTYPE* pCallbacks,
23620fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu        OMX_IN  OMX_PTR pAppData);
23720fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu    OMX_ERRORTYPE CBaseSetCallbacks(
23820fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu        OMX_IN  OMX_HANDLETYPE hComponent,
23920fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu        OMX_IN  OMX_CALLBACKTYPE* pCallbacks,
24020fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu        OMX_IN  OMX_PTR pAppData);
24120fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu
24220fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu    static OMX_ERRORTYPE ComponentRoleEnum(
24320fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu        OMX_IN OMX_HANDLETYPE hComponent,
24420fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu        OMX_OUT OMX_U8 *cRole,
24520fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu        OMX_IN OMX_U32 nIndex);
24620fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu    OMX_ERRORTYPE CBaseComponentRoleEnum(
24720fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu        OMX_IN OMX_HANDLETYPE hComponent,
24820fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu        OMX_OUT OMX_U8 *cRole,
24920fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu        OMX_IN OMX_U32 nIndex);
25020fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu
25120fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu    /* end of component methods & helpers */
25220fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu
25320fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu    /*
25420fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu     * omx header manipuation
25520fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu     */
256074aeb8c3193c729c3e1050b970a2315608d0a24Ho-Eun Ryu    static void SetTypeHeader(OMX_PTR type, OMX_U32 size);
257dfaf4e141f33555032cc66b3810eba741a589288Ho-Eun Ryu    static OMX_ERRORTYPE CheckTypeHeader(const OMX_PTR type, OMX_U32 size);
25820fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu
25920fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu    /* end of omx header manipuation */
26020fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu
261c127caa3755f46f028fe7ec6e7ab02cf33238f62Ho-Eun Ryu    /*
262c127caa3755f46f028fe7ec6e7ab02cf33238f62Ho-Eun Ryu     * helper method for queury_roles()
263c127caa3755f46f028fe7ec6e7ab02cf33238f62Ho-Eun Ryu     */
264c127caa3755f46f028fe7ec6e7ab02cf33238f62Ho-Eun Ryu    static OMX_ERRORTYPE QueryRolesHelper(OMX_U32 nr_comp_roles,
265c127caa3755f46f028fe7ec6e7ab02cf33238f62Ho-Eun Ryu                                          const OMX_U8 **comp_roles,
266c127caa3755f46f028fe7ec6e7ab02cf33238f62Ho-Eun Ryu                                          OMX_U32 *nr_roles, OMX_U8 **roles);
267c127caa3755f46f028fe7ec6e7ab02cf33238f62Ho-Eun Ryu
268c127caa3755f46f028fe7ec6e7ab02cf33238f62Ho-Eun Ryu    /* end of helper method for queury_roles() */
269c127caa3755f46f028fe7ec6e7ab02cf33238f62Ho-Eun Ryu
270074aeb8c3193c729c3e1050b970a2315608d0a24Ho-Eun Ryuprotected:
27127cb7aad256077ad50541fb08c675b257ec76626Ho-Eun Ryu    /* helpers for derived class */
27269d34dfb7d76cbdd1bd0f0b4b7cb1f2267f5002aHo-Eun Ryu    const OMX_COMPONENTTYPE *GetComponentHandle(void);
273ec2f29d0c23a6c7ea3a36e03a9635b63ac23ae35XiaoFeng#if 0
274dd0f8243514bd9380e5172ba883e488bcf65dcc9Ho-Eun Ryu    void DumpBuffer(const OMX_BUFFERHEADERTYPE *bufferheader, bool dumpdata);
275ec2f29d0c23a6c7ea3a36e03a9635b63ac23ae35XiaoFeng#endif
276705c231d1e4ff148d8cec637288d9ad41429f0e3Weian Chen    /* check if all port has own pending buffer */
277705c231d1e4ff148d8cec637288d9ad41429f0e3Weian Chen    virtual bool IsAllBufferAvailable(void);
278705c231d1e4ff148d8cec637288d9ad41429f0e3Weian Chen
27927cb7aad256077ad50541fb08c675b257ec76626Ho-Eun Ryu    /* end of helpers for derived class */
28027cb7aad256077ad50541fb08c675b257ec76626Ho-Eun Ryu
2815ab694059dd6abe79303fdf2712a974d9d2e29d4Ho-Eun Ryu    /* ports */
2825ab694059dd6abe79303fdf2712a974d9d2e29d4Ho-Eun Ryu    /*
2835ab694059dd6abe79303fdf2712a974d9d2e29d4Ho-Eun Ryu     * allocated with derived port classes by derived component classes
2845ab694059dd6abe79303fdf2712a974d9d2e29d4Ho-Eun Ryu     */
2855ab694059dd6abe79303fdf2712a974d9d2e29d4Ho-Eun Ryu    PortBase **ports;
2865ab694059dd6abe79303fdf2712a974d9d2e29d4Ho-Eun Ryu    OMX_U32 nr_ports;
2875ab694059dd6abe79303fdf2712a974d9d2e29d4Ho-Eun Ryu    OMX_PORT_PARAM_TYPE portparam;
2885ab694059dd6abe79303fdf2712a974d9d2e29d4Ho-Eun Ryu
28922d9fa5479b936d58d92f54d16560d0f9f15d5b3Ho-Eun Ryu    /* ports big lock, must be held when accessing all ports at one time */
29022d9fa5479b936d58d92f54d16560d0f9f15d5b3Ho-Eun Ryu    pthread_mutex_t ports_block;
29122d9fa5479b936d58d92f54d16560d0f9f15d5b3Ho-Eun Ryu
292b7e8facd37fe0d46e8f6ff6527e4f2c4f90565caDan Liang    /* adaptive playback param */
293b7e8facd37fe0d46e8f6ff6527e4f2c4f90565caDan Liang    OMX_BOOL mEnableAdaptivePlayback;
29420fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryuprivate:
29520fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu    /* common routines for constructor */
29620fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu    void __ComponentBase(void);
29720fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu
2983ee08716991119e541a439811c8c74988d7be754Ho-Eun Ryu    /*
2993ee08716991119e541a439811c8c74988d7be754Ho-Eun Ryu     * core methods & helpers
3003ee08716991119e541a439811c8c74988d7be754Ho-Eun Ryu     */
3015f3dea3773e2a740d6389e9f0de70d3078c0dcc8Ho-Eun Ryu    /* called in GetHandle (nr_roles == 1) or SetParameter(ComponentRole) */
3025f3dea3773e2a740d6389e9f0de70d3078c0dcc8Ho-Eun Ryu    OMX_ERRORTYPE SetWorkingRole(const OMX_STRING role);
3035995aef03a789309fef914febc0bc6beb2d926f2Ho-Eun Ryu    /* called int FreeHandle() */
3045995aef03a789309fef914febc0bc6beb2d926f2Ho-Eun Ryu    OMX_ERRORTYPE FreePorts(void);
3055995aef03a789309fef914febc0bc6beb2d926f2Ho-Eun Ryu
3063ee08716991119e541a439811c8c74988d7be754Ho-Eun Ryu    /* end of core methods & helpers */
3073ee08716991119e541a439811c8c74988d7be754Ho-Eun Ryu
308cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu    /*
309cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu     * component methods & helpers
310cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu     */
311cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu    /* SendCommand */
312cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu    /* implement CmdHandlerInterface */
313cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu    virtual void CmdHandler(struct cmd_s *cmd);
314cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu
315abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu    /* SendCommand:OMX_CommandStateSet */
316abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu    /* called in CmdHandler() thread context or by component itself */
317abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu    void TransState(OMX_STATETYPE transition);
318abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu    inline OMX_ERRORTYPE TransStateToLoaded(OMX_STATETYPE current);
319abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu    inline OMX_ERRORTYPE TransStateToIdle(OMX_STATETYPE current);
320abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu    inline OMX_ERRORTYPE TransStateToExecuting(OMX_STATETYPE current);
321abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu    inline OMX_ERRORTYPE TransStateToPause(OMX_STATETYPE current);
322abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu    inline OMX_ERRORTYPE TransStateToWaitForResources(OMX_STATETYPE current);
323abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu    inline OMX_ERRORTYPE TransStateToInvalid(OMX_STATETYPE current);
324abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu
325118bba9d4dd9906f3d73713c931a3be3df9f2694Ho-Eun Ryu    /* called in TransStateToIdle(Loaded) */
326118bba9d4dd9906f3d73713c931a3be3df9f2694Ho-Eun Ryu    OMX_ERRORTYPE ApplyWorkingRole(void);
327118bba9d4dd9906f3d73713c931a3be3df9f2694Ho-Eun Ryu    /* called in ApplyWorkingRole() */
328118bba9d4dd9906f3d73713c931a3be3df9f2694Ho-Eun Ryu    OMX_ERRORTYPE AllocatePorts(void);
329118bba9d4dd9906f3d73713c931a3be3df9f2694Ho-Eun Ryu    /* allocate specific port type derived from portbase */
330118bba9d4dd9906f3d73713c931a3be3df9f2694Ho-Eun Ryu    virtual OMX_ERRORTYPE ComponentAllocatePorts(void) = 0;
331118bba9d4dd9906f3d73713c931a3be3df9f2694Ho-Eun Ryu
332d2d7fc5745af2532cd7aaf9bd88148cf29501900Ho-Eun Ryu    /* SendCommand:OMX_CommandMarkBuffer */
333d2d7fc5745af2532cd7aaf9bd88148cf29501900Ho-Eun Ryu    /* called in CmdHandler() thread context */
334d2d7fc5745af2532cd7aaf9bd88148cf29501900Ho-Eun Ryu    void PushThisMark(OMX_U32 portindex, OMX_MARKTYPE *mark);
335dcf05c3d6a37bf9a3b09de2428a18d7f82b8204dHo-Eun Ryu    /* SendCommand:OMX_CommandFlush (notify:1) or other parts (notify:0) */
336dcf05c3d6a37bf9a3b09de2428a18d7f82b8204dHo-Eun Ryu    void FlushPort(OMX_U32 port_index, bool notify);
337b7ca9a1a868348e9234c9aee022929c9b3267e4dHo-Eun Ryu    /* SendCommand:OMX_CommandPortDisable/Enable */
338b7ca9a1a868348e9234c9aee022929c9b3267e4dHo-Eun Ryu    /* state: PortBase::OMX_PortEnabled/Disabled */
339b7ca9a1a868348e9234c9aee022929c9b3267e4dHo-Eun Ryu    void TransStatePort(OMX_U32 port_index, OMX_U8 state);
340b7ca9a1a868348e9234c9aee022929c9b3267e4dHo-Eun Ryu
341d8b921cd23e85c61acf2422a617943ac378cccc4Ho-Eun Ryu    /* Get/SetParameter */
342d8b921cd23e85c61acf2422a617943ac378cccc4Ho-Eun Ryu    virtual OMX_ERRORTYPE
343d8b921cd23e85c61acf2422a617943ac378cccc4Ho-Eun Ryu        ComponentGetParameter(OMX_INDEXTYPE nParamIndex,
344d8b921cd23e85c61acf2422a617943ac378cccc4Ho-Eun Ryu                              OMX_PTR pComponentParameterStructure) = 0;
345d8b921cd23e85c61acf2422a617943ac378cccc4Ho-Eun Ryu    virtual OMX_ERRORTYPE
346d8b921cd23e85c61acf2422a617943ac378cccc4Ho-Eun Ryu        ComponentSetParameter(OMX_INDEXTYPE nIndex,
347d8b921cd23e85c61acf2422a617943ac378cccc4Ho-Eun Ryu                              OMX_PTR pComponentParameterStructure) = 0;
348d8b921cd23e85c61acf2422a617943ac378cccc4Ho-Eun Ryu
349e3be2d84503a7693ece53adbcf26ee243eea1b87Ho-Eun Ryu    /* Get/SetConfig */
350e3be2d84503a7693ece53adbcf26ee243eea1b87Ho-Eun Ryu    virtual OMX_ERRORTYPE
351e3be2d84503a7693ece53adbcf26ee243eea1b87Ho-Eun Ryu        ComponentGetConfig(OMX_INDEXTYPE nIndex,
352e3be2d84503a7693ece53adbcf26ee243eea1b87Ho-Eun Ryu                           OMX_PTR pComponentConfigStructure) = 0;
353e3be2d84503a7693ece53adbcf26ee243eea1b87Ho-Eun Ryu    virtual OMX_ERRORTYPE
354e3be2d84503a7693ece53adbcf26ee243eea1b87Ho-Eun Ryu        ComponentSetConfig(OMX_INDEXTYPE nIndex,
355e3be2d84503a7693ece53adbcf26ee243eea1b87Ho-Eun Ryu                           OMX_PTR pComponentConfigStructure) = 0;
356e3be2d84503a7693ece53adbcf26ee243eea1b87Ho-Eun Ryu
3579efecd18c0d29b883f22cbd54aa4a51ca158040dHo-Eun Ryu    /* buffer processing */
3589efecd18c0d29b883f22cbd54aa4a51ca158040dHo-Eun Ryu    /* implement WorkableInterface */
3599efecd18c0d29b883f22cbd54aa4a51ca158040dHo-Eun Ryu    virtual void Work(void); /* handle this->ports, hold ports_block */
360f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu
3617036eb904f03a68a182222e5c8148163dc0f1ad7Ho-Eun Ryu    /* called in Work() after ProcessorProcess() */
36234277d8b1ca48a932e7b17ba331c29f040ba0838xiao    void PostProcessBuffers(OMX_BUFFERHEADERTYPE ***buffers,
363f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu                            const buffer_retain_t *retain);
3643f7ceee13aa17ae32d4263aed2ce67eb9a37c58bywan    void SourcePostProcessBuffers(OMX_BUFFERHEADERTYPE ***buffers);
36534277d8b1ca48a932e7b17ba331c29f040ba0838xiao    void FilterPostProcessBuffers(OMX_BUFFERHEADERTYPE ***buffers,
366f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu                                  const buffer_retain_t *retain);
3673f7ceee13aa17ae32d4263aed2ce67eb9a37c58bywan    void SinkPostProcessBuffers();
3689efecd18c0d29b883f22cbd54aa4a51ca158040dHo-Eun Ryu
3697ca8edc2e24fcee5fbaa5406bc966494d13ac1b4Ho-Eun Ryu    /* processor callbacks */
3707ca8edc2e24fcee5fbaa5406bc966494d13ac1b4Ho-Eun Ryu    /* TransState */
3717ca8edc2e24fcee5fbaa5406bc966494d13ac1b4Ho-Eun Ryu    virtual OMX_ERRORTYPE ProcessorInit(void);  /* Loaded to Idle */
3727ca8edc2e24fcee5fbaa5406bc966494d13ac1b4Ho-Eun Ryu    virtual OMX_ERRORTYPE ProcessorDeinit(void);/* Idle to Loaded */
3737ca8edc2e24fcee5fbaa5406bc966494d13ac1b4Ho-Eun Ryu    virtual OMX_ERRORTYPE ProcessorStart(void); /* Idle to Executing/Pause */
374ecc877a1dd44921dff3f300bc5559841f0c44ac6ywan    virtual OMX_ERRORTYPE ProcessorReset(void); /* Reset */
3757ca8edc2e24fcee5fbaa5406bc966494d13ac1b4Ho-Eun Ryu    virtual OMX_ERRORTYPE ProcessorStop(void);  /* Executing/Pause to Idle */
3767ca8edc2e24fcee5fbaa5406bc966494d13ac1b4Ho-Eun Ryu    virtual OMX_ERRORTYPE ProcessorPause(void); /* Executing to Pause */
3777ca8edc2e24fcee5fbaa5406bc966494d13ac1b4Ho-Eun Ryu    virtual OMX_ERRORTYPE ProcessorResume(void);/* Pause to Executing */
378ac3429dfacf1c5a03889558006f2af0d40a7bfe8Tao Tao    virtual OMX_ERRORTYPE ProcessorFlush(OMX_U32 port_index); /* Flush */
379705c231d1e4ff148d8cec637288d9ad41429f0e3Weian Chen    virtual OMX_ERRORTYPE ProcessorPreFillBuffer(OMX_BUFFERHEADERTYPE* buffer);
38085d33bdb86649f8daa474948f3224cc0a6c160ceZhao Liang    virtual OMX_ERRORTYPE ProcessorPreEmptyBuffer(OMX_BUFFERHEADERTYPE* buffer);
38157fbad335bcd1fc0b12cea2e58586015cec7b571xiao
38257fbad335bcd1fc0b12cea2e58586015cec7b571xiao    /* invoked when buffer is to be freed */
38357fbad335bcd1fc0b12cea2e58586015cec7b571xiao    virtual OMX_ERRORTYPE ProcessorPreFreeBuffer(OMX_U32 nPortIndex, OMX_BUFFERHEADERTYPE* pBuffer);
3847ca8edc2e24fcee5fbaa5406bc966494d13ac1b4Ho-Eun Ryu    /* Work */
38534277d8b1ca48a932e7b17ba331c29f040ba0838xiao    virtual OMX_ERRORTYPE ProcessorProcess(OMX_BUFFERHEADERTYPE ***pBuffers,
38634277d8b1ca48a932e7b17ba331c29f040ba0838xiao                                           buffer_retain_t *retain,
38734277d8b1ca48a932e7b17ba331c29f040ba0838xiao                                           OMX_U32 nr_buffers);
38834277d8b1ca48a932e7b17ba331c29f040ba0838xiao    virtual OMX_ERRORTYPE ProcessorProcess(OMX_BUFFERHEADERTYPE **pBuffers,
38922c02021e7be74c6636353ad0b62f60278a695c8Ho-Eun Ryu                                           buffer_retain_t *retain,
39034277d8b1ca48a932e7b17ba331c29f040ba0838xiao                                           OMX_U32 nr_buffers);
3917ca8edc2e24fcee5fbaa5406bc966494d13ac1b4Ho-Eun Ryu
392d8b921cd23e85c61acf2422a617943ac378cccc4Ho-Eun Ryu    /* end of component methods & helpers */
393d8b921cd23e85c61acf2422a617943ac378cccc4Ho-Eun Ryu
394cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu    /* process component's commands work */
395cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu    CmdProcessWork *cmdwork;
396cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu
39722d9fa5479b936d58d92f54d16560d0f9f15d5b3Ho-Eun Ryu    /* buffer processing work */
39822d9fa5479b936d58d92f54d16560d0f9f15d5b3Ho-Eun Ryu    WorkQueue *bufferwork;
39922d9fa5479b936d58d92f54d16560d0f9f15d5b3Ho-Eun Ryu
400f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu    /* component variant */
401f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu    typedef enum component_variant_e {
402f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu        CVARIANT_NULL = 0,
403f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu        CVARIANT_SOURCE,
404f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu        CVARIANT_FILTER,
405f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu        CVARIANT_SINK,
406f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu    } component_variant_t;
407f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu
408f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu    component_variant_t cvariant;
409f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu
41020fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu    /* roles */
41120fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu    OMX_U8 **roles;
41220fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu    OMX_U32 nr_roles;
41320fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu
4145f3dea3773e2a740d6389e9f0de70d3078c0dcc8Ho-Eun Ryu    OMX_STRING working_role;
4155f3dea3773e2a740d6389e9f0de70d3078c0dcc8Ho-Eun Ryu
41669d34dfb7d76cbdd1bd0f0b4b7cb1f2267f5002aHo-Eun Ryu    /* omx standard handle */
41769d34dfb7d76cbdd1bd0f0b4b7cb1f2267f5002aHo-Eun Ryu    /* allocated at GetHandle, freed at FreeHandle */
41869d34dfb7d76cbdd1bd0f0b4b7cb1f2267f5002aHo-Eun Ryu    OMX_COMPONENTTYPE *handle;
41969d34dfb7d76cbdd1bd0f0b4b7cb1f2267f5002aHo-Eun Ryu
42020fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu    /* component module */
42120fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu    CModule *cmodule;
42220fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu
423abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu    OMX_STATETYPE state;
424abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu
425abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu    const static OMX_STATETYPE OMX_StateUnloaded = OMX_StateVendorStartUnused;
426abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu
4273ee08716991119e541a439811c8c74988d7be754Ho-Eun Ryu    /* omx standard callbacks */
4283ee08716991119e541a439811c8c74988d7be754Ho-Eun Ryu    OMX_PTR appdata;
4293ee08716991119e541a439811c8c74988d7be754Ho-Eun Ryu    OMX_CALLBACKTYPE *callbacks;
4303ee08716991119e541a439811c8c74988d7be754Ho-Eun Ryu
43120fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu    /* component name */
43220fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu    char name[OMX_MAX_STRINGNAME_SIZE];
43320fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu
434d438ab4e1c4dde0b5e0aa7c44186137b2d2adaa5Gu, Wangyi    /* state lock */
435d438ab4e1c4dde0b5e0aa7c44186137b2d2adaa5Gu, Wangyi    pthread_mutex_t state_block;
436d438ab4e1c4dde0b5e0aa7c44186137b2d2adaa5Gu, Wangyi
437c87a1a8f47c29d4eddf1ea0093c32b8eee04a239ywan    OMX_U32 mMaxFrameWidth;
438c87a1a8f47c29d4eddf1ea0093c32b8eee04a239ywan    OMX_U32 mMaxFrameHeight;
439c87a1a8f47c29d4eddf1ea0093c32b8eee04a239ywan
44020fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu    /* omx specification version */
441302f566a7f78515edc0b4e433e358c7eeba7fbd1Ho-Eun Ryu#ifndef ANDROID
44220fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu    const static OMX_U8 OMX_SPEC_VERSION_MAJOR = 1;
44320fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu    const static OMX_U8 OMX_SPEC_VERSION_MINOR = 1;
444302f566a7f78515edc0b4e433e358c7eeba7fbd1Ho-Eun Ryu    const static OMX_U8 OMX_SPEC_VERSION_REVISION = 2;
445302f566a7f78515edc0b4e433e358c7eeba7fbd1Ho-Eun Ryu    const static OMX_U8 OMX_SPEC_VERSION_STEP = 0;
446302f566a7f78515edc0b4e433e358c7eeba7fbd1Ho-Eun Ryu#else
447302f566a7f78515edc0b4e433e358c7eeba7fbd1Ho-Eun Ryu    const static OMX_U8 OMX_SPEC_VERSION_MAJOR = 1;
448302f566a7f78515edc0b4e433e358c7eeba7fbd1Ho-Eun Ryu    const static OMX_U8 OMX_SPEC_VERSION_MINOR = 0;
44920fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu    const static OMX_U8 OMX_SPEC_VERSION_REVISION = 0;
45020fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu    const static OMX_U8 OMX_SPEC_VERSION_STEP = 0;
451302f566a7f78515edc0b4e433e358c7eeba7fbd1Ho-Eun Ryu#endif
45220fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu
45320fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu    const static OMX_U32 OMX_SPEC_VERSION = 0
454c198aa03548b9a81d46c31ddc2bebf37268ffe19Ho-Eun Ryu        | (OMX_SPEC_VERSION_MAJOR << 0)
455c198aa03548b9a81d46c31ddc2bebf37268ffe19Ho-Eun Ryu        | (OMX_SPEC_VERSION_MINOR << 8)
456c198aa03548b9a81d46c31ddc2bebf37268ffe19Ho-Eun Ryu        | (OMX_SPEC_VERSION_REVISION << 16)
457c198aa03548b9a81d46c31ddc2bebf37268ffe19Ho-Eun Ryu        | (OMX_SPEC_VERSION_STEP << 24);
45820fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu};
45922d9fa5479b936d58d92f54d16560d0f9f15d5b3Ho-Eun Ryu
46022d9fa5479b936d58d92f54d16560d0f9f15d5b3Ho-Eun Ryu#endif /* __COMPONENTBASE_H */
461