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, ¶ms); 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, ¶ms); 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(¶ms, 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, ¶ms)) != 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> ¶ms, 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, ¶ms); 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> ¶ms, 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