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