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
32d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhangstruct CodecProfileLevel {
33d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang    OMX_U32 mProfile;
34d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang    OMX_U32 mLevel;
35d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang};
36d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang
37bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huberstruct SimpleSoftOMXComponent : public SoftOMXComponent {
38bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    SimpleSoftOMXComponent(
39bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber            const char *name,
40bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber            const OMX_CALLBACKTYPE *callbacks,
41bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber            OMX_PTR appData,
42bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber            OMX_COMPONENTTYPE **component);
43bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber
445a65e30064dc8dffa4f3d868f1c46038972c40c5Andreas Huber    virtual void prepareForDestruction();
45bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber
46bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    void onMessageReceived(const sp<AMessage> &msg);
47bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber
48bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huberprotected:
49bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    struct BufferInfo {
50bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber        OMX_BUFFERHEADERTYPE *mHeader;
51bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber        bool mOwnedByUs;
52bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    };
53bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber
54bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    struct PortInfo {
55bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber        OMX_PARAM_PORTDEFINITIONTYPE mDef;
56bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber        Vector<BufferInfo> mBuffers;
57bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber        List<BufferInfo *> mQueue;
58bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber
59bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber        enum {
60bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber            NONE,
61bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber            DISABLING,
62bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber            ENABLING,
63bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber        } mTransition;
64bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    };
65bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber
66031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu    enum {
67031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu        kStoreMetaDataExtensionIndex = OMX_IndexVendorStartUnused + 1,
68031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu        kPrepareForAdaptivePlaybackIndex,
69031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu    };
70031be0f358b07732092a4d1bf02fc99f109a63c4Ronghua Wu
71bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    void addPort(const OMX_PARAM_PORTDEFINITIONTYPE &def);
72bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber
73bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    virtual OMX_ERRORTYPE internalGetParameter(
74bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber            OMX_INDEXTYPE index, OMX_PTR params);
75bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber
76bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    virtual OMX_ERRORTYPE internalSetParameter(
77bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber            OMX_INDEXTYPE index, const OMX_PTR params);
78bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber
79bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    virtual void onQueueFilled(OMX_U32 portIndex);
80bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    List<BufferInfo *> &getPortQueue(OMX_U32 portIndex);
81bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber
82bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    virtual void onPortFlushCompleted(OMX_U32 portIndex);
83bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    virtual void onPortEnableCompleted(OMX_U32 portIndex, bool enabled);
846fc72b01a3b67903b52f1d33b1ad5c960b5365f1Marco Nelissen    virtual void onReset();
85bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber
86bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    PortInfo *editPortInfo(OMX_U32 portIndex);
87bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber
88bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huberprivate:
89bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    enum {
90bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber        kWhatSendCommand,
91bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber        kWhatEmptyThisBuffer,
92bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber        kWhatFillThisBuffer,
93bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    };
94bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber
95bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    Mutex mLock;
96bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber
97bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    sp<ALooper> mLooper;
98bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    sp<AHandlerReflector<SimpleSoftOMXComponent> > mHandler;
99bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber
100bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    OMX_STATETYPE mState;
101bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    OMX_STATETYPE mTargetState;
102bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber
103bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    Vector<PortInfo> mPorts;
104bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber
105bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    bool isSetParameterAllowed(
106bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber            OMX_INDEXTYPE index, const OMX_PTR params) const;
107bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber
108bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    virtual OMX_ERRORTYPE sendCommand(
109bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber            OMX_COMMANDTYPE cmd, OMX_U32 param, OMX_PTR data);
110bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber
111bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    virtual OMX_ERRORTYPE getParameter(
112bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber            OMX_INDEXTYPE index, OMX_PTR params);
113bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber
114bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    virtual OMX_ERRORTYPE setParameter(
115bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber            OMX_INDEXTYPE index, const OMX_PTR params);
116bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber
117bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    virtual OMX_ERRORTYPE useBuffer(
118bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber            OMX_BUFFERHEADERTYPE **buffer,
119bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber            OMX_U32 portIndex,
120bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber            OMX_PTR appPrivate,
121bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber            OMX_U32 size,
122bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber            OMX_U8 *ptr);
123bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber
124bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    virtual OMX_ERRORTYPE allocateBuffer(
125bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber            OMX_BUFFERHEADERTYPE **buffer,
126bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber            OMX_U32 portIndex,
127bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber            OMX_PTR appPrivate,
128bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber            OMX_U32 size);
129bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber
130bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    virtual OMX_ERRORTYPE freeBuffer(
131bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber            OMX_U32 portIndex,
132bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber            OMX_BUFFERHEADERTYPE *buffer);
133bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber
134bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    virtual OMX_ERRORTYPE emptyThisBuffer(
135bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber            OMX_BUFFERHEADERTYPE *buffer);
136bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber
137bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    virtual OMX_ERRORTYPE fillThisBuffer(
138bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber            OMX_BUFFERHEADERTYPE *buffer);
139bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber
140bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    virtual OMX_ERRORTYPE getState(OMX_STATETYPE *state);
141bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber
142bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    void onSendCommand(OMX_COMMANDTYPE cmd, OMX_U32 param);
143bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    void onChangeState(OMX_STATETYPE state);
144bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    void onPortEnable(OMX_U32 portIndex, bool enable);
145bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    void onPortFlush(OMX_U32 portIndex, bool sendFlushComplete);
146bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber
147bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    void checkTransitions();
148bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber
149bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    DISALLOW_EVIL_CONSTRUCTORS(SimpleSoftOMXComponent);
150bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber};
151bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber
152bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber}  // namespace android
153bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber
154bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber#endif  // SIMPLE_SOFT_OMX_COMPONENT_H_
155