ACodec.cpp revision f933441648ef6a71dee783d733aac17b9508b452
1f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//#define LOG_NDEBUG 0
2f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#define LOG_TAG "ACodec"
3f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
4f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/ACodec.h>
5f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
6f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <binder/MemoryDealer.h>
7f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
8f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/hexdump.h>
9f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/ABuffer.h>
10f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/ADebug.h>
11f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/AMessage.h>
12f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
13f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/MediaDefs.h>
14f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/OMXClient.h>
15f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
16f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <surfaceflinger/Surface.h>
17f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
18f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <OMX_Component.h>
19f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
20f933441648ef6a71dee783d733aac17b9508b452Andreas Hubernamespace android {
21f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
22f933441648ef6a71dee783d733aac17b9508b452Andreas Hubertemplate<class T>
23f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatic void InitOMXParams(T *params) {
24f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    params->nSize = sizeof(T);
25f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    params->nVersion.s.nVersionMajor = 1;
26f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    params->nVersion.s.nVersionMinor = 0;
27f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    params->nVersion.s.nRevision = 0;
28f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    params->nVersion.s.nStep = 0;
29f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
30f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
31f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct CodecObserver : public BnOMXObserver {
32f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CodecObserver() {}
33f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
34f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    void setNotificationMessage(const sp<AMessage> &msg) {
35f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        mNotify = msg;
36f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
37f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
38f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    // from IOMXObserver
39f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    virtual void onMessage(const omx_message &omx_msg) {
40f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        sp<AMessage> msg = mNotify->dup();
41f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
42f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        msg->setInt32("type", omx_msg.type);
43f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        msg->setPointer("node", omx_msg.node);
44f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
45f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        switch (omx_msg.type) {
46f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            case omx_message::EVENT:
47f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            {
48f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                msg->setInt32("event", omx_msg.u.event_data.event);
49f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                msg->setInt32("data1", omx_msg.u.event_data.data1);
50f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                msg->setInt32("data2", omx_msg.u.event_data.data2);
51f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                break;
52f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            }
53f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
54f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            case omx_message::EMPTY_BUFFER_DONE:
55f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            {
56f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                msg->setPointer("buffer", omx_msg.u.buffer_data.buffer);
57f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                break;
58f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            }
59f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
60f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            case omx_message::FILL_BUFFER_DONE:
61f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            {
62f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                msg->setPointer(
63f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                        "buffer", omx_msg.u.extended_buffer_data.buffer);
64f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                msg->setInt32(
65f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                        "range_offset",
66f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                        omx_msg.u.extended_buffer_data.range_offset);
67f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                msg->setInt32(
68f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                        "range_length",
69f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                        omx_msg.u.extended_buffer_data.range_length);
70f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                msg->setInt32(
71f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                        "flags",
72f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                        omx_msg.u.extended_buffer_data.flags);
73f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                msg->setInt64(
74f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                        "timestamp",
75f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                        omx_msg.u.extended_buffer_data.timestamp);
76f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                msg->setPointer(
77f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                        "platform_private",
78f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                        omx_msg.u.extended_buffer_data.platform_private);
79f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                msg->setPointer(
80f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                        "data_ptr",
81f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                        omx_msg.u.extended_buffer_data.data_ptr);
82f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                break;
83f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            }
84f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
85f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            default:
86f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                TRESPASS();
87f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                break;
88f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
89f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
90f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        msg->post();
91f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
92f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
93f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected:
94f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    virtual ~CodecObserver() {}
95f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
96f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate:
97f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<AMessage> mNotify;
98f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
99f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    DISALLOW_EVIL_CONSTRUCTORS(CodecObserver);
100f933441648ef6a71dee783d733aac17b9508b452Andreas Huber};
101f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
102f933441648ef6a71dee783d733aac17b9508b452Andreas Huber////////////////////////////////////////////////////////////////////////////////
103f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
104f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct ACodec::BaseState : public AState {
105f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    BaseState(ACodec *codec, const sp<AState> &parentState = NULL);
106f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
107f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected:
108f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    enum PortMode {
109f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        KEEP_BUFFERS,
110f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        RESUBMIT_BUFFERS,
111f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        FREE_BUFFERS,
112f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    };
113f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
114f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    ACodec *mCodec;
115f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
116f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    virtual PortMode getPortMode(OMX_U32 portIndex);
117f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
118f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    virtual bool onMessageReceived(const sp<AMessage> &msg);
119f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
120f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    virtual bool onOMXEvent(OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2);
121f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
122f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    virtual void onOutputBufferDrained(const sp<AMessage> &msg);
123f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    virtual void onInputBufferFilled(const sp<AMessage> &msg);
124f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
125f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    void postFillThisBuffer(BufferInfo *info);
126f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
127f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate:
128f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    bool onOMXMessage(const sp<AMessage> &msg);
129f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
130f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    bool onOMXEmptyBufferDone(IOMX::buffer_id bufferID);
131f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
132f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    bool onOMXFillBufferDone(
133f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            IOMX::buffer_id bufferID,
134f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            size_t rangeOffset, size_t rangeLength,
135f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            OMX_U32 flags,
136f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            int64_t timeUs,
137f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            void *platformPrivate,
138f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            void *dataPtr);
139f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
140f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    void getMoreInputDataIfPossible();
141f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
142f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    DISALLOW_EVIL_CONSTRUCTORS(BaseState);
143f933441648ef6a71dee783d733aac17b9508b452Andreas Huber};
144f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
145f933441648ef6a71dee783d733aac17b9508b452Andreas Huber////////////////////////////////////////////////////////////////////////////////
146f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
147f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct ACodec::UninitializedState : public ACodec::BaseState {
148f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    UninitializedState(ACodec *codec);
149f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
150f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected:
151f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    virtual bool onMessageReceived(const sp<AMessage> &msg);
152f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
153f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate:
154f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    void onSetup(const sp<AMessage> &msg);
155f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
156f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    DISALLOW_EVIL_CONSTRUCTORS(UninitializedState);
157f933441648ef6a71dee783d733aac17b9508b452Andreas Huber};
158f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
159f933441648ef6a71dee783d733aac17b9508b452Andreas Huber////////////////////////////////////////////////////////////////////////////////
160f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
161f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct ACodec::LoadedToIdleState : public ACodec::BaseState {
162f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    LoadedToIdleState(ACodec *codec);
163f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
164f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected:
165f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    virtual bool onMessageReceived(const sp<AMessage> &msg);
166f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    virtual bool onOMXEvent(OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2);
167f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    virtual void stateEntered();
168f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
169f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate:
170f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    status_t allocateBuffers();
171f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
172f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    DISALLOW_EVIL_CONSTRUCTORS(LoadedToIdleState);
173f933441648ef6a71dee783d733aac17b9508b452Andreas Huber};
174f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
175f933441648ef6a71dee783d733aac17b9508b452Andreas Huber////////////////////////////////////////////////////////////////////////////////
176f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
177f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct ACodec::IdleToExecutingState : public ACodec::BaseState {
178f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    IdleToExecutingState(ACodec *codec);
179f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
180f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected:
181f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    virtual bool onMessageReceived(const sp<AMessage> &msg);
182f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    virtual bool onOMXEvent(OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2);
183f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    virtual void stateEntered();
184f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
185f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate:
186f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    DISALLOW_EVIL_CONSTRUCTORS(IdleToExecutingState);
187f933441648ef6a71dee783d733aac17b9508b452Andreas Huber};
188f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
189f933441648ef6a71dee783d733aac17b9508b452Andreas Huber////////////////////////////////////////////////////////////////////////////////
190f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
191f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct ACodec::ExecutingState : public ACodec::BaseState {
192f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    ExecutingState(ACodec *codec);
193f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
194f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    void submitOutputBuffers();
195f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
196f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    // Submit output buffers to the decoder, submit input buffers to client
197f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    // to fill with data.
198f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    void resume();
199f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
200f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected:
201f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    virtual PortMode getPortMode(OMX_U32 portIndex);
202f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    virtual bool onMessageReceived(const sp<AMessage> &msg);
203f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    virtual void stateEntered();
204f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
205f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    virtual bool onOMXEvent(OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2);
206f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
207f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate:
208f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    DISALLOW_EVIL_CONSTRUCTORS(ExecutingState);
209f933441648ef6a71dee783d733aac17b9508b452Andreas Huber};
210f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
211f933441648ef6a71dee783d733aac17b9508b452Andreas Huber////////////////////////////////////////////////////////////////////////////////
212f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
213f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct ACodec::OutputPortSettingsChangedState : public ACodec::BaseState {
214f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    OutputPortSettingsChangedState(ACodec *codec);
215f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
216f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected:
217f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    virtual PortMode getPortMode(OMX_U32 portIndex);
218f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    virtual bool onMessageReceived(const sp<AMessage> &msg);
219f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    virtual void stateEntered();
220f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
221f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    virtual bool onOMXEvent(OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2);
222f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
223f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate:
224f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    DISALLOW_EVIL_CONSTRUCTORS(OutputPortSettingsChangedState);
225f933441648ef6a71dee783d733aac17b9508b452Andreas Huber};
226f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
227f933441648ef6a71dee783d733aac17b9508b452Andreas Huber////////////////////////////////////////////////////////////////////////////////
228f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
229f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct ACodec::ExecutingToIdleState : public ACodec::BaseState {
230f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    ExecutingToIdleState(ACodec *codec);
231f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
232f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected:
233f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    virtual bool onMessageReceived(const sp<AMessage> &msg);
234f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    virtual void stateEntered();
235f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
236f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    virtual bool onOMXEvent(OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2);
237f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
238f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    virtual void onOutputBufferDrained(const sp<AMessage> &msg);
239f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    virtual void onInputBufferFilled(const sp<AMessage> &msg);
240f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
241f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate:
242f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    void changeStateIfWeOwnAllBuffers();
243f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
244f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    DISALLOW_EVIL_CONSTRUCTORS(ExecutingToIdleState);
245f933441648ef6a71dee783d733aac17b9508b452Andreas Huber};
246f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
247f933441648ef6a71dee783d733aac17b9508b452Andreas Huber////////////////////////////////////////////////////////////////////////////////
248f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
249f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct ACodec::IdleToLoadedState : public ACodec::BaseState {
250f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    IdleToLoadedState(ACodec *codec);
251f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
252f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected:
253f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    virtual bool onMessageReceived(const sp<AMessage> &msg);
254f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    virtual void stateEntered();
255f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
256f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    virtual bool onOMXEvent(OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2);
257f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
258f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate:
259f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    DISALLOW_EVIL_CONSTRUCTORS(IdleToLoadedState);
260f933441648ef6a71dee783d733aac17b9508b452Andreas Huber};
261f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
262f933441648ef6a71dee783d733aac17b9508b452Andreas Huber////////////////////////////////////////////////////////////////////////////////
263f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
264f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct ACodec::ErrorState : public ACodec::BaseState {
265f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    ErrorState(ACodec *codec);
266f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
267f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected:
268f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    virtual bool onMessageReceived(const sp<AMessage> &msg);
269f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    virtual void stateEntered();
270f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
271f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    virtual bool onOMXEvent(OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2);
272f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
273f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate:
274f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    DISALLOW_EVIL_CONSTRUCTORS(ErrorState);
275f933441648ef6a71dee783d733aac17b9508b452Andreas Huber};
276f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
277f933441648ef6a71dee783d733aac17b9508b452Andreas Huber////////////////////////////////////////////////////////////////////////////////
278f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
279f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct ACodec::FlushingState : public ACodec::BaseState {
280f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    FlushingState(ACodec *codec);
281f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
282f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected:
283f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    virtual bool onMessageReceived(const sp<AMessage> &msg);
284f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    virtual void stateEntered();
285f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
286f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    virtual bool onOMXEvent(OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2);
287f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
288f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    virtual void onOutputBufferDrained(const sp<AMessage> &msg);
289f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    virtual void onInputBufferFilled(const sp<AMessage> &msg);
290f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
291f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate:
292f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    bool mFlushComplete[2];
293f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
294f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    void changeStateIfWeOwnAllBuffers();
295f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
296f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    DISALLOW_EVIL_CONSTRUCTORS(FlushingState);
297f933441648ef6a71dee783d733aac17b9508b452Andreas Huber};
298f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
299f933441648ef6a71dee783d733aac17b9508b452Andreas Huber////////////////////////////////////////////////////////////////////////////////
300f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
301f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::ACodec()
302f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    : mNode(NULL) {
303f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    mUninitializedState = new UninitializedState(this);
304f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    mLoadedToIdleState = new LoadedToIdleState(this);
305f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    mIdleToExecutingState = new IdleToExecutingState(this);
306f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    mExecutingState = new ExecutingState(this);
307f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
308f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    mOutputPortSettingsChangedState =
309f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        new OutputPortSettingsChangedState(this);
310f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
311f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    mExecutingToIdleState = new ExecutingToIdleState(this);
312f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    mIdleToLoadedState = new IdleToLoadedState(this);
313f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    mErrorState = new ErrorState(this);
314f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    mFlushingState = new FlushingState(this);
315f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
316f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    mPortEOS[kPortIndexInput] = mPortEOS[kPortIndexOutput] = false;
317f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
318f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    changeState(mUninitializedState);
319f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
320f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
321f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::~ACodec() {
322f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
323f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
324f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::setNotificationMessage(const sp<AMessage> &msg) {
325f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    mNotify = msg;
326f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
327f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
328f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::initiateSetup(const sp<AMessage> &msg) {
329f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    msg->setWhat(kWhatSetup);
330f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    msg->setTarget(id());
331f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    msg->post();
332f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
333f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
334f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::signalFlush() {
335f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    (new AMessage(kWhatFlush, id()))->post();
336f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
337f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
338f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::signalResume() {
339f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    (new AMessage(kWhatResume, id()))->post();
340f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
341f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
342f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::initiateShutdown() {
343f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    (new AMessage(kWhatShutdown, id()))->post();
344f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
345f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
346f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::allocateBuffersOnPort(OMX_U32 portIndex) {
347f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK(portIndex == kPortIndexInput || portIndex == kPortIndexOutput);
348f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
349f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK(mDealer[portIndex] == NULL);
350f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK(mBuffers[portIndex].isEmpty());
351f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
352f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (mNativeWindow != NULL && portIndex == kPortIndexOutput) {
353f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return allocateOutputBuffersFromNativeWindow();
354f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
355f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
356f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    OMX_PARAM_PORTDEFINITIONTYPE def;
357f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    InitOMXParams(&def);
358f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    def.nPortIndex = portIndex;
359f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
360f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    status_t err = mOMX->getParameter(
361f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            mNode, OMX_IndexParamPortDefinition, &def, sizeof(def));
362f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
363f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (err != OK) {
364f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return err;
365f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
366f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
367f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    LOGV("[%s] Allocating %lu buffers of size %lu on %s port",
368f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            mComponentName.c_str(),
369f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            def.nBufferCountActual, def.nBufferSize,
370f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            portIndex == kPortIndexInput ? "input" : "output");
371f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
372f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    size_t totalSize = def.nBufferCountActual * def.nBufferSize;
373f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    mDealer[portIndex] = new MemoryDealer(totalSize, "OMXCodec");
374f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
375f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    for (OMX_U32 i = 0; i < def.nBufferCountActual; ++i) {
376f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        sp<IMemory> mem = mDealer[portIndex]->allocate(def.nBufferSize);
377f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        CHECK(mem.get() != NULL);
378f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
379f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        IOMX::buffer_id buffer;
380f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#if 0
381f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        err = mOMX->allocateBufferWithBackup(mNode, portIndex, mem, &buffer);
382f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#else
383f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        err = mOMX->useBuffer(mNode, portIndex, mem, &buffer);
384f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#endif
385f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
386f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        if (err != OK) {
387f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            return err;
388f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
389f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
390f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        BufferInfo info;
391f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        info.mBufferID = buffer;
392f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        info.mStatus = BufferInfo::OWNED_BY_US;
393f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        info.mData = new ABuffer(mem->pointer(), def.nBufferSize);
394f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        mBuffers[portIndex].push(info);
395f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
396f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
397f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    return OK;
398f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
399f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
400f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::allocateOutputBuffersFromNativeWindow() {
401f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    OMX_PARAM_PORTDEFINITIONTYPE def;
402f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    InitOMXParams(&def);
403f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    def.nPortIndex = kPortIndexOutput;
404f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
405f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    status_t err = mOMX->getParameter(
406f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            mNode, OMX_IndexParamPortDefinition, &def, sizeof(def));
407f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
408f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (err != OK) {
409f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return err;
410f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
411f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
412f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    err = native_window_set_buffers_geometry(
413f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            mNativeWindow.get(),
414f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            def.format.video.nFrameWidth,
415f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            def.format.video.nFrameHeight,
416f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            def.format.video.eColorFormat);
417f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
418f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (err != 0) {
419f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        LOGE("native_window_set_buffers_geometry failed: %s (%d)",
420f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                strerror(-err), -err);
421f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return err;
422f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
423f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
424f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    // Increase the buffer count by one to allow for the ANativeWindow to hold
425f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    // on to one of the buffers.
426f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    def.nBufferCountActual++;
427f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    err = mOMX->setParameter(
428f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            mNode, OMX_IndexParamPortDefinition, &def, sizeof(def));
429f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
430f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (err != OK) {
431f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return err;
432f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
433f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
434f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    // Set up the native window.
435f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    // XXX TODO: Get the gralloc usage flags from the OMX plugin!
436f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    err = native_window_set_usage(
437f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            mNativeWindow.get(),
438f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            GRALLOC_USAGE_HW_TEXTURE | GRALLOC_USAGE_EXTERNAL_DISP);
439f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
440f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (err != 0) {
441f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        LOGE("native_window_set_usage failed: %s (%d)", strerror(-err), -err);
442f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return err;
443f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
444f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
445f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    err = native_window_set_buffer_count(
446f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            mNativeWindow.get(), def.nBufferCountActual);
447f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
448f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (err != 0) {
449f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        LOGE("native_window_set_buffer_count failed: %s (%d)", strerror(-err),
450f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                -err);
451f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return err;
452f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
453f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
454f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    // XXX TODO: Do something so the ANativeWindow knows that we'll need to get
455f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    // the same set of buffers.
456f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
457f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    LOGV("[%s] Allocating %lu buffers from a native window of size %lu on "
458f933441648ef6a71dee783d733aac17b9508b452Andreas Huber         "output port",
459f933441648ef6a71dee783d733aac17b9508b452Andreas Huber         mComponentName.c_str(), def.nBufferCountActual, def.nBufferSize);
460f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
461f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    // Dequeue buffers and send them to OMX
462f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    OMX_U32 i;
463f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    for (i = 0; i < def.nBufferCountActual; i++) {
464f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        android_native_buffer_t *buf;
465f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        err = mNativeWindow->dequeueBuffer(mNativeWindow.get(), &buf);
466f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        if (err != 0) {
467f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            LOGE("dequeueBuffer failed: %s (%d)", strerror(-err), -err);
468f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
469f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
470f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
471f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        sp<GraphicBuffer> graphicBuffer(new GraphicBuffer(buf, false));
472f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        IOMX::buffer_id bufferId;
473f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        err = mOMX->useGraphicBuffer(mNode, kPortIndexOutput, graphicBuffer,
474f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                &bufferId);
475f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        if (err != 0) {
476f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
477f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
478f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
479f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        LOGV("[%s] Registered graphic buffer with ID %p (pointer = %p)",
480f933441648ef6a71dee783d733aac17b9508b452Andreas Huber             mComponentName.c_str(),
481f933441648ef6a71dee783d733aac17b9508b452Andreas Huber             bufferId, graphicBuffer.get());
482f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
483f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        BufferInfo info;
484f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        info.mBufferID = bufferId;
485f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        info.mStatus = BufferInfo::OWNED_BY_US;
486f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        info.mData = new ABuffer(0);
487f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        info.mGraphicBuffer = graphicBuffer;
488f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        mBuffers[kPortIndexOutput].push(info);
489f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
490f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
491f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    OMX_U32 cancelStart;
492f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    OMX_U32 cancelEnd;
493f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
494f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (err != 0) {
495f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        // If an error occurred while dequeuing we need to cancel any buffers
496f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        // that were dequeued.
497f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        cancelStart = 0;
498f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        cancelEnd = i;
499f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    } else {
500f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        // Return the last two buffers to the native window.
501f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        // XXX TODO: The number of buffers the native window owns should
502f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        // probably be queried from it when we put the native window in
503f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        // fixed buffer pool mode (which needs to be implemented).
504f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        // Currently it's hard-coded to 2.
505f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        cancelStart = def.nBufferCountActual - 2;
506f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        cancelEnd = def.nBufferCountActual;
507f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
508f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
509f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    for (OMX_U32 i = cancelStart; i < cancelEnd; i++) {
510f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        BufferInfo *info = &mBuffers[kPortIndexOutput].editItemAt(i);
511f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        cancelBufferToNativeWindow(info);
512f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
513f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
514f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    return err;
515f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
516f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
517f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::cancelBufferToNativeWindow(BufferInfo *info) {
518f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK_EQ((int)info->mStatus, (int)BufferInfo::OWNED_BY_US);
519f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
520f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    LOGV("[%s] Calling cancelBuffer on buffer %p",
521f933441648ef6a71dee783d733aac17b9508b452Andreas Huber         mComponentName.c_str(), info->mBufferID);
522f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
523f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    int err = mNativeWindow->cancelBuffer(
524f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        mNativeWindow.get(), info->mGraphicBuffer.get());
525f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
526f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK_EQ(err, 0);
527f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
528f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    info->mStatus = BufferInfo::OWNED_BY_NATIVE_WINDOW;
529f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
530f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    return OK;
531f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
532f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
533f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::BufferInfo *ACodec::dequeueBufferFromNativeWindow() {
534f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    android_native_buffer_t *buf;
535f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK_EQ(mNativeWindow->dequeueBuffer(mNativeWindow.get(), &buf), 0);
536f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
537f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    for (size_t i = mBuffers[kPortIndexOutput].size(); i-- > 0;) {
538f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        BufferInfo *info =
539f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            &mBuffers[kPortIndexOutput].editItemAt(i);
540f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
541f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        if (info->mGraphicBuffer->handle == buf->handle) {
542f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK_EQ((int)info->mStatus,
543f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                     (int)BufferInfo::OWNED_BY_NATIVE_WINDOW);
544f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
545f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            info->mStatus = BufferInfo::OWNED_BY_US;
546f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
547f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            return info;
548f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
549f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
550f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
551f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    TRESPASS();
552f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
553f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    return NULL;
554f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
555f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
556f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::freeBuffersOnPort(OMX_U32 portIndex) {
557f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    for (size_t i = mBuffers[portIndex].size(); i-- > 0;) {
558f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        CHECK_EQ((status_t)OK, freeBuffer(portIndex, i));
559f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
560f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
561f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    mDealer[portIndex].clear();
562f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
563f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    return OK;
564f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
565f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
566f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::freeOutputBuffersOwnedByNativeWindow() {
567f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    for (size_t i = mBuffers[kPortIndexOutput].size(); i-- > 0;) {
568f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        BufferInfo *info =
569f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            &mBuffers[kPortIndexOutput].editItemAt(i);
570f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
571f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        if (info->mStatus ==
572f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                BufferInfo::OWNED_BY_NATIVE_WINDOW) {
573f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK_EQ((status_t)OK, freeBuffer(kPortIndexOutput, i));
574f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
575f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
576f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
577f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    return OK;
578f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
579f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
580f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::freeBuffer(OMX_U32 portIndex, size_t i) {
581f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    BufferInfo *info = &mBuffers[portIndex].editItemAt(i);
582f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
583f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK(info->mStatus == BufferInfo::OWNED_BY_US
584f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            || info->mStatus == BufferInfo::OWNED_BY_NATIVE_WINDOW);
585f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
586f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (portIndex == kPortIndexOutput && mNativeWindow != NULL
587f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            && info->mStatus == BufferInfo::OWNED_BY_US) {
588f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        CHECK_EQ((status_t)OK, cancelBufferToNativeWindow(info));
589f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
590f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
591f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK_EQ(mOMX->freeBuffer(
592f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                mNode, portIndex, info->mBufferID),
593f933441648ef6a71dee783d733aac17b9508b452Andreas Huber             (status_t)OK);
594f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
595f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    mBuffers[portIndex].removeAt(i);
596f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
597f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    return OK;
598f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
599f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
600f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::BufferInfo *ACodec::findBufferByID(
601f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        uint32_t portIndex, IOMX::buffer_id bufferID,
602f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        ssize_t *index) {
603f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    for (size_t i = 0; i < mBuffers[portIndex].size(); ++i) {
604f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        BufferInfo *info = &mBuffers[portIndex].editItemAt(i);
605f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
606f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        if (info->mBufferID == bufferID) {
607f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            if (index != NULL) {
608f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                *index = i;
609f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            }
610f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            return info;
611f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
612f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
613f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
614f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    TRESPASS();
615f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
616f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    return NULL;
617f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
618f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
619f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::setComponentRole(
620f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        bool isEncoder, const char *mime) {
621f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    struct MimeToRole {
622f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        const char *mime;
623f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        const char *decoderRole;
624f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        const char *encoderRole;
625f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    };
626f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
627f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    static const MimeToRole kMimeToRole[] = {
628f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        { MEDIA_MIMETYPE_AUDIO_MPEG,
629f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            "audio_decoder.mp3", "audio_encoder.mp3" },
630f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        { MEDIA_MIMETYPE_AUDIO_AMR_NB,
631f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            "audio_decoder.amrnb", "audio_encoder.amrnb" },
632f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        { MEDIA_MIMETYPE_AUDIO_AMR_WB,
633f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            "audio_decoder.amrwb", "audio_encoder.amrwb" },
634f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        { MEDIA_MIMETYPE_AUDIO_AAC,
635f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            "audio_decoder.aac", "audio_encoder.aac" },
636f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        { MEDIA_MIMETYPE_VIDEO_AVC,
637f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            "video_decoder.avc", "video_encoder.avc" },
638f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        { MEDIA_MIMETYPE_VIDEO_MPEG4,
639f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            "video_decoder.mpeg4", "video_encoder.mpeg4" },
640f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        { MEDIA_MIMETYPE_VIDEO_H263,
641f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            "video_decoder.h263", "video_encoder.h263" },
642f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    };
643f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
644f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    static const size_t kNumMimeToRole =
645f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        sizeof(kMimeToRole) / sizeof(kMimeToRole[0]);
646f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
647f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    size_t i;
648f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    for (i = 0; i < kNumMimeToRole; ++i) {
649f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        if (!strcasecmp(mime, kMimeToRole[i].mime)) {
650f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
651f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
652f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
653f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
654f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (i == kNumMimeToRole) {
655f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return;
656f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
657f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
658f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    const char *role =
659f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        isEncoder ? kMimeToRole[i].encoderRole
660f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                  : kMimeToRole[i].decoderRole;
661f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
662f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (role != NULL) {
663f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        OMX_PARAM_COMPONENTROLETYPE roleParams;
664f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        InitOMXParams(&roleParams);
665f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
666f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        strncpy((char *)roleParams.cRole,
667f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                role, OMX_MAX_STRINGNAME_SIZE - 1);
668f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
669f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        roleParams.cRole[OMX_MAX_STRINGNAME_SIZE - 1] = '\0';
670f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
671f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        status_t err = mOMX->setParameter(
672f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                mNode, OMX_IndexParamStandardComponentRole,
673f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                &roleParams, sizeof(roleParams));
674f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
675f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        if (err != OK) {
676f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            LOGW("[%s] Failed to set standard component role '%s'.",
677f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                 mComponentName.c_str(), role);
678f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
679f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
680f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
681f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
682f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::configureCodec(
683f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        const char *mime, const sp<AMessage> &msg) {
684f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    setComponentRole(false /* isEncoder */, mime);
685f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
686f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (!strncasecmp(mime, "video/", 6)) {
687f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        int32_t width, height;
688f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        CHECK(msg->findInt32("width", &width));
689f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        CHECK(msg->findInt32("height", &height));
690f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
691f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        CHECK_EQ(setupVideoDecoder(mime, width, height),
692f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                 (status_t)OK);
693f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_AAC)) {
694f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        int32_t numChannels, sampleRate;
695f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        CHECK(msg->findInt32("channel-count", &numChannels));
696f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        CHECK(msg->findInt32("sample-rate", &sampleRate));
697f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
698f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        CHECK_EQ(setupAACDecoder(numChannels, sampleRate), (status_t)OK);
699f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_MPEG)) {
700f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    } else {
701f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        TRESPASS();
702f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
703f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
704f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    int32_t maxInputSize;
705f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (msg->findInt32("max-input-size", &maxInputSize)) {
706f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        CHECK_EQ(setMinBufferSize(kPortIndexInput, (size_t)maxInputSize),
707f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                 (status_t)OK);
708f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    } else if (!strcmp("OMX.Nvidia.aac.decoder", mComponentName.c_str())) {
709f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        CHECK_EQ(setMinBufferSize(kPortIndexInput, 8192),  // XXX
710f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                 (status_t)OK);
711f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
712f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
713f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
714f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::setMinBufferSize(OMX_U32 portIndex, size_t size) {
715f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    OMX_PARAM_PORTDEFINITIONTYPE def;
716f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    InitOMXParams(&def);
717f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    def.nPortIndex = portIndex;
718f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
719f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    status_t err = mOMX->getParameter(
720f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            mNode, OMX_IndexParamPortDefinition, &def, sizeof(def));
721f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
722f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (err != OK) {
723f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return err;
724f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
725f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
726f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (def.nBufferSize >= size) {
727f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return OK;
728f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
729f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
730f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    def.nBufferSize = size;
731f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
732f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    err = mOMX->setParameter(
733f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            mNode, OMX_IndexParamPortDefinition, &def, sizeof(def));
734f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
735f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (err != OK) {
736f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return err;
737f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
738f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
739f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    err = mOMX->getParameter(
740f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            mNode, OMX_IndexParamPortDefinition, &def, sizeof(def));
741f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
742f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (err != OK) {
743f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return err;
744f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
745f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
746f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK(def.nBufferSize >= size);
747f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
748f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    return OK;
749f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
750f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
751f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::setupAACDecoder(int32_t numChannels, int32_t sampleRate) {
752f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    OMX_AUDIO_PARAM_AACPROFILETYPE profile;
753f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    InitOMXParams(&profile);
754f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    profile.nPortIndex = kPortIndexInput;
755f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
756f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    status_t err = mOMX->getParameter(
757f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            mNode, OMX_IndexParamAudioAac, &profile, sizeof(profile));
758f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
759f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (err != OK) {
760f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return err;
761f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
762f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
763f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    profile.nChannels = numChannels;
764f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    profile.nSampleRate = sampleRate;
765f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    profile.eAACStreamFormat = OMX_AUDIO_AACStreamFormatMP4ADTS;
766f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
767f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    err = mOMX->setParameter(
768f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            mNode, OMX_IndexParamAudioAac, &profile, sizeof(profile));
769f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
770f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    return err;
771f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
772f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
773f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::setVideoPortFormatType(
774f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        OMX_U32 portIndex,
775f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        OMX_VIDEO_CODINGTYPE compressionFormat,
776f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        OMX_COLOR_FORMATTYPE colorFormat) {
777f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    OMX_VIDEO_PARAM_PORTFORMATTYPE format;
778f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    InitOMXParams(&format);
779f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    format.nPortIndex = portIndex;
780f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    format.nIndex = 0;
781f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    bool found = false;
782f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
783f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    OMX_U32 index = 0;
784f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    for (;;) {
785f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        format.nIndex = index;
786f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        status_t err = mOMX->getParameter(
787f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                mNode, OMX_IndexParamVideoPortFormat,
788f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                &format, sizeof(format));
789f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
790f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        if (err != OK) {
791f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            return err;
792f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
793f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
794f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        // The following assertion is violated by TI's video decoder.
795f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        // CHECK_EQ(format.nIndex, index);
796f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
797f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        if (!strcmp("OMX.TI.Video.encoder", mComponentName.c_str())) {
798f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            if (portIndex == kPortIndexInput
799f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    && colorFormat == format.eColorFormat) {
800f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                // eCompressionFormat does not seem right.
801f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                found = true;
802f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                break;
803f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            }
804f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            if (portIndex == kPortIndexOutput
805f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    && compressionFormat == format.eCompressionFormat) {
806f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                // eColorFormat does not seem right.
807f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                found = true;
808f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                break;
809f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            }
810f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
811f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
812f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        if (format.eCompressionFormat == compressionFormat
813f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            && format.eColorFormat == colorFormat) {
814f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            found = true;
815f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
816f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
817f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
818f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        ++index;
819f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
820f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
821f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (!found) {
822f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return UNKNOWN_ERROR;
823f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
824f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
825f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    status_t err = mOMX->setParameter(
826f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            mNode, OMX_IndexParamVideoPortFormat,
827f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            &format, sizeof(format));
828f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
829f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    return err;
830f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
831f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
832f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::setSupportedOutputFormat() {
833f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    OMX_VIDEO_PARAM_PORTFORMATTYPE format;
834f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    InitOMXParams(&format);
835f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    format.nPortIndex = kPortIndexOutput;
836f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    format.nIndex = 0;
837f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
838f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    status_t err = mOMX->getParameter(
839f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            mNode, OMX_IndexParamVideoPortFormat,
840f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            &format, sizeof(format));
841f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK_EQ(err, (status_t)OK);
842f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK_EQ((int)format.eCompressionFormat, (int)OMX_VIDEO_CodingUnused);
843f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
844f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    static const int OMX_QCOM_COLOR_FormatYVU420SemiPlanar = 0x7FA30C00;
845f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
846f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK(format.eColorFormat == OMX_COLOR_FormatYUV420Planar
847f933441648ef6a71dee783d733aac17b9508b452Andreas Huber           || format.eColorFormat == OMX_COLOR_FormatYUV420SemiPlanar
848f933441648ef6a71dee783d733aac17b9508b452Andreas Huber           || format.eColorFormat == OMX_COLOR_FormatCbYCrY
849f933441648ef6a71dee783d733aac17b9508b452Andreas Huber           || format.eColorFormat == OMX_QCOM_COLOR_FormatYVU420SemiPlanar);
850f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
851f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    return mOMX->setParameter(
852f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            mNode, OMX_IndexParamVideoPortFormat,
853f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            &format, sizeof(format));
854f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
855f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
856f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::setupVideoDecoder(
857f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        const char *mime, int32_t width, int32_t height) {
858f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    OMX_VIDEO_CODINGTYPE compressionFormat = OMX_VIDEO_CodingUnused;
859f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (!strcasecmp(MEDIA_MIMETYPE_VIDEO_AVC, mime)) {
860f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        compressionFormat = OMX_VIDEO_CodingAVC;
861f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    } else if (!strcasecmp(MEDIA_MIMETYPE_VIDEO_MPEG4, mime)) {
862f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        compressionFormat = OMX_VIDEO_CodingMPEG4;
863f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    } else if (!strcasecmp(MEDIA_MIMETYPE_VIDEO_H263, mime)) {
864f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        compressionFormat = OMX_VIDEO_CodingH263;
865f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    } else {
866f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        TRESPASS();
867f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
868f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
869f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    status_t err = setVideoPortFormatType(
870f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            kPortIndexInput, compressionFormat, OMX_COLOR_FormatUnused);
871f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
872f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (err != OK) {
873f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return err;
874f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
875f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
876f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    err = setSupportedOutputFormat();
877f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
878f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (err != OK) {
879f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return err;
880f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
881f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
882f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    err = setVideoFormatOnPort(
883f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            kPortIndexInput, width, height, compressionFormat);
884f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
885f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (err != OK) {
886f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return err;
887f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
888f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
889f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    err = setVideoFormatOnPort(
890f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            kPortIndexOutput, width, height, OMX_VIDEO_CodingUnused);
891f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
892f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (err != OK) {
893f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return err;
894f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
895f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
896f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    return OK;
897f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
898f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
899f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::setVideoFormatOnPort(
900f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        OMX_U32 portIndex,
901f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        int32_t width, int32_t height, OMX_VIDEO_CODINGTYPE compressionFormat) {
902f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    OMX_PARAM_PORTDEFINITIONTYPE def;
903f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    InitOMXParams(&def);
904f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    def.nPortIndex = portIndex;
905f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
906f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    OMX_VIDEO_PORTDEFINITIONTYPE *video_def = &def.format.video;
907f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
908f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    status_t err = mOMX->getParameter(
909f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            mNode, OMX_IndexParamPortDefinition, &def, sizeof(def));
910f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
911f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK_EQ(err, (status_t)OK);
912f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
913f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (portIndex == kPortIndexInput) {
914f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        // XXX Need a (much) better heuristic to compute input buffer sizes.
915f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        const size_t X = 64 * 1024;
916f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        if (def.nBufferSize < X) {
917f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            def.nBufferSize = X;
918f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
919f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
920f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
921f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK_EQ((int)def.eDomain, (int)OMX_PortDomainVideo);
922f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
923f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    video_def->nFrameWidth = width;
924f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    video_def->nFrameHeight = height;
925f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
926f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (portIndex == kPortIndexInput) {
927f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        video_def->eCompressionFormat = compressionFormat;
928f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        video_def->eColorFormat = OMX_COLOR_FormatUnused;
929f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
930f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
931f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    err = mOMX->setParameter(
932f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            mNode, OMX_IndexParamPortDefinition, &def, sizeof(def));
933f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
934f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    return err;
935f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
936f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
937f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::initNativeWindow() {
938f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (mNativeWindow != NULL) {
939f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return mOMX->enableGraphicBuffers(mNode, kPortIndexOutput, OMX_TRUE);
940f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
941f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
942f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    mOMX->enableGraphicBuffers(mNode, kPortIndexOutput, OMX_FALSE);
943f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    return OK;
944f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
945f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
946f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::allYourBuffersAreBelongToUs(
947f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        OMX_U32 portIndex) {
948f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    for (size_t i = 0; i < mBuffers[portIndex].size(); ++i) {
949f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        BufferInfo *info = &mBuffers[portIndex].editItemAt(i);
950f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
951f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        if (info->mStatus != BufferInfo::OWNED_BY_US
952f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                && info->mStatus != BufferInfo::OWNED_BY_NATIVE_WINDOW) {
953f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            LOGV("[%s] Buffer %p on port %ld still has status %d",
954f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    mComponentName.c_str(),
955f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    info->mBufferID, portIndex, info->mStatus);
956f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            return false;
957f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
958f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
959f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
960f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    return true;
961f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
962f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
963f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::allYourBuffersAreBelongToUs() {
964f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    return allYourBuffersAreBelongToUs(kPortIndexInput)
965f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        && allYourBuffersAreBelongToUs(kPortIndexOutput);
966f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
967f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
968f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::deferMessage(const sp<AMessage> &msg) {
969f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    bool wasEmptyBefore = mDeferredQueue.empty();
970f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    mDeferredQueue.push_back(msg);
971f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
972f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
973f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::processDeferredMessages() {
974f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    List<sp<AMessage> > queue = mDeferredQueue;
975f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    mDeferredQueue.clear();
976f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
977f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    List<sp<AMessage> >::iterator it = queue.begin();
978f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    while (it != queue.end()) {
979f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        onMessageReceived(*it++);
980f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
981f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
982f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
983f933441648ef6a71dee783d733aac17b9508b452Andreas Huber////////////////////////////////////////////////////////////////////////////////
984f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
985f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::BaseState::BaseState(ACodec *codec, const sp<AState> &parentState)
986f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    : AState(parentState),
987f933441648ef6a71dee783d733aac17b9508b452Andreas Huber      mCodec(codec) {
988f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
989f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
990f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::BaseState::PortMode ACodec::BaseState::getPortMode(OMX_U32 portIndex) {
991f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    return KEEP_BUFFERS;
992f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
993f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
994f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::BaseState::onMessageReceived(const sp<AMessage> &msg) {
995f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    switch (msg->what()) {
996f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatInputBufferFilled:
997f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
998f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            onInputBufferFilled(msg);
999f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
1000f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
1001f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1002f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatOutputBufferDrained:
1003f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
1004f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            onOutputBufferDrained(msg);
1005f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
1006f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
1007f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1008f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case ACodec::kWhatOMXMessage:
1009f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
1010f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            return onOMXMessage(msg);
1011f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
1012f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1013f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        default:
1014f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            return false;
1015f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
1016f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1017f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    return true;
1018f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
1019f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1020f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::BaseState::onOMXMessage(const sp<AMessage> &msg) {
1021f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    int32_t type;
1022f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK(msg->findInt32("type", &type));
1023f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1024f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    IOMX::node_id nodeID;
1025f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK(msg->findPointer("node", &nodeID));
1026f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK_EQ(nodeID, mCodec->mNode);
1027f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1028f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    switch (type) {
1029f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case omx_message::EVENT:
1030f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
1031f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            int32_t event, data1, data2;
1032f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK(msg->findInt32("event", &event));
1033f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK(msg->findInt32("data1", &data1));
1034f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK(msg->findInt32("data2", &data2));
1035f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1036f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            return onOMXEvent(
1037f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    static_cast<OMX_EVENTTYPE>(event),
1038f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    static_cast<OMX_U32>(data1),
1039f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    static_cast<OMX_U32>(data2));
1040f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
1041f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1042f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case omx_message::EMPTY_BUFFER_DONE:
1043f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
1044f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            IOMX::buffer_id bufferID;
1045f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK(msg->findPointer("buffer", &bufferID));
1046f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1047f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            return onOMXEmptyBufferDone(bufferID);
1048f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
1049f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1050f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case omx_message::FILL_BUFFER_DONE:
1051f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
1052f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            IOMX::buffer_id bufferID;
1053f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK(msg->findPointer("buffer", &bufferID));
1054f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1055f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            int32_t rangeOffset, rangeLength, flags;
1056f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            int64_t timeUs;
1057f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            void *platformPrivate;
1058f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            void *dataPtr;
1059f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1060f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK(msg->findInt32("range_offset", &rangeOffset));
1061f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK(msg->findInt32("range_length", &rangeLength));
1062f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK(msg->findInt32("flags", &flags));
1063f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK(msg->findInt64("timestamp", &timeUs));
1064f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK(msg->findPointer("platform_private", &platformPrivate));
1065f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK(msg->findPointer("data_ptr", &dataPtr));
1066f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1067f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            return onOMXFillBufferDone(
1068f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    bufferID,
1069f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    (size_t)rangeOffset, (size_t)rangeLength,
1070f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    (OMX_U32)flags,
1071f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    timeUs,
1072f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    platformPrivate,
1073f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    dataPtr);
1074f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
1075f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1076f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        default:
1077f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            TRESPASS();
1078f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
1079f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
1080f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
1081f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1082f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::BaseState::onOMXEvent(
1083f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2) {
1084f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (event != OMX_EventError) {
1085f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        LOGI("[%s] EVENT(%d, 0x%08lx, 0x%08lx)",
1086f933441648ef6a71dee783d733aac17b9508b452Andreas Huber             mCodec->mComponentName.c_str(), event, data1, data2);
1087f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1088f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return false;
1089f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
1090f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1091f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    LOGE("[%s] ERROR(0x%08lx, 0x%08lx)",
1092f933441648ef6a71dee783d733aac17b9508b452Andreas Huber         mCodec->mComponentName.c_str(), data1, data2);
1093f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1094f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    mCodec->changeState(mCodec->mErrorState);
1095f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1096f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    return true;
1097f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
1098f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1099f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::BaseState::onOMXEmptyBufferDone(IOMX::buffer_id bufferID) {
1100f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    BufferInfo *info =
1101f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        mCodec->findBufferByID(kPortIndexInput, bufferID);
1102f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1103f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK_EQ((int)info->mStatus, (int)BufferInfo::OWNED_BY_COMPONENT);
1104f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    info->mStatus = BufferInfo::OWNED_BY_US;
1105f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1106f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    PortMode mode = getPortMode(kPortIndexInput);
1107f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1108f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    switch (mode) {
1109f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case KEEP_BUFFERS:
1110f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
1111f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1112f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case RESUBMIT_BUFFERS:
1113f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            postFillThisBuffer(info);
1114f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
1115f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1116f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        default:
1117f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
1118f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK_EQ((int)mode, (int)FREE_BUFFERS);
1119f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            TRESPASS();  // Not currently used
1120f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
1121f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
1122f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
1123f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1124f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    return true;
1125f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
1126f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1127f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::BaseState::postFillThisBuffer(BufferInfo *info) {
1128f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (mCodec->mPortEOS[kPortIndexInput]) {
1129f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return;
1130f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
1131f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1132f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK_EQ((int)info->mStatus, (int)BufferInfo::OWNED_BY_US);
1133f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1134f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<AMessage> notify = mCodec->mNotify->dup();
1135f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    notify->setInt32("what", ACodec::kWhatFillThisBuffer);
1136f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    notify->setPointer("buffer-id", info->mBufferID);
1137f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1138f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    info->mData->meta()->clear();
1139f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    notify->setObject("buffer", info->mData);
1140f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1141f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<AMessage> reply = new AMessage(kWhatInputBufferFilled, mCodec->id());
1142f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    reply->setPointer("buffer-id", info->mBufferID);
1143f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1144f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    notify->setMessage("reply", reply);
1145f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1146f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    notify->post();
1147f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1148f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    info->mStatus = BufferInfo::OWNED_BY_UPSTREAM;
1149f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
1150f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1151f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::BaseState::onInputBufferFilled(const sp<AMessage> &msg) {
1152f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    IOMX::buffer_id bufferID;
1153f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK(msg->findPointer("buffer-id", &bufferID));
1154f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1155f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<RefBase> obj;
1156f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    int32_t err = OK;
1157f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (!msg->findObject("buffer", &obj)) {
1158f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        CHECK(msg->findInt32("err", &err));
1159f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1160f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        obj.clear();
1161f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
1162f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1163f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<ABuffer> buffer = static_cast<ABuffer *>(obj.get());
1164f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1165f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    BufferInfo *info = mCodec->findBufferByID(kPortIndexInput, bufferID);
1166f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK_EQ((int)info->mStatus, (int)BufferInfo::OWNED_BY_UPSTREAM);
1167f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1168f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    info->mStatus = BufferInfo::OWNED_BY_US;
1169f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1170f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    PortMode mode = getPortMode(kPortIndexInput);
1171f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1172f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    switch (mode) {
1173f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case KEEP_BUFFERS:
1174f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
1175f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            if (buffer == NULL) {
1176f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                mCodec->mPortEOS[kPortIndexInput] = true;
1177f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            }
1178f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
1179f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
1180f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1181f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case RESUBMIT_BUFFERS:
1182f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
1183f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            if (buffer != NULL) {
1184f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                CHECK(!mCodec->mPortEOS[kPortIndexInput]);
1185f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1186f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                int64_t timeUs;
1187f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                CHECK(buffer->meta()->findInt64("timeUs", &timeUs));
1188f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1189f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                OMX_U32 flags = OMX_BUFFERFLAG_ENDOFFRAME;
1190f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1191f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                int32_t isCSD;
1192f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                if (buffer->meta()->findInt32("csd", &isCSD) && isCSD != 0) {
1193f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    flags |= OMX_BUFFERFLAG_CODECCONFIG;
1194f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                }
1195f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1196f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                if (buffer != info->mData) {
1197f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    if (!(flags & OMX_BUFFERFLAG_CODECCONFIG)) {
1198f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                        LOGV("[%s] Needs to copy input data.",
1199f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                             mCodec->mComponentName.c_str());
1200f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    }
1201f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1202f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    CHECK_LE(buffer->size(), info->mData->capacity());
1203f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    memcpy(info->mData->data(), buffer->data(), buffer->size());
1204f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                }
1205f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1206f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                CHECK_EQ(mCodec->mOMX->emptyBuffer(
1207f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                            mCodec->mNode,
1208f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                            bufferID,
1209f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                            0,
1210f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                            buffer->size(),
1211f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                            flags,
1212f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                            timeUs),
1213f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                         (status_t)OK);
1214f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1215f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                info->mStatus = BufferInfo::OWNED_BY_COMPONENT;
1216f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1217f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                getMoreInputDataIfPossible();
1218f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            } else if (!mCodec->mPortEOS[kPortIndexInput]) {
1219f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                LOGV("[%s] Signalling EOS on the input port",
1220f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                     mCodec->mComponentName.c_str());
1221f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1222f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                CHECK_EQ(mCodec->mOMX->emptyBuffer(
1223f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                            mCodec->mNode,
1224f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                            bufferID,
1225f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                            0,
1226f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                            0,
1227f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                            OMX_BUFFERFLAG_EOS,
1228f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                            0),
1229f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                         (status_t)OK);
1230f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1231f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                info->mStatus = BufferInfo::OWNED_BY_COMPONENT;
1232f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1233f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                mCodec->mPortEOS[kPortIndexInput] = true;
1234f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            }
1235f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
1236f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1237f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            default:
1238f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                CHECK_EQ((int)mode, (int)FREE_BUFFERS);
1239f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                break;
1240f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
1241f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
1242f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
1243f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1244f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::BaseState::getMoreInputDataIfPossible() {
1245f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (mCodec->mPortEOS[kPortIndexInput]) {
1246f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return;
1247f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
1248f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1249f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    BufferInfo *eligible = NULL;
1250f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1251f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    for (size_t i = 0; i < mCodec->mBuffers[kPortIndexInput].size(); ++i) {
1252f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        BufferInfo *info = &mCodec->mBuffers[kPortIndexInput].editItemAt(i);
1253f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1254f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#if 0
1255f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        if (info->mStatus == BufferInfo::OWNED_BY_UPSTREAM) {
1256f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            // There's already a "read" pending.
1257f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            return;
1258f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
1259f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#endif
1260f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1261f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        if (info->mStatus == BufferInfo::OWNED_BY_US) {
1262f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            eligible = info;
1263f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
1264f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
1265f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1266f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (eligible == NULL) {
1267f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return;
1268f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
1269f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1270f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    postFillThisBuffer(eligible);
1271f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
1272f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1273f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::BaseState::onOMXFillBufferDone(
1274f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        IOMX::buffer_id bufferID,
1275f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        size_t rangeOffset, size_t rangeLength,
1276f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        OMX_U32 flags,
1277f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        int64_t timeUs,
1278f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        void *platformPrivate,
1279f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        void *dataPtr) {
1280f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    ssize_t index;
1281f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    BufferInfo *info =
1282f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        mCodec->findBufferByID(kPortIndexOutput, bufferID, &index);
1283f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1284f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK_EQ((int)info->mStatus, (int)BufferInfo::OWNED_BY_COMPONENT);
1285f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1286f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    info->mStatus = BufferInfo::OWNED_BY_US;
1287f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1288f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    PortMode mode = getPortMode(kPortIndexOutput);
1289f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1290f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    switch (mode) {
1291f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case KEEP_BUFFERS:
1292f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
1293f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1294f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case RESUBMIT_BUFFERS:
1295f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
1296f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            if (rangeLength == 0) {
1297f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                if (!(flags & OMX_BUFFERFLAG_EOS)) {
1298f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    CHECK_EQ(mCodec->mOMX->fillBuffer(
1299f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                                mCodec->mNode, info->mBufferID),
1300f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                             (status_t)OK);
1301f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1302f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    info->mStatus = BufferInfo::OWNED_BY_COMPONENT;
1303f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                }
1304f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            } else {
1305f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                if (mCodec->mNativeWindow == NULL) {
1306f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    info->mData->setRange(rangeOffset, rangeLength);
1307f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                }
1308f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1309f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                info->mData->meta()->setInt64("timeUs", timeUs);
1310f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1311f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                sp<AMessage> notify = mCodec->mNotify->dup();
1312f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                notify->setInt32("what", ACodec::kWhatDrainThisBuffer);
1313f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                notify->setPointer("buffer-id", info->mBufferID);
1314f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                notify->setObject("buffer", info->mData);
1315f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1316f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                sp<AMessage> reply =
1317f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    new AMessage(kWhatOutputBufferDrained, mCodec->id());
1318f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1319f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                reply->setPointer("buffer-id", info->mBufferID);
1320f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1321f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                notify->setMessage("reply", reply);
1322f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1323f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                notify->post();
1324f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1325f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                info->mStatus = BufferInfo::OWNED_BY_DOWNSTREAM;
1326f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            }
1327f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1328f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            if (flags & OMX_BUFFERFLAG_EOS) {
1329f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                sp<AMessage> notify = mCodec->mNotify->dup();
1330f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                notify->setInt32("what", ACodec::kWhatEOS);
1331f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                notify->post();
1332f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1333f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                mCodec->mPortEOS[kPortIndexOutput] = true;
1334f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            }
1335f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
1336f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
1337f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1338f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        default:
1339f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
1340f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK_EQ((int)mode, (int)FREE_BUFFERS);
1341f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1342f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK_EQ((status_t)OK,
1343f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                     mCodec->freeBuffer(kPortIndexOutput, index));
1344f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
1345f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
1346f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
1347f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1348f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    return true;
1349f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
1350f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1351f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::BaseState::onOutputBufferDrained(const sp<AMessage> &msg) {
1352f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    IOMX::buffer_id bufferID;
1353f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK(msg->findPointer("buffer-id", &bufferID));
1354f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1355f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    ssize_t index;
1356f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    BufferInfo *info =
1357f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        mCodec->findBufferByID(kPortIndexOutput, bufferID, &index);
1358f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK_EQ((int)info->mStatus, (int)BufferInfo::OWNED_BY_DOWNSTREAM);
1359f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1360f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    int32_t render;
1361f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (mCodec->mNativeWindow != NULL
1362f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            && msg->findInt32("render", &render) && render != 0) {
1363f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        // The client wants this buffer to be rendered.
1364f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1365f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        CHECK_EQ(mCodec->mNativeWindow->queueBuffer(
1366f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    mCodec->mNativeWindow.get(),
1367f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    info->mGraphicBuffer.get()),
1368f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                 0);
1369f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1370f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        info->mStatus = BufferInfo::OWNED_BY_NATIVE_WINDOW;
1371f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    } else {
1372f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        info->mStatus = BufferInfo::OWNED_BY_US;
1373f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
1374f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1375f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    PortMode mode = getPortMode(kPortIndexOutput);
1376f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1377f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    switch (mode) {
1378f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case KEEP_BUFFERS:
1379f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
1380f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            // XXX fishy, revisit!!! What about the FREE_BUFFERS case below?
1381f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1382f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            if (info->mStatus == BufferInfo::OWNED_BY_NATIVE_WINDOW) {
1383f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                // We cannot resubmit the buffer we just rendered, dequeue
1384f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                // the spare instead.
1385f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1386f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                info = mCodec->dequeueBufferFromNativeWindow();
1387f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            }
1388f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
1389f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
1390f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1391f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case RESUBMIT_BUFFERS:
1392f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
1393f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            if (!mCodec->mPortEOS[kPortIndexOutput]) {
1394f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                if (info->mStatus == BufferInfo::OWNED_BY_NATIVE_WINDOW) {
1395f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    // We cannot resubmit the buffer we just rendered, dequeue
1396f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    // the spare instead.
1397f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1398f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    info = mCodec->dequeueBufferFromNativeWindow();
1399f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                }
1400f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1401f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                CHECK_EQ(mCodec->mOMX->fillBuffer(mCodec->mNode, info->mBufferID),
1402f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                         (status_t)OK);
1403f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1404f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                info->mStatus = BufferInfo::OWNED_BY_COMPONENT;
1405f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            }
1406f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
1407f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
1408f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1409f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        default:
1410f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
1411f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK_EQ((int)mode, (int)FREE_BUFFERS);
1412f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1413f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK_EQ((status_t)OK,
1414f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                     mCodec->freeBuffer(kPortIndexOutput, index));
1415f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
1416f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
1417f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
1418f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
1419f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1420f933441648ef6a71dee783d733aac17b9508b452Andreas Huber////////////////////////////////////////////////////////////////////////////////
1421f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1422f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::UninitializedState::UninitializedState(ACodec *codec)
1423f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    : BaseState(codec) {
1424f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
1425f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1426f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::UninitializedState::onMessageReceived(const sp<AMessage> &msg) {
1427f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    bool handled = false;
1428f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1429f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    switch (msg->what()) {
1430f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case ACodec::kWhatSetup:
1431f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
1432f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            onSetup(msg);
1433f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1434f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            handled = true;
1435f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
1436f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
1437f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1438f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case ACodec::kWhatShutdown:
1439f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
1440f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            sp<AMessage> notify = mCodec->mNotify->dup();
1441f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            notify->setInt32("what", ACodec::kWhatShutdownCompleted);
1442f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            notify->post();
1443f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1444f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            handled = true;
1445f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
1446f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1447f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case ACodec::kWhatFlush:
1448f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
1449f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            sp<AMessage> notify = mCodec->mNotify->dup();
1450f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            notify->setInt32("what", ACodec::kWhatFlushCompleted);
1451f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            notify->post();
1452f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1453f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            handled = true;
1454f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
1455f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1456f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        default:
1457f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            return BaseState::onMessageReceived(msg);
1458f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
1459f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1460f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    return handled;
1461f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
1462f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1463f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::UninitializedState::onSetup(
1464f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        const sp<AMessage> &msg) {
1465f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    OMXClient client;
1466f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK_EQ(client.connect(), (status_t)OK);
1467f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1468f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<IOMX> omx = client.interface();
1469f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1470f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    AString mime;
1471f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK(msg->findString("mime", &mime));
1472f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1473f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    AString componentName;
1474f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1475f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (!strcasecmp(mime.c_str(), MEDIA_MIMETYPE_VIDEO_AVC)) {
1476f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        componentName = "OMX.Nvidia.h264.decode";
1477f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    } else if (!strcasecmp(mime.c_str(), MEDIA_MIMETYPE_AUDIO_AAC)) {
1478f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        componentName = "OMX.Nvidia.aac.decoder";
1479f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    } else if (!strcasecmp(mime.c_str(), MEDIA_MIMETYPE_AUDIO_MPEG)) {
1480f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        componentName = "OMX.Nvidia.mp3.decoder";
1481f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    } else {
1482f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        TRESPASS();
1483f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
1484f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1485f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<CodecObserver> observer = new CodecObserver;
1486f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1487f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    IOMX::node_id node;
1488f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK_EQ(omx->allocateNode(componentName.c_str(), observer, &node),
1489f933441648ef6a71dee783d733aac17b9508b452Andreas Huber             (status_t)OK);
1490f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1491f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<AMessage> notify = new AMessage(kWhatOMXMessage, mCodec->id());
1492f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    observer->setNotificationMessage(notify);
1493f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1494f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    mCodec->mComponentName = componentName;
1495f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    mCodec->mOMX = omx;
1496f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    mCodec->mNode = node;
1497f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1498f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    mCodec->configureCodec(mime.c_str(), msg);
1499f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1500f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<RefBase> obj;
1501f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (msg->findObject("surface", &obj)) {
1502f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        mCodec->mNativeWindow = static_cast<Surface *>(obj.get());
1503f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
1504f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1505f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK_EQ((status_t)OK, mCodec->initNativeWindow());
1506f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1507f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK_EQ(omx->sendCommand(node, OMX_CommandStateSet, OMX_StateIdle),
1508f933441648ef6a71dee783d733aac17b9508b452Andreas Huber             (status_t)OK);
1509f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1510f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    mCodec->changeState(mCodec->mLoadedToIdleState);
1511f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
1512f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1513f933441648ef6a71dee783d733aac17b9508b452Andreas Huber////////////////////////////////////////////////////////////////////////////////
1514f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1515f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::LoadedToIdleState::LoadedToIdleState(ACodec *codec)
1516f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    : BaseState(codec) {
1517f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
1518f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1519f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::LoadedToIdleState::stateEntered() {
1520f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    LOGI("[%s] Now Loaded->Idle", mCodec->mComponentName.c_str());
1521f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1522f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK_EQ(allocateBuffers(), (status_t)OK);
1523f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
1524f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1525f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::LoadedToIdleState::allocateBuffers() {
1526f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    status_t err = mCodec->allocateBuffersOnPort(kPortIndexInput);
1527f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1528f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (err != OK) {
1529f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return err;
1530f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
1531f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1532f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    return mCodec->allocateBuffersOnPort(kPortIndexOutput);
1533f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
1534f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1535f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::LoadedToIdleState::onMessageReceived(const sp<AMessage> &msg) {
1536f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    switch (msg->what()) {
1537f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatShutdown:
1538f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
1539f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            mCodec->deferMessage(msg);
1540f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            return true;
1541f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
1542f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1543f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        default:
1544f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            return BaseState::onMessageReceived(msg);
1545f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
1546f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
1547f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1548f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::LoadedToIdleState::onOMXEvent(
1549f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2) {
1550f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    switch (event) {
1551f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case OMX_EventCmdComplete:
1552f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
1553f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK_EQ(data1, (OMX_U32)OMX_CommandStateSet);
1554f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK_EQ(data2, (OMX_U32)OMX_StateIdle);
1555f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1556f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK_EQ(mCodec->mOMX->sendCommand(
1557f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                        mCodec->mNode, OMX_CommandStateSet, OMX_StateExecuting),
1558f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                     (status_t)OK);
1559f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1560f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            mCodec->changeState(mCodec->mIdleToExecutingState);
1561f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1562f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            return true;
1563f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
1564f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1565f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        default:
1566f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            return BaseState::onOMXEvent(event, data1, data2);
1567f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
1568f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
1569f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1570f933441648ef6a71dee783d733aac17b9508b452Andreas Huber////////////////////////////////////////////////////////////////////////////////
1571f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1572f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::IdleToExecutingState::IdleToExecutingState(ACodec *codec)
1573f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    : BaseState(codec) {
1574f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
1575f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1576f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::IdleToExecutingState::stateEntered() {
1577f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    LOGI("[%s] Now Idle->Executing", mCodec->mComponentName.c_str());
1578f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
1579f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1580f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::IdleToExecutingState::onMessageReceived(const sp<AMessage> &msg) {
1581f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    switch (msg->what()) {
1582f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatShutdown:
1583f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
1584f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            mCodec->deferMessage(msg);
1585f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            return true;
1586f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
1587f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1588f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        default:
1589f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            return BaseState::onMessageReceived(msg);
1590f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
1591f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
1592f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1593f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::IdleToExecutingState::onOMXEvent(
1594f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2) {
1595f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    switch (event) {
1596f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case OMX_EventCmdComplete:
1597f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
1598f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK_EQ(data1, (OMX_U32)OMX_CommandStateSet);
1599f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK_EQ(data2, (OMX_U32)OMX_StateExecuting);
1600f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1601f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            mCodec->mExecutingState->resume();
1602f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            mCodec->changeState(mCodec->mExecutingState);
1603f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1604f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            return true;
1605f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
1606f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1607f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        default:
1608f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            return BaseState::onOMXEvent(event, data1, data2);
1609f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
1610f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
1611f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1612f933441648ef6a71dee783d733aac17b9508b452Andreas Huber////////////////////////////////////////////////////////////////////////////////
1613f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1614f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::ExecutingState::ExecutingState(ACodec *codec)
1615f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    : BaseState(codec) {
1616f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
1617f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1618f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::BaseState::PortMode ACodec::ExecutingState::getPortMode(
1619f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        OMX_U32 portIndex) {
1620f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    return RESUBMIT_BUFFERS;
1621f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
1622f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1623f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::ExecutingState::submitOutputBuffers() {
1624f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    for (size_t i = 0; i < mCodec->mBuffers[kPortIndexOutput].size(); ++i) {
1625f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        BufferInfo *info = &mCodec->mBuffers[kPortIndexOutput].editItemAt(i);
1626f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1627f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        if (mCodec->mNativeWindow != NULL) {
1628f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK(info->mStatus == BufferInfo::OWNED_BY_US
1629f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    || info->mStatus == BufferInfo::OWNED_BY_NATIVE_WINDOW);
1630f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1631f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            if (info->mStatus == BufferInfo::OWNED_BY_NATIVE_WINDOW) {
1632f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                continue;
1633f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            }
1634f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1635f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            status_t err = mCodec->mNativeWindow->lockBuffer(
1636f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    mCodec->mNativeWindow.get(),
1637f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    info->mGraphicBuffer.get());
1638f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK_EQ(err, (status_t)OK);
1639f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        } else {
1640f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK_EQ((int)info->mStatus, (int)BufferInfo::OWNED_BY_US);
1641f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
1642f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1643f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        CHECK_EQ(mCodec->mOMX->fillBuffer(mCodec->mNode, info->mBufferID),
1644f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                 (status_t)OK);
1645f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1646f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        info->mStatus = BufferInfo::OWNED_BY_COMPONENT;
1647f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
1648f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
1649f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1650f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::ExecutingState::resume() {
1651f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    submitOutputBuffers();
1652f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1653f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    // Post the first input buffer.
1654f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK_GT(mCodec->mBuffers[kPortIndexInput].size(), 0u);
1655f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    BufferInfo *info = &mCodec->mBuffers[kPortIndexInput].editItemAt(0);
1656f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1657f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    postFillThisBuffer(info);
1658f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
1659f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1660f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::ExecutingState::stateEntered() {
1661f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    LOGI("[%s] Now Executing", mCodec->mComponentName.c_str());
1662f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1663f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    mCodec->processDeferredMessages();
1664f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
1665f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1666f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::ExecutingState::onMessageReceived(const sp<AMessage> &msg) {
1667f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    bool handled = false;
1668f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1669f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    switch (msg->what()) {
1670f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatShutdown:
1671f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
1672f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK_EQ(mCodec->mOMX->sendCommand(
1673f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                        mCodec->mNode, OMX_CommandStateSet, OMX_StateIdle),
1674f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                     (status_t)OK);
1675f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1676f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            mCodec->changeState(mCodec->mExecutingToIdleState);
1677f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1678f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            handled = true;
1679f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
1680f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
1681f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1682f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatFlush:
1683f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
1684f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK_EQ(mCodec->mOMX->sendCommand(
1685f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                        mCodec->mNode, OMX_CommandFlush, OMX_ALL),
1686f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                     (status_t)OK);
1687f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1688f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            mCodec->changeState(mCodec->mFlushingState);
1689f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1690f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            handled = true;
1691f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
1692f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
1693f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1694f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatResume:
1695f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
1696f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            resume();
1697f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1698f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            handled = true;
1699f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
1700f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
1701f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1702f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        default:
1703f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            handled = BaseState::onMessageReceived(msg);
1704f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
1705f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
1706f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1707f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    return handled;
1708f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
1709f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1710f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::ExecutingState::onOMXEvent(
1711f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2) {
1712f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    switch (event) {
1713f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case OMX_EventPortSettingsChanged:
1714f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
1715f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK_EQ(data1, (OMX_U32)kPortIndexOutput);
1716f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1717f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            if (data2 == OMX_IndexParamPortDefinition) {
1718f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                CHECK_EQ(mCodec->mOMX->sendCommand(
1719f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                            mCodec->mNode,
1720f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                            OMX_CommandPortDisable, kPortIndexOutput),
1721f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                         (status_t)OK);
1722f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1723f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                if (mCodec->mNativeWindow != NULL) {
1724f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    CHECK_EQ((status_t)OK,
1725f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                             mCodec->freeOutputBuffersOwnedByNativeWindow());
1726f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                }
1727f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1728f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                mCodec->changeState(mCodec->mOutputPortSettingsChangedState);
1729f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            } else {
1730f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                LOGV("[%s] OMX_EventPortSettingsChanged 0x%08lx",
1731f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                     mCodec->mComponentName.c_str(), data2);
1732f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            }
1733f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1734f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            return true;
1735f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
1736f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1737f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case OMX_EventBufferFlag:
1738f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
1739f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            return true;
1740f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
1741f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1742f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        default:
1743f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            return BaseState::onOMXEvent(event, data1, data2);
1744f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
1745f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
1746f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1747f933441648ef6a71dee783d733aac17b9508b452Andreas Huber////////////////////////////////////////////////////////////////////////////////
1748f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1749f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::OutputPortSettingsChangedState::OutputPortSettingsChangedState(
1750f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        ACodec *codec)
1751f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    : BaseState(codec) {
1752f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
1753f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1754f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::BaseState::PortMode ACodec::OutputPortSettingsChangedState::getPortMode(
1755f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        OMX_U32 portIndex) {
1756f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (portIndex == kPortIndexOutput) {
1757f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return FREE_BUFFERS;
1758f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
1759f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1760f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK_EQ(portIndex, (OMX_U32)kPortIndexInput);
1761f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1762f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    return RESUBMIT_BUFFERS;
1763f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
1764f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1765f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::OutputPortSettingsChangedState::onMessageReceived(
1766f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        const sp<AMessage> &msg) {
1767f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    bool handled = false;
1768f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1769f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    switch (msg->what()) {
1770f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatFlush:
1771f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatShutdown:
1772f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
1773f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            mCodec->deferMessage(msg);
1774f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            handled = true;
1775f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
1776f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
1777f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1778f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        default:
1779f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            handled = BaseState::onMessageReceived(msg);
1780f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
1781f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
1782f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1783f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    return handled;
1784f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
1785f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1786f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::OutputPortSettingsChangedState::stateEntered() {
1787f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    LOGI("[%s] Now handling output port settings change",
1788f933441648ef6a71dee783d733aac17b9508b452Andreas Huber         mCodec->mComponentName.c_str());
1789f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
1790f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1791f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::OutputPortSettingsChangedState::onOMXEvent(
1792f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2) {
1793f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    switch (event) {
1794f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case OMX_EventCmdComplete:
1795f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
1796f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            if (data1 == (OMX_U32)OMX_CommandPortDisable) {
1797f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                CHECK_EQ(data2, (OMX_U32)kPortIndexOutput);
1798f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1799f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                LOGV("[%s] Output port now disabled.",
1800f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                        mCodec->mComponentName.c_str());
1801f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1802f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                CHECK(mCodec->mBuffers[kPortIndexOutput].isEmpty());
1803f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                mCodec->mDealer[kPortIndexOutput].clear();
1804f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1805f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                CHECK_EQ(mCodec->mOMX->sendCommand(
1806f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                            mCodec->mNode, OMX_CommandPortEnable, kPortIndexOutput),
1807f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                         (status_t)OK);
1808f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1809f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                CHECK_EQ(mCodec->allocateBuffersOnPort(kPortIndexOutput),
1810f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                         (status_t)OK);
1811f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1812f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                return true;
1813f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            } else if (data1 == (OMX_U32)OMX_CommandPortEnable) {
1814f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                CHECK_EQ(data2, (OMX_U32)kPortIndexOutput);
1815f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1816f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                LOGV("[%s] Output port now reenabled.",
1817f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                        mCodec->mComponentName.c_str());
1818f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1819f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                mCodec->mExecutingState->submitOutputBuffers();
1820f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                mCodec->changeState(mCodec->mExecutingState);
1821f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1822f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                return true;
1823f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            }
1824f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1825f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            return false;
1826f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
1827f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1828f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        default:
1829f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            return false;
1830f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
1831f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
1832f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1833f933441648ef6a71dee783d733aac17b9508b452Andreas Huber////////////////////////////////////////////////////////////////////////////////
1834f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1835f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::ExecutingToIdleState::ExecutingToIdleState(ACodec *codec)
1836f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    : BaseState(codec) {
1837f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
1838f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1839f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::ExecutingToIdleState::onMessageReceived(const sp<AMessage> &msg) {
1840f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    bool handled = false;
1841f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1842f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    switch (msg->what()) {
1843f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatFlush:
1844f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
1845f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            // Don't send me a flush request if you previously wanted me
1846f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            // to shutdown.
1847f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            TRESPASS();
1848f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
1849f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
1850f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1851f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatShutdown:
1852f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
1853f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            // We're already doing that...
1854f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1855f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            handled = true;
1856f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
1857f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
1858f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1859f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        default:
1860f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            handled = BaseState::onMessageReceived(msg);
1861f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
1862f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
1863f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1864f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    return handled;
1865f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
1866f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1867f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::ExecutingToIdleState::stateEntered() {
1868f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    LOGI("[%s] Now Executing->Idle", mCodec->mComponentName.c_str());
1869f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
1870f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1871f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::ExecutingToIdleState::onOMXEvent(
1872f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2) {
1873f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    switch (event) {
1874f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case OMX_EventCmdComplete:
1875f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
1876f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK_EQ(data1, (OMX_U32)OMX_CommandStateSet);
1877f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK_EQ(data2, (OMX_U32)OMX_StateIdle);
1878f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1879f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            changeStateIfWeOwnAllBuffers();
1880f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1881f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            return true;
1882f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
1883f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1884f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        default:
1885f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            return BaseState::onOMXEvent(event, data1, data2);
1886f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
1887f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
1888f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::ExecutingToIdleState::changeStateIfWeOwnAllBuffers() {
1889f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (mCodec->allYourBuffersAreBelongToUs()) {
1890f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        CHECK_EQ(mCodec->mOMX->sendCommand(
1891f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    mCodec->mNode, OMX_CommandStateSet, OMX_StateLoaded),
1892f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                 (status_t)OK);
1893f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1894f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        CHECK_EQ(mCodec->freeBuffersOnPort(kPortIndexInput), (status_t)OK);
1895f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        CHECK_EQ(mCodec->freeBuffersOnPort(kPortIndexOutput), (status_t)OK);
1896f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1897f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        mCodec->changeState(mCodec->mIdleToLoadedState);
1898f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
1899f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
1900f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1901f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::ExecutingToIdleState::onInputBufferFilled(
1902f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        const sp<AMessage> &msg) {
1903f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    BaseState::onInputBufferFilled(msg);
1904f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1905f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    changeStateIfWeOwnAllBuffers();
1906f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
1907f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1908f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::ExecutingToIdleState::onOutputBufferDrained(
1909f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        const sp<AMessage> &msg) {
1910f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    BaseState::onOutputBufferDrained(msg);
1911f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1912f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    changeStateIfWeOwnAllBuffers();
1913f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
1914f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1915f933441648ef6a71dee783d733aac17b9508b452Andreas Huber////////////////////////////////////////////////////////////////////////////////
1916f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1917f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::IdleToLoadedState::IdleToLoadedState(ACodec *codec)
1918f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    : BaseState(codec) {
1919f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
1920f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1921f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::IdleToLoadedState::onMessageReceived(const sp<AMessage> &msg) {
1922f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    bool handled = false;
1923f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1924f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    switch (msg->what()) {
1925f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatShutdown:
1926f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
1927f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            // We're already doing that...
1928f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1929f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            handled = true;
1930f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
1931f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
1932f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1933f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatFlush:
1934f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
1935f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            // Don't send me a flush request if you previously wanted me
1936f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            // to shutdown.
1937f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            TRESPASS();
1938f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
1939f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
1940f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1941f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        default:
1942f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            handled = BaseState::onMessageReceived(msg);
1943f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
1944f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
1945f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1946f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    return handled;
1947f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
1948f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1949f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::IdleToLoadedState::stateEntered() {
1950f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    LOGI("[%s] Now Idle->Loaded", mCodec->mComponentName.c_str());
1951f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
1952f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1953f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::IdleToLoadedState::onOMXEvent(
1954f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2) {
1955f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    switch (event) {
1956f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case OMX_EventCmdComplete:
1957f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
1958f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK_EQ(data1, (OMX_U32)OMX_CommandStateSet);
1959f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK_EQ(data2, (OMX_U32)OMX_StateLoaded);
1960f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1961f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            LOGI("[%s] Now Loaded", mCodec->mComponentName.c_str());
1962f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1963f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK_EQ(mCodec->mOMX->freeNode(mCodec->mNode), (status_t)OK);
1964f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1965f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            mCodec->mNativeWindow.clear();
1966f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            mCodec->mNode = NULL;
1967f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            mCodec->mOMX.clear();
1968f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            mCodec->mComponentName.clear();
1969f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1970f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            mCodec->changeState(mCodec->mUninitializedState);
1971f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1972f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            sp<AMessage> notify = mCodec->mNotify->dup();
1973f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            notify->setInt32("what", ACodec::kWhatShutdownCompleted);
1974f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            notify->post();
1975f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1976f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            return true;
1977f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
1978f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1979f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        default:
1980f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            return BaseState::onOMXEvent(event, data1, data2);
1981f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
1982f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
1983f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1984f933441648ef6a71dee783d733aac17b9508b452Andreas Huber////////////////////////////////////////////////////////////////////////////////
1985f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1986f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::ErrorState::ErrorState(ACodec *codec)
1987f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    : BaseState(codec) {
1988f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
1989f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1990f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::ErrorState::onMessageReceived(const sp<AMessage> &msg) {
1991f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    return BaseState::onMessageReceived(msg);
1992f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
1993f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1994f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::ErrorState::stateEntered() {
1995f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    LOGI("[%s] Now in ErrorState", mCodec->mComponentName.c_str());
1996f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
1997f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1998f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::ErrorState::onOMXEvent(
1999f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2) {
2000f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    LOGI("EVENT(%d, 0x%08lx, 0x%08lx)", event, data1, data2);
2001f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    return true;
2002f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
2003f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
2004f933441648ef6a71dee783d733aac17b9508b452Andreas Huber////////////////////////////////////////////////////////////////////////////////
2005f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
2006f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::FlushingState::FlushingState(ACodec *codec)
2007f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    : BaseState(codec) {
2008f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
2009f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
2010f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::FlushingState::stateEntered() {
2011f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    LOGI("[%s] Now Flushing", mCodec->mComponentName.c_str());
2012f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
2013f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    mFlushComplete[kPortIndexInput] = mFlushComplete[kPortIndexOutput] = false;
2014f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
2015f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
2016f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::FlushingState::onMessageReceived(const sp<AMessage> &msg) {
2017f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    bool handled = false;
2018f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
2019f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    switch (msg->what()) {
2020f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatShutdown:
2021f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
2022f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            mCodec->deferMessage(msg);
2023f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
2024f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
2025f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
2026f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatFlush:
2027f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
2028f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            // We're already doing this right now.
2029f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            handled = true;
2030f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
2031f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
2032f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
2033f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        default:
2034f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            handled = BaseState::onMessageReceived(msg);
2035f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
2036f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
2037f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
2038f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    return handled;
2039f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
2040f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
2041f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::FlushingState::onOMXEvent(
2042f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2) {
2043f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    switch (event) {
2044f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case OMX_EventCmdComplete:
2045f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
2046f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK_EQ(data1, (OMX_U32)OMX_CommandFlush);
2047f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
2048f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            if (data2 == kPortIndexInput || data2 == kPortIndexOutput) {
2049f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                CHECK(!mFlushComplete[data2]);
2050f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                mFlushComplete[data2] = true;
2051f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            } else {
2052f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                CHECK_EQ(data2, OMX_ALL);
2053f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                CHECK(mFlushComplete[kPortIndexInput]);
2054f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                CHECK(mFlushComplete[kPortIndexOutput]);
2055f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
2056f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                changeStateIfWeOwnAllBuffers();
2057f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            }
2058f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
2059f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            return true;
2060f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
2061f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
2062f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        default:
2063f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            return BaseState::onOMXEvent(event, data1, data2);
2064f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
2065f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
2066f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    return true;
2067f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
2068f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
2069f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::FlushingState::onOutputBufferDrained(const sp<AMessage> &msg) {
2070f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    BaseState::onOutputBufferDrained(msg);
2071f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
2072f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    changeStateIfWeOwnAllBuffers();
2073f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
2074f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
2075f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::FlushingState::onInputBufferFilled(const sp<AMessage> &msg) {
2076f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    BaseState::onInputBufferFilled(msg);
2077f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
2078f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    changeStateIfWeOwnAllBuffers();
2079f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
2080f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
2081f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::FlushingState::changeStateIfWeOwnAllBuffers() {
2082f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (mFlushComplete[kPortIndexInput]
2083f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            && mFlushComplete[kPortIndexOutput]
2084f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            && mCodec->allYourBuffersAreBelongToUs()) {
2085f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        sp<AMessage> notify = mCodec->mNotify->dup();
2086f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        notify->setInt32("what", ACodec::kWhatFlushCompleted);
2087f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        notify->post();
2088f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
2089f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        mCodec->mPortEOS[kPortIndexInput] =
2090f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            mCodec->mPortEOS[kPortIndexOutput] = false;
2091f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
2092f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        mCodec->changeState(mCodec->mExecutingState);
2093f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
2094f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
2095f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
2096f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}  // namespace android
2097f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
2098