OMXNodeInstance.cpp revision 609b815a3131d22da38b2f452faa9f89daad4039
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
73d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar    void setGraphicBuffer(const sp<GraphicBuffer> &graphicBuffer) {
74d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar        mGraphicBuffer = graphicBuffer;
75d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar    }
76d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar
77318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberprivate:
7883750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    sp<GraphicBuffer> mGraphicBuffer;
79318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    sp<IMemory> mMem;
80318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    size_t mSize;
81318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    bool mIsBackup;
82318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
83318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    BufferMeta(const BufferMeta &);
84318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    BufferMeta &operator=(const BufferMeta &);
85318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber};
86318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
87318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber// static
88318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas HuberOMX_CALLBACKTYPE OMXNodeInstance::kCallbacks = {
89318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    &OnEvent, &OnEmptyBufferDone, &OnFillBufferDone
90318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber};
91318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
92318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas HuberOMXNodeInstance::OMXNodeInstance(
93318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX *owner, const sp<IOMXObserver> &observer)
94318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    : mOwner(owner),
95609b815a3131d22da38b2f452faa9f89daad4039Andy Hung      mNodeID(0),
96318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber      mHandle(NULL),
97134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber      mObserver(observer),
98609b815a3131d22da38b2f452faa9f89daad4039Andy Hung      mDying(false)
99609b815a3131d22da38b2f452faa9f89daad4039Andy Hung#ifdef __LP64__
100609b815a3131d22da38b2f452faa9f89daad4039Andy Hung      , mBufferIDCount(0)
101609b815a3131d22da38b2f452faa9f89daad4039Andy Hung#endif
102609b815a3131d22da38b2f452faa9f89daad4039Andy Hung{
103318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
104318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
105318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas HuberOMXNodeInstance::~OMXNodeInstance() {
106f1d5aa162c02a16b7195a43a9bcea4d592600ac4James Dong    CHECK(mHandle == NULL);
107318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
108318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
109318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Hubervoid OMXNodeInstance::setHandle(OMX::node_id node_id, OMX_HANDLETYPE handle) {
110f1d5aa162c02a16b7195a43a9bcea4d592600ac4James Dong    CHECK(mHandle == NULL);
111318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    mNodeID = node_id;
112318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    mHandle = handle;
113318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
114318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
115f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFaddensp<GraphicBufferSource> OMXNodeInstance::getGraphicBufferSource() {
116f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    Mutex::Autolock autoLock(mGraphicBufferSourceLock);
117f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    return mGraphicBufferSource;
118f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden}
119f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden
120f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFaddenvoid OMXNodeInstance::setGraphicBufferSource(
121f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden        const sp<GraphicBufferSource>& bufferSource) {
122f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    Mutex::Autolock autoLock(mGraphicBufferSourceLock);
123f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    mGraphicBufferSource = bufferSource;
124f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden}
125f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden
126318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas HuberOMX *OMXNodeInstance::owner() {
127318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return mOwner;
128318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
129318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
130318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Hubersp<IOMXObserver> OMXNodeInstance::observer() {
131318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return mObserver;
132318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
133318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
134318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas HuberOMX::node_id OMXNodeInstance::nodeID() {
135318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return mNodeID;
136318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
137318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
138318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatic status_t StatusFromOMXError(OMX_ERRORTYPE err) {
1392a3847ee1cbdaa8a65eee397a0173bb02211c459Andreas Huber    switch (err) {
1402a3847ee1cbdaa8a65eee397a0173bb02211c459Andreas Huber        case OMX_ErrorNone:
1412a3847ee1cbdaa8a65eee397a0173bb02211c459Andreas Huber            return OK;
1422a3847ee1cbdaa8a65eee397a0173bb02211c459Andreas Huber        case OMX_ErrorUnsupportedSetting:
1432a3847ee1cbdaa8a65eee397a0173bb02211c459Andreas Huber            return ERROR_UNSUPPORTED;
1442a3847ee1cbdaa8a65eee397a0173bb02211c459Andreas Huber        default:
1452a3847ee1cbdaa8a65eee397a0173bb02211c459Andreas Huber            return UNKNOWN_ERROR;
1462a3847ee1cbdaa8a65eee397a0173bb02211c459Andreas Huber    }
147318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
148318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
149f0fb96c352f30b812a4903a1d783a715e1e817bdAndreas Huberstatus_t OMXNodeInstance::freeNode(OMXMaster *master) {
15043e5eca7048a3b7b3ee0223b7f3cbd837ed10ae5Andreas Huber    static int32_t kMaxNumIterations = 10;
15143e5eca7048a3b7b3ee0223b7f3cbd837ed10ae5Andreas Huber
152d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    // Transition the node from its current state all the way down
153d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    // to "Loaded".
154d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    // This ensures that all active buffers are properly freed even
155d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    // for components that don't do this themselves on a call to
156d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    // "FreeHandle".
157d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber
158134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    // The code below may trigger some more events to be dispatched
159134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    // by the OMX component - we want to ignore them as our client
160134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    // does not expect them.
161134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    mDying = true;
162134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber
163d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    OMX_STATETYPE state;
164d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    CHECK_EQ(OMX_GetState(mHandle, &state), OMX_ErrorNone);
165d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    switch (state) {
166d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber        case OMX_StateExecuting:
167d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber        {
1683856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("forcing Executing->Idle");
169d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            sendCommand(OMX_CommandStateSet, OMX_StateIdle);
170d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            OMX_ERRORTYPE err;
17143e5eca7048a3b7b3ee0223b7f3cbd837ed10ae5Andreas Huber            int32_t iteration = 0;
172d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            while ((err = OMX_GetState(mHandle, &state)) == OMX_ErrorNone
1730d681df3b0ded2c1e335b6b5785439da4ce2c238Andreas Huber                   && state != OMX_StateIdle
1740d681df3b0ded2c1e335b6b5785439da4ce2c238Andreas Huber                   && state != OMX_StateInvalid) {
17543e5eca7048a3b7b3ee0223b7f3cbd837ed10ae5Andreas Huber                if (++iteration > kMaxNumIterations) {
17629357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block                    ALOGE("component failed to enter Idle state, aborting.");
17743e5eca7048a3b7b3ee0223b7f3cbd837ed10ae5Andreas Huber                    state = OMX_StateInvalid;
17843e5eca7048a3b7b3ee0223b7f3cbd837ed10ae5Andreas Huber                    break;
17943e5eca7048a3b7b3ee0223b7f3cbd837ed10ae5Andreas Huber                }
18043e5eca7048a3b7b3ee0223b7f3cbd837ed10ae5Andreas Huber
181d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber                usleep(100000);
182d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            }
183d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            CHECK_EQ(err, OMX_ErrorNone);
184d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber
1850d681df3b0ded2c1e335b6b5785439da4ce2c238Andreas Huber            if (state == OMX_StateInvalid) {
1860d681df3b0ded2c1e335b6b5785439da4ce2c238Andreas Huber                break;
1870d681df3b0ded2c1e335b6b5785439da4ce2c238Andreas Huber            }
1880d681df3b0ded2c1e335b6b5785439da4ce2c238Andreas Huber
189d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            // fall through
190d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber        }
191d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber
192d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber        case OMX_StateIdle:
193d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber        {
1943856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("forcing Idle->Loaded");
195d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            sendCommand(OMX_CommandStateSet, OMX_StateLoaded);
196d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber
197d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            freeActiveBuffers();
198d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber
199d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            OMX_ERRORTYPE err;
20043e5eca7048a3b7b3ee0223b7f3cbd837ed10ae5Andreas Huber            int32_t iteration = 0;
201d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            while ((err = OMX_GetState(mHandle, &state)) == OMX_ErrorNone
2020d681df3b0ded2c1e335b6b5785439da4ce2c238Andreas Huber                   && state != OMX_StateLoaded
2030d681df3b0ded2c1e335b6b5785439da4ce2c238Andreas Huber                   && state != OMX_StateInvalid) {
20443e5eca7048a3b7b3ee0223b7f3cbd837ed10ae5Andreas Huber                if (++iteration > kMaxNumIterations) {
20529357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block                    ALOGE("component failed to enter Loaded state, aborting.");
20643e5eca7048a3b7b3ee0223b7f3cbd837ed10ae5Andreas Huber                    state = OMX_StateInvalid;
20743e5eca7048a3b7b3ee0223b7f3cbd837ed10ae5Andreas Huber                    break;
20843e5eca7048a3b7b3ee0223b7f3cbd837ed10ae5Andreas Huber                }
20943e5eca7048a3b7b3ee0223b7f3cbd837ed10ae5Andreas Huber
2103856b090cd04ba5dd4a59a12430ed724d5995909Steve Block                ALOGV("waiting for Loaded state...");
211d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber                usleep(100000);
212d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            }
213d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            CHECK_EQ(err, OMX_ErrorNone);
214d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber
215d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            // fall through
216d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber        }
217d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber
218d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber        case OMX_StateLoaded:
219fa70cad40b01627ac1c22e04cdd548ece9c2654fAndreas Huber        case OMX_StateInvalid:
220d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            break;
221d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber
222d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber        default:
223d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            CHECK(!"should not be here, unknown state.");
224d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            break;
225d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    }
226d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber
2273856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("calling destroyComponentInstance");
228f0fb96c352f30b812a4903a1d783a715e1e817bdAndreas Huber    OMX_ERRORTYPE err = master->destroyComponentInstance(
229f0fb96c352f30b812a4903a1d783a715e1e817bdAndreas Huber            static_cast<OMX_COMPONENTTYPE *>(mHandle));
2303856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("destroyComponentInstance returned err %d", err);
231f0fb96c352f30b812a4903a1d783a715e1e817bdAndreas Huber
232318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    mHandle = NULL;
233318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
234318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    if (err != OMX_ErrorNone) {
23529357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("FreeHandle FAILED with error 0x%08x.", err);
236318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    }
237318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
238318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    mOwner->invalidateNodeID(mNodeID);
239609b815a3131d22da38b2f452faa9f89daad4039Andy Hung    mNodeID = 0;
240318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
2413856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("OMXNodeInstance going away.");
24247bed1a7755ed58fa5d4c0d35b20468deb83bd60Andreas Huber    delete this;
243318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
244318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return StatusFromOMXError(err);
245318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
246318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
247318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::sendCommand(
248318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_COMMANDTYPE cmd, OMX_S32 param) {
249e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber    const sp<GraphicBufferSource>& bufferSource(getGraphicBufferSource());
250ad3b7e8d40bf1c97347f1538d30bba78ca371f67Andreas Huber    if (bufferSource != NULL && cmd == OMX_CommandStateSet) {
251ad3b7e8d40bf1c97347f1538d30bba78ca371f67Andreas Huber        if (param == OMX_StateIdle) {
252ad3b7e8d40bf1c97347f1538d30bba78ca371f67Andreas Huber            // Initiating transition from Executing -> Idle
253ad3b7e8d40bf1c97347f1538d30bba78ca371f67Andreas Huber            // ACodec is waiting for all buffers to be returned, do NOT
254ad3b7e8d40bf1c97347f1538d30bba78ca371f67Andreas Huber            // submit any more buffers to the codec.
255ad3b7e8d40bf1c97347f1538d30bba78ca371f67Andreas Huber            bufferSource->omxIdle();
256ad3b7e8d40bf1c97347f1538d30bba78ca371f67Andreas Huber        } else if (param == OMX_StateLoaded) {
257ad3b7e8d40bf1c97347f1538d30bba78ca371f67Andreas Huber            // Initiating transition from Idle/Executing -> Loaded
258ad3b7e8d40bf1c97347f1538d30bba78ca371f67Andreas Huber            // Buffers are about to be freed.
259ad3b7e8d40bf1c97347f1538d30bba78ca371f67Andreas Huber            bufferSource->omxLoaded();
260ad3b7e8d40bf1c97347f1538d30bba78ca371f67Andreas Huber            setGraphicBufferSource(NULL);
261ad3b7e8d40bf1c97347f1538d30bba78ca371f67Andreas Huber        }
262e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber
263e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber        // fall through
264e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber    }
265e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber
266318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    Mutex::Autolock autoLock(mLock);
267318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
268318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_ERRORTYPE err = OMX_SendCommand(mHandle, cmd, param, NULL);
269318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return StatusFromOMXError(err);
270318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
271318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
272318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::getParameter(
27384333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber        OMX_INDEXTYPE index, void *params, size_t /* size */) {
274318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    Mutex::Autolock autoLock(mLock);
275318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
276318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_ERRORTYPE err = OMX_GetParameter(mHandle, index, params);
277609b815a3131d22da38b2f452faa9f89daad4039Andy Hung    ALOGE_IF(err != OMX_ErrorNone, "getParameter(%d) ERROR: %#x", index, err);
278318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return StatusFromOMXError(err);
279318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
280318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
281318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::setParameter(
28284333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber        OMX_INDEXTYPE index, const void *params, size_t /* size */) {
283318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    Mutex::Autolock autoLock(mLock);
284318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
285318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_ERRORTYPE err = OMX_SetParameter(
286318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            mHandle, index, const_cast<void *>(params));
287609b815a3131d22da38b2f452faa9f89daad4039Andy Hung    ALOGE_IF(err != OMX_ErrorNone, "setParameter(%d) ERROR: %#x", index, err);
288318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return StatusFromOMXError(err);
289318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
290318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
291318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::getConfig(
29284333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber        OMX_INDEXTYPE index, void *params, size_t /* size */) {
293318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    Mutex::Autolock autoLock(mLock);
294318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
295318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_ERRORTYPE err = OMX_GetConfig(mHandle, index, params);
296318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return StatusFromOMXError(err);
297318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
298318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
299318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::setConfig(
30084333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber        OMX_INDEXTYPE index, const void *params, size_t /* size */) {
301318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    Mutex::Autolock autoLock(mLock);
302318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
303318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_ERRORTYPE err = OMX_SetConfig(
304318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            mHandle, index, const_cast<void *>(params));
305318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
306318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return StatusFromOMXError(err);
307b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis}
308b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis
309b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennisstatus_t OMXNodeInstance::getState(OMX_STATETYPE* state) {
310b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis    Mutex::Autolock autoLock(mLock);
311b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis
312b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis    OMX_ERRORTYPE err = OMX_GetState(mHandle, state);
313b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis
314b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis    return StatusFromOMXError(err);
315318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
316318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
31783750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennisstatus_t OMXNodeInstance::enableGraphicBuffers(
31883750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        OMX_U32 portIndex, OMX_BOOL enable) {
31983750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    Mutex::Autolock autoLock(mLock);
320ce18d7d85a78ac6642624fef1b5831eff4c72d56Jamie Gennis    OMX_STRING name = const_cast<OMX_STRING>(
321ce18d7d85a78ac6642624fef1b5831eff4c72d56Jamie Gennis            "OMX.google.android.index.enableAndroidNativeBuffers");
32283750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
32383750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    OMX_INDEXTYPE index;
324ce18d7d85a78ac6642624fef1b5831eff4c72d56Jamie Gennis    OMX_ERRORTYPE err = OMX_GetExtensionIndex(mHandle, name, &index);
32583750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
32683750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    if (err != OMX_ErrorNone) {
327d8754298b576aca4e85a059ea7b7e8f7a9502226Jamie Gennis        if (enable) {
328d8754298b576aca4e85a059ea7b7e8f7a9502226Jamie Gennis            ALOGE("OMX_GetExtensionIndex %s failed", name);
329d8754298b576aca4e85a059ea7b7e8f7a9502226Jamie Gennis        }
33083750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
33183750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        return StatusFromOMXError(err);
33283750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    }
33383750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
33483750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    OMX_VERSIONTYPE ver;
33583750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    ver.s.nVersionMajor = 1;
33683750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    ver.s.nVersionMinor = 0;
33783750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    ver.s.nRevision = 0;
33883750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    ver.s.nStep = 0;
33983750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    EnableAndroidNativeBuffersParams params = {
34083750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        sizeof(EnableAndroidNativeBuffersParams), ver, portIndex, enable,
34183750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    };
34283750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
34383750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    err = OMX_SetParameter(mHandle, index, &params);
34483750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
34583750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    if (err != OMX_ErrorNone) {
34629357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("OMX_EnableAndroidNativeBuffers failed with error %d (0x%08x)",
34783750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis                err, err);
34883750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
34983750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        return UNKNOWN_ERROR;
35083750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    }
35183750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
35283750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    return OK;
35383750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis}
35483750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
355e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennisstatus_t OMXNodeInstance::getGraphicBufferUsage(
356e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis        OMX_U32 portIndex, OMX_U32* usage) {
357e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis    Mutex::Autolock autoLock(mLock);
358e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis
359e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis    OMX_INDEXTYPE index;
360ce18d7d85a78ac6642624fef1b5831eff4c72d56Jamie Gennis    OMX_STRING name = const_cast<OMX_STRING>(
361ce18d7d85a78ac6642624fef1b5831eff4c72d56Jamie Gennis            "OMX.google.android.index.getAndroidNativeBufferUsage");
362ce18d7d85a78ac6642624fef1b5831eff4c72d56Jamie Gennis    OMX_ERRORTYPE err = OMX_GetExtensionIndex(mHandle, name, &index);
363e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis
364e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis    if (err != OMX_ErrorNone) {
365ce18d7d85a78ac6642624fef1b5831eff4c72d56Jamie Gennis        ALOGE("OMX_GetExtensionIndex %s failed", name);
366e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis
367e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis        return StatusFromOMXError(err);
368e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis    }
369e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis
370e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis    OMX_VERSIONTYPE ver;
371e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis    ver.s.nVersionMajor = 1;
372e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis    ver.s.nVersionMinor = 0;
373e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis    ver.s.nRevision = 0;
374e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis    ver.s.nStep = 0;
375e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis    GetAndroidNativeBufferUsageParams params = {
376e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis        sizeof(GetAndroidNativeBufferUsageParams), ver, portIndex, 0,
377e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis    };
378e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis
379e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis    err = OMX_GetParameter(mHandle, index, &params);
380e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis
381e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis    if (err != OMX_ErrorNone) {
38229357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("OMX_GetAndroidNativeBufferUsage failed with error %d (0x%08x)",
383e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis                err, err);
384e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis        return UNKNOWN_ERROR;
385e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis    }
386e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis
387e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis    *usage = params.nUsage;
388e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis
389e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis    return OK;
390e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis}
391e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis
392e870772a78ffe08b1c14a791e368f1499f1be0f3James Dongstatus_t OMXNodeInstance::storeMetaDataInBuffers(
393e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong        OMX_U32 portIndex,
394e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong        OMX_BOOL enable) {
395e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong    Mutex::Autolock autolock(mLock);
396f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    return storeMetaDataInBuffers_l(portIndex, enable);
397f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden}
398e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong
399f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFaddenstatus_t OMXNodeInstance::storeMetaDataInBuffers_l(
400f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden        OMX_U32 portIndex,
401f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden        OMX_BOOL enable) {
402e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong    OMX_INDEXTYPE index;
403e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong    OMX_STRING name = const_cast<OMX_STRING>(
404e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong            "OMX.google.android.index.storeMetaDataInBuffers");
405e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong
406e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong    OMX_ERRORTYPE err = OMX_GetExtensionIndex(mHandle, name, &index);
407e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong    if (err != OMX_ErrorNone) {
408d8754298b576aca4e85a059ea7b7e8f7a9502226Jamie Gennis        ALOGE("OMX_GetExtensionIndex %s failed", name);
409d8754298b576aca4e85a059ea7b7e8f7a9502226Jamie Gennis
410e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong        return StatusFromOMXError(err);
411e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong    }
412e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong
413e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong    StoreMetaDataInBuffersParams params;
414e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong    memset(&params, 0, sizeof(params));
415e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong    params.nSize = sizeof(params);
416e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong
417e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong    // Version: 1.0.0.0
418e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong    params.nVersion.s.nVersionMajor = 1;
419e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong
420e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong    params.nPortIndex = portIndex;
421e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong    params.bStoreMetaData = enable;
422e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong    if ((err = OMX_SetParameter(mHandle, index, &params)) != OMX_ErrorNone) {
42329357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("OMX_SetParameter() failed for StoreMetaDataInBuffers: 0x%08x", err);
424e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong        return UNKNOWN_ERROR;
425e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong    }
426e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong    return err;
427e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong}
428e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong
42956ce726019f700a95ce5b45beebceadae4836e30Lajos Molnarstatus_t OMXNodeInstance::prepareForAdaptivePlayback(
43056ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar        OMX_U32 portIndex, OMX_BOOL enable, OMX_U32 maxFrameWidth,
43156ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar        OMX_U32 maxFrameHeight) {
43256ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar    Mutex::Autolock autolock(mLock);
43356ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar
43456ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar    OMX_INDEXTYPE index;
43556ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar    OMX_STRING name = const_cast<OMX_STRING>(
43656ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar            "OMX.google.android.index.prepareForAdaptivePlayback");
43756ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar
43856ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar    OMX_ERRORTYPE err = OMX_GetExtensionIndex(mHandle, name, &index);
43956ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar    if (err != OMX_ErrorNone) {
44056ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar        ALOGW_IF(enable, "OMX_GetExtensionIndex %s failed", name);
44156ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar        return StatusFromOMXError(err);
44256ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar    }
44356ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar
44456ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar    PrepareForAdaptivePlaybackParams params;
44556ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar    params.nSize = sizeof(params);
44656ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar    params.nVersion.s.nVersionMajor = 1;
44756ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar    params.nVersion.s.nVersionMinor = 0;
44856ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar    params.nVersion.s.nRevision = 0;
44956ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar    params.nVersion.s.nStep = 0;
45056ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar
45156ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar    params.nPortIndex = portIndex;
45256ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar    params.bEnable = enable;
45356ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar    params.nMaxFrameWidth = maxFrameWidth;
45456ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar    params.nMaxFrameHeight = maxFrameHeight;
45556ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar    if ((err = OMX_SetParameter(mHandle, index, &params)) != OMX_ErrorNone) {
45656ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar        ALOGW("OMX_SetParameter failed for PrepareForAdaptivePlayback "
45756ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar              "with error %d (0x%08x)", err, err);
45856ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar        return UNKNOWN_ERROR;
45956ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar    }
46056ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar    return err;
46156ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar}
46256ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar
463318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::useBuffer(
464318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_U32 portIndex, const sp<IMemory> &params,
465318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX::buffer_id *buffer) {
466318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    Mutex::Autolock autoLock(mLock);
467318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
468318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    BufferMeta *buffer_meta = new BufferMeta(params);
469318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
470318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_BUFFERHEADERTYPE *header;
471318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
472318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_ERRORTYPE err = OMX_UseBuffer(
473318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            mHandle, &header, portIndex, buffer_meta,
474318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            params->size(), static_cast<OMX_U8 *>(params->pointer()));
475318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
476318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    if (err != OMX_ErrorNone) {
47729357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("OMX_UseBuffer failed with error %d (0x%08x)", err, err);
478318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
479318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        delete buffer_meta;
480318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        buffer_meta = NULL;
481318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
482318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        *buffer = 0;
483318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
484318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        return UNKNOWN_ERROR;
485318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    }
486318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
48703b268eac37ca2589bfff0bf58daf79d29cc14f4Andreas Huber    CHECK_EQ(header->pAppPrivate, buffer_meta);
48803b268eac37ca2589bfff0bf58daf79d29cc14f4Andreas Huber
489609b815a3131d22da38b2f452faa9f89daad4039Andy Hung    *buffer = makeBufferID(header);
490318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
491d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    addActiveBuffer(portIndex, *buffer);
492d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber
493f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    sp<GraphicBufferSource> bufferSource(getGraphicBufferSource());
494f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    if (bufferSource != NULL && portIndex == kPortIndexInput) {
495f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden        bufferSource->addCodecBuffer(header);
496f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    }
497f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden
498318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return OK;
499318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
500318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
501c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajanstatus_t OMXNodeInstance::useGraphicBuffer2_l(
502c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan        OMX_U32 portIndex, const sp<GraphicBuffer>& graphicBuffer,
503c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan        OMX::buffer_id *buffer) {
504c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan
505c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan    // port definition
506c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan    OMX_PARAM_PORTDEFINITIONTYPE def;
507c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan    def.nSize = sizeof(OMX_PARAM_PORTDEFINITIONTYPE);
508c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan    def.nVersion.s.nVersionMajor = 1;
509c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan    def.nVersion.s.nVersionMinor = 0;
510c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan    def.nVersion.s.nRevision = 0;
511c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan    def.nVersion.s.nStep = 0;
512c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan    def.nPortIndex = portIndex;
513c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan    OMX_ERRORTYPE err = OMX_GetParameter(mHandle, OMX_IndexParamPortDefinition, &def);
514a0dac9e24ae7520cb7d7f0505bf0936bffbcd047Jamie Gennis    if (err != OMX_ErrorNone)
515c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan    {
51629357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("%s::%d:Error getting OMX_IndexParamPortDefinition", __FUNCTION__, __LINE__);
517c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan        return err;
518c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan    }
519c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan
520c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan    BufferMeta *bufferMeta = new BufferMeta(graphicBuffer);
521c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan
522c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan    OMX_BUFFERHEADERTYPE *header = NULL;
523c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan    OMX_U8* bufferHandle = const_cast<OMX_U8*>(
524c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan            reinterpret_cast<const OMX_U8*>(graphicBuffer->handle));
525c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan
526c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan    err = OMX_UseBuffer(
527c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan            mHandle,
528c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan            &header,
529c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan            portIndex,
530c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan            bufferMeta,
531c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan            def.nBufferSize,
532c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan            bufferHandle);
533c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan
534c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan    if (err != OMX_ErrorNone) {
53529357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("OMX_UseBuffer failed with error %d (0x%08x)", err, err);
536c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan        delete bufferMeta;
537c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan        bufferMeta = NULL;
538c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan        *buffer = 0;
539c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan        return UNKNOWN_ERROR;
540c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan    }
541c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan
542c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan    CHECK_EQ(header->pBuffer, bufferHandle);
543c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan    CHECK_EQ(header->pAppPrivate, bufferMeta);
544c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan
545609b815a3131d22da38b2f452faa9f89daad4039Andy Hung    *buffer = makeBufferID(header);
546c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan
547c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan    addActiveBuffer(portIndex, *buffer);
548c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan
549c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan    return OK;
550c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan}
551c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan
552c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan// XXX: This function is here for backwards compatibility.  Once the OMX
553c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan// implementations have been updated this can be removed and useGraphicBuffer2
554c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan// can be renamed to useGraphicBuffer.
55583750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennisstatus_t OMXNodeInstance::useGraphicBuffer(
55683750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        OMX_U32 portIndex, const sp<GraphicBuffer>& graphicBuffer,
55783750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        OMX::buffer_id *buffer) {
55883750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    Mutex::Autolock autoLock(mLock);
55983750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
560c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan    // See if the newer version of the extension is present.
56183750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    OMX_INDEXTYPE index;
562c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan    if (OMX_GetExtensionIndex(
563c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan            mHandle,
564c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan            const_cast<OMX_STRING>("OMX.google.android.index.useAndroidNativeBuffer2"),
565c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan            &index) == OMX_ErrorNone) {
566c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan        return useGraphicBuffer2_l(portIndex, graphicBuffer, buffer);
567c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan    }
568c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan
569ce18d7d85a78ac6642624fef1b5831eff4c72d56Jamie Gennis    OMX_STRING name = const_cast<OMX_STRING>(
570ce18d7d85a78ac6642624fef1b5831eff4c72d56Jamie Gennis        "OMX.google.android.index.useAndroidNativeBuffer");
571ce18d7d85a78ac6642624fef1b5831eff4c72d56Jamie Gennis    OMX_ERRORTYPE err = OMX_GetExtensionIndex(mHandle, name, &index);
57283750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
57383750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    if (err != OMX_ErrorNone) {
574ce18d7d85a78ac6642624fef1b5831eff4c72d56Jamie Gennis        ALOGE("OMX_GetExtensionIndex %s failed", name);
57583750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
57683750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        return StatusFromOMXError(err);
57783750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    }
57883750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
57983750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    BufferMeta *bufferMeta = new BufferMeta(graphicBuffer);
58083750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
58183750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    OMX_BUFFERHEADERTYPE *header;
58283750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
58383750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    OMX_VERSIONTYPE ver;
58483750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    ver.s.nVersionMajor = 1;
58583750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    ver.s.nVersionMinor = 0;
58683750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    ver.s.nRevision = 0;
58783750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    ver.s.nStep = 0;
58883750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    UseAndroidNativeBufferParams params = {
58983750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        sizeof(UseAndroidNativeBufferParams), ver, portIndex, bufferMeta,
59083750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        &header, graphicBuffer,
59183750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    };
59283750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
59383750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    err = OMX_SetParameter(mHandle, index, &params);
59483750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
59583750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    if (err != OMX_ErrorNone) {
59629357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("OMX_UseAndroidNativeBuffer failed with error %d (0x%08x)", err,
59783750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis                err);
59883750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
59983750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        delete bufferMeta;
60083750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        bufferMeta = NULL;
60183750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
60283750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        *buffer = 0;
60383750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
60483750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        return UNKNOWN_ERROR;
60583750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    }
60683750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
60783750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    CHECK_EQ(header->pAppPrivate, bufferMeta);
60883750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
609609b815a3131d22da38b2f452faa9f89daad4039Andy Hung    *buffer = makeBufferID(header);
61083750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
61183750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    addActiveBuffer(portIndex, *buffer);
61283750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
61383750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    return OK;
61483750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis}
61583750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
616d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnarstatus_t OMXNodeInstance::updateGraphicBufferInMeta(
61784333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber        OMX_U32 /* portIndex */, const sp<GraphicBuffer>& graphicBuffer,
618d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar        OMX::buffer_id buffer) {
619d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar    Mutex::Autolock autoLock(mLock);
620d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar
621609b815a3131d22da38b2f452faa9f89daad4039Andy Hung    OMX_BUFFERHEADERTYPE *header = findBufferHeader(buffer);
622d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar    VideoDecoderOutputMetaData *metadata =
623d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar        (VideoDecoderOutputMetaData *)(header->pBuffer);
624d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar    BufferMeta *bufferMeta = (BufferMeta *)(header->pAppPrivate);
625d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar    bufferMeta->setGraphicBuffer(graphicBuffer);
626d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar    metadata->eType = kMetadataBufferTypeGrallocSource;
627d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar    metadata->pHandle = graphicBuffer->handle;
628d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar
629d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar    return OK;
630d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar}
631d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar
632f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFaddenstatus_t OMXNodeInstance::createInputSurface(
633f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden        OMX_U32 portIndex, sp<IGraphicBufferProducer> *bufferProducer) {
634f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    Mutex::Autolock autolock(mLock);
635f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    status_t err;
636f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden
637f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    const sp<GraphicBufferSource>& surfaceCheck = getGraphicBufferSource();
638f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    if (surfaceCheck != NULL) {
639f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden        return ALREADY_EXISTS;
640f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    }
641f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden
642f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    // Input buffers will hold meta-data (gralloc references).
643f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    err = storeMetaDataInBuffers_l(portIndex, OMX_TRUE);
644f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    if (err != OK) {
645f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden        return err;
646f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    }
647f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden
648f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    // Retrieve the width and height of the graphic buffer, set when the
649f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    // codec was configured.
650f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    OMX_PARAM_PORTDEFINITIONTYPE def;
651f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    def.nSize = sizeof(def);
652f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    def.nVersion.s.nVersionMajor = 1;
653f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    def.nVersion.s.nVersionMinor = 0;
654f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    def.nVersion.s.nRevision = 0;
655f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    def.nVersion.s.nStep = 0;
656f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    def.nPortIndex = portIndex;
657f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    OMX_ERRORTYPE oerr = OMX_GetParameter(
658f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden            mHandle, OMX_IndexParamPortDefinition, &def);
659f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    CHECK(oerr == OMX_ErrorNone);
660f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden
661ba6218eae3dbcf3f962b3561b26374a214dbf5e2Andy McFadden    if (def.format.video.eColorFormat != OMX_COLOR_FormatAndroidOpaque) {
66292cb8f928dc9e237c356c942d10b5c0c1e04b2aeAndy McFadden        ALOGE("createInputSurface requires COLOR_FormatSurface "
66392cb8f928dc9e237c356c942d10b5c0c1e04b2aeAndy McFadden              "(AndroidOpaque) color format");
664ba6218eae3dbcf3f962b3561b26374a214dbf5e2Andy McFadden        return INVALID_OPERATION;
665ba6218eae3dbcf3f962b3561b26374a214dbf5e2Andy McFadden    }
666ba6218eae3dbcf3f962b3561b26374a214dbf5e2Andy McFadden
667f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    GraphicBufferSource* bufferSource = new GraphicBufferSource(
6680c37f9d1320bb87fd242f9425c67dacd6ce20112Andy McFadden            this, def.format.video.nFrameWidth, def.format.video.nFrameHeight,
6690c37f9d1320bb87fd242f9425c67dacd6ce20112Andy McFadden            def.nBufferCountActual);
670f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    if ((err = bufferSource->initCheck()) != OK) {
671f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden        delete bufferSource;
672f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden        return err;
673f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    }
674f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    setGraphicBufferSource(bufferSource);
675f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden
676f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    *bufferProducer = bufferSource->getIGraphicBufferProducer();
677f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    return OK;
678f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden}
679f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden
680f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFaddenstatus_t OMXNodeInstance::signalEndOfInputStream() {
681f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    // For non-Surface input, the MediaCodec should convert the call to a
682f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    // pair of requests (dequeue input buffer, queue input buffer with EOS
683f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    // flag set).  Seems easier than doing the equivalent from here.
684f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    sp<GraphicBufferSource> bufferSource(getGraphicBufferSource());
685f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    if (bufferSource == NULL) {
686ba6218eae3dbcf3f962b3561b26374a214dbf5e2Andy McFadden        ALOGW("signalEndOfInputStream can only be used with Surface input");
687f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden        return INVALID_OPERATION;
688f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    };
689ba6218eae3dbcf3f962b3561b26374a214dbf5e2Andy McFadden    return bufferSource->signalEndOfInputStream();
690f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden}
691f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden
692318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::allocateBuffer(
693570a3cb7582daa030cb38eedc5eb6a06f86ecc7fAndreas Huber        OMX_U32 portIndex, size_t size, OMX::buffer_id *buffer,
694570a3cb7582daa030cb38eedc5eb6a06f86ecc7fAndreas Huber        void **buffer_data) {
695318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    Mutex::Autolock autoLock(mLock);
696318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
697318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    BufferMeta *buffer_meta = new BufferMeta(size);
698318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
699318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_BUFFERHEADERTYPE *header;
700318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
701318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_ERRORTYPE err = OMX_AllocateBuffer(
702318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            mHandle, &header, portIndex, buffer_meta, size);
703318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
704318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    if (err != OMX_ErrorNone) {
70529357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("OMX_AllocateBuffer failed with error %d (0x%08x)", err, err);
706318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
707318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        delete buffer_meta;
708318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        buffer_meta = NULL;
709318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
710318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        *buffer = 0;
711318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
712318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        return UNKNOWN_ERROR;
713318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    }
714318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
71503b268eac37ca2589bfff0bf58daf79d29cc14f4Andreas Huber    CHECK_EQ(header->pAppPrivate, buffer_meta);
71603b268eac37ca2589bfff0bf58daf79d29cc14f4Andreas Huber
717609b815a3131d22da38b2f452faa9f89daad4039Andy Hung    *buffer = makeBufferID(header);
718570a3cb7582daa030cb38eedc5eb6a06f86ecc7fAndreas Huber    *buffer_data = header->pBuffer;
719318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
720d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    addActiveBuffer(portIndex, *buffer);
721d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber
722f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    sp<GraphicBufferSource> bufferSource(getGraphicBufferSource());
723f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    if (bufferSource != NULL && portIndex == kPortIndexInput) {
724f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden        bufferSource->addCodecBuffer(header);
725f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    }
726f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden
727318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return OK;
728318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
729318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
730318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::allocateBufferWithBackup(
731318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_U32 portIndex, const sp<IMemory> &params,
732318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX::buffer_id *buffer) {
733318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    Mutex::Autolock autoLock(mLock);
734318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
735318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    BufferMeta *buffer_meta = new BufferMeta(params, true);
736318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
737318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_BUFFERHEADERTYPE *header;
738318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
739318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_ERRORTYPE err = OMX_AllocateBuffer(
740318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            mHandle, &header, portIndex, buffer_meta, params->size());
741318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
742318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    if (err != OMX_ErrorNone) {
74329357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("OMX_AllocateBuffer failed with error %d (0x%08x)", err, err);
744318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
745318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        delete buffer_meta;
746318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        buffer_meta = NULL;
747318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
748318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        *buffer = 0;
749318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
750318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        return UNKNOWN_ERROR;
751318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    }
752318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
75303b268eac37ca2589bfff0bf58daf79d29cc14f4Andreas Huber    CHECK_EQ(header->pAppPrivate, buffer_meta);
75403b268eac37ca2589bfff0bf58daf79d29cc14f4Andreas Huber
755609b815a3131d22da38b2f452faa9f89daad4039Andy Hung    *buffer = makeBufferID(header);
756318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
757d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    addActiveBuffer(portIndex, *buffer);
758d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber
759f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    sp<GraphicBufferSource> bufferSource(getGraphicBufferSource());
760f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    if (bufferSource != NULL && portIndex == kPortIndexInput) {
761f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden        bufferSource->addCodecBuffer(header);
762f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    }
763f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden
764318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return OK;
765318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
766318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
767318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::freeBuffer(
768318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_U32 portIndex, OMX::buffer_id buffer) {
769318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    Mutex::Autolock autoLock(mLock);
770318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
771d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    removeActiveBuffer(portIndex, buffer);
772d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber
773609b815a3131d22da38b2f452faa9f89daad4039Andy Hung    OMX_BUFFERHEADERTYPE *header = findBufferHeader(buffer);
774318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    BufferMeta *buffer_meta = static_cast<BufferMeta *>(header->pAppPrivate);
775318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
776318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_ERRORTYPE err = OMX_FreeBuffer(mHandle, portIndex, header);
777318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
778318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    delete buffer_meta;
779318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    buffer_meta = NULL;
780609b815a3131d22da38b2f452faa9f89daad4039Andy Hung    invalidateBufferID(buffer);
781318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
782318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return StatusFromOMXError(err);
783318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
784318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
785318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::fillBuffer(OMX::buffer_id buffer) {
786318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    Mutex::Autolock autoLock(mLock);
787318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
788609b815a3131d22da38b2f452faa9f89daad4039Andy Hung    OMX_BUFFERHEADERTYPE *header = findBufferHeader(buffer);
789318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    header->nFilledLen = 0;
790318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    header->nOffset = 0;
791318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    header->nFlags = 0;
792318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
793318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_ERRORTYPE err = OMX_FillThisBuffer(mHandle, header);
794318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
795318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return StatusFromOMXError(err);
796318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
797318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
798318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::emptyBuffer(
799318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX::buffer_id buffer,
800318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_U32 rangeOffset, OMX_U32 rangeLength,
801318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_U32 flags, OMX_TICKS timestamp) {
802318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    Mutex::Autolock autoLock(mLock);
803318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
804609b815a3131d22da38b2f452faa9f89daad4039Andy Hung    OMX_BUFFERHEADERTYPE *header = findBufferHeader(buffer);
805318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    header->nFilledLen = rangeLength;
806318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    header->nOffset = rangeOffset;
807318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    header->nFlags = flags;
808318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    header->nTimeStamp = timestamp;
809318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
810318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    BufferMeta *buffer_meta =
811318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        static_cast<BufferMeta *>(header->pAppPrivate);
812318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    buffer_meta->CopyToOMX(header);
813318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
814318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_ERRORTYPE err = OMX_EmptyThisBuffer(mHandle, header);
815318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
816318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return StatusFromOMXError(err);
817318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
818318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
819f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden// like emptyBuffer, but the data is already in header->pBuffer
820f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFaddenstatus_t OMXNodeInstance::emptyDirectBuffer(
821f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden        OMX_BUFFERHEADERTYPE *header,
822f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden        OMX_U32 rangeOffset, OMX_U32 rangeLength,
823f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden        OMX_U32 flags, OMX_TICKS timestamp) {
824f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    Mutex::Autolock autoLock(mLock);
825f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden
826f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    header->nFilledLen = rangeLength;
827f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    header->nOffset = rangeOffset;
828f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    header->nFlags = flags;
829f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    header->nTimeStamp = timestamp;
830f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden
831f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    OMX_ERRORTYPE err = OMX_EmptyThisBuffer(mHandle, header);
832f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    if (err != OMX_ErrorNone) {
833f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden        ALOGW("emptyDirectBuffer failed, OMX err=0x%x", err);
834f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    }
835f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden
836f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    return StatusFromOMXError(err);
837f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden}
838f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden
839318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::getExtensionIndex(
840318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        const char *parameterName, OMX_INDEXTYPE *index) {
841318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    Mutex::Autolock autoLock(mLock);
842318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
843318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_ERRORTYPE err = OMX_GetExtensionIndex(
844318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            mHandle, const_cast<char *>(parameterName), index);
845318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
846318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return StatusFromOMXError(err);
847318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
848318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
849e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huberstatus_t OMXNodeInstance::setInternalOption(
850e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber        OMX_U32 portIndex,
851e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber        IOMX::InternalOptionType type,
852e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber        const void *data,
853e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber        size_t size) {
854e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber    switch (type) {
855e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber        case IOMX::INTERNAL_OPTION_SUSPEND:
856a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber        case IOMX::INTERNAL_OPTION_REPEAT_PREVIOUS_FRAME_DELAY:
85794ee4b708acfa941581160b267afb79192b1d816Chong Zhang        case IOMX::INTERNAL_OPTION_MAX_TIMESTAMP_GAP:
85872cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang        case IOMX::INTERNAL_OPTION_START_TIME:
8592c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang        case IOMX::INTERNAL_OPTION_TIME_LAPSE:
860e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber        {
861e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber            const sp<GraphicBufferSource> &bufferSource =
862e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber                getGraphicBufferSource();
863e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber
864e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber            if (bufferSource == NULL || portIndex != kPortIndexInput) {
865e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber                return ERROR_UNSUPPORTED;
866e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber            }
867e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber
868a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber            if (type == IOMX::INTERNAL_OPTION_SUSPEND) {
869a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber                if (size != sizeof(bool)) {
870a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber                    return INVALID_OPERATION;
871a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber                }
872a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber
873a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber                bool suspend = *(bool *)data;
874a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber                bufferSource->suspend(suspend);
87594ee4b708acfa941581160b267afb79192b1d816Chong Zhang            } else if (type ==
87694ee4b708acfa941581160b267afb79192b1d816Chong Zhang                    IOMX::INTERNAL_OPTION_REPEAT_PREVIOUS_FRAME_DELAY){
877a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber                if (size != sizeof(int64_t)) {
878a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber                    return INVALID_OPERATION;
879a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber                }
880a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber
881a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber                int64_t delayUs = *(int64_t *)data;
882e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber
883a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber                return bufferSource->setRepeatPreviousFrameDelayUs(delayUs);
88472cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang            } else if (type ==
88572cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang                    IOMX::INTERNAL_OPTION_MAX_TIMESTAMP_GAP){
88694ee4b708acfa941581160b267afb79192b1d816Chong Zhang                if (size != sizeof(int64_t)) {
88794ee4b708acfa941581160b267afb79192b1d816Chong Zhang                    return INVALID_OPERATION;
88894ee4b708acfa941581160b267afb79192b1d816Chong Zhang                }
88994ee4b708acfa941581160b267afb79192b1d816Chong Zhang
89094ee4b708acfa941581160b267afb79192b1d816Chong Zhang                int64_t maxGapUs = *(int64_t *)data;
89194ee4b708acfa941581160b267afb79192b1d816Chong Zhang
89294ee4b708acfa941581160b267afb79192b1d816Chong Zhang                return bufferSource->setMaxTimestampGapUs(maxGapUs);
8932c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang            } else if (type == IOMX::INTERNAL_OPTION_START_TIME) {
89472cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang                if (size != sizeof(int64_t)) {
89572cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang                    return INVALID_OPERATION;
89672cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang                }
89772cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang
89872cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang                int64_t skipFramesBeforeUs = *(int64_t *)data;
89972cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang
90072cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang                bufferSource->setSkipFramesBeforeUs(skipFramesBeforeUs);
9012c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang            } else { // IOMX::INTERNAL_OPTION_TIME_LAPSE
9022c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang                if (size != sizeof(int64_t) * 2) {
9032c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang                    return INVALID_OPERATION;
9042c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang                }
9052c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang
9062c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang                bufferSource->setTimeLapseUs((int64_t *)data);
907a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber            }
908e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber
909e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber            return OK;
910e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber        }
911e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber
912e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber        default:
913e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber            return ERROR_UNSUPPORTED;
914e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber    }
915e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber}
916e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber
917318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Hubervoid OMXNodeInstance::onMessage(const omx_message &msg) {
91894ee4b708acfa941581160b267afb79192b1d816Chong Zhang    const sp<GraphicBufferSource>& bufferSource(getGraphicBufferSource());
91994ee4b708acfa941581160b267afb79192b1d816Chong Zhang
920318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    if (msg.type == omx_message::FILL_BUFFER_DONE) {
921318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_BUFFERHEADERTYPE *buffer =
922609b815a3131d22da38b2f452faa9f89daad4039Andy Hung            findBufferHeader(msg.u.extended_buffer_data.buffer);
923318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
924318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        BufferMeta *buffer_meta =
925318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            static_cast<BufferMeta *>(buffer->pAppPrivate);
926318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
927318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        buffer_meta->CopyFromOMX(buffer);
9281b4ca5cebd7f42a8f8842e45bfabe19001e9a435Andreas Huber
9291b4ca5cebd7f42a8f8842e45bfabe19001e9a435Andreas Huber        if (bufferSource != NULL) {
93094ee4b708acfa941581160b267afb79192b1d816Chong Zhang            // fix up the buffer info (especially timestamp) if needed
93194ee4b708acfa941581160b267afb79192b1d816Chong Zhang            bufferSource->codecBufferFilled(buffer);
93294ee4b708acfa941581160b267afb79192b1d816Chong Zhang
93394ee4b708acfa941581160b267afb79192b1d816Chong Zhang            omx_message newMsg = msg;
93494ee4b708acfa941581160b267afb79192b1d816Chong Zhang            newMsg.u.extended_buffer_data.timestamp = buffer->nTimeStamp;
93594ee4b708acfa941581160b267afb79192b1d816Chong Zhang            mObserver->onMessage(newMsg);
93694ee4b708acfa941581160b267afb79192b1d816Chong Zhang            return;
93794ee4b708acfa941581160b267afb79192b1d816Chong Zhang        }
93894ee4b708acfa941581160b267afb79192b1d816Chong Zhang    } else if (msg.type == omx_message::EMPTY_BUFFER_DONE) {
93994ee4b708acfa941581160b267afb79192b1d816Chong Zhang        if (bufferSource != NULL) {
9401b4ca5cebd7f42a8f8842e45bfabe19001e9a435Andreas Huber            // This is one of the buffers used exclusively by
9411b4ca5cebd7f42a8f8842e45bfabe19001e9a435Andreas Huber            // GraphicBufferSource.
9421b4ca5cebd7f42a8f8842e45bfabe19001e9a435Andreas Huber            // Don't dispatch a message back to ACodec, since it doesn't
9431b4ca5cebd7f42a8f8842e45bfabe19001e9a435Andreas Huber            // know that anyone asked to have the buffer emptied and will
9441b4ca5cebd7f42a8f8842e45bfabe19001e9a435Andreas Huber            // be very confused.
9451b4ca5cebd7f42a8f8842e45bfabe19001e9a435Andreas Huber
9461b4ca5cebd7f42a8f8842e45bfabe19001e9a435Andreas Huber            OMX_BUFFERHEADERTYPE *buffer =
947609b815a3131d22da38b2f452faa9f89daad4039Andy Hung                findBufferHeader(msg.u.buffer_data.buffer);
9481b4ca5cebd7f42a8f8842e45bfabe19001e9a435Andreas Huber
9491b4ca5cebd7f42a8f8842e45bfabe19001e9a435Andreas Huber            bufferSource->codecBufferEmptied(buffer);
9501b4ca5cebd7f42a8f8842e45bfabe19001e9a435Andreas Huber            return;
9511b4ca5cebd7f42a8f8842e45bfabe19001e9a435Andreas Huber        }
952318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    }
953318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
954318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    mObserver->onMessage(msg);
955318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
956318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
957f0fb96c352f30b812a4903a1d783a715e1e817bdAndreas Hubervoid OMXNodeInstance::onObserverDied(OMXMaster *master) {
95829357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block    ALOGE("!!! Observer died. Quickly, do something, ... anything...");
959318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
960318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    // Try to force shutdown of the node and hope for the best.
961f0fb96c352f30b812a4903a1d783a715e1e817bdAndreas Huber    freeNode(master);
962318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
963318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
964318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Hubervoid OMXNodeInstance::onGetHandleFailed() {
965318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    delete this;
966318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
967318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
968f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden// OMXNodeInstance::OnEvent calls OMX::OnEvent, which then calls here.
969f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden// Don't try to acquire mLock here -- in rare circumstances this will hang.
970f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFaddenvoid OMXNodeInstance::onEvent(
971f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden        OMX_EVENTTYPE event, OMX_U32 arg1, OMX_U32 arg2) {
972f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    const sp<GraphicBufferSource>& bufferSource(getGraphicBufferSource());
973f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden
974e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber    if (bufferSource != NULL
975e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber            && event == OMX_EventCmdComplete
976e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber            && arg1 == OMX_CommandStateSet
977e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber            && arg2 == OMX_StateExecuting) {
978e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber        bufferSource->omxExecuting();
979f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden    }
980f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden}
981f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden
982318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber// static
983318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas HuberOMX_ERRORTYPE OMXNodeInstance::OnEvent(
98484333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber        OMX_IN OMX_HANDLETYPE /* hComponent */,
985318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_IN OMX_PTR pAppData,
986318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_IN OMX_EVENTTYPE eEvent,
987318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_IN OMX_U32 nData1,
988318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_IN OMX_U32 nData2,
989318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_IN OMX_PTR pEventData) {
990318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMXNodeInstance *instance = static_cast<OMXNodeInstance *>(pAppData);
991134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    if (instance->mDying) {
992134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber        return OMX_ErrorNone;
993134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    }
994318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return instance->owner()->OnEvent(
995318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            instance->nodeID(), eEvent, nData1, nData2, pEventData);
996318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
997318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
998318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber// static
999318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas HuberOMX_ERRORTYPE OMXNodeInstance::OnEmptyBufferDone(
100084333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber        OMX_IN OMX_HANDLETYPE /* hComponent */,
1001318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_IN OMX_PTR pAppData,
1002318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_IN OMX_BUFFERHEADERTYPE* pBuffer) {
1003318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMXNodeInstance *instance = static_cast<OMXNodeInstance *>(pAppData);
1004134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    if (instance->mDying) {
1005134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber        return OMX_ErrorNone;
1006134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    }
1007609b815a3131d22da38b2f452faa9f89daad4039Andy Hung    return instance->owner()->OnEmptyBufferDone(instance->nodeID(),
1008609b815a3131d22da38b2f452faa9f89daad4039Andy Hung            instance->findBufferID(pBuffer), pBuffer);
1009318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
1010318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
1011318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber// static
1012318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas HuberOMX_ERRORTYPE OMXNodeInstance::OnFillBufferDone(
101384333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber        OMX_IN OMX_HANDLETYPE /* hComponent */,
1014318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_IN OMX_PTR pAppData,
1015318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_IN OMX_BUFFERHEADERTYPE* pBuffer) {
1016318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMXNodeInstance *instance = static_cast<OMXNodeInstance *>(pAppData);
1017134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    if (instance->mDying) {
1018134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber        return OMX_ErrorNone;
1019134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    }
1020609b815a3131d22da38b2f452faa9f89daad4039Andy Hung    return instance->owner()->OnFillBufferDone(instance->nodeID(),
1021609b815a3131d22da38b2f452faa9f89daad4039Andy Hung            instance->findBufferID(pBuffer), pBuffer);
1022318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
1023318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
1024d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Hubervoid OMXNodeInstance::addActiveBuffer(OMX_U32 portIndex, OMX::buffer_id id) {
1025d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    ActiveBuffer active;
1026d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    active.mPortIndex = portIndex;
1027d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    active.mID = id;
1028d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    mActiveBuffers.push(active);
1029d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber}
1030d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber
1031d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Hubervoid OMXNodeInstance::removeActiveBuffer(
1032d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber        OMX_U32 portIndex, OMX::buffer_id id) {
1033d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    bool found = false;
1034d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    for (size_t i = 0; i < mActiveBuffers.size(); ++i) {
1035d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber        if (mActiveBuffers[i].mPortIndex == portIndex
1036d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            && mActiveBuffers[i].mID == id) {
1037d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            found = true;
1038d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            mActiveBuffers.removeItemsAt(i);
1039d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            break;
1040d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber        }
1041d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    }
1042d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber
1043d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    if (!found) {
10445ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block        ALOGW("Attempt to remove an active buffer we know nothing about...");
1045d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    }
1046d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber}
1047d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber
1048d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Hubervoid OMXNodeInstance::freeActiveBuffers() {
1049d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    // Make sure to count down here, as freeBuffer will in turn remove
1050d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    // the active buffer from the vector...
1051d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    for (size_t i = mActiveBuffers.size(); i--;) {
1052d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber        freeBuffer(mActiveBuffers[i].mPortIndex, mActiveBuffers[i].mID);
1053d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    }
1054d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber}
1055d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber
1056609b815a3131d22da38b2f452faa9f89daad4039Andy Hung#ifdef __LP64__
1057609b815a3131d22da38b2f452faa9f89daad4039Andy Hung
1058609b815a3131d22da38b2f452faa9f89daad4039Andy HungOMX::buffer_id OMXNodeInstance::makeBufferID(OMX_BUFFERHEADERTYPE *bufferHeader) {
1059609b815a3131d22da38b2f452faa9f89daad4039Andy Hung    if (bufferHeader == NULL) {
1060609b815a3131d22da38b2f452faa9f89daad4039Andy Hung        return 0;
1061609b815a3131d22da38b2f452faa9f89daad4039Andy Hung    }
1062609b815a3131d22da38b2f452faa9f89daad4039Andy Hung    Mutex::Autolock autoLock(mBufferIDLock);
1063609b815a3131d22da38b2f452faa9f89daad4039Andy Hung    OMX::buffer_id buffer;
1064609b815a3131d22da38b2f452faa9f89daad4039Andy Hung    do { // handle the very unlikely case of ID overflow
1065609b815a3131d22da38b2f452faa9f89daad4039Andy Hung        if (++mBufferIDCount == 0) {
1066609b815a3131d22da38b2f452faa9f89daad4039Andy Hung           ++mBufferIDCount;
1067609b815a3131d22da38b2f452faa9f89daad4039Andy Hung        }
1068609b815a3131d22da38b2f452faa9f89daad4039Andy Hung        buffer = (OMX::buffer_id)mBufferIDCount;
1069609b815a3131d22da38b2f452faa9f89daad4039Andy Hung    } while (mBufferIDToBufferHeader.indexOfKey(buffer) >= 0);
1070609b815a3131d22da38b2f452faa9f89daad4039Andy Hung    mBufferIDToBufferHeader.add(buffer, bufferHeader);
1071609b815a3131d22da38b2f452faa9f89daad4039Andy Hung    mBufferHeaderToBufferID.add(bufferHeader, buffer);
1072609b815a3131d22da38b2f452faa9f89daad4039Andy Hung    return buffer;
1073609b815a3131d22da38b2f452faa9f89daad4039Andy Hung}
1074609b815a3131d22da38b2f452faa9f89daad4039Andy Hung
1075609b815a3131d22da38b2f452faa9f89daad4039Andy HungOMX_BUFFERHEADERTYPE *OMXNodeInstance::findBufferHeader(OMX::buffer_id buffer) {
1076609b815a3131d22da38b2f452faa9f89daad4039Andy Hung    if (buffer == 0) {
1077609b815a3131d22da38b2f452faa9f89daad4039Andy Hung        return NULL;
1078609b815a3131d22da38b2f452faa9f89daad4039Andy Hung    }
1079609b815a3131d22da38b2f452faa9f89daad4039Andy Hung    Mutex::Autolock autoLock(mBufferIDLock);
1080609b815a3131d22da38b2f452faa9f89daad4039Andy Hung    return mBufferIDToBufferHeader.valueFor(buffer);
1081609b815a3131d22da38b2f452faa9f89daad4039Andy Hung}
1082609b815a3131d22da38b2f452faa9f89daad4039Andy Hung
1083609b815a3131d22da38b2f452faa9f89daad4039Andy HungOMX::buffer_id OMXNodeInstance::findBufferID(OMX_BUFFERHEADERTYPE *bufferHeader) {
1084609b815a3131d22da38b2f452faa9f89daad4039Andy Hung    if (bufferHeader == NULL) {
1085609b815a3131d22da38b2f452faa9f89daad4039Andy Hung        return 0;
1086609b815a3131d22da38b2f452faa9f89daad4039Andy Hung    }
1087609b815a3131d22da38b2f452faa9f89daad4039Andy Hung    Mutex::Autolock autoLock(mBufferIDLock);
1088609b815a3131d22da38b2f452faa9f89daad4039Andy Hung    return mBufferHeaderToBufferID.valueFor(bufferHeader);
1089609b815a3131d22da38b2f452faa9f89daad4039Andy Hung}
1090609b815a3131d22da38b2f452faa9f89daad4039Andy Hung
1091609b815a3131d22da38b2f452faa9f89daad4039Andy Hungvoid OMXNodeInstance::invalidateBufferID(OMX::buffer_id buffer) {
1092609b815a3131d22da38b2f452faa9f89daad4039Andy Hung    if (buffer == 0) {
1093609b815a3131d22da38b2f452faa9f89daad4039Andy Hung        return;
1094609b815a3131d22da38b2f452faa9f89daad4039Andy Hung    }
1095609b815a3131d22da38b2f452faa9f89daad4039Andy Hung    Mutex::Autolock autoLock(mBufferIDLock);
1096609b815a3131d22da38b2f452faa9f89daad4039Andy Hung    mBufferHeaderToBufferID.removeItem(mBufferIDToBufferHeader.valueFor(buffer));
1097609b815a3131d22da38b2f452faa9f89daad4039Andy Hung    mBufferIDToBufferHeader.removeItem(buffer);
1098609b815a3131d22da38b2f452faa9f89daad4039Andy Hung}
1099609b815a3131d22da38b2f452faa9f89daad4039Andy Hung
1100609b815a3131d22da38b2f452faa9f89daad4039Andy Hung#else
1101609b815a3131d22da38b2f452faa9f89daad4039Andy Hung
1102609b815a3131d22da38b2f452faa9f89daad4039Andy HungOMX::buffer_id OMXNodeInstance::makeBufferID(OMX_BUFFERHEADERTYPE *bufferHeader) {
1103609b815a3131d22da38b2f452faa9f89daad4039Andy Hung    return (OMX::buffer_id)bufferHeader;
1104609b815a3131d22da38b2f452faa9f89daad4039Andy Hung}
1105609b815a3131d22da38b2f452faa9f89daad4039Andy Hung
1106609b815a3131d22da38b2f452faa9f89daad4039Andy HungOMX_BUFFERHEADERTYPE *OMXNodeInstance::findBufferHeader(OMX::buffer_id buffer) {
1107609b815a3131d22da38b2f452faa9f89daad4039Andy Hung    return (OMX_BUFFERHEADERTYPE *)buffer;
1108609b815a3131d22da38b2f452faa9f89daad4039Andy Hung}
1109609b815a3131d22da38b2f452faa9f89daad4039Andy Hung
1110609b815a3131d22da38b2f452faa9f89daad4039Andy HungOMX::buffer_id OMXNodeInstance::findBufferID(OMX_BUFFERHEADERTYPE *bufferHeader) {
1111609b815a3131d22da38b2f452faa9f89daad4039Andy Hung    return (OMX::buffer_id)bufferHeader;
1112609b815a3131d22da38b2f452faa9f89daad4039Andy Hung}
1113609b815a3131d22da38b2f452faa9f89daad4039Andy Hung
1114609b815a3131d22da38b2f452faa9f89daad4039Andy Hungvoid OMXNodeInstance::invalidateBufferID(OMX::buffer_id buffer __unused) {
1115609b815a3131d22da38b2f452faa9f89daad4039Andy Hung}
1116609b815a3131d22da38b2f452faa9f89daad4039Andy Hung
1117609b815a3131d22da38b2f452faa9f89daad4039Andy Hung#endif
1118609b815a3131d22da38b2f452faa9f89daad4039Andy Hung
1119318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}  // namespace android
1120