OMXNodeInstance.cpp revision 6c6b4d0d2b98a7ceee8b697daaf611f8df3254fb
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"
23318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
24e3ec3cec3a2e27033249ff82964d2cbd441d9873Andreas Huber#include <OMX_Component.h>
25318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
26318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber#include <binder/IMemory.h>
276c6b4d0d2b98a7ceee8b697daaf611f8df3254fbJames Dong#include <HardwareAPI.h>
28f1d5aa162c02a16b7195a43a9bcea4d592600ac4James Dong#include <media/stagefright/foundation/ADebug.h>
292a3847ee1cbdaa8a65eee397a0173bb02211c459Andreas Huber#include <media/stagefright/MediaErrors.h>
30318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
31318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Hubernamespace android {
32318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
33318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstruct BufferMeta {
34318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    BufferMeta(const sp<IMemory> &mem, bool is_backup = false)
35318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        : mMem(mem),
36318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber          mIsBackup(is_backup) {
37318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    }
38318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
39318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    BufferMeta(size_t size)
40318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        : mSize(size),
41318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber          mIsBackup(false) {
42318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    }
43318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
4483750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    BufferMeta(const sp<GraphicBuffer> &graphicBuffer)
4583750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        : mGraphicBuffer(graphicBuffer),
4683750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis          mIsBackup(false) {
4783750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    }
4883750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
49318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    void CopyFromOMX(const OMX_BUFFERHEADERTYPE *header) {
50318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        if (!mIsBackup) {
51318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            return;
52318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        }
53318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
54318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        memcpy((OMX_U8 *)mMem->pointer() + header->nOffset,
55318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber               header->pBuffer + header->nOffset,
56318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber               header->nFilledLen);
57318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    }
58318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
59318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    void CopyToOMX(const OMX_BUFFERHEADERTYPE *header) {
60318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        if (!mIsBackup) {
61318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            return;
62318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        }
63318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
64318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        memcpy(header->pBuffer + header->nOffset,
65318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber               (const OMX_U8 *)mMem->pointer() + header->nOffset,
66318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber               header->nFilledLen);
67318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    }
68318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
69318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberprivate:
7083750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    sp<GraphicBuffer> mGraphicBuffer;
71318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    sp<IMemory> mMem;
72318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    size_t mSize;
73318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    bool mIsBackup;
74318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
75318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    BufferMeta(const BufferMeta &);
76318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    BufferMeta &operator=(const BufferMeta &);
77318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber};
78318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
79318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber// static
80318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas HuberOMX_CALLBACKTYPE OMXNodeInstance::kCallbacks = {
81318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    &OnEvent, &OnEmptyBufferDone, &OnFillBufferDone
82318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber};
83318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
84318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas HuberOMXNodeInstance::OMXNodeInstance(
85318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX *owner, const sp<IOMXObserver> &observer)
86318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    : mOwner(owner),
87318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber      mNodeID(NULL),
88318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber      mHandle(NULL),
89134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber      mObserver(observer),
90134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber      mDying(false) {
91318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
92318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
93318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas HuberOMXNodeInstance::~OMXNodeInstance() {
94f1d5aa162c02a16b7195a43a9bcea4d592600ac4James Dong    CHECK(mHandle == NULL);
95318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
96318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
97318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Hubervoid OMXNodeInstance::setHandle(OMX::node_id node_id, OMX_HANDLETYPE handle) {
98f1d5aa162c02a16b7195a43a9bcea4d592600ac4James Dong    CHECK(mHandle == NULL);
99318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    mNodeID = node_id;
100318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    mHandle = handle;
101318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
102318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
103318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas HuberOMX *OMXNodeInstance::owner() {
104318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return mOwner;
105318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
106318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
107318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Hubersp<IOMXObserver> OMXNodeInstance::observer() {
108318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return mObserver;
109318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
110318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
111318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas HuberOMX::node_id OMXNodeInstance::nodeID() {
112318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return mNodeID;
113318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
114318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
115318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatic status_t StatusFromOMXError(OMX_ERRORTYPE err) {
1162a3847ee1cbdaa8a65eee397a0173bb02211c459Andreas Huber    switch (err) {
1172a3847ee1cbdaa8a65eee397a0173bb02211c459Andreas Huber        case OMX_ErrorNone:
1182a3847ee1cbdaa8a65eee397a0173bb02211c459Andreas Huber            return OK;
1192a3847ee1cbdaa8a65eee397a0173bb02211c459Andreas Huber        case OMX_ErrorUnsupportedSetting:
1202a3847ee1cbdaa8a65eee397a0173bb02211c459Andreas Huber            return ERROR_UNSUPPORTED;
1212a3847ee1cbdaa8a65eee397a0173bb02211c459Andreas Huber        default:
1222a3847ee1cbdaa8a65eee397a0173bb02211c459Andreas Huber            return UNKNOWN_ERROR;
1232a3847ee1cbdaa8a65eee397a0173bb02211c459Andreas Huber    }
124318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
125318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
126f0fb96c352f30b812a4903a1d783a715e1e817bdAndreas Huberstatus_t OMXNodeInstance::freeNode(OMXMaster *master) {
12743e5eca7048a3b7b3ee0223b7f3cbd837ed10ae5Andreas Huber    static int32_t kMaxNumIterations = 10;
12843e5eca7048a3b7b3ee0223b7f3cbd837ed10ae5Andreas Huber
129d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    // Transition the node from its current state all the way down
130d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    // to "Loaded".
131d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    // This ensures that all active buffers are properly freed even
132d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    // for components that don't do this themselves on a call to
133d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    // "FreeHandle".
134d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber
135134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    // The code below may trigger some more events to be dispatched
136134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    // by the OMX component - we want to ignore them as our client
137134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    // does not expect them.
138134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    mDying = true;
139134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber
140d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    OMX_STATETYPE state;
141d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    CHECK_EQ(OMX_GetState(mHandle, &state), OMX_ErrorNone);
142d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    switch (state) {
143d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber        case OMX_StateExecuting:
144d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber        {
1453856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("forcing Executing->Idle");
146d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            sendCommand(OMX_CommandStateSet, OMX_StateIdle);
147d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            OMX_ERRORTYPE err;
14843e5eca7048a3b7b3ee0223b7f3cbd837ed10ae5Andreas Huber            int32_t iteration = 0;
149d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            while ((err = OMX_GetState(mHandle, &state)) == OMX_ErrorNone
1500d681df3b0ded2c1e335b6b5785439da4ce2c238Andreas Huber                   && state != OMX_StateIdle
1510d681df3b0ded2c1e335b6b5785439da4ce2c238Andreas Huber                   && state != OMX_StateInvalid) {
15243e5eca7048a3b7b3ee0223b7f3cbd837ed10ae5Andreas Huber                if (++iteration > kMaxNumIterations) {
15329357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block                    ALOGE("component failed to enter Idle state, aborting.");
15443e5eca7048a3b7b3ee0223b7f3cbd837ed10ae5Andreas Huber                    state = OMX_StateInvalid;
15543e5eca7048a3b7b3ee0223b7f3cbd837ed10ae5Andreas Huber                    break;
15643e5eca7048a3b7b3ee0223b7f3cbd837ed10ae5Andreas Huber                }
15743e5eca7048a3b7b3ee0223b7f3cbd837ed10ae5Andreas Huber
158d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber                usleep(100000);
159d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            }
160d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            CHECK_EQ(err, OMX_ErrorNone);
161d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber
1620d681df3b0ded2c1e335b6b5785439da4ce2c238Andreas Huber            if (state == OMX_StateInvalid) {
1630d681df3b0ded2c1e335b6b5785439da4ce2c238Andreas Huber                break;
1640d681df3b0ded2c1e335b6b5785439da4ce2c238Andreas Huber            }
1650d681df3b0ded2c1e335b6b5785439da4ce2c238Andreas Huber
166d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            // fall through
167d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber        }
168d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber
169d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber        case OMX_StateIdle:
170d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber        {
1713856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("forcing Idle->Loaded");
172d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            sendCommand(OMX_CommandStateSet, OMX_StateLoaded);
173d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber
174d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            freeActiveBuffers();
175d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber
176d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            OMX_ERRORTYPE err;
17743e5eca7048a3b7b3ee0223b7f3cbd837ed10ae5Andreas Huber            int32_t iteration = 0;
178d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            while ((err = OMX_GetState(mHandle, &state)) == OMX_ErrorNone
1790d681df3b0ded2c1e335b6b5785439da4ce2c238Andreas Huber                   && state != OMX_StateLoaded
1800d681df3b0ded2c1e335b6b5785439da4ce2c238Andreas Huber                   && state != OMX_StateInvalid) {
18143e5eca7048a3b7b3ee0223b7f3cbd837ed10ae5Andreas Huber                if (++iteration > kMaxNumIterations) {
18229357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block                    ALOGE("component failed to enter Loaded state, aborting.");
18343e5eca7048a3b7b3ee0223b7f3cbd837ed10ae5Andreas Huber                    state = OMX_StateInvalid;
18443e5eca7048a3b7b3ee0223b7f3cbd837ed10ae5Andreas Huber                    break;
18543e5eca7048a3b7b3ee0223b7f3cbd837ed10ae5Andreas Huber                }
18643e5eca7048a3b7b3ee0223b7f3cbd837ed10ae5Andreas Huber
1873856b090cd04ba5dd4a59a12430ed724d5995909Steve Block                ALOGV("waiting for Loaded state...");
188d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber                usleep(100000);
189d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            }
190d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            CHECK_EQ(err, OMX_ErrorNone);
191d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber
192d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            // fall through
193d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber        }
194d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber
195d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber        case OMX_StateLoaded:
196fa70cad40b01627ac1c22e04cdd548ece9c2654fAndreas Huber        case OMX_StateInvalid:
197d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            break;
198d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber
199d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber        default:
200d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            CHECK(!"should not be here, unknown state.");
201d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            break;
202d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    }
203d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber
2043856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("calling destroyComponentInstance");
205f0fb96c352f30b812a4903a1d783a715e1e817bdAndreas Huber    OMX_ERRORTYPE err = master->destroyComponentInstance(
206f0fb96c352f30b812a4903a1d783a715e1e817bdAndreas Huber            static_cast<OMX_COMPONENTTYPE *>(mHandle));
2073856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("destroyComponentInstance returned err %d", err);
208f0fb96c352f30b812a4903a1d783a715e1e817bdAndreas Huber
209318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    mHandle = NULL;
210318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
211318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    if (err != OMX_ErrorNone) {
21229357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("FreeHandle FAILED with error 0x%08x.", err);
213318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    }
214318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
215318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    mOwner->invalidateNodeID(mNodeID);
216318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    mNodeID = NULL;
217318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
2183856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("OMXNodeInstance going away.");
21947bed1a7755ed58fa5d4c0d35b20468deb83bd60Andreas Huber    delete this;
220318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
221318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return StatusFromOMXError(err);
222318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
223318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
224318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::sendCommand(
225318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_COMMANDTYPE cmd, OMX_S32 param) {
226318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    Mutex::Autolock autoLock(mLock);
227318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
228318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_ERRORTYPE err = OMX_SendCommand(mHandle, cmd, param, NULL);
229318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return StatusFromOMXError(err);
230318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
231318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
232318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::getParameter(
233318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_INDEXTYPE index, void *params, size_t size) {
234318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    Mutex::Autolock autoLock(mLock);
235318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
236318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_ERRORTYPE err = OMX_GetParameter(mHandle, index, params);
237bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber
238318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return StatusFromOMXError(err);
239318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
240318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
241318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::setParameter(
242318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_INDEXTYPE index, const void *params, size_t size) {
243318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    Mutex::Autolock autoLock(mLock);
244318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
245318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_ERRORTYPE err = OMX_SetParameter(
246318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            mHandle, index, const_cast<void *>(params));
247318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
248318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return StatusFromOMXError(err);
249318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
250318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
251318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::getConfig(
252318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_INDEXTYPE index, void *params, size_t size) {
253318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    Mutex::Autolock autoLock(mLock);
254318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
255318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_ERRORTYPE err = OMX_GetConfig(mHandle, index, params);
256318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return StatusFromOMXError(err);
257318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
258318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
259318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::setConfig(
260318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_INDEXTYPE index, const void *params, size_t size) {
261318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    Mutex::Autolock autoLock(mLock);
262318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
263318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_ERRORTYPE err = OMX_SetConfig(
264318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            mHandle, index, const_cast<void *>(params));
265318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
266318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return StatusFromOMXError(err);
267b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis}
268b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis
269b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennisstatus_t OMXNodeInstance::getState(OMX_STATETYPE* state) {
270b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis    Mutex::Autolock autoLock(mLock);
271b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis
272b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis    OMX_ERRORTYPE err = OMX_GetState(mHandle, state);
273b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis
274b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis    return StatusFromOMXError(err);
275318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
276318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
27783750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennisstatus_t OMXNodeInstance::enableGraphicBuffers(
27883750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        OMX_U32 portIndex, OMX_BOOL enable) {
27983750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    Mutex::Autolock autoLock(mLock);
28083750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
28183750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    OMX_INDEXTYPE index;
28283750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    OMX_ERRORTYPE err = OMX_GetExtensionIndex(
28383750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            mHandle,
28483750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            const_cast<OMX_STRING>("OMX.google.android.index.enableAndroidNativeBuffers"),
28583750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            &index);
28683750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
28783750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    if (err != OMX_ErrorNone) {
28829357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("OMX_GetExtensionIndex failed");
28983750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
29083750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        return StatusFromOMXError(err);
29183750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    }
29283750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
29383750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    OMX_VERSIONTYPE ver;
29483750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    ver.s.nVersionMajor = 1;
29583750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    ver.s.nVersionMinor = 0;
29683750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    ver.s.nRevision = 0;
29783750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    ver.s.nStep = 0;
29883750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    EnableAndroidNativeBuffersParams params = {
29983750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        sizeof(EnableAndroidNativeBuffersParams), ver, portIndex, enable,
30083750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    };
30183750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
30283750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    err = OMX_SetParameter(mHandle, index, &params);
30383750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
30483750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    if (err != OMX_ErrorNone) {
30529357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("OMX_EnableAndroidNativeBuffers failed with error %d (0x%08x)",
30683750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis                err, err);
30783750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
30883750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        return UNKNOWN_ERROR;
30983750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    }
31083750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
31183750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    return OK;
31283750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis}
31383750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
314e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennisstatus_t OMXNodeInstance::getGraphicBufferUsage(
315e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis        OMX_U32 portIndex, OMX_U32* usage) {
316e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis    Mutex::Autolock autoLock(mLock);
317e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis
318e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis    OMX_INDEXTYPE index;
319e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis    OMX_ERRORTYPE err = OMX_GetExtensionIndex(
320e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis            mHandle,
321e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis            const_cast<OMX_STRING>(
322e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis                    "OMX.google.android.index.getAndroidNativeBufferUsage"),
323e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis            &index);
324e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis
325e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis    if (err != OMX_ErrorNone) {
32629357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("OMX_GetExtensionIndex failed");
327e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis
328e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis        return StatusFromOMXError(err);
329e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis    }
330e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis
331e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis    OMX_VERSIONTYPE ver;
332e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis    ver.s.nVersionMajor = 1;
333e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis    ver.s.nVersionMinor = 0;
334e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis    ver.s.nRevision = 0;
335e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis    ver.s.nStep = 0;
336e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis    GetAndroidNativeBufferUsageParams params = {
337e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis        sizeof(GetAndroidNativeBufferUsageParams), ver, portIndex, 0,
338e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis    };
339e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis
340e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis    err = OMX_GetParameter(mHandle, index, &params);
341e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis
342e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis    if (err != OMX_ErrorNone) {
34329357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("OMX_GetAndroidNativeBufferUsage failed with error %d (0x%08x)",
344e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis                err, err);
345e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis        return UNKNOWN_ERROR;
346e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis    }
347e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis
348e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis    *usage = params.nUsage;
349e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis
350e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis    return OK;
351e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis}
352e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis
353e870772a78ffe08b1c14a791e368f1499f1be0f3James Dongstatus_t OMXNodeInstance::storeMetaDataInBuffers(
354e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong        OMX_U32 portIndex,
355e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong        OMX_BOOL enable) {
356e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong    Mutex::Autolock autolock(mLock);
357e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong
358e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong    OMX_INDEXTYPE index;
359e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong    OMX_STRING name = const_cast<OMX_STRING>(
360e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong            "OMX.google.android.index.storeMetaDataInBuffers");
361e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong
362e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong    OMX_ERRORTYPE err = OMX_GetExtensionIndex(mHandle, name, &index);
363e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong    if (err != OMX_ErrorNone) {
36429357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("OMX_GetExtensionIndex %s failed", name);
365e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong        return StatusFromOMXError(err);
366e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong    }
367e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong
368e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong    StoreMetaDataInBuffersParams params;
369e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong    memset(&params, 0, sizeof(params));
370e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong    params.nSize = sizeof(params);
371e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong
372e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong    // Version: 1.0.0.0
373e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong    params.nVersion.s.nVersionMajor = 1;
374e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong
375e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong    params.nPortIndex = portIndex;
376e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong    params.bStoreMetaData = enable;
377e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong    if ((err = OMX_SetParameter(mHandle, index, &params)) != OMX_ErrorNone) {
37829357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("OMX_SetParameter() failed for StoreMetaDataInBuffers: 0x%08x", err);
379e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong        return UNKNOWN_ERROR;
380e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong    }
381e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong    return err;
382e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong}
383e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong
384318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::useBuffer(
385318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_U32 portIndex, const sp<IMemory> &params,
386318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX::buffer_id *buffer) {
387318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    Mutex::Autolock autoLock(mLock);
388318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
389318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    BufferMeta *buffer_meta = new BufferMeta(params);
390318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
391318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_BUFFERHEADERTYPE *header;
392318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
393318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_ERRORTYPE err = OMX_UseBuffer(
394318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            mHandle, &header, portIndex, buffer_meta,
395318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            params->size(), static_cast<OMX_U8 *>(params->pointer()));
396318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
397318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    if (err != OMX_ErrorNone) {
39829357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("OMX_UseBuffer failed with error %d (0x%08x)", err, err);
399318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
400318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        delete buffer_meta;
401318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        buffer_meta = NULL;
402318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
403318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        *buffer = 0;
404318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
405318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        return UNKNOWN_ERROR;
406318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    }
407318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
40803b268eac37ca2589bfff0bf58daf79d29cc14f4Andreas Huber    CHECK_EQ(header->pAppPrivate, buffer_meta);
40903b268eac37ca2589bfff0bf58daf79d29cc14f4Andreas Huber
410318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    *buffer = header;
411318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
412d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    addActiveBuffer(portIndex, *buffer);
413d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber
414318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return OK;
415318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
416318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
417c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajanstatus_t OMXNodeInstance::useGraphicBuffer2_l(
418c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan        OMX_U32 portIndex, const sp<GraphicBuffer>& graphicBuffer,
419c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan        OMX::buffer_id *buffer) {
420c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan
421c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan    // port definition
422c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan    OMX_PARAM_PORTDEFINITIONTYPE def;
423c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan    def.nSize = sizeof(OMX_PARAM_PORTDEFINITIONTYPE);
424c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan    def.nVersion.s.nVersionMajor = 1;
425c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan    def.nVersion.s.nVersionMinor = 0;
426c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan    def.nVersion.s.nRevision = 0;
427c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan    def.nVersion.s.nStep = 0;
428c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan    def.nPortIndex = portIndex;
429c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan    OMX_ERRORTYPE err = OMX_GetParameter(mHandle, OMX_IndexParamPortDefinition, &def);
430a0dac9e24ae7520cb7d7f0505bf0936bffbcd047Jamie Gennis    if (err != OMX_ErrorNone)
431c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan    {
43229357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("%s::%d:Error getting OMX_IndexParamPortDefinition", __FUNCTION__, __LINE__);
433c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan        return err;
434c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan    }
435c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan
436c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan    BufferMeta *bufferMeta = new BufferMeta(graphicBuffer);
437c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan
438c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan    OMX_BUFFERHEADERTYPE *header = NULL;
439c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan    OMX_U8* bufferHandle = const_cast<OMX_U8*>(
440c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan            reinterpret_cast<const OMX_U8*>(graphicBuffer->handle));
441c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan
442c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan    err = OMX_UseBuffer(
443c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan            mHandle,
444c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan            &header,
445c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan            portIndex,
446c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan            bufferMeta,
447c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan            def.nBufferSize,
448c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan            bufferHandle);
449c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan
450c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan    if (err != OMX_ErrorNone) {
45129357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("OMX_UseBuffer failed with error %d (0x%08x)", err, err);
452c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan        delete bufferMeta;
453c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan        bufferMeta = NULL;
454c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan        *buffer = 0;
455c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan        return UNKNOWN_ERROR;
456c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan    }
457c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan
458c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan    CHECK_EQ(header->pBuffer, bufferHandle);
459c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan    CHECK_EQ(header->pAppPrivate, bufferMeta);
460c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan
461c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan    *buffer = header;
462c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan
463c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan    addActiveBuffer(portIndex, *buffer);
464c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan
465c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan    return OK;
466c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan}
467c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan
468c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan// XXX: This function is here for backwards compatibility.  Once the OMX
469c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan// implementations have been updated this can be removed and useGraphicBuffer2
470c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan// can be renamed to useGraphicBuffer.
47183750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennisstatus_t OMXNodeInstance::useGraphicBuffer(
47283750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        OMX_U32 portIndex, const sp<GraphicBuffer>& graphicBuffer,
47383750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        OMX::buffer_id *buffer) {
47483750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    Mutex::Autolock autoLock(mLock);
47583750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
476c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan    // See if the newer version of the extension is present.
47783750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    OMX_INDEXTYPE index;
478c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan    if (OMX_GetExtensionIndex(
479c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan            mHandle,
480c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan            const_cast<OMX_STRING>("OMX.google.android.index.useAndroidNativeBuffer2"),
481c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan            &index) == OMX_ErrorNone) {
482c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan        return useGraphicBuffer2_l(portIndex, graphicBuffer, buffer);
483c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan    }
484c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan
48583750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    OMX_ERRORTYPE err = OMX_GetExtensionIndex(
48683750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            mHandle,
48783750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            const_cast<OMX_STRING>("OMX.google.android.index.useAndroidNativeBuffer"),
48883750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            &index);
48983750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
49083750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    if (err != OMX_ErrorNone) {
49129357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("OMX_GetExtensionIndex failed");
49283750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
49383750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        return StatusFromOMXError(err);
49483750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    }
49583750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
49683750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    BufferMeta *bufferMeta = new BufferMeta(graphicBuffer);
49783750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
49883750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    OMX_BUFFERHEADERTYPE *header;
49983750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
50083750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    OMX_VERSIONTYPE ver;
50183750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    ver.s.nVersionMajor = 1;
50283750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    ver.s.nVersionMinor = 0;
50383750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    ver.s.nRevision = 0;
50483750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    ver.s.nStep = 0;
50583750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    UseAndroidNativeBufferParams params = {
50683750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        sizeof(UseAndroidNativeBufferParams), ver, portIndex, bufferMeta,
50783750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        &header, graphicBuffer,
50883750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    };
50983750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
51083750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    err = OMX_SetParameter(mHandle, index, &params);
51183750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
51283750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    if (err != OMX_ErrorNone) {
51329357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("OMX_UseAndroidNativeBuffer failed with error %d (0x%08x)", err,
51483750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis                err);
51583750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
51683750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        delete bufferMeta;
51783750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        bufferMeta = NULL;
51883750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
51983750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        *buffer = 0;
52083750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
52183750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis        return UNKNOWN_ERROR;
52283750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    }
52383750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
52483750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    CHECK_EQ(header->pAppPrivate, bufferMeta);
52583750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
52683750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    *buffer = header;
52783750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
52883750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    addActiveBuffer(portIndex, *buffer);
52983750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
53083750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    return OK;
53183750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis}
53283750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
533318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::allocateBuffer(
534570a3cb7582daa030cb38eedc5eb6a06f86ecc7fAndreas Huber        OMX_U32 portIndex, size_t size, OMX::buffer_id *buffer,
535570a3cb7582daa030cb38eedc5eb6a06f86ecc7fAndreas Huber        void **buffer_data) {
536318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    Mutex::Autolock autoLock(mLock);
537318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
538318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    BufferMeta *buffer_meta = new BufferMeta(size);
539318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
540318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_BUFFERHEADERTYPE *header;
541318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
542318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_ERRORTYPE err = OMX_AllocateBuffer(
543318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            mHandle, &header, portIndex, buffer_meta, size);
544318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
545318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    if (err != OMX_ErrorNone) {
54629357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("OMX_AllocateBuffer failed with error %d (0x%08x)", err, err);
547318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
548318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        delete buffer_meta;
549318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        buffer_meta = NULL;
550318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
551318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        *buffer = 0;
552318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
553318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        return UNKNOWN_ERROR;
554318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    }
555318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
55603b268eac37ca2589bfff0bf58daf79d29cc14f4Andreas Huber    CHECK_EQ(header->pAppPrivate, buffer_meta);
55703b268eac37ca2589bfff0bf58daf79d29cc14f4Andreas Huber
558318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    *buffer = header;
559570a3cb7582daa030cb38eedc5eb6a06f86ecc7fAndreas Huber    *buffer_data = header->pBuffer;
560318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
561d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    addActiveBuffer(portIndex, *buffer);
562d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber
563318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return OK;
564318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
565318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
566318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::allocateBufferWithBackup(
567318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_U32 portIndex, const sp<IMemory> &params,
568318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX::buffer_id *buffer) {
569318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    Mutex::Autolock autoLock(mLock);
570318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
571318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    BufferMeta *buffer_meta = new BufferMeta(params, true);
572318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
573318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_BUFFERHEADERTYPE *header;
574318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
575318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_ERRORTYPE err = OMX_AllocateBuffer(
576318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            mHandle, &header, portIndex, buffer_meta, params->size());
577318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
578318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    if (err != OMX_ErrorNone) {
57929357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("OMX_AllocateBuffer failed with error %d (0x%08x)", err, err);
580318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
581318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        delete buffer_meta;
582318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        buffer_meta = NULL;
583318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
584318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        *buffer = 0;
585318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
586318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        return UNKNOWN_ERROR;
587318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    }
588318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
58903b268eac37ca2589bfff0bf58daf79d29cc14f4Andreas Huber    CHECK_EQ(header->pAppPrivate, buffer_meta);
59003b268eac37ca2589bfff0bf58daf79d29cc14f4Andreas Huber
591318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    *buffer = header;
592318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
593d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    addActiveBuffer(portIndex, *buffer);
594d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber
595318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return OK;
596318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
597318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
598318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::freeBuffer(
599318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_U32 portIndex, OMX::buffer_id buffer) {
600318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    Mutex::Autolock autoLock(mLock);
601318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
602d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    removeActiveBuffer(portIndex, buffer);
603d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber
604318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_BUFFERHEADERTYPE *header = (OMX_BUFFERHEADERTYPE *)buffer;
605318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    BufferMeta *buffer_meta = static_cast<BufferMeta *>(header->pAppPrivate);
606318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
607318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_ERRORTYPE err = OMX_FreeBuffer(mHandle, portIndex, header);
608318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
609318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    delete buffer_meta;
610318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    buffer_meta = NULL;
611318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
612318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return StatusFromOMXError(err);
613318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
614318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
615318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::fillBuffer(OMX::buffer_id buffer) {
616318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    Mutex::Autolock autoLock(mLock);
617318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
618318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_BUFFERHEADERTYPE *header = (OMX_BUFFERHEADERTYPE *)buffer;
619318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    header->nFilledLen = 0;
620318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    header->nOffset = 0;
621318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    header->nFlags = 0;
622318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
623318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_ERRORTYPE err = OMX_FillThisBuffer(mHandle, header);
624318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
625318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return StatusFromOMXError(err);
626318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
627318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
628318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::emptyBuffer(
629318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX::buffer_id buffer,
630318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_U32 rangeOffset, OMX_U32 rangeLength,
631318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_U32 flags, OMX_TICKS timestamp) {
632318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    Mutex::Autolock autoLock(mLock);
633318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
634318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_BUFFERHEADERTYPE *header = (OMX_BUFFERHEADERTYPE *)buffer;
635318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    header->nFilledLen = rangeLength;
636318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    header->nOffset = rangeOffset;
637318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    header->nFlags = flags;
638318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    header->nTimeStamp = timestamp;
639318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
640318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    BufferMeta *buffer_meta =
641318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        static_cast<BufferMeta *>(header->pAppPrivate);
642318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    buffer_meta->CopyToOMX(header);
643318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
644318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_ERRORTYPE err = OMX_EmptyThisBuffer(mHandle, header);
645318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
646318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return StatusFromOMXError(err);
647318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
648318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
649318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::getExtensionIndex(
650318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        const char *parameterName, OMX_INDEXTYPE *index) {
651318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    Mutex::Autolock autoLock(mLock);
652318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
653318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMX_ERRORTYPE err = OMX_GetExtensionIndex(
654318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            mHandle, const_cast<char *>(parameterName), index);
655318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
656318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return StatusFromOMXError(err);
657318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
658318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
659318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Hubervoid OMXNodeInstance::onMessage(const omx_message &msg) {
660318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    if (msg.type == omx_message::FILL_BUFFER_DONE) {
661318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_BUFFERHEADERTYPE *buffer =
662318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            static_cast<OMX_BUFFERHEADERTYPE *>(
663318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber                    msg.u.extended_buffer_data.buffer);
664318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
665318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        BufferMeta *buffer_meta =
666318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            static_cast<BufferMeta *>(buffer->pAppPrivate);
667318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
668318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        buffer_meta->CopyFromOMX(buffer);
669318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    }
670318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
671318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    mObserver->onMessage(msg);
672318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
673318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
674f0fb96c352f30b812a4903a1d783a715e1e817bdAndreas Hubervoid OMXNodeInstance::onObserverDied(OMXMaster *master) {
67529357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block    ALOGE("!!! Observer died. Quickly, do something, ... anything...");
676318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
677318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    // Try to force shutdown of the node and hope for the best.
678f0fb96c352f30b812a4903a1d783a715e1e817bdAndreas Huber    freeNode(master);
679318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
680318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
681318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Hubervoid OMXNodeInstance::onGetHandleFailed() {
682318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    delete this;
683318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
684318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
685318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber// static
686318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas HuberOMX_ERRORTYPE OMXNodeInstance::OnEvent(
687318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_IN OMX_HANDLETYPE hComponent,
688318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_IN OMX_PTR pAppData,
689318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_IN OMX_EVENTTYPE eEvent,
690318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_IN OMX_U32 nData1,
691318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_IN OMX_U32 nData2,
692318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_IN OMX_PTR pEventData) {
693318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMXNodeInstance *instance = static_cast<OMXNodeInstance *>(pAppData);
694134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    if (instance->mDying) {
695134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber        return OMX_ErrorNone;
696134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    }
697318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return instance->owner()->OnEvent(
698318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            instance->nodeID(), eEvent, nData1, nData2, pEventData);
699318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
700318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
701318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber// static
702318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas HuberOMX_ERRORTYPE OMXNodeInstance::OnEmptyBufferDone(
703318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_IN OMX_HANDLETYPE hComponent,
704318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_IN OMX_PTR pAppData,
705318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_IN OMX_BUFFERHEADERTYPE* pBuffer) {
706318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMXNodeInstance *instance = static_cast<OMXNodeInstance *>(pAppData);
707134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    if (instance->mDying) {
708134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber        return OMX_ErrorNone;
709134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    }
710318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return instance->owner()->OnEmptyBufferDone(instance->nodeID(), pBuffer);
711318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
712318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
713318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber// static
714318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas HuberOMX_ERRORTYPE OMXNodeInstance::OnFillBufferDone(
715318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_IN OMX_HANDLETYPE hComponent,
716318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_IN OMX_PTR pAppData,
717318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber        OMX_IN OMX_BUFFERHEADERTYPE* pBuffer) {
718318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMXNodeInstance *instance = static_cast<OMXNodeInstance *>(pAppData);
719134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    if (instance->mDying) {
720134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber        return OMX_ErrorNone;
721134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    }
722318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    return instance->owner()->OnFillBufferDone(instance->nodeID(), pBuffer);
723318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}
724318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
725d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Hubervoid OMXNodeInstance::addActiveBuffer(OMX_U32 portIndex, OMX::buffer_id id) {
726d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    ActiveBuffer active;
727d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    active.mPortIndex = portIndex;
728d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    active.mID = id;
729d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    mActiveBuffers.push(active);
730d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber}
731d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber
732d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Hubervoid OMXNodeInstance::removeActiveBuffer(
733d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber        OMX_U32 portIndex, OMX::buffer_id id) {
734d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    bool found = false;
735d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    for (size_t i = 0; i < mActiveBuffers.size(); ++i) {
736d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber        if (mActiveBuffers[i].mPortIndex == portIndex
737d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            && mActiveBuffers[i].mID == id) {
738d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            found = true;
739d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            mActiveBuffers.removeItemsAt(i);
740d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber            break;
741d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber        }
742d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    }
743d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber
744d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    if (!found) {
7455ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block        ALOGW("Attempt to remove an active buffer we know nothing about...");
746d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    }
747d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber}
748d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber
749d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Hubervoid OMXNodeInstance::freeActiveBuffers() {
750d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    // Make sure to count down here, as freeBuffer will in turn remove
751d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    // the active buffer from the vector...
752d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    for (size_t i = mActiveBuffers.size(); i--;) {
753d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber        freeBuffer(mActiveBuffers[i].mPortIndex, mActiveBuffers[i].mID);
754d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber    }
755d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber}
756d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber
757318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}  // namespace android
758