1bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber/*
2bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber * Copyright (C) 2011 The Android Open Source Project
3bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber *
4bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber * you may not use this file except in compliance with the License.
6bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber * You may obtain a copy of the License at
7bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber *
8bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
9bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber *
10bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber * Unless required by applicable law or agreed to in writing, software
11bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber * See the License for the specific language governing permissions and
14bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber * limitations under the License.
15bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber */
16bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber
17bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber#ifndef SIMPLE_SOFT_OMX_COMPONENT_H_
18bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber
19bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber#define SIMPLE_SOFT_OMX_COMPONENT_H_
20bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber
21bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber#include "SoftOMXComponent.h"
22bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber
23bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber#include <media/stagefright/foundation/AHandlerReflector.h>
24bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber#include <utils/RefBase.h>
25bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber#include <utils/threads.h>
26bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber#include <utils/Vector.h>
27bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber
28bbba88cb1bdc34705d1477208990a06904c022e7Andreas Hubernamespace android {
29bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber
30bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huberstruct ALooper;
31bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber
32bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huberstruct SimpleSoftOMXComponent : public SoftOMXComponent {
33bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    SimpleSoftOMXComponent(
34bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber            const char *name,
35bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber            const OMX_CALLBACKTYPE *callbacks,
36bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber            OMX_PTR appData,
37bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber            OMX_COMPONENTTYPE **component);
38bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber
395a65e30064dc8dffa4f3d868f1c46038972c40c5Andreas Huber    virtual void prepareForDestruction();
40bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber
41bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    void onMessageReceived(const sp<AMessage> &msg);
42bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber
43bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huberprotected:
44bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    struct BufferInfo {
45bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber        OMX_BUFFERHEADERTYPE *mHeader;
46bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber        bool mOwnedByUs;
47bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    };
48bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber
49bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    struct PortInfo {
50bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber        OMX_PARAM_PORTDEFINITIONTYPE mDef;
51bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber        Vector<BufferInfo> mBuffers;
52bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber        List<BufferInfo *> mQueue;
53bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber
54bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber        enum {
55bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber            NONE,
56bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber            DISABLING,
57bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber            ENABLING,
58bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber        } mTransition;
59bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    };
60bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber
61031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu    enum {
62031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu        kStoreMetaDataExtensionIndex = OMX_IndexVendorStartUnused + 1,
63031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu        kPrepareForAdaptivePlaybackIndex,
64031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu    };
65031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu
66bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    void addPort(const OMX_PARAM_PORTDEFINITIONTYPE &def);
67bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber
68bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    virtual OMX_ERRORTYPE internalGetParameter(
69bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber            OMX_INDEXTYPE index, OMX_PTR params);
70bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber
71bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    virtual OMX_ERRORTYPE internalSetParameter(
72bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber            OMX_INDEXTYPE index, const OMX_PTR params);
73bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber
74bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    virtual void onQueueFilled(OMX_U32 portIndex);
75bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    List<BufferInfo *> &getPortQueue(OMX_U32 portIndex);
76bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber
77bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    virtual void onPortFlushCompleted(OMX_U32 portIndex);
78bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    virtual void onPortEnableCompleted(OMX_U32 portIndex, bool enabled);
796fc72b01a3b67903b52f1d33b1ad5c960b5365f1Marco Nelissen    virtual void onReset();
80bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber
81bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    PortInfo *editPortInfo(OMX_U32 portIndex);
82bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber
83bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huberprivate:
84bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    enum {
85bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber        kWhatSendCommand,
86bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber        kWhatEmptyThisBuffer,
87bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber        kWhatFillThisBuffer,
88bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    };
89bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber
90bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    Mutex mLock;
91bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber
92bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    sp<ALooper> mLooper;
93bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    sp<AHandlerReflector<SimpleSoftOMXComponent> > mHandler;
94bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber
95bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    OMX_STATETYPE mState;
96bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    OMX_STATETYPE mTargetState;
97bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber
98bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    Vector<PortInfo> mPorts;
99bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber
100bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    bool isSetParameterAllowed(
101bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber            OMX_INDEXTYPE index, const OMX_PTR params) const;
102bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber
103bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    virtual OMX_ERRORTYPE sendCommand(
104bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber            OMX_COMMANDTYPE cmd, OMX_U32 param, OMX_PTR data);
105bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber
106bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    virtual OMX_ERRORTYPE getParameter(
107bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber            OMX_INDEXTYPE index, OMX_PTR params);
108bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber
109bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    virtual OMX_ERRORTYPE setParameter(
110bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber            OMX_INDEXTYPE index, const OMX_PTR params);
111bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber
112bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    virtual OMX_ERRORTYPE useBuffer(
113bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber            OMX_BUFFERHEADERTYPE **buffer,
114bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber            OMX_U32 portIndex,
115bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber            OMX_PTR appPrivate,
116bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber            OMX_U32 size,
117bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber            OMX_U8 *ptr);
118bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber
119bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    virtual OMX_ERRORTYPE allocateBuffer(
120bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber            OMX_BUFFERHEADERTYPE **buffer,
121bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber            OMX_U32 portIndex,
122bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber            OMX_PTR appPrivate,
123bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber            OMX_U32 size);
124bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber
125bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    virtual OMX_ERRORTYPE freeBuffer(
126bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber            OMX_U32 portIndex,
127bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber            OMX_BUFFERHEADERTYPE *buffer);
128bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber
129bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    virtual OMX_ERRORTYPE emptyThisBuffer(
130bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber            OMX_BUFFERHEADERTYPE *buffer);
131bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber
132bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    virtual OMX_ERRORTYPE fillThisBuffer(
133bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber            OMX_BUFFERHEADERTYPE *buffer);
134bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber
135bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    virtual OMX_ERRORTYPE getState(OMX_STATETYPE *state);
136bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber
137bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    void onSendCommand(OMX_COMMANDTYPE cmd, OMX_U32 param);
138bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    void onChangeState(OMX_STATETYPE state);
139bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    void onPortEnable(OMX_U32 portIndex, bool enable);
140bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    void onPortFlush(OMX_U32 portIndex, bool sendFlushComplete);
141bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber
142bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    void checkTransitions();
143bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber
144bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    DISALLOW_EVIL_CONSTRUCTORS(SimpleSoftOMXComponent);
145bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber};
146bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber
147bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber}  // namespace android
148bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber
149bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber#endif  // SIMPLE_SOFT_OMX_COMPONENT_H_
150