OMXNodeInstance.cpp revision 0c37f9d1320bb87fd242f9425c67dacd6ce20112
1318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber/*
2318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber * Copyright (C) 2009 The Android Open Source Project
3318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber *
4318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber * you may not use this file except in compliance with the License.
6318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber * You may obtain a copy of the License at
7318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber *
8318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
9318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber *
10318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber * Unless required by applicable law or agreed to in writing, software
11318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber * See the License for the specific language governing permissions and
14318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber * limitations under the License.
15318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber */
16318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
170c03d5c7c2fa4d17f7f5159e3fddd2adf6bfc923Andreas Huber//#define LOG_NDEBUG 0
18318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber#define LOG_TAG "OMXNodeInstance"
19318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber#include <utils/Log.h>
20318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
21318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber#include "../include/OMXNodeInstance.h"
22f0fb96c352f30b812a4903a1d783a715e1e817bdAndreas Huber#include "OMXMaster.h"
23f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden#include "GraphicBufferSource.h"
24318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
25e3ec3cec3a2e27033249ff82964d2cbd441d9873Andreas Huber#include <OMX_Component.h>
26318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
27318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber#include <binder/IMemory.h>
28f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden#include <gui/BufferQueue.h>
296c6b4d0d2b98a7ceee8b697daaf611f8df3254fbJames Dong#include <HardwareAPI.h>
30f1d5aa162c02a16b7195a43a9bcea4d592600ac4James Dong#include <media/stagefright/foundation/ADebug.h>
312a3847ee1cbdaa8a65eee397a0173bb02211c459Andreas Huber#include <media/stagefright/MediaErrors.h>
32318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
33f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFaddenstatic const OMX_U32 kPortIndexInput = 0;
34f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden
35318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Hubernamespace android {
36318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
37318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstruct BufferMeta {
38318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    BufferMeta(const sp<IMemory> &mem, bool is_backup = false)
39318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        : mMem(mem),
40318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber          mIsBackup(is_backup) {
41318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    }
42318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
43318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    BufferMeta(size_t size)
44318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        : mSize(size),
45318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber          mIsBackup(false) {
46318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    }
47318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
4883750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    BufferMeta(const sp<GraphicBuffer> &graphicBuffer)
4983750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        : mGraphicBuffer(graphicBuffer),
5083750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis          mIsBackup(false) {
5183750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    }
5283750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
53318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    void CopyFromOMX(const OMX_BUFFERHEADERTYPE *header) {
54318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        if (!mIsBackup) {
55318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            return;
56318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        }
57318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
58318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        memcpy((OMX_U8 *)mMem->pointer() + header->nOffset,
59318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber               header->pBuffer + header->nOffset,
60318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber               header->nFilledLen);
61318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    }
62318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
63318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    void CopyToOMX(const OMX_BUFFERHEADERTYPE *header) {
64318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        if (!mIsBackup) {
65318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            return;
66318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        }
67318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
68318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        memcpy(header->pBuffer + header->nOffset,
69318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber               (const OMX_U8 *)mMem->pointer() + header->nOffset,
70318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber               header->nFilledLen);
71318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    }
72318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
73318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberprivate:
7483750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    sp<GraphicBuffer> mGraphicBuffer;
75318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    sp<IMemory> mMem;
76318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    size_t mSize;
77318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    bool mIsBackup;
78318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
79318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    BufferMeta(const BufferMeta &);
80318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    BufferMeta &operator=(const BufferMeta &);
81318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber};
82318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
83318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber// static
84318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas HuberOMX_CALLBACKTYPE OMXNodeInstance::kCallbacks = {
85318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    &OnEvent, &OnEmptyBufferDone, &OnFillBufferDone
86318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber};
87318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
88318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas HuberOMXNodeInstance::OMXNodeInstance(
89318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX *owner, const sp<IOMXObserver> &observer)
90318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    : mOwner(owner),
91318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber      mNodeID(NULL),
92318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber      mHandle(NULL),
93134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber      mObserver(observer),
94134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber      mDying(false) {
95318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
96318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
97318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas HuberOMXNodeInstance::~OMXNodeInstance() {
98f1d5aa162c02a16b7195a43a9bcea4d592600ac4James Dong    CHECK(mHandle == NULL);
99318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
100318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
101318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Hubervoid OMXNodeInstance::setHandle(OMX::node_id node_id, OMX_HANDLETYPE handle) {
102f1d5aa162c02a16b7195a43a9bcea4d592600ac4James Dong    CHECK(mHandle == NULL);
103318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    mNodeID = node_id;
104318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    mHandle = handle;
105318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
106318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
107f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFaddensp<GraphicBufferSource> OMXNodeInstance::getGraphicBufferSource() {
108f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    Mutex::Autolock autoLock(mGraphicBufferSourceLock);
109f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    return mGraphicBufferSource;
110f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden}
111f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden
112f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFaddenvoid OMXNodeInstance::setGraphicBufferSource(
113f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden        const sp<GraphicBufferSource>& bufferSource) {
114f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    Mutex::Autolock autoLock(mGraphicBufferSourceLock);
115f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    mGraphicBufferSource = bufferSource;
116f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden}
117f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden
118318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas HuberOMX *OMXNodeInstance::owner() {
119318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return mOwner;
120318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
121318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
122318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Hubersp<IOMXObserver> OMXNodeInstance::observer() {
123318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return mObserver;
124318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
125318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
126318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas HuberOMX::node_id OMXNodeInstance::nodeID() {
127318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return mNodeID;
128318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
129318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
130318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatic status_t StatusFromOMXError(OMX_ERRORTYPE err) {
1312a3847ee1cbdaa8a65eee397a0173bb02211c459Andreas Huber    switch (err) {
1322a3847ee1cbdaa8a65eee397a0173bb02211c459Andreas Huber        case OMX_ErrorNone:
1332a3847ee1cbdaa8a65eee397a0173bb02211c459Andreas Huber            return OK;
1342a3847ee1cbdaa8a65eee397a0173bb02211c459Andreas Huber        case OMX_ErrorUnsupportedSetting:
1352a3847ee1cbdaa8a65eee397a0173bb02211c459Andreas Huber            return ERROR_UNSUPPORTED;
1362a3847ee1cbdaa8a65eee397a0173bb02211c459Andreas Huber        default:
1372a3847ee1cbdaa8a65eee397a0173bb02211c459Andreas Huber            return UNKNOWN_ERROR;
1382a3847ee1cbdaa8a65eee397a0173bb02211c459Andreas Huber    }
139318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
140318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
141f0fb96c352f30b812a4903a1d783a715e1e817bdAndreas Huberstatus_t OMXNodeInstance::freeNode(OMXMaster *master) {
14243e5eca7048a3b7b3ee0223b7f3cbd837ed10ae5Andreas Huber    static int32_t kMaxNumIterations = 10;
14343e5eca7048a3b7b3ee0223b7f3cbd837ed10ae5Andreas Huber
144d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    // Transition the node from its current state all the way down
145d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    // to "Loaded".
146d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    // This ensures that all active buffers are properly freed even
147d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    // for components that don't do this themselves on a call to
148d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    // "FreeHandle".
149d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber
150134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    // The code below may trigger some more events to be dispatched
151134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    // by the OMX component - we want to ignore them as our client
152134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    // does not expect them.
153134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    mDying = true;
154134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber
155d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    OMX_STATETYPE state;
156d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    CHECK_EQ(OMX_GetState(mHandle, &state), OMX_ErrorNone);
157d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    switch (state) {
158d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber        case OMX_StateExecuting:
159d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber        {
1603856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("forcing Executing->Idle");
161d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            sendCommand(OMX_CommandStateSet, OMX_StateIdle);
162d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            OMX_ERRORTYPE err;
16343e5eca7048a3b7b3ee0223b7f3cbd837ed10ae5Andreas Huber            int32_t iteration = 0;
164d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            while ((err = OMX_GetState(mHandle, &state)) == OMX_ErrorNone
1650d681df3b0ded2c1e335b6b5785439da4ce2c238Andreas Huber                   && state != OMX_StateIdle
1660d681df3b0ded2c1e335b6b5785439da4ce2c238Andreas Huber                   && state != OMX_StateInvalid) {
16743e5eca7048a3b7b3ee0223b7f3cbd837ed10ae5Andreas Huber                if (++iteration > kMaxNumIterations) {
16829357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block                    ALOGE("component failed to enter Idle state, aborting.");
16943e5eca7048a3b7b3ee0223b7f3cbd837ed10ae5Andreas Huber                    state = OMX_StateInvalid;
17043e5eca7048a3b7b3ee0223b7f3cbd837ed10ae5Andreas Huber                    break;
17143e5eca7048a3b7b3ee0223b7f3cbd837ed10ae5Andreas Huber                }
17243e5eca7048a3b7b3ee0223b7f3cbd837ed10ae5Andreas Huber
173d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber                usleep(100000);
174d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            }
175d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            CHECK_EQ(err, OMX_ErrorNone);
176d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber
1770d681df3b0ded2c1e335b6b5785439da4ce2c238Andreas Huber            if (state == OMX_StateInvalid) {
1780d681df3b0ded2c1e335b6b5785439da4ce2c238Andreas Huber                break;
1790d681df3b0ded2c1e335b6b5785439da4ce2c238Andreas Huber            }
1800d681df3b0ded2c1e335b6b5785439da4ce2c238Andreas Huber
181d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            // fall through
182d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber        }
183d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber
184d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber        case OMX_StateIdle:
185d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber        {
1863856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("forcing Idle->Loaded");
187d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            sendCommand(OMX_CommandStateSet, OMX_StateLoaded);
188d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber
189d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            freeActiveBuffers();
190d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber
191d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            OMX_ERRORTYPE err;
19243e5eca7048a3b7b3ee0223b7f3cbd837ed10ae5Andreas Huber            int32_t iteration = 0;
193d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            while ((err = OMX_GetState(mHandle, &state)) == OMX_ErrorNone
1940d681df3b0ded2c1e335b6b5785439da4ce2c238Andreas Huber                   && state != OMX_StateLoaded
1950d681df3b0ded2c1e335b6b5785439da4ce2c238Andreas Huber                   && state != OMX_StateInvalid) {
19643e5eca7048a3b7b3ee0223b7f3cbd837ed10ae5Andreas Huber                if (++iteration > kMaxNumIterations) {
19729357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block                    ALOGE("component failed to enter Loaded state, aborting.");
19843e5eca7048a3b7b3ee0223b7f3cbd837ed10ae5Andreas Huber                    state = OMX_StateInvalid;
19943e5eca7048a3b7b3ee0223b7f3cbd837ed10ae5Andreas Huber                    break;
20043e5eca7048a3b7b3ee0223b7f3cbd837ed10ae5Andreas Huber                }
20143e5eca7048a3b7b3ee0223b7f3cbd837ed10ae5Andreas Huber
2023856b090cd04ba5dd4a59a12430ed724d5995909Steve Block                ALOGV("waiting for Loaded state...");
203d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber                usleep(100000);
204d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            }
205d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            CHECK_EQ(err, OMX_ErrorNone);
206d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber
207d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            // fall through
208d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber        }
209d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber
210d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber        case OMX_StateLoaded:
211fa70cad40b01627ac1c22e04cdd548ece9c2654fAndreas Huber        case OMX_StateInvalid:
212d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            break;
213d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber
214d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber        default:
215d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            CHECK(!"should not be here, unknown state.");
216d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            break;
217d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    }
218d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber
2193856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("calling destroyComponentInstance");
220f0fb96c352f30b812a4903a1d783a715e1e817bdAndreas Huber    OMX_ERRORTYPE err = master->destroyComponentInstance(
221f0fb96c352f30b812a4903a1d783a715e1e817bdAndreas Huber            static_cast<OMX_COMPONENTTYPE *>(mHandle));
2223856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("destroyComponentInstance returned err %d", err);
223f0fb96c352f30b812a4903a1d783a715e1e817bdAndreas Huber
224318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    mHandle = NULL;
225318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
226318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    if (err != OMX_ErrorNone) {
22729357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("FreeHandle FAILED with error 0x%08x.", err);
228318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    }
229318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
230318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    mOwner->invalidateNodeID(mNodeID);
231318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    mNodeID = NULL;
232318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
2333856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("OMXNodeInstance going away.");
23447bed1a7755ed58fa5d4c0d35b20468deb83bd60Andreas Huber    delete this;
235318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
236318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return StatusFromOMXError(err);
237318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
238318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
239318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::sendCommand(
240318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_COMMANDTYPE cmd, OMX_S32 param) {
241318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    Mutex::Autolock autoLock(mLock);
242318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
243318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_ERRORTYPE err = OMX_SendCommand(mHandle, cmd, param, NULL);
244318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return StatusFromOMXError(err);
245318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
246318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
247318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::getParameter(
248318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_INDEXTYPE index, void *params, size_t size) {
249318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    Mutex::Autolock autoLock(mLock);
250318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
251318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_ERRORTYPE err = OMX_GetParameter(mHandle, index, params);
252bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber
253318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return StatusFromOMXError(err);
254318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
255318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
256318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::setParameter(
257318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_INDEXTYPE index, const void *params, size_t size) {
258318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    Mutex::Autolock autoLock(mLock);
259318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
260318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_ERRORTYPE err = OMX_SetParameter(
261318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            mHandle, index, const_cast<void *>(params));
262318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
263318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return StatusFromOMXError(err);
264318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
265318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
266318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::getConfig(
267318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_INDEXTYPE index, void *params, size_t size) {
268318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    Mutex::Autolock autoLock(mLock);
269318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
270318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_ERRORTYPE err = OMX_GetConfig(mHandle, index, params);
271318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return StatusFromOMXError(err);
272318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
273318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
274318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::setConfig(
275318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_INDEXTYPE index, const void *params, size_t size) {
276318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    Mutex::Autolock autoLock(mLock);
277318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
278318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_ERRORTYPE err = OMX_SetConfig(
279318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            mHandle, index, const_cast<void *>(params));
280318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
281318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return StatusFromOMXError(err);
282b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis}
283b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis
284b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennisstatus_t OMXNodeInstance::getState(OMX_STATETYPE* state) {
285b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis    Mutex::Autolock autoLock(mLock);
286b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis
287b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis    OMX_ERRORTYPE err = OMX_GetState(mHandle, state);
288b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis
289b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis    return StatusFromOMXError(err);
290318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
291318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
29283750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennisstatus_t OMXNodeInstance::enableGraphicBuffers(
29383750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        OMX_U32 portIndex, OMX_BOOL enable) {
29483750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    Mutex::Autolock autoLock(mLock);
29583750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
29683750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    OMX_INDEXTYPE index;
29783750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    OMX_ERRORTYPE err = OMX_GetExtensionIndex(
29883750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            mHandle,
29983750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            const_cast<OMX_STRING>("OMX.google.android.index.enableAndroidNativeBuffers"),
30083750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            &index);
30183750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
30283750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    if (err != OMX_ErrorNone) {
30329357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("OMX_GetExtensionIndex failed");
30483750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
30583750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        return StatusFromOMXError(err);
30683750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    }
30783750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
30883750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    OMX_VERSIONTYPE ver;
30983750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    ver.s.nVersionMajor = 1;
31083750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    ver.s.nVersionMinor = 0;
31183750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    ver.s.nRevision = 0;
31283750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    ver.s.nStep = 0;
31383750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    EnableAndroidNativeBuffersParams params = {
31483750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        sizeof(EnableAndroidNativeBuffersParams), ver, portIndex, enable,
31583750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    };
31683750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
31783750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    err = OMX_SetParameter(mHandle, index, &params);
31883750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
31983750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    if (err != OMX_ErrorNone) {
32029357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("OMX_EnableAndroidNativeBuffers failed with error %d (0x%08x)",
32183750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis                err, err);
32283750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
32383750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        return UNKNOWN_ERROR;
32483750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    }
32583750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
32683750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    return OK;
32783750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis}
32883750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
329e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennisstatus_t OMXNodeInstance::getGraphicBufferUsage(
330e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis        OMX_U32 portIndex, OMX_U32* usage) {
331e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis    Mutex::Autolock autoLock(mLock);
332e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis
333e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis    OMX_INDEXTYPE index;
334e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis    OMX_ERRORTYPE err = OMX_GetExtensionIndex(
335e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis            mHandle,
336e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis            const_cast<OMX_STRING>(
337e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis                    "OMX.google.android.index.getAndroidNativeBufferUsage"),
338e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis            &index);
339e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis
340e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis    if (err != OMX_ErrorNone) {
34129357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("OMX_GetExtensionIndex failed");
342e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis
343e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis        return StatusFromOMXError(err);
344e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis    }
345e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis
346e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis    OMX_VERSIONTYPE ver;
347e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis    ver.s.nVersionMajor = 1;
348e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis    ver.s.nVersionMinor = 0;
349e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis    ver.s.nRevision = 0;
350e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis    ver.s.nStep = 0;
351e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis    GetAndroidNativeBufferUsageParams params = {
352e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis        sizeof(GetAndroidNativeBufferUsageParams), ver, portIndex, 0,
353e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis    };
354e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis
355e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis    err = OMX_GetParameter(mHandle, index, &params);
356e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis
357e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis    if (err != OMX_ErrorNone) {
35829357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("OMX_GetAndroidNativeBufferUsage failed with error %d (0x%08x)",
359e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis                err, err);
360e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis        return UNKNOWN_ERROR;
361e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis    }
362e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis
363e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis    *usage = params.nUsage;
364e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis
365e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis    return OK;
366e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis}
367e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis
368e870772a78ffe08b1c14a791e368f1499f1be0f3James Dongstatus_t OMXNodeInstance::storeMetaDataInBuffers(
369e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong        OMX_U32 portIndex,
370e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong        OMX_BOOL enable) {
371e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong    Mutex::Autolock autolock(mLock);
372f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    return storeMetaDataInBuffers_l(portIndex, enable);
373f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden}
374e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong
375f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFaddenstatus_t OMXNodeInstance::storeMetaDataInBuffers_l(
376f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden        OMX_U32 portIndex,
377f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden        OMX_BOOL enable) {
378e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong    OMX_INDEXTYPE index;
379e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong    OMX_STRING name = const_cast<OMX_STRING>(
380e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong            "OMX.google.android.index.storeMetaDataInBuffers");
381e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong
382e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong    OMX_ERRORTYPE err = OMX_GetExtensionIndex(mHandle, name, &index);
383e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong    if (err != OMX_ErrorNone) {
38429357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("OMX_GetExtensionIndex %s failed", name);
385e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong        return StatusFromOMXError(err);
386e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong    }
387e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong
388e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong    StoreMetaDataInBuffersParams params;
389e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong    memset(&params, 0, sizeof(params));
390e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong    params.nSize = sizeof(params);
391e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong
392e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong    // Version: 1.0.0.0
393e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong    params.nVersion.s.nVersionMajor = 1;
394e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong
395e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong    params.nPortIndex = portIndex;
396e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong    params.bStoreMetaData = enable;
397e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong    if ((err = OMX_SetParameter(mHandle, index, &params)) != OMX_ErrorNone) {
39829357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("OMX_SetParameter() failed for StoreMetaDataInBuffers: 0x%08x", err);
399e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong        return UNKNOWN_ERROR;
400e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong    }
401e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong    return err;
402e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong}
403e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong
404318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::useBuffer(
405318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_U32 portIndex, const sp<IMemory> &params,
406318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX::buffer_id *buffer) {
407318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    Mutex::Autolock autoLock(mLock);
408318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
409318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    BufferMeta *buffer_meta = new BufferMeta(params);
410318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
411318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_BUFFERHEADERTYPE *header;
412318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
413318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_ERRORTYPE err = OMX_UseBuffer(
414318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            mHandle, &header, portIndex, buffer_meta,
415318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            params->size(), static_cast<OMX_U8 *>(params->pointer()));
416318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
417318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    if (err != OMX_ErrorNone) {
41829357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("OMX_UseBuffer failed with error %d (0x%08x)", err, err);
419318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
420318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        delete buffer_meta;
421318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        buffer_meta = NULL;
422318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
423318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        *buffer = 0;
424318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
425318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        return UNKNOWN_ERROR;
426318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    }
427318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
42803b268eac37ca2589bfff0bf58daf79d29cc14f4Andreas Huber    CHECK_EQ(header->pAppPrivate, buffer_meta);
42903b268eac37ca2589bfff0bf58daf79d29cc14f4Andreas Huber
430318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    *buffer = header;
431318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
432d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    addActiveBuffer(portIndex, *buffer);
433d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber
434f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    sp<GraphicBufferSource> bufferSource(getGraphicBufferSource());
435f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    if (bufferSource != NULL && portIndex == kPortIndexInput) {
436f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden        bufferSource->addCodecBuffer(header);
437f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    }
438f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden
439318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return OK;
440318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
441318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
442c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajanstatus_t OMXNodeInstance::useGraphicBuffer2_l(
443c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan        OMX_U32 portIndex, const sp<GraphicBuffer>& graphicBuffer,
444c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan        OMX::buffer_id *buffer) {
445c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan
446c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan    // port definition
447c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan    OMX_PARAM_PORTDEFINITIONTYPE def;
448c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan    def.nSize = sizeof(OMX_PARAM_PORTDEFINITIONTYPE);
449c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan    def.nVersion.s.nVersionMajor = 1;
450c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan    def.nVersion.s.nVersionMinor = 0;
451c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan    def.nVersion.s.nRevision = 0;
452c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan    def.nVersion.s.nStep = 0;
453c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan    def.nPortIndex = portIndex;
454c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan    OMX_ERRORTYPE err = OMX_GetParameter(mHandle, OMX_IndexParamPortDefinition, &def);
455a0dac9e24ae7520cb7d7f0505bf0936bffbcd047Jamie Gennis    if (err != OMX_ErrorNone)
456c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan    {
45729357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("%s::%d:Error getting OMX_IndexParamPortDefinition", __FUNCTION__, __LINE__);
458c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan        return err;
459c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan    }
460c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan
461c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan    BufferMeta *bufferMeta = new BufferMeta(graphicBuffer);
462c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan
463c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan    OMX_BUFFERHEADERTYPE *header = NULL;
464c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan    OMX_U8* bufferHandle = const_cast<OMX_U8*>(
465c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan            reinterpret_cast<const OMX_U8*>(graphicBuffer->handle));
466c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan
467c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan    err = OMX_UseBuffer(
468c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan            mHandle,
469c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan            &header,
470c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan            portIndex,
471c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan            bufferMeta,
472c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan            def.nBufferSize,
473c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan            bufferHandle);
474c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan
475c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan    if (err != OMX_ErrorNone) {
47629357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("OMX_UseBuffer failed with error %d (0x%08x)", err, err);
477c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan        delete bufferMeta;
478c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan        bufferMeta = NULL;
479c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan        *buffer = 0;
480c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan        return UNKNOWN_ERROR;
481c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan    }
482c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan
483c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan    CHECK_EQ(header->pBuffer, bufferHandle);
484c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan    CHECK_EQ(header->pAppPrivate, bufferMeta);
485c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan
486c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan    *buffer = header;
487c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan
488c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan    addActiveBuffer(portIndex, *buffer);
489c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan
490c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan    return OK;
491c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan}
492c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan
493c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan// XXX: This function is here for backwards compatibility.  Once the OMX
494c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan// implementations have been updated this can be removed and useGraphicBuffer2
495c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan// can be renamed to useGraphicBuffer.
49683750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennisstatus_t OMXNodeInstance::useGraphicBuffer(
49783750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        OMX_U32 portIndex, const sp<GraphicBuffer>& graphicBuffer,
49883750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        OMX::buffer_id *buffer) {
49983750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    Mutex::Autolock autoLock(mLock);
50083750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
501c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan    // See if the newer version of the extension is present.
50283750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    OMX_INDEXTYPE index;
503c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan    if (OMX_GetExtensionIndex(
504c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan            mHandle,
505c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan            const_cast<OMX_STRING>("OMX.google.android.index.useAndroidNativeBuffer2"),
506c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan            &index) == OMX_ErrorNone) {
507c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan        return useGraphicBuffer2_l(portIndex, graphicBuffer, buffer);
508c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan    }
509c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan
51083750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    OMX_ERRORTYPE err = OMX_GetExtensionIndex(
51183750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            mHandle,
51283750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            const_cast<OMX_STRING>("OMX.google.android.index.useAndroidNativeBuffer"),
51383750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            &index);
51483750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
51583750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    if (err != OMX_ErrorNone) {
51629357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("OMX_GetExtensionIndex failed");
51783750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
51883750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        return StatusFromOMXError(err);
51983750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    }
52083750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
52183750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    BufferMeta *bufferMeta = new BufferMeta(graphicBuffer);
52283750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
52383750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    OMX_BUFFERHEADERTYPE *header;
52483750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
52583750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    OMX_VERSIONTYPE ver;
52683750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    ver.s.nVersionMajor = 1;
52783750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    ver.s.nVersionMinor = 0;
52883750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    ver.s.nRevision = 0;
52983750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    ver.s.nStep = 0;
53083750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    UseAndroidNativeBufferParams params = {
53183750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        sizeof(UseAndroidNativeBufferParams), ver, portIndex, bufferMeta,
53283750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        &header, graphicBuffer,
53383750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    };
53483750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
53583750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    err = OMX_SetParameter(mHandle, index, &params);
53683750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
53783750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    if (err != OMX_ErrorNone) {
53829357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("OMX_UseAndroidNativeBuffer failed with error %d (0x%08x)", err,
53983750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis                err);
54083750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
54183750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        delete bufferMeta;
54283750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        bufferMeta = NULL;
54383750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
54483750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        *buffer = 0;
54583750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
54683750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        return UNKNOWN_ERROR;
54783750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    }
54883750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
54983750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    CHECK_EQ(header->pAppPrivate, bufferMeta);
55083750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
55183750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    *buffer = header;
55283750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
55383750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    addActiveBuffer(portIndex, *buffer);
55483750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
55583750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    return OK;
55683750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis}
55783750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
558f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFaddenstatus_t OMXNodeInstance::createInputSurface(
559f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden        OMX_U32 portIndex, sp<IGraphicBufferProducer> *bufferProducer) {
560f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    Mutex::Autolock autolock(mLock);
561f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    status_t err;
562f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden
563f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    const sp<GraphicBufferSource>& surfaceCheck = getGraphicBufferSource();
564f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    if (surfaceCheck != NULL) {
565f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden        return ALREADY_EXISTS;
566f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    }
567f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden
568f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    // Input buffers will hold meta-data (gralloc references).
569f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    err = storeMetaDataInBuffers_l(portIndex, OMX_TRUE);
570f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    if (err != OK) {
571f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden        return err;
572f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    }
573f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden
574f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    // Retrieve the width and height of the graphic buffer, set when the
575f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    // codec was configured.
576f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    OMX_PARAM_PORTDEFINITIONTYPE def;
577f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    def.nSize = sizeof(def);
578f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    def.nVersion.s.nVersionMajor = 1;
579f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    def.nVersion.s.nVersionMinor = 0;
580f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    def.nVersion.s.nRevision = 0;
581f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    def.nVersion.s.nStep = 0;
582f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    def.nPortIndex = portIndex;
583f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    OMX_ERRORTYPE oerr = OMX_GetParameter(
584f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden            mHandle, OMX_IndexParamPortDefinition, &def);
585f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    CHECK(oerr == OMX_ErrorNone);
586f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden
587ba6218eae3dbcf3f962b3561b26374a214dbf5e2Andy McFadden    if (def.format.video.eColorFormat != OMX_COLOR_FormatAndroidOpaque) {
588ba6218eae3dbcf3f962b3561b26374a214dbf5e2Andy McFadden        ALOGE("createInputSurface requires AndroidOpaque color format");
589ba6218eae3dbcf3f962b3561b26374a214dbf5e2Andy McFadden        return INVALID_OPERATION;
590ba6218eae3dbcf3f962b3561b26374a214dbf5e2Andy McFadden    }
591ba6218eae3dbcf3f962b3561b26374a214dbf5e2Andy McFadden
592f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    GraphicBufferSource* bufferSource = new GraphicBufferSource(
5930c37f9d1320bb87fd242f9425c67dacd6ce20112Andy McFadden            this, def.format.video.nFrameWidth, def.format.video.nFrameHeight,
5940c37f9d1320bb87fd242f9425c67dacd6ce20112Andy McFadden            def.nBufferCountActual);
595f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    if ((err = bufferSource->initCheck()) != OK) {
596f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden        delete bufferSource;
597f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden        return err;
598f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    }
599f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    setGraphicBufferSource(bufferSource);
600f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden
601f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    *bufferProducer = bufferSource->getIGraphicBufferProducer();
602f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    return OK;
603f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden}
604f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden
605f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFaddenstatus_t OMXNodeInstance::signalEndOfInputStream() {
606f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    // For non-Surface input, the MediaCodec should convert the call to a
607f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    // pair of requests (dequeue input buffer, queue input buffer with EOS
608f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    // flag set).  Seems easier than doing the equivalent from here.
609f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    sp<GraphicBufferSource> bufferSource(getGraphicBufferSource());
610f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    if (bufferSource == NULL) {
611ba6218eae3dbcf3f962b3561b26374a214dbf5e2Andy McFadden        ALOGW("signalEndOfInputStream can only be used with Surface input");
612f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden        return INVALID_OPERATION;
613f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    };
614ba6218eae3dbcf3f962b3561b26374a214dbf5e2Andy McFadden    return bufferSource->signalEndOfInputStream();
615f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden}
616f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden
617318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::allocateBuffer(
618570a3cb7582daa030cb38eedc5eb6a06f86ecc7fAndreas Huber        OMX_U32 portIndex, size_t size, OMX::buffer_id *buffer,
619570a3cb7582daa030cb38eedc5eb6a06f86ecc7fAndreas Huber        void **buffer_data) {
620318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    Mutex::Autolock autoLock(mLock);
621318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
622318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    BufferMeta *buffer_meta = new BufferMeta(size);
623318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
624318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_BUFFERHEADERTYPE *header;
625318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
626318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_ERRORTYPE err = OMX_AllocateBuffer(
627318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            mHandle, &header, portIndex, buffer_meta, size);
628318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
629318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    if (err != OMX_ErrorNone) {
63029357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("OMX_AllocateBuffer failed with error %d (0x%08x)", err, err);
631318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
632318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        delete buffer_meta;
633318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        buffer_meta = NULL;
634318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
635318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        *buffer = 0;
636318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
637318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        return UNKNOWN_ERROR;
638318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    }
639318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
64003b268eac37ca2589bfff0bf58daf79d29cc14f4Andreas Huber    CHECK_EQ(header->pAppPrivate, buffer_meta);
64103b268eac37ca2589bfff0bf58daf79d29cc14f4Andreas Huber
642318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    *buffer = header;
643570a3cb7582daa030cb38eedc5eb6a06f86ecc7fAndreas Huber    *buffer_data = header->pBuffer;
644318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
645d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    addActiveBuffer(portIndex, *buffer);
646d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber
647f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    sp<GraphicBufferSource> bufferSource(getGraphicBufferSource());
648f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    if (bufferSource != NULL && portIndex == kPortIndexInput) {
649f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden        bufferSource->addCodecBuffer(header);
650f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    }
651f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden
652318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return OK;
653318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
654318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
655318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::allocateBufferWithBackup(
656318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_U32 portIndex, const sp<IMemory> &params,
657318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX::buffer_id *buffer) {
658318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    Mutex::Autolock autoLock(mLock);
659318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
660318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    BufferMeta *buffer_meta = new BufferMeta(params, true);
661318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
662318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_BUFFERHEADERTYPE *header;
663318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
664318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_ERRORTYPE err = OMX_AllocateBuffer(
665318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            mHandle, &header, portIndex, buffer_meta, params->size());
666318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
667318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    if (err != OMX_ErrorNone) {
66829357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("OMX_AllocateBuffer failed with error %d (0x%08x)", err, err);
669318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
670318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        delete buffer_meta;
671318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        buffer_meta = NULL;
672318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
673318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        *buffer = 0;
674318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
675318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        return UNKNOWN_ERROR;
676318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    }
677318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
67803b268eac37ca2589bfff0bf58daf79d29cc14f4Andreas Huber    CHECK_EQ(header->pAppPrivate, buffer_meta);
67903b268eac37ca2589bfff0bf58daf79d29cc14f4Andreas Huber
680318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    *buffer = header;
681318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
682d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    addActiveBuffer(portIndex, *buffer);
683d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber
684f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    sp<GraphicBufferSource> bufferSource(getGraphicBufferSource());
685f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    if (bufferSource != NULL && portIndex == kPortIndexInput) {
686f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden        bufferSource->addCodecBuffer(header);
687f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    }
688f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden
689318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return OK;
690318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
691318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
692318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::freeBuffer(
693318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_U32 portIndex, OMX::buffer_id buffer) {
694318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    Mutex::Autolock autoLock(mLock);
695318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
696d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    removeActiveBuffer(portIndex, buffer);
697d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber
698318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_BUFFERHEADERTYPE *header = (OMX_BUFFERHEADERTYPE *)buffer;
699318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    BufferMeta *buffer_meta = static_cast<BufferMeta *>(header->pAppPrivate);
700318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
701318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_ERRORTYPE err = OMX_FreeBuffer(mHandle, portIndex, header);
702318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
703318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    delete buffer_meta;
704318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    buffer_meta = NULL;
705318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
706318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return StatusFromOMXError(err);
707318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
708318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
709318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::fillBuffer(OMX::buffer_id buffer) {
710318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    Mutex::Autolock autoLock(mLock);
711318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
712318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_BUFFERHEADERTYPE *header = (OMX_BUFFERHEADERTYPE *)buffer;
713318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    header->nFilledLen = 0;
714318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    header->nOffset = 0;
715318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    header->nFlags = 0;
716318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
717318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_ERRORTYPE err = OMX_FillThisBuffer(mHandle, header);
718318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
719318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return StatusFromOMXError(err);
720318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
721318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
722318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::emptyBuffer(
723318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX::buffer_id buffer,
724318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_U32 rangeOffset, OMX_U32 rangeLength,
725318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_U32 flags, OMX_TICKS timestamp) {
726318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    Mutex::Autolock autoLock(mLock);
727318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
728318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_BUFFERHEADERTYPE *header = (OMX_BUFFERHEADERTYPE *)buffer;
729318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    header->nFilledLen = rangeLength;
730318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    header->nOffset = rangeOffset;
731318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    header->nFlags = flags;
732318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    header->nTimeStamp = timestamp;
733318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
734318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    BufferMeta *buffer_meta =
735318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        static_cast<BufferMeta *>(header->pAppPrivate);
736318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    buffer_meta->CopyToOMX(header);
737318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
738318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_ERRORTYPE err = OMX_EmptyThisBuffer(mHandle, header);
739318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
740318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return StatusFromOMXError(err);
741318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
742318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
743f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden// like emptyBuffer, but the data is already in header->pBuffer
744f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFaddenstatus_t OMXNodeInstance::emptyDirectBuffer(
745f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden        OMX_BUFFERHEADERTYPE *header,
746f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden        OMX_U32 rangeOffset, OMX_U32 rangeLength,
747f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden        OMX_U32 flags, OMX_TICKS timestamp) {
748f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    Mutex::Autolock autoLock(mLock);
749f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden
750f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    header->nFilledLen = rangeLength;
751f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    header->nOffset = rangeOffset;
752f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    header->nFlags = flags;
753f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    header->nTimeStamp = timestamp;
754f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden
755f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    OMX_ERRORTYPE err = OMX_EmptyThisBuffer(mHandle, header);
756f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    if (err != OMX_ErrorNone) {
757f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden        ALOGW("emptyDirectBuffer failed, OMX err=0x%x", err);
758f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    }
759f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden
760f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    return StatusFromOMXError(err);
761f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden}
762f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden
763318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::getExtensionIndex(
764318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        const char *parameterName, OMX_INDEXTYPE *index) {
765318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    Mutex::Autolock autoLock(mLock);
766318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
767318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_ERRORTYPE err = OMX_GetExtensionIndex(
768318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            mHandle, const_cast<char *>(parameterName), index);
769318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
770318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return StatusFromOMXError(err);
771318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
772318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
773318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Hubervoid OMXNodeInstance::onMessage(const omx_message &msg) {
774318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    if (msg.type == omx_message::FILL_BUFFER_DONE) {
775318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_BUFFERHEADERTYPE *buffer =
776318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            static_cast<OMX_BUFFERHEADERTYPE *>(
777318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber                    msg.u.extended_buffer_data.buffer);
778318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
779318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        BufferMeta *buffer_meta =
780318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            static_cast<BufferMeta *>(buffer->pAppPrivate);
781318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
782318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        buffer_meta->CopyFromOMX(buffer);
783318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    }
784318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
785318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    mObserver->onMessage(msg);
786318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
787318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
788f0fb96c352f30b812a4903a1d783a715e1e817bdAndreas Hubervoid OMXNodeInstance::onObserverDied(OMXMaster *master) {
78929357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block    ALOGE("!!! Observer died. Quickly, do something, ... anything...");
790318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
791318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    // Try to force shutdown of the node and hope for the best.
792f0fb96c352f30b812a4903a1d783a715e1e817bdAndreas Huber    freeNode(master);
793318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
794318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
795318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Hubervoid OMXNodeInstance::onGetHandleFailed() {
796318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    delete this;
797318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
798318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
799f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden// OMXNodeInstance::OnEvent calls OMX::OnEvent, which then calls here.
800f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden// Don't try to acquire mLock here -- in rare circumstances this will hang.
801f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFaddenvoid OMXNodeInstance::onEvent(
802f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden        OMX_EVENTTYPE event, OMX_U32 arg1, OMX_U32 arg2) {
803f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    const sp<GraphicBufferSource>& bufferSource(getGraphicBufferSource());
804f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden
805f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    if (bufferSource != NULL && event == OMX_EventCmdComplete &&
806f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden            arg1 == OMX_CommandStateSet) {
807f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden        if (arg2 == OMX_StateExecuting) {
808f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden            bufferSource->omxExecuting();
809ba6218eae3dbcf3f962b3561b26374a214dbf5e2Andy McFadden        } else if (arg2 == OMX_StateLoaded) {
810ba6218eae3dbcf3f962b3561b26374a214dbf5e2Andy McFadden            // Must be shutting down -- won't have a GraphicBufferSource
811ba6218eae3dbcf3f962b3561b26374a214dbf5e2Andy McFadden            // on the way up.
812ba6218eae3dbcf3f962b3561b26374a214dbf5e2Andy McFadden            bufferSource->omxLoaded();
813ba6218eae3dbcf3f962b3561b26374a214dbf5e2Andy McFadden            setGraphicBufferSource(NULL);
814f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden        }
815f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    }
816f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden}
817f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden
818318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber// static
819318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas HuberOMX_ERRORTYPE OMXNodeInstance::OnEvent(
820318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_IN OMX_HANDLETYPE hComponent,
821318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_IN OMX_PTR pAppData,
822318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_IN OMX_EVENTTYPE eEvent,
823318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_IN OMX_U32 nData1,
824318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_IN OMX_U32 nData2,
825318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_IN OMX_PTR pEventData) {
826318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMXNodeInstance *instance = static_cast<OMXNodeInstance *>(pAppData);
827134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    if (instance->mDying) {
828134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber        return OMX_ErrorNone;
829134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    }
830318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return instance->owner()->OnEvent(
831318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            instance->nodeID(), eEvent, nData1, nData2, pEventData);
832318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
833318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
834318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber// static
835318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas HuberOMX_ERRORTYPE OMXNodeInstance::OnEmptyBufferDone(
836318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_IN OMX_HANDLETYPE hComponent,
837318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_IN OMX_PTR pAppData,
838318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_IN OMX_BUFFERHEADERTYPE* pBuffer) {
839318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMXNodeInstance *instance = static_cast<OMXNodeInstance *>(pAppData);
840134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    if (instance->mDying) {
841134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber        return OMX_ErrorNone;
842134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    }
843f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    const sp<GraphicBufferSource>& bufferSource(
844f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden            instance->getGraphicBufferSource());
845f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    if (bufferSource != NULL) {
846f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden        bufferSource->codecBufferEmptied(pBuffer);
847f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden
848f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden        // This is one of the buffers used exclusively by GraphicBufferSource.
849f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden        // Don't dispatch a message back to ACodec, since it doesn't
850f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden        // know that anyone asked to have the buffer emptied and will
851f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden        // be very confused.
852f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden        return OMX_ErrorNone;
853f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    }
854318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return instance->owner()->OnEmptyBufferDone(instance->nodeID(), pBuffer);
855318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
856318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
857318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber// static
858318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas HuberOMX_ERRORTYPE OMXNodeInstance::OnFillBufferDone(
859318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_IN OMX_HANDLETYPE hComponent,
860318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_IN OMX_PTR pAppData,
861318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_IN OMX_BUFFERHEADERTYPE* pBuffer) {
862318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMXNodeInstance *instance = static_cast<OMXNodeInstance *>(pAppData);
863134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    if (instance->mDying) {
864134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber        return OMX_ErrorNone;
865134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    }
866318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return instance->owner()->OnFillBufferDone(instance->nodeID(), pBuffer);
867318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
868318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
869d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Hubervoid OMXNodeInstance::addActiveBuffer(OMX_U32 portIndex, OMX::buffer_id id) {
870d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    ActiveBuffer active;
871d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    active.mPortIndex = portIndex;
872d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    active.mID = id;
873d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    mActiveBuffers.push(active);
874d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber}
875d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber
876d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Hubervoid OMXNodeInstance::removeActiveBuffer(
877d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber        OMX_U32 portIndex, OMX::buffer_id id) {
878d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    bool found = false;
879d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    for (size_t i = 0; i < mActiveBuffers.size(); ++i) {
880d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber        if (mActiveBuffers[i].mPortIndex == portIndex
881d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            && mActiveBuffers[i].mID == id) {
882d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            found = true;
883d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            mActiveBuffers.removeItemsAt(i);
884d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            break;
885d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber        }
886d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    }
887d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber
888d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    if (!found) {
8895ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block        ALOGW("Attempt to remove an active buffer we know nothing about...");
890d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    }
891d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber}
892d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber
893d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Hubervoid OMXNodeInstance::freeActiveBuffers() {
894d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    // Make sure to count down here, as freeBuffer will in turn remove
895d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    // the active buffer from the vector...
896d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    for (size_t i = mActiveBuffers.size(); i--;) {
897d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber        freeBuffer(mActiveBuffers[i].mPortIndex, mActiveBuffers[i].mID);
898d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    }
899d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber}
900d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber
901318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}  // namespace android
902