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 21f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar#include <inttypes.h> 22f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 23318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber#include "../include/OMXNodeInstance.h" 24f0fb96c352f30b812a4903a1d783a715e1e817bdAndreas Huber#include "OMXMaster.h" 2573dd808754c641fe798273d356ee38368715fa7bLajos Molnar#include "OMXUtils.h" 26f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden#include "GraphicBufferSource.h" 27318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 28e3ec3cec3a2e27033249ff82964d2cbd441d9873Andreas Huber#include <OMX_Component.h> 29f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar#include <OMX_IndexExt.h> 30f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar#include <OMX_AsString.h> 31318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 32318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber#include <binder/IMemory.h> 33aef47bf801dcbcb88cec8426c03237c6313da1c2Lajos Molnar#include <cutils/properties.h> 34f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden#include <gui/BufferQueue.h> 356c6b4d0d2b98a7ceee8b697daaf611f8df3254fbJames Dong#include <HardwareAPI.h> 36f1d5aa162c02a16b7195a43a9bcea4d592600ac4James Dong#include <media/stagefright/foundation/ADebug.h> 37054219874873b41f1c815552987c10465c34ba2bLajos Molnar#include <media/stagefright/foundation/ABuffer.h> 382a3847ee1cbdaa8a65eee397a0173bb02211c459Andreas Huber#include <media/stagefright/MediaErrors.h> 39f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar#include <utils/misc.h> 407e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar#include <utils/NativeHandle.h> 41f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 42f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFaddenstatic const OMX_U32 kPortIndexInput = 0; 43f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnarstatic const OMX_U32 kPortIndexOutput = 1; 44f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 45f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar#define CLOGW(fmt, ...) ALOGW("[%x:%s] " fmt, mNodeID, mName, ##__VA_ARGS__) 46f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 47f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar#define CLOG_ERROR_IF(cond, fn, err, fmt, ...) \ 48f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar ALOGE_IF(cond, #fn "(%x:%s, " fmt ") ERROR: %s(%#x)", \ 49f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar mNodeID, mName, ##__VA_ARGS__, asString(err), err) 50f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar#define CLOG_ERROR(fn, err, fmt, ...) CLOG_ERROR_IF(true, fn, err, fmt, ##__VA_ARGS__) 51f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar#define CLOG_IF_ERROR(fn, err, fmt, ...) \ 52f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_ERROR_IF((err) != OMX_ErrorNone, fn, err, fmt, ##__VA_ARGS__) 53f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 54f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar#define CLOGI_(level, fn, fmt, ...) \ 55f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar ALOGI_IF(DEBUG >= (level), #fn "(%x:%s, " fmt ")", mNodeID, mName, ##__VA_ARGS__) 56f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar#define CLOGD_(level, fn, fmt, ...) \ 57f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar ALOGD_IF(DEBUG >= (level), #fn "(%x:%s, " fmt ")", mNodeID, mName, ##__VA_ARGS__) 58f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 59f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar#define CLOG_LIFE(fn, fmt, ...) CLOGI_(ADebug::kDebugLifeCycle, fn, fmt, ##__VA_ARGS__) 60f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar#define CLOG_STATE(fn, fmt, ...) CLOGI_(ADebug::kDebugState, fn, fmt, ##__VA_ARGS__) 61f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar#define CLOG_CONFIG(fn, fmt, ...) CLOGI_(ADebug::kDebugConfig, fn, fmt, ##__VA_ARGS__) 62f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar#define CLOG_INTERNAL(fn, fmt, ...) CLOGD_(ADebug::kDebugInternalState, fn, fmt, ##__VA_ARGS__) 63f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 64f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar#define CLOG_DEBUG_IF(cond, fn, fmt, ...) \ 65f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar ALOGD_IF(cond, #fn "(%x, " fmt ")", mNodeID, ##__VA_ARGS__) 66f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 67f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar#define CLOG_BUFFER(fn, fmt, ...) \ 68f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_DEBUG_IF(DEBUG >= ADebug::kDebugAll, fn, fmt, ##__VA_ARGS__) 69f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar#define CLOG_BUMPED_BUFFER(fn, fmt, ...) \ 70f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_DEBUG_IF(DEBUG_BUMP >= ADebug::kDebugAll, fn, fmt, ##__VA_ARGS__) 71f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 72f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar/* buffer formatting */ 73f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar#define BUFFER_FMT(port, fmt, ...) "%s:%u " fmt, portString(port), (port), ##__VA_ARGS__ 74f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar#define NEW_BUFFER_FMT(buffer_id, port, fmt, ...) \ 75f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar BUFFER_FMT(port, fmt ") (#%zu => %#x", ##__VA_ARGS__, mActiveBuffers.size(), (buffer_id)) 76f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 77f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar#define SIMPLE_BUFFER(port, size, data) BUFFER_FMT(port, "%zu@%p", (size), (data)) 78f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar#define SIMPLE_NEW_BUFFER(buffer_id, port, size, data) \ 79f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar NEW_BUFFER_FMT(buffer_id, port, "%zu@%p", (size), (data)) 80f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 8115ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar#define EMPTY_BUFFER(addr, header, fenceFd) "%#x [%u@%p fc=%d]", \ 8215ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar (addr), (header)->nAllocLen, (header)->pBuffer, (fenceFd) 8315ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar#define FULL_BUFFER(addr, header, fenceFd) "%#" PRIxPTR " [%u@%p (%u..+%u) f=%x ts=%lld fc=%d]", \ 84f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar (intptr_t)(addr), (header)->nAllocLen, (header)->pBuffer, \ 8515ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar (header)->nOffset, (header)->nFilledLen, (header)->nFlags, (header)->nTimeStamp, (fenceFd) 86f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 87f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar#define WITH_STATS_WRAPPER(fmt, ...) fmt " { IN=%zu/%zu OUT=%zu/%zu }", ##__VA_ARGS__, \ 88f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar mInputBuffersWithCodec.size(), mNumPortBuffers[kPortIndexInput], \ 89f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar mOutputBuffersWithCodec.size(), mNumPortBuffers[kPortIndexOutput] 90f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar// TRICKY: this is needed so formatting macros expand before substitution 91f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar#define WITH_STATS(fmt, ...) WITH_STATS_WRAPPER(fmt, ##__VA_ARGS__) 92f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 93318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Hubernamespace android { 94318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 95318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstruct BufferMeta { 96d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar BufferMeta( 97d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar const sp<IMemory> &mem, OMX_U32 portIndex, bool copyToOmx, 98d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar bool copyFromOmx, OMX_U8 *backup) 99318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber : mMem(mem), 100d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar mCopyFromOmx(copyFromOmx), 101d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar mCopyToOmx(copyToOmx), 102d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar mPortIndex(portIndex), 103d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar mBackup(backup) { 104318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber } 105318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 10641eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim BufferMeta(size_t size, OMX_U32 portIndex) 107318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber : mSize(size), 108d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar mCopyFromOmx(false), 109d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar mCopyToOmx(false), 110d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar mPortIndex(portIndex), 111d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar mBackup(NULL) { 112318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber } 113318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 11441eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim BufferMeta(const sp<GraphicBuffer> &graphicBuffer, OMX_U32 portIndex) 11583750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis : mGraphicBuffer(graphicBuffer), 116d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar mCopyFromOmx(false), 117d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar mCopyToOmx(false), 118d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar mPortIndex(portIndex), 119d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar mBackup(NULL) { 12083750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis } 12183750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis 122318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber void CopyFromOMX(const OMX_BUFFERHEADERTYPE *header) { 123d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar if (!mCopyFromOmx) { 124318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber return; 125318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber } 126318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 127ec4ed7d541f48d1d0af8f93cd26ec291ca82061bLajos Molnar // check component returns proper range 128ec4ed7d541f48d1d0af8f93cd26ec291ca82061bLajos Molnar sp<ABuffer> codec = getBuffer(header, false /* backup */, true /* limit */); 129ec4ed7d541f48d1d0af8f93cd26ec291ca82061bLajos Molnar 130ec4ed7d541f48d1d0af8f93cd26ec291ca82061bLajos Molnar memcpy((OMX_U8 *)mMem->pointer() + header->nOffset, codec->data(), codec->size()); 131318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber } 132318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 133318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber void CopyToOMX(const OMX_BUFFERHEADERTYPE *header) { 134d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar if (!mCopyToOmx) { 135318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber return; 136318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber } 137318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 138318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber memcpy(header->pBuffer + header->nOffset, 139f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar (const OMX_U8 *)mMem->pointer() + header->nOffset, 140f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar header->nFilledLen); 141318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber } 142318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 143054219874873b41f1c815552987c10465c34ba2bLajos Molnar // return either the codec or the backup buffer 144ec4ed7d541f48d1d0af8f93cd26ec291ca82061bLajos Molnar sp<ABuffer> getBuffer(const OMX_BUFFERHEADERTYPE *header, bool backup, bool limit) { 145054219874873b41f1c815552987c10465c34ba2bLajos Molnar sp<ABuffer> buf; 146054219874873b41f1c815552987c10465c34ba2bLajos Molnar if (backup && mMem != NULL) { 147054219874873b41f1c815552987c10465c34ba2bLajos Molnar buf = new ABuffer(mMem->pointer(), mMem->size()); 148054219874873b41f1c815552987c10465c34ba2bLajos Molnar } else { 149054219874873b41f1c815552987c10465c34ba2bLajos Molnar buf = new ABuffer(header->pBuffer, header->nAllocLen); 150054219874873b41f1c815552987c10465c34ba2bLajos Molnar } 151ec4ed7d541f48d1d0af8f93cd26ec291ca82061bLajos Molnar if (limit) { 152ec4ed7d541f48d1d0af8f93cd26ec291ca82061bLajos Molnar if (header->nOffset + header->nFilledLen > header->nOffset 153ec4ed7d541f48d1d0af8f93cd26ec291ca82061bLajos Molnar && header->nOffset + header->nFilledLen <= header->nAllocLen) { 154ec4ed7d541f48d1d0af8f93cd26ec291ca82061bLajos Molnar buf->setRange(header->nOffset, header->nFilledLen); 155ec4ed7d541f48d1d0af8f93cd26ec291ca82061bLajos Molnar } else { 156ec4ed7d541f48d1d0af8f93cd26ec291ca82061bLajos Molnar buf->setRange(0, 0); 157ec4ed7d541f48d1d0af8f93cd26ec291ca82061bLajos Molnar } 158ec4ed7d541f48d1d0af8f93cd26ec291ca82061bLajos Molnar } 159054219874873b41f1c815552987c10465c34ba2bLajos Molnar return buf; 160054219874873b41f1c815552987c10465c34ba2bLajos Molnar } 161054219874873b41f1c815552987c10465c34ba2bLajos Molnar 162d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar void setGraphicBuffer(const sp<GraphicBuffer> &graphicBuffer) { 163d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar mGraphicBuffer = graphicBuffer; 164d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar } 165d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar 1667e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar void setNativeHandle(const sp<NativeHandle> &nativeHandle) { 1677e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar mNativeHandle = nativeHandle; 1687e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar } 1697e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar 17041eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim OMX_U32 getPortIndex() { 17141eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim return mPortIndex; 17241eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim } 17341eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim 174d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar ~BufferMeta() { 175d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar delete[] mBackup; 176d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar } 177d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar 178318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberprivate: 17983750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis sp<GraphicBuffer> mGraphicBuffer; 1807e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar sp<NativeHandle> mNativeHandle; 181318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber sp<IMemory> mMem; 182318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber size_t mSize; 183d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar bool mCopyFromOmx; 184d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar bool mCopyToOmx; 18541eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim OMX_U32 mPortIndex; 186d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar OMX_U8 *mBackup; 187318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 188318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber BufferMeta(const BufferMeta &); 189318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber BufferMeta &operator=(const BufferMeta &); 190318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}; 191318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 192318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber// static 193318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas HuberOMX_CALLBACKTYPE OMXNodeInstance::kCallbacks = { 194318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber &OnEvent, &OnEmptyBufferDone, &OnFillBufferDone 195318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}; 196318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 197f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnarstatic inline const char *portString(OMX_U32 portIndex) { 198f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar switch (portIndex) { 199f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar case kPortIndexInput: return "Input"; 200f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar case kPortIndexOutput: return "Output"; 201011734f0ce7e8b2e3066f90ef51c323ee7d4dea2Bill Yi case ~0U: return "All"; 202f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar default: return "port"; 203f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } 204f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar} 205f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 206318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas HuberOMXNodeInstance::OMXNodeInstance( 207f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar OMX *owner, const sp<IOMXObserver> &observer, const char *name) 208318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber : mOwner(owner), 209609b815a3131d22da38b2f452faa9f89daad4039Andy Hung mNodeID(0), 210318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber mHandle(NULL), 211134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber mObserver(observer), 2129113c1e619fd78fe53b548180fdc02300d33303dAndy Hung mDying(false), 213d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar mSailed(false), 214d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar mQueriedProhibitedExtensions(false), 2159113c1e619fd78fe53b548180fdc02300d33303dAndy Hung mBufferIDCount(0) 216609b815a3131d22da38b2f452faa9f89daad4039Andy Hung{ 217f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar mName = ADebug::GetDebugName(name); 218f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar DEBUG = ADebug::GetDebugLevelFromProperty(name, "debug.stagefright.omx-debug"); 219f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar ALOGV("debug level for %s is %d", name, DEBUG); 220f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar DEBUG_BUMP = DEBUG; 221f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar mNumPortBuffers[0] = 0; 222f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar mNumPortBuffers[1] = 0; 223f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar mDebugLevelBumpPendingBuffers[0] = 0; 224f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar mDebugLevelBumpPendingBuffers[1] = 0; 225054219874873b41f1c815552987c10465c34ba2bLajos Molnar mMetadataType[0] = kMetadataBufferTypeInvalid; 226054219874873b41f1c815552987c10465c34ba2bLajos Molnar mMetadataType[1] = kMetadataBufferTypeInvalid; 227a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnar mSecureBufferType[0] = kSecureBufferTypeUnknown; 228a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnar mSecureBufferType[1] = kSecureBufferTypeUnknown; 2298239dfee37a5e6777f94186f51871e86d0b6c21eDongwon Kang mGraphicBufferEnabled[0] = false; 2308239dfee37a5e6777f94186f51871e86d0b6c21eDongwon Kang mGraphicBufferEnabled[1] = false; 2318dde7269a5356503d2b283234b6cb46d0c3f214eWei Jia mIsSecure = AString(name).endsWith(".secure"); 232318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 233318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 234318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas HuberOMXNodeInstance::~OMXNodeInstance() { 235f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar free(mName); 236f1d5aa162c02a16b7195a43a9bcea4d592600ac4James Dong CHECK(mHandle == NULL); 237318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 238318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 239318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Hubervoid OMXNodeInstance::setHandle(OMX::node_id node_id, OMX_HANDLETYPE handle) { 240318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber mNodeID = node_id; 241f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_LIFE(allocateNode, "handle=%p", handle); 242f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CHECK(mHandle == NULL); 243318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber mHandle = handle; 244318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 245318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 246f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFaddensp<GraphicBufferSource> OMXNodeInstance::getGraphicBufferSource() { 247f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden Mutex::Autolock autoLock(mGraphicBufferSourceLock); 248f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden return mGraphicBufferSource; 249f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden} 250f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden 251f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFaddenvoid OMXNodeInstance::setGraphicBufferSource( 252f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden const sp<GraphicBufferSource>& bufferSource) { 253f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden Mutex::Autolock autoLock(mGraphicBufferSourceLock); 254f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_INTERNAL(setGraphicBufferSource, "%p", bufferSource.get()); 255f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden mGraphicBufferSource = bufferSource; 256f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden} 257f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden 258318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas HuberOMX *OMXNodeInstance::owner() { 259318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber return mOwner; 260318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 261318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 262318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Hubersp<IOMXObserver> OMXNodeInstance::observer() { 263318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber return mObserver; 264318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 265318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 266318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas HuberOMX::node_id OMXNodeInstance::nodeID() { 267318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber return mNodeID; 268318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 269318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 270f0fb96c352f30b812a4903a1d783a715e1e817bdAndreas Huberstatus_t OMXNodeInstance::freeNode(OMXMaster *master) { 271f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_LIFE(freeNode, "handle=%p", mHandle); 27243e5eca7048a3b7b3ee0223b7f3cbd837ed10ae5Andreas Huber static int32_t kMaxNumIterations = 10; 27343e5eca7048a3b7b3ee0223b7f3cbd837ed10ae5Andreas Huber 27430358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar // exit if we have already freed the node 27530358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar if (mHandle == NULL) { 27630358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar return OK; 27730358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar } 27830358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar 279d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber // Transition the node from its current state all the way down 280d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber // to "Loaded". 281d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber // This ensures that all active buffers are properly freed even 282d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber // for components that don't do this themselves on a call to 283d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber // "FreeHandle". 284d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber 285134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber // The code below may trigger some more events to be dispatched 286134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber // by the OMX component - we want to ignore them as our client 287134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber // does not expect them. 288134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber mDying = true; 289134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber 290d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber OMX_STATETYPE state; 291d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber CHECK_EQ(OMX_GetState(mHandle, &state), OMX_ErrorNone); 292d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber switch (state) { 293d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber case OMX_StateExecuting: 294d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber { 2953856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("forcing Executing->Idle"); 296d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber sendCommand(OMX_CommandStateSet, OMX_StateIdle); 297d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber OMX_ERRORTYPE err; 29843e5eca7048a3b7b3ee0223b7f3cbd837ed10ae5Andreas Huber int32_t iteration = 0; 299d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber while ((err = OMX_GetState(mHandle, &state)) == OMX_ErrorNone 300f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar && state != OMX_StateIdle 301f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar && state != OMX_StateInvalid) { 30243e5eca7048a3b7b3ee0223b7f3cbd837ed10ae5Andreas Huber if (++iteration > kMaxNumIterations) { 303f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOGW("failed to enter Idle state (now %s(%d), aborting.", 304f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar asString(state), state); 30543e5eca7048a3b7b3ee0223b7f3cbd837ed10ae5Andreas Huber state = OMX_StateInvalid; 30643e5eca7048a3b7b3ee0223b7f3cbd837ed10ae5Andreas Huber break; 30743e5eca7048a3b7b3ee0223b7f3cbd837ed10ae5Andreas Huber } 30843e5eca7048a3b7b3ee0223b7f3cbd837ed10ae5Andreas Huber 309d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber usleep(100000); 310d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber } 311d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber CHECK_EQ(err, OMX_ErrorNone); 312d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber 3130d681df3b0ded2c1e335b6b5785439da4ce2c238Andreas Huber if (state == OMX_StateInvalid) { 3140d681df3b0ded2c1e335b6b5785439da4ce2c238Andreas Huber break; 3150d681df3b0ded2c1e335b6b5785439da4ce2c238Andreas Huber } 3160d681df3b0ded2c1e335b6b5785439da4ce2c238Andreas Huber 317d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber // fall through 318d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber } 319d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber 320d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber case OMX_StateIdle: 321d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber { 3223856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("forcing Idle->Loaded"); 323d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber sendCommand(OMX_CommandStateSet, OMX_StateLoaded); 324d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber 325d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber freeActiveBuffers(); 326d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber 327d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber OMX_ERRORTYPE err; 32843e5eca7048a3b7b3ee0223b7f3cbd837ed10ae5Andreas Huber int32_t iteration = 0; 329d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber while ((err = OMX_GetState(mHandle, &state)) == OMX_ErrorNone 330f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar && state != OMX_StateLoaded 331f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar && state != OMX_StateInvalid) { 33243e5eca7048a3b7b3ee0223b7f3cbd837ed10ae5Andreas Huber if (++iteration > kMaxNumIterations) { 333f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOGW("failed to enter Loaded state (now %s(%d), aborting.", 334f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar asString(state), state); 33543e5eca7048a3b7b3ee0223b7f3cbd837ed10ae5Andreas Huber state = OMX_StateInvalid; 33643e5eca7048a3b7b3ee0223b7f3cbd837ed10ae5Andreas Huber break; 33743e5eca7048a3b7b3ee0223b7f3cbd837ed10ae5Andreas Huber } 33843e5eca7048a3b7b3ee0223b7f3cbd837ed10ae5Andreas Huber 3393856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("waiting for Loaded state..."); 340d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber usleep(100000); 341d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber } 342d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber CHECK_EQ(err, OMX_ErrorNone); 343d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber 344d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber // fall through 345d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber } 346d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber 347d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber case OMX_StateLoaded: 348fa70cad40b01627ac1c22e04cdd548ece9c2654fAndreas Huber case OMX_StateInvalid: 349d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber break; 350d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber 351d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber default: 352f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar LOG_ALWAYS_FATAL("unknown state %s(%#x).", asString(state), state); 353d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber break; 354d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber } 355d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber 3562e75c7d933eac23f6b4278fd776e0fcacd85d3c4Lajos Molnar Mutex::Autolock _l(mLock); 3572e75c7d933eac23f6b4278fd776e0fcacd85d3c4Lajos Molnar 358f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar ALOGV("[%x:%s] calling destroyComponentInstance", mNodeID, mName); 359f0fb96c352f30b812a4903a1d783a715e1e817bdAndreas Huber OMX_ERRORTYPE err = master->destroyComponentInstance( 360f0fb96c352f30b812a4903a1d783a715e1e817bdAndreas Huber static_cast<OMX_COMPONENTTYPE *>(mHandle)); 361f0fb96c352f30b812a4903a1d783a715e1e817bdAndreas Huber 362318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber mHandle = NULL; 363f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_IF_ERROR(freeNode, err, ""); 364f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar free(mName); 365f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar mName = NULL; 366318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 367318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber mOwner->invalidateNodeID(mNodeID); 368609b815a3131d22da38b2f452faa9f89daad4039Andy Hung mNodeID = 0; 369318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 3703856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("OMXNodeInstance going away."); 37147bed1a7755ed58fa5d4c0d35b20468deb83bd60Andreas Huber delete this; 372318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 373318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber return StatusFromOMXError(err); 374318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 375318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 376318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::sendCommand( 377318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_COMMANDTYPE cmd, OMX_S32 param) { 378d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar if (cmd == OMX_CommandStateSet) { 3796392ae13cf6e15c706fce45396ec1e79af6171a9Lajos Molnar // There are no configurations past first StateSet command. 380d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar mSailed = true; 381d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar } 382d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar const sp<GraphicBufferSource> bufferSource(getGraphicBufferSource()); 383ad3b7e8d40bf1c97347f1538d30bba78ca371f67Andreas Huber if (bufferSource != NULL && cmd == OMX_CommandStateSet) { 384ad3b7e8d40bf1c97347f1538d30bba78ca371f67Andreas Huber if (param == OMX_StateIdle) { 385ad3b7e8d40bf1c97347f1538d30bba78ca371f67Andreas Huber // Initiating transition from Executing -> Idle 386ad3b7e8d40bf1c97347f1538d30bba78ca371f67Andreas Huber // ACodec is waiting for all buffers to be returned, do NOT 387ad3b7e8d40bf1c97347f1538d30bba78ca371f67Andreas Huber // submit any more buffers to the codec. 388ad3b7e8d40bf1c97347f1538d30bba78ca371f67Andreas Huber bufferSource->omxIdle(); 389ad3b7e8d40bf1c97347f1538d30bba78ca371f67Andreas Huber } else if (param == OMX_StateLoaded) { 390ad3b7e8d40bf1c97347f1538d30bba78ca371f67Andreas Huber // Initiating transition from Idle/Executing -> Loaded 391ad3b7e8d40bf1c97347f1538d30bba78ca371f67Andreas Huber // Buffers are about to be freed. 392ad3b7e8d40bf1c97347f1538d30bba78ca371f67Andreas Huber bufferSource->omxLoaded(); 393ad3b7e8d40bf1c97347f1538d30bba78ca371f67Andreas Huber setGraphicBufferSource(NULL); 394ad3b7e8d40bf1c97347f1538d30bba78ca371f67Andreas Huber } 395e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber 396e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber // fall through 397e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber } 398e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber 399318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber Mutex::Autolock autoLock(mLock); 400318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 401f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar // bump internal-state debug level for 2 input and output frames past a command 402f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar { 403f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar Mutex::Autolock _l(mDebugLock); 404f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar bumpDebugLevel_l(2 /* numInputBuffers */, 2 /* numOutputBuffers */); 405f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } 406f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 407f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar const char *paramString = 408f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar cmd == OMX_CommandStateSet ? asString((OMX_STATETYPE)param) : portString(param); 409f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_STATE(sendCommand, "%s(%d), %s(%d)", asString(cmd), cmd, paramString, param); 410318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_ERRORTYPE err = OMX_SendCommand(mHandle, cmd, param, NULL); 411f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_IF_ERROR(sendCommand, err, "%s(%d), %s(%d)", asString(cmd), cmd, paramString, param); 412318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber return StatusFromOMXError(err); 413318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 414318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 415d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnarbool OMXNodeInstance::isProhibitedIndex_l(OMX_INDEXTYPE index) { 416d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar // these extensions can only be used from OMXNodeInstance, not by clients directly. 417d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar static const char *restricted_extensions[] = { 418d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar "OMX.google.android.index.storeMetaDataInBuffers", 419d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar "OMX.google.android.index.storeANWBufferInMetadata", 420d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar "OMX.google.android.index.prepareForAdaptivePlayback", 421d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar "OMX.google.android.index.configureVideoTunnelMode", 422d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar "OMX.google.android.index.useAndroidNativeBuffer2", 423d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar "OMX.google.android.index.useAndroidNativeBuffer", 424d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar "OMX.google.android.index.enableAndroidNativeBuffers", 425d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar "OMX.google.android.index.allocateNativeHandle", 426d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar "OMX.google.android.index.getAndroidNativeBufferUsage", 427d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar }; 428d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar 429d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar if ((index > OMX_IndexComponentStartUnused && index <= OMX_IndexParamStandardComponentRole) 430d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar || (index > OMX_IndexPortStartUnused && index <= OMX_IndexParamCompBufferSupplier) 431d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar || (index > OMX_IndexAudioStartUnused && index <= OMX_IndexConfigAudioChannelVolume) 432d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar || (index > OMX_IndexVideoStartUnused && index <= OMX_IndexConfigVideoNalSize) 433d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar || (index > OMX_IndexCommonStartUnused 434d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar && index <= OMX_IndexConfigCommonTransitionEffect) 435d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar || (index > (OMX_INDEXTYPE)OMX_IndexExtAudioStartUnused 436d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar && index <= (OMX_INDEXTYPE)OMX_IndexParamAudioProfileQuerySupported) 437d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar || (index > (OMX_INDEXTYPE)OMX_IndexExtVideoStartUnused 438d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar && index <= (OMX_INDEXTYPE)OMX_IndexConfigAndroidVideoTemporalLayering) 439d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar || (index > (OMX_INDEXTYPE)OMX_IndexExtOtherStartUnused 440d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar && index <= (OMX_INDEXTYPE)OMX_IndexParamConsumerUsageBits)) { 441d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar return false; 442d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar } 443d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar 444d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar if (!mQueriedProhibitedExtensions) { 445d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar for (size_t i = 0; i < NELEM(restricted_extensions); ++i) { 446d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar OMX_INDEXTYPE ext; 447d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar if (OMX_GetExtensionIndex(mHandle, (OMX_STRING)restricted_extensions[i], &ext) == OMX_ErrorNone) { 448d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar mProhibitedExtensions.add(ext); 449d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar } 450d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar } 451d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar mQueriedProhibitedExtensions = true; 452d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar } 453d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar 454d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar return mProhibitedExtensions.indexOf(index) >= 0; 455d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar} 456d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar 457318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::getParameter( 45884333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber OMX_INDEXTYPE index, void *params, size_t /* size */) { 459318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber Mutex::Autolock autoLock(mLock); 460318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 461d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar if (isProhibitedIndex_l(index)) { 462d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar android_errorWriteLog(0x534e4554, "29422020"); 463d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar return BAD_INDEX; 464d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar } 465d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar 466318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_ERRORTYPE err = OMX_GetParameter(mHandle, index, params); 467f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar OMX_INDEXEXTTYPE extIndex = (OMX_INDEXEXTTYPE)index; 468f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar // some errors are expected for getParameter 469f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar if (err != OMX_ErrorNoMore) { 470f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_IF_ERROR(getParameter, err, "%s(%#x)", asString(extIndex), index); 471f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } 472318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber return StatusFromOMXError(err); 473318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 474318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 475318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::setParameter( 476f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar OMX_INDEXTYPE index, const void *params, size_t size) { 477318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber Mutex::Autolock autoLock(mLock); 478f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar OMX_INDEXEXTTYPE extIndex = (OMX_INDEXEXTTYPE)index; 479f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_CONFIG(setParameter, "%s(%#x), %zu@%p)", asString(extIndex), index, size, params); 480318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 481d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar if (isProhibitedIndex_l(index)) { 482d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar android_errorWriteLog(0x534e4554, "29422020"); 483d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar return BAD_INDEX; 484d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar } 485d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar 486318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_ERRORTYPE err = OMX_SetParameter( 487318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber mHandle, index, const_cast<void *>(params)); 488f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_IF_ERROR(setParameter, err, "%s(%#x)", asString(extIndex), index); 489318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber return StatusFromOMXError(err); 490318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 491318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 492318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::getConfig( 49384333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber OMX_INDEXTYPE index, void *params, size_t /* size */) { 494318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber Mutex::Autolock autoLock(mLock); 495318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 496d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar if (isProhibitedIndex_l(index)) { 497d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar android_errorWriteLog(0x534e4554, "29422020"); 498d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar return BAD_INDEX; 499d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar } 500d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar 501318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_ERRORTYPE err = OMX_GetConfig(mHandle, index, params); 502f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar OMX_INDEXEXTTYPE extIndex = (OMX_INDEXEXTTYPE)index; 503f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar // some errors are expected for getConfig 504f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar if (err != OMX_ErrorNoMore) { 505f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_IF_ERROR(getConfig, err, "%s(%#x)", asString(extIndex), index); 506f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } 507318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber return StatusFromOMXError(err); 508318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 509318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 510318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::setConfig( 511f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar OMX_INDEXTYPE index, const void *params, size_t size) { 512318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber Mutex::Autolock autoLock(mLock); 513f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar OMX_INDEXEXTTYPE extIndex = (OMX_INDEXEXTTYPE)index; 514f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_CONFIG(setConfig, "%s(%#x), %zu@%p)", asString(extIndex), index, size, params); 515318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 516d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar if (isProhibitedIndex_l(index)) { 517d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar android_errorWriteLog(0x534e4554, "29422020"); 518d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar return BAD_INDEX; 519d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar } 520d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar 521318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_ERRORTYPE err = OMX_SetConfig( 522318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber mHandle, index, const_cast<void *>(params)); 523f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_IF_ERROR(setConfig, err, "%s(%#x)", asString(extIndex), index); 524318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber return StatusFromOMXError(err); 525b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis} 526b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis 527b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennisstatus_t OMXNodeInstance::getState(OMX_STATETYPE* state) { 528b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis Mutex::Autolock autoLock(mLock); 529b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis 530b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis OMX_ERRORTYPE err = OMX_GetState(mHandle, state); 531f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_IF_ERROR(getState, err, ""); 532b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis return StatusFromOMXError(err); 533318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 534318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 535a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnarstatus_t OMXNodeInstance::enableNativeBuffers( 536a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnar OMX_U32 portIndex, OMX_BOOL graphic, OMX_BOOL enable) { 537f80a1f5075a7c6e1982d37c68bfed7c9a611bb20Wei Jia if (portIndex >= NELEM(mSecureBufferType)) { 538f80a1f5075a7c6e1982d37c68bfed7c9a611bb20Wei Jia ALOGE("b/31385713, portIndex(%u)", portIndex); 539f80a1f5075a7c6e1982d37c68bfed7c9a611bb20Wei Jia android_errorWriteLog(0x534e4554, "31385713"); 540f80a1f5075a7c6e1982d37c68bfed7c9a611bb20Wei Jia return BAD_VALUE; 541f80a1f5075a7c6e1982d37c68bfed7c9a611bb20Wei Jia } 542f80a1f5075a7c6e1982d37c68bfed7c9a611bb20Wei Jia 54383750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis Mutex::Autolock autoLock(mLock); 544a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnar CLOG_CONFIG(enableNativeBuffers, "%s:%u%s, %d", portString(portIndex), portIndex, 545a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnar graphic ? ", graphic" : "", enable); 546ce18d7d85a78ac6642624fef1b5831eff4c72d56Jamie Gennis OMX_STRING name = const_cast<OMX_STRING>( 547a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnar graphic ? "OMX.google.android.index.enableAndroidNativeBuffers" 548a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnar : "OMX.google.android.index.allocateNativeHandle"); 54983750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis 55083750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis OMX_INDEXTYPE index; 551ce18d7d85a78ac6642624fef1b5831eff4c72d56Jamie Gennis OMX_ERRORTYPE err = OMX_GetExtensionIndex(mHandle, name, &index); 55283750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis 553a94c49819fd1513f1d60dbfb433017ca64bbd7dbJeff Tinker if (err == OMX_ErrorNone) { 554a94c49819fd1513f1d60dbfb433017ca64bbd7dbJeff Tinker EnableAndroidNativeBuffersParams params; 555a94c49819fd1513f1d60dbfb433017ca64bbd7dbJeff Tinker InitOMXParams(¶ms); 556a94c49819fd1513f1d60dbfb433017ca64bbd7dbJeff Tinker params.nPortIndex = portIndex; 557a94c49819fd1513f1d60dbfb433017ca64bbd7dbJeff Tinker params.enable = enable; 558a94c49819fd1513f1d60dbfb433017ca64bbd7dbJeff Tinker 559a94c49819fd1513f1d60dbfb433017ca64bbd7dbJeff Tinker err = OMX_SetParameter(mHandle, index, ¶ms); 560a94c49819fd1513f1d60dbfb433017ca64bbd7dbJeff Tinker CLOG_IF_ERROR(setParameter, err, "%s(%#x): %s:%u en=%d", name, index, 561a94c49819fd1513f1d60dbfb433017ca64bbd7dbJeff Tinker portString(portIndex), portIndex, enable); 562a94c49819fd1513f1d60dbfb433017ca64bbd7dbJeff Tinker if (!graphic) { 563a94c49819fd1513f1d60dbfb433017ca64bbd7dbJeff Tinker if (err == OMX_ErrorNone) { 564a94c49819fd1513f1d60dbfb433017ca64bbd7dbJeff Tinker mSecureBufferType[portIndex] = 565a94c49819fd1513f1d60dbfb433017ca64bbd7dbJeff Tinker enable ? kSecureBufferTypeNativeHandle : kSecureBufferTypeOpaque; 566a94c49819fd1513f1d60dbfb433017ca64bbd7dbJeff Tinker } else if (mSecureBufferType[portIndex] == kSecureBufferTypeUnknown) { 567a94c49819fd1513f1d60dbfb433017ca64bbd7dbJeff Tinker mSecureBufferType[portIndex] = kSecureBufferTypeOpaque; 568a94c49819fd1513f1d60dbfb433017ca64bbd7dbJeff Tinker } 5698239dfee37a5e6777f94186f51871e86d0b6c21eDongwon Kang } else { 5708239dfee37a5e6777f94186f51871e86d0b6c21eDongwon Kang if (err == OMX_ErrorNone) { 5718239dfee37a5e6777f94186f51871e86d0b6c21eDongwon Kang mGraphicBufferEnabled[portIndex] = enable; 5728239dfee37a5e6777f94186f51871e86d0b6c21eDongwon Kang } else if (enable) { 5738239dfee37a5e6777f94186f51871e86d0b6c21eDongwon Kang mGraphicBufferEnabled[portIndex] = false; 5748239dfee37a5e6777f94186f51871e86d0b6c21eDongwon Kang } 575a94c49819fd1513f1d60dbfb433017ca64bbd7dbJeff Tinker } 576a94c49819fd1513f1d60dbfb433017ca64bbd7dbJeff Tinker } else { 577f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_ERROR_IF(enable, getExtensionIndex, err, "%s", name); 578a94c49819fd1513f1d60dbfb433017ca64bbd7dbJeff Tinker if (!graphic) { 579a94c49819fd1513f1d60dbfb433017ca64bbd7dbJeff Tinker // Extension not supported, check for manual override with system property 580a94c49819fd1513f1d60dbfb433017ca64bbd7dbJeff Tinker // This is a temporary workaround until partners support the OMX extension 581aef47bf801dcbcb88cec8426c03237c6313da1c2Lajos Molnar char value[PROPERTY_VALUE_MAX]; 582aef47bf801dcbcb88cec8426c03237c6313da1c2Lajos Molnar if (property_get("media.mediadrmservice.enable", value, NULL) 583a94c49819fd1513f1d60dbfb433017ca64bbd7dbJeff Tinker && (!strcmp("1", value) || !strcasecmp("true", value))) { 584aef47bf801dcbcb88cec8426c03237c6313da1c2Lajos Molnar CLOG_CONFIG(enableNativeBuffers, "system property override: using native-handles"); 585aef47bf801dcbcb88cec8426c03237c6313da1c2Lajos Molnar mSecureBufferType[portIndex] = kSecureBufferTypeNativeHandle; 586a94c49819fd1513f1d60dbfb433017ca64bbd7dbJeff Tinker } else if (mSecureBufferType[portIndex] == kSecureBufferTypeUnknown) { 587a94c49819fd1513f1d60dbfb433017ca64bbd7dbJeff Tinker mSecureBufferType[portIndex] = kSecureBufferTypeOpaque; 588aef47bf801dcbcb88cec8426c03237c6313da1c2Lajos Molnar } 589a94c49819fd1513f1d60dbfb433017ca64bbd7dbJeff Tinker err = OMX_ErrorNone; 590a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnar } 591a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnar } 592a94c49819fd1513f1d60dbfb433017ca64bbd7dbJeff Tinker 593f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar return StatusFromOMXError(err); 59483750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis} 59583750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis 596e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennisstatus_t OMXNodeInstance::getGraphicBufferUsage( 597e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis OMX_U32 portIndex, OMX_U32* usage) { 598e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis Mutex::Autolock autoLock(mLock); 599e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis 600e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis OMX_INDEXTYPE index; 601ce18d7d85a78ac6642624fef1b5831eff4c72d56Jamie Gennis OMX_STRING name = const_cast<OMX_STRING>( 602ce18d7d85a78ac6642624fef1b5831eff4c72d56Jamie Gennis "OMX.google.android.index.getAndroidNativeBufferUsage"); 603ce18d7d85a78ac6642624fef1b5831eff4c72d56Jamie Gennis OMX_ERRORTYPE err = OMX_GetExtensionIndex(mHandle, name, &index); 604e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis 605e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis if (err != OMX_ErrorNone) { 606f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_ERROR(getExtensionIndex, err, "%s", name); 607e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis return StatusFromOMXError(err); 608e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis } 609e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis 610f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar GetAndroidNativeBufferUsageParams params; 611f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar InitOMXParams(¶ms); 612f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar params.nPortIndex = portIndex; 613e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis 614e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis err = OMX_GetParameter(mHandle, index, ¶ms); 615e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis if (err != OMX_ErrorNone) { 616f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_ERROR(getParameter, err, "%s(%#x): %s:%u", name, index, 617f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar portString(portIndex), portIndex); 618f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar return StatusFromOMXError(err); 619e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis } 620e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis 621e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis *usage = params.nUsage; 622e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis 623e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis return OK; 624e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis} 625e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis 626e870772a78ffe08b1c14a791e368f1499f1be0f3James Dongstatus_t OMXNodeInstance::storeMetaDataInBuffers( 627054219874873b41f1c815552987c10465c34ba2bLajos Molnar OMX_U32 portIndex, OMX_BOOL enable, MetadataBufferType *type) { 628e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong Mutex::Autolock autolock(mLock); 629f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_CONFIG(storeMetaDataInBuffers, "%s:%u en:%d", portString(portIndex), portIndex, enable); 630054219874873b41f1c815552987c10465c34ba2bLajos Molnar return storeMetaDataInBuffers_l(portIndex, enable, type); 631f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden} 632e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong 633f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFaddenstatus_t OMXNodeInstance::storeMetaDataInBuffers_l( 634054219874873b41f1c815552987c10465c34ba2bLajos Molnar OMX_U32 portIndex, OMX_BOOL enable, MetadataBufferType *type) { 635d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar if (mSailed) { 636d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar android_errorWriteLog(0x534e4554, "29422020"); 637d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar return INVALID_OPERATION; 638d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar } 639054219874873b41f1c815552987c10465c34ba2bLajos Molnar if (portIndex != kPortIndexInput && portIndex != kPortIndexOutput) { 6401a19076c36cbe76a537b5742e96747135b4f0d46mspector@google.com android_errorWriteLog(0x534e4554, "26324358"); 6413e328782f1e1061d08ea0c45b855cc418a2d9ea6Lajos Molnar if (type != NULL) { 6423e328782f1e1061d08ea0c45b855cc418a2d9ea6Lajos Molnar *type = kMetadataBufferTypeInvalid; 6433e328782f1e1061d08ea0c45b855cc418a2d9ea6Lajos Molnar } 644054219874873b41f1c815552987c10465c34ba2bLajos Molnar return BAD_VALUE; 645054219874873b41f1c815552987c10465c34ba2bLajos Molnar } 646054219874873b41f1c815552987c10465c34ba2bLajos Molnar 647e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong OMX_INDEXTYPE index; 648e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong OMX_STRING name = const_cast<OMX_STRING>( 649e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong "OMX.google.android.index.storeMetaDataInBuffers"); 650e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong 651054219874873b41f1c815552987c10465c34ba2bLajos Molnar OMX_STRING nativeBufferName = const_cast<OMX_STRING>( 652054219874873b41f1c815552987c10465c34ba2bLajos Molnar "OMX.google.android.index.storeANWBufferInMetadata"); 653054219874873b41f1c815552987c10465c34ba2bLajos Molnar MetadataBufferType negotiatedType; 6543e328782f1e1061d08ea0c45b855cc418a2d9ea6Lajos Molnar MetadataBufferType requestedType = type != NULL ? *type : kMetadataBufferTypeANWBuffer; 655512e979284de984427e5b2f73b9054ae1b5e2b0aLajos Molnar 656054219874873b41f1c815552987c10465c34ba2bLajos Molnar StoreMetaDataInBuffersParams params; 657054219874873b41f1c815552987c10465c34ba2bLajos Molnar InitOMXParams(¶ms); 658054219874873b41f1c815552987c10465c34ba2bLajos Molnar params.nPortIndex = portIndex; 659054219874873b41f1c815552987c10465c34ba2bLajos Molnar params.bStoreMetaData = enable; 660512e979284de984427e5b2f73b9054ae1b5e2b0aLajos Molnar 6613e328782f1e1061d08ea0c45b855cc418a2d9ea6Lajos Molnar OMX_ERRORTYPE err = 6623e328782f1e1061d08ea0c45b855cc418a2d9ea6Lajos Molnar requestedType == kMetadataBufferTypeANWBuffer 6633e328782f1e1061d08ea0c45b855cc418a2d9ea6Lajos Molnar ? OMX_GetExtensionIndex(mHandle, nativeBufferName, &index) 6643e328782f1e1061d08ea0c45b855cc418a2d9ea6Lajos Molnar : OMX_ErrorUnsupportedIndex; 665f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar OMX_ERRORTYPE xerr = err; 666f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar if (err == OMX_ErrorNone) { 667f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar err = OMX_SetParameter(mHandle, index, ¶ms); 668054219874873b41f1c815552987c10465c34ba2bLajos Molnar if (err == OMX_ErrorNone) { 669054219874873b41f1c815552987c10465c34ba2bLajos Molnar name = nativeBufferName; // set name for debugging 6703e328782f1e1061d08ea0c45b855cc418a2d9ea6Lajos Molnar negotiatedType = requestedType; 671054219874873b41f1c815552987c10465c34ba2bLajos Molnar } 672054219874873b41f1c815552987c10465c34ba2bLajos Molnar } 673054219874873b41f1c815552987c10465c34ba2bLajos Molnar if (err != OMX_ErrorNone) { 674054219874873b41f1c815552987c10465c34ba2bLajos Molnar err = OMX_GetExtensionIndex(mHandle, name, &index); 675054219874873b41f1c815552987c10465c34ba2bLajos Molnar xerr = err; 676054219874873b41f1c815552987c10465c34ba2bLajos Molnar if (err == OMX_ErrorNone) { 6773e328782f1e1061d08ea0c45b855cc418a2d9ea6Lajos Molnar negotiatedType = 6783e328782f1e1061d08ea0c45b855cc418a2d9ea6Lajos Molnar requestedType == kMetadataBufferTypeANWBuffer 6793e328782f1e1061d08ea0c45b855cc418a2d9ea6Lajos Molnar ? kMetadataBufferTypeGrallocSource : requestedType; 680054219874873b41f1c815552987c10465c34ba2bLajos Molnar err = OMX_SetParameter(mHandle, index, ¶ms); 681054219874873b41f1c815552987c10465c34ba2bLajos Molnar } 682f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } 683e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong 684f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar // don't log loud error if component does not support metadata mode on the output 685f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar if (err != OMX_ErrorNone) { 686f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar if (err == OMX_ErrorUnsupportedIndex && portIndex == kPortIndexOutput) { 687f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOGW("component does not support metadata mode; using fallback"); 688f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } else if (xerr != OMX_ErrorNone) { 689f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_ERROR(getExtensionIndex, xerr, "%s", name); 690f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } else { 691054219874873b41f1c815552987c10465c34ba2bLajos Molnar CLOG_ERROR(setParameter, err, "%s(%#x): %s:%u en=%d type=%d", name, index, 692054219874873b41f1c815552987c10465c34ba2bLajos Molnar portString(portIndex), portIndex, enable, negotiatedType); 693f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } 694054219874873b41f1c815552987c10465c34ba2bLajos Molnar negotiatedType = mMetadataType[portIndex]; 695054219874873b41f1c815552987c10465c34ba2bLajos Molnar } else { 696054219874873b41f1c815552987c10465c34ba2bLajos Molnar if (!enable) { 697054219874873b41f1c815552987c10465c34ba2bLajos Molnar negotiatedType = kMetadataBufferTypeInvalid; 698054219874873b41f1c815552987c10465c34ba2bLajos Molnar } 699054219874873b41f1c815552987c10465c34ba2bLajos Molnar mMetadataType[portIndex] = negotiatedType; 700054219874873b41f1c815552987c10465c34ba2bLajos Molnar } 7013e328782f1e1061d08ea0c45b855cc418a2d9ea6Lajos Molnar CLOG_CONFIG(storeMetaDataInBuffers, "%s:%u %srequested %s:%d negotiated %s:%d", 7023e328782f1e1061d08ea0c45b855cc418a2d9ea6Lajos Molnar portString(portIndex), portIndex, enable ? "" : "UN", 7033e328782f1e1061d08ea0c45b855cc418a2d9ea6Lajos Molnar asString(requestedType), requestedType, asString(negotiatedType), negotiatedType); 704054219874873b41f1c815552987c10465c34ba2bLajos Molnar 705054219874873b41f1c815552987c10465c34ba2bLajos Molnar if (type != NULL) { 706054219874873b41f1c815552987c10465c34ba2bLajos Molnar *type = negotiatedType; 707e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong } 708054219874873b41f1c815552987c10465c34ba2bLajos Molnar 709f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar return StatusFromOMXError(err); 710e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong} 711e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong 71256ce726019f700a95ce5b45beebceadae4836e30Lajos Molnarstatus_t OMXNodeInstance::prepareForAdaptivePlayback( 71356ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar OMX_U32 portIndex, OMX_BOOL enable, OMX_U32 maxFrameWidth, 71456ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar OMX_U32 maxFrameHeight) { 71556ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar Mutex::Autolock autolock(mLock); 716d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar if (mSailed) { 717d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar android_errorWriteLog(0x534e4554, "29422020"); 718d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar return INVALID_OPERATION; 719d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar } 720f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_CONFIG(prepareForAdaptivePlayback, "%s:%u en=%d max=%ux%u", 721f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar portString(portIndex), portIndex, enable, maxFrameWidth, maxFrameHeight); 72256ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar 72356ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar OMX_INDEXTYPE index; 72456ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar OMX_STRING name = const_cast<OMX_STRING>( 72556ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar "OMX.google.android.index.prepareForAdaptivePlayback"); 72656ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar 72756ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar OMX_ERRORTYPE err = OMX_GetExtensionIndex(mHandle, name, &index); 72856ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar if (err != OMX_ErrorNone) { 729f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_ERROR_IF(enable, getExtensionIndex, err, "%s", name); 73056ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar return StatusFromOMXError(err); 73156ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar } 73256ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar 73356ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar PrepareForAdaptivePlaybackParams params; 734f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar InitOMXParams(¶ms); 73556ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar params.nPortIndex = portIndex; 73656ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar params.bEnable = enable; 73756ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar params.nMaxFrameWidth = maxFrameWidth; 73856ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar params.nMaxFrameHeight = maxFrameHeight; 739f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 740f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar err = OMX_SetParameter(mHandle, index, ¶ms); 741f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_IF_ERROR(setParameter, err, "%s(%#x): %s:%u en=%d max=%ux%u", name, index, 742f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar portString(portIndex), portIndex, enable, maxFrameWidth, maxFrameHeight); 743f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar return StatusFromOMXError(err); 74456ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar} 74556ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar 7465a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachadstatus_t OMXNodeInstance::configureVideoTunnelMode( 7475a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad OMX_U32 portIndex, OMX_BOOL tunneled, OMX_U32 audioHwSync, 7485a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad native_handle_t **sidebandHandle) { 7495a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad Mutex::Autolock autolock(mLock); 750d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar if (mSailed) { 751d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar android_errorWriteLog(0x534e4554, "29422020"); 752d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar return INVALID_OPERATION; 753d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar } 754f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_CONFIG(configureVideoTunnelMode, "%s:%u tun=%d sync=%u", 755f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar portString(portIndex), portIndex, tunneled, audioHwSync); 7565a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad 7575a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad OMX_INDEXTYPE index; 7585a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad OMX_STRING name = const_cast<OMX_STRING>( 7595a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad "OMX.google.android.index.configureVideoTunnelMode"); 7605a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad 7615a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad OMX_ERRORTYPE err = OMX_GetExtensionIndex(mHandle, name, &index); 7625a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad if (err != OMX_ErrorNone) { 763f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_ERROR_IF(tunneled, getExtensionIndex, err, "%s", name); 7645a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad return StatusFromOMXError(err); 7655a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad } 7665a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad 7675a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad ConfigureVideoTunnelModeParams tunnelParams; 768f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar InitOMXParams(&tunnelParams); 7695a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad tunnelParams.nPortIndex = portIndex; 7705a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad tunnelParams.bTunneled = tunneled; 7715a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad tunnelParams.nAudioHwSync = audioHwSync; 7725a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad err = OMX_SetParameter(mHandle, index, &tunnelParams); 7735a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad if (err != OMX_ErrorNone) { 774f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_ERROR(setParameter, err, "%s(%#x): %s:%u tun=%d sync=%u", name, index, 775f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar portString(portIndex), portIndex, tunneled, audioHwSync); 776f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar return StatusFromOMXError(err); 7775a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad } 7785a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad 7795a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad err = OMX_GetParameter(mHandle, index, &tunnelParams); 7805a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad if (err != OMX_ErrorNone) { 781f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_ERROR(getParameter, err, "%s(%#x): %s:%u tun=%d sync=%u", name, index, 782f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar portString(portIndex), portIndex, tunneled, audioHwSync); 783f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar return StatusFromOMXError(err); 7845a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad } 7855a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad if (sidebandHandle) { 7865a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad *sidebandHandle = (native_handle_t*)tunnelParams.pSidebandWindow; 7875a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad } 7885a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad 789f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar return OK; 7905a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad} 7915a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad 792318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::useBuffer( 793318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_U32 portIndex, const sp<IMemory> ¶ms, 794cc7cc67349b7a3f498882087aa42ffc05a2daf11Lajos Molnar OMX::buffer_id *buffer, OMX_U32 allottedSize) { 795298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia if (params == NULL || buffer == NULL) { 796298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia ALOGE("b/25884056"); 797298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia return BAD_VALUE; 798298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia } 799298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia 800318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber Mutex::Autolock autoLock(mLock); 801d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar if (allottedSize > params->size() || portIndex >= NELEM(mNumPortBuffers)) { 802cc7cc67349b7a3f498882087aa42ffc05a2daf11Lajos Molnar return BAD_VALUE; 803cc7cc67349b7a3f498882087aa42ffc05a2daf11Lajos Molnar } 804318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 8051618337cac09284fddb5bb14b5e0cfe2946d3431Marco Nelissen if (!mSailed) { 8061618337cac09284fddb5bb14b5e0cfe2946d3431Marco Nelissen ALOGE("b/35467458"); 8071618337cac09284fddb5bb14b5e0cfe2946d3431Marco Nelissen android_errorWriteLog(0x534e4554, "35467458"); 8081618337cac09284fddb5bb14b5e0cfe2946d3431Marco Nelissen return BAD_VALUE; 8091618337cac09284fddb5bb14b5e0cfe2946d3431Marco Nelissen } 8101618337cac09284fddb5bb14b5e0cfe2946d3431Marco Nelissen 8118239dfee37a5e6777f94186f51871e86d0b6c21eDongwon Kang if (mMetadataType[portIndex] == kMetadataBufferTypeInvalid 8128239dfee37a5e6777f94186f51871e86d0b6c21eDongwon Kang && mGraphicBufferEnabled[portIndex]) { 8138239dfee37a5e6777f94186f51871e86d0b6c21eDongwon Kang ALOGE("b/62948670"); 8148239dfee37a5e6777f94186f51871e86d0b6c21eDongwon Kang android_errorWriteLog(0x534e4554, "62948670"); 8158239dfee37a5e6777f94186f51871e86d0b6c21eDongwon Kang return INVALID_OPERATION; 8168239dfee37a5e6777f94186f51871e86d0b6c21eDongwon Kang } 8178239dfee37a5e6777f94186f51871e86d0b6c21eDongwon Kang 818d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar // metadata buffers are not connected cross process 819d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar // use a backup buffer instead of the actual buffer 820d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar BufferMeta *buffer_meta; 821d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar bool useBackup = mMetadataType[portIndex] != kMetadataBufferTypeInvalid; 822d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar OMX_U8 *data = static_cast<OMX_U8 *>(params->pointer()); 823d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar // allocate backup buffer 824d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar if (useBackup) { 825d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar data = new (std::nothrow) OMX_U8[allottedSize]; 826d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar if (data == NULL) { 827d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar return NO_MEMORY; 828d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar } 829d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar memset(data, 0, allottedSize); 830d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar 831d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar buffer_meta = new BufferMeta( 832d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar params, portIndex, false /* copyToOmx */, false /* copyFromOmx */, data); 833d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar } else { 834d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar buffer_meta = new BufferMeta( 835534bb6132a6a664f90b42b3ef81298b42efb3dc2Lajos Molnar params, portIndex, false /* copyToOmx */, false /* copyFromOmx */, NULL); 836d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar } 837318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 838318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_BUFFERHEADERTYPE *header; 839318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 840318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_ERRORTYPE err = OMX_UseBuffer( 841318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber mHandle, &header, portIndex, buffer_meta, 842d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar allottedSize, data); 843318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 844318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber if (err != OMX_ErrorNone) { 845cc7cc67349b7a3f498882087aa42ffc05a2daf11Lajos Molnar CLOG_ERROR(useBuffer, err, SIMPLE_BUFFER( 846d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar portIndex, (size_t)allottedSize, data)); 847318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 848318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber delete buffer_meta; 849318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber buffer_meta = NULL; 850318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 851318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber *buffer = 0; 852318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 853f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar return StatusFromOMXError(err); 854318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber } 855318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 85603b268eac37ca2589bfff0bf58daf79d29cc14f4Andreas Huber CHECK_EQ(header->pAppPrivate, buffer_meta); 85703b268eac37ca2589bfff0bf58daf79d29cc14f4Andreas Huber 858609b815a3131d22da38b2f452faa9f89daad4039Andy Hung *buffer = makeBufferID(header); 859318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 860d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber addActiveBuffer(portIndex, *buffer); 861d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber 862f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden sp<GraphicBufferSource> bufferSource(getGraphicBufferSource()); 863f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden if (bufferSource != NULL && portIndex == kPortIndexInput) { 864f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden bufferSource->addCodecBuffer(header); 865f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden } 866f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden 867f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_BUFFER(useBuffer, NEW_BUFFER_FMT( 8685fb8b2987ab96ad65dc4b046616607ece16d6fb3Lajos Molnar *buffer, portIndex, "%u(%zu)@%p", allottedSize, params->size(), params->pointer())); 869318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber return OK; 870318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 871318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 872c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajanstatus_t OMXNodeInstance::useGraphicBuffer2_l( 873c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan OMX_U32 portIndex, const sp<GraphicBuffer>& graphicBuffer, 874c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan OMX::buffer_id *buffer) { 875298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia if (graphicBuffer == NULL || buffer == NULL) { 876298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia ALOGE("b/25884056"); 877298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia return BAD_VALUE; 878298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia } 879c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan 880c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan // port definition 881c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan OMX_PARAM_PORTDEFINITIONTYPE def; 882f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar InitOMXParams(&def); 883c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan def.nPortIndex = portIndex; 884c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan OMX_ERRORTYPE err = OMX_GetParameter(mHandle, OMX_IndexParamPortDefinition, &def); 885f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar if (err != OMX_ErrorNone) { 886f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar OMX_INDEXTYPE index = OMX_IndexParamPortDefinition; 887f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_ERROR(getParameter, err, "%s(%#x): %s:%u", 888f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar asString(index), index, portString(portIndex), portIndex); 889f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar return UNKNOWN_ERROR; 890c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan } 891c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan 89241eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim BufferMeta *bufferMeta = new BufferMeta(graphicBuffer, portIndex); 893c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan 894c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan OMX_BUFFERHEADERTYPE *header = NULL; 895c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan OMX_U8* bufferHandle = const_cast<OMX_U8*>( 896c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan reinterpret_cast<const OMX_U8*>(graphicBuffer->handle)); 897c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan 898c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan err = OMX_UseBuffer( 899c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan mHandle, 900c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan &header, 901c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan portIndex, 902c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan bufferMeta, 903c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan def.nBufferSize, 904c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan bufferHandle); 905c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan 906c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan if (err != OMX_ErrorNone) { 907f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_ERROR(useBuffer, err, BUFFER_FMT(portIndex, "%u@%p", def.nBufferSize, bufferHandle)); 908c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan delete bufferMeta; 909c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan bufferMeta = NULL; 910c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan *buffer = 0; 911f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar return StatusFromOMXError(err); 912c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan } 913c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan 914c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan CHECK_EQ(header->pBuffer, bufferHandle); 915c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan CHECK_EQ(header->pAppPrivate, bufferMeta); 916c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan 917609b815a3131d22da38b2f452faa9f89daad4039Andy Hung *buffer = makeBufferID(header); 918c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan 919c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan addActiveBuffer(portIndex, *buffer); 920f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_BUFFER(useGraphicBuffer2, NEW_BUFFER_FMT( 921f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar *buffer, portIndex, "%u@%p", def.nBufferSize, bufferHandle)); 922c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan return OK; 923c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan} 924c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan 925c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan// XXX: This function is here for backwards compatibility. Once the OMX 926c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan// implementations have been updated this can be removed and useGraphicBuffer2 927c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan// can be renamed to useGraphicBuffer. 92883750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennisstatus_t OMXNodeInstance::useGraphicBuffer( 92983750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis OMX_U32 portIndex, const sp<GraphicBuffer>& graphicBuffer, 93083750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis OMX::buffer_id *buffer) { 931298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia if (graphicBuffer == NULL || buffer == NULL) { 932298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia ALOGE("b/25884056"); 933298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia return BAD_VALUE; 934298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia } 93583750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis Mutex::Autolock autoLock(mLock); 9368239dfee37a5e6777f94186f51871e86d0b6c21eDongwon Kang if (!mGraphicBufferEnabled[portIndex] 9378239dfee37a5e6777f94186f51871e86d0b6c21eDongwon Kang || mMetadataType[portIndex] != kMetadataBufferTypeInvalid) { 9388239dfee37a5e6777f94186f51871e86d0b6c21eDongwon Kang // Report error if this is not in graphic buffer mode. 9398239dfee37a5e6777f94186f51871e86d0b6c21eDongwon Kang ALOGE("b/62948670"); 9408239dfee37a5e6777f94186f51871e86d0b6c21eDongwon Kang android_errorWriteLog(0x534e4554, "62948670"); 9418239dfee37a5e6777f94186f51871e86d0b6c21eDongwon Kang return INVALID_OPERATION; 9428239dfee37a5e6777f94186f51871e86d0b6c21eDongwon Kang } 94383750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis 944c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan // See if the newer version of the extension is present. 94583750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis OMX_INDEXTYPE index; 946c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan if (OMX_GetExtensionIndex( 947c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan mHandle, 948c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan const_cast<OMX_STRING>("OMX.google.android.index.useAndroidNativeBuffer2"), 949c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan &index) == OMX_ErrorNone) { 950c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan return useGraphicBuffer2_l(portIndex, graphicBuffer, buffer); 951c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan } 952c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan 953ce18d7d85a78ac6642624fef1b5831eff4c72d56Jamie Gennis OMX_STRING name = const_cast<OMX_STRING>( 954ce18d7d85a78ac6642624fef1b5831eff4c72d56Jamie Gennis "OMX.google.android.index.useAndroidNativeBuffer"); 955ce18d7d85a78ac6642624fef1b5831eff4c72d56Jamie Gennis OMX_ERRORTYPE err = OMX_GetExtensionIndex(mHandle, name, &index); 95683750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis if (err != OMX_ErrorNone) { 957f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_ERROR(getExtensionIndex, err, "%s", name); 95883750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis return StatusFromOMXError(err); 95983750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis } 96083750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis 96141eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim BufferMeta *bufferMeta = new BufferMeta(graphicBuffer, portIndex); 96283750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis 96383750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis OMX_BUFFERHEADERTYPE *header; 96483750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis 96583750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis OMX_VERSIONTYPE ver; 96683750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis ver.s.nVersionMajor = 1; 96783750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis ver.s.nVersionMinor = 0; 96883750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis ver.s.nRevision = 0; 96983750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis ver.s.nStep = 0; 97083750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis UseAndroidNativeBufferParams params = { 97183750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis sizeof(UseAndroidNativeBufferParams), ver, portIndex, bufferMeta, 97283750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis &header, graphicBuffer, 97383750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis }; 97483750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis 97583750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis err = OMX_SetParameter(mHandle, index, ¶ms); 97683750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis 97783750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis if (err != OMX_ErrorNone) { 978f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_ERROR(setParameter, err, "%s(%#x): %s:%u meta=%p GB=%p", name, index, 979f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar portString(portIndex), portIndex, bufferMeta, graphicBuffer->handle); 98083750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis 98183750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis delete bufferMeta; 98283750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis bufferMeta = NULL; 98383750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis 98483750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis *buffer = 0; 98583750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis 986f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar return StatusFromOMXError(err); 98783750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis } 98883750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis 98983750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis CHECK_EQ(header->pAppPrivate, bufferMeta); 99083750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis 991609b815a3131d22da38b2f452faa9f89daad4039Andy Hung *buffer = makeBufferID(header); 99283750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis 99383750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis addActiveBuffer(portIndex, *buffer); 994f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_BUFFER(useGraphicBuffer, NEW_BUFFER_FMT( 995f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar *buffer, portIndex, "GB=%p", graphicBuffer->handle)); 99683750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis return OK; 99783750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis} 99883750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis 999054219874873b41f1c815552987c10465c34ba2bLajos Molnarstatus_t OMXNodeInstance::updateGraphicBufferInMeta_l( 1000f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar OMX_U32 portIndex, const sp<GraphicBuffer>& graphicBuffer, 1001e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar OMX::buffer_id buffer, OMX_BUFFERHEADERTYPE *header, bool updateCodecBuffer) { 1002298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia // No need to check |graphicBuffer| since NULL is valid for it as below. 1003298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia if (header == NULL) { 1004298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia ALOGE("b/25884056"); 1005298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia return BAD_VALUE; 1006298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia } 1007298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia 1008054219874873b41f1c815552987c10465c34ba2bLajos Molnar if (portIndex != kPortIndexInput && portIndex != kPortIndexOutput) { 1009054219874873b41f1c815552987c10465c34ba2bLajos Molnar return BAD_VALUE; 1010054219874873b41f1c815552987c10465c34ba2bLajos Molnar } 1011d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar 1012d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar BufferMeta *bufferMeta = (BufferMeta *)(header->pAppPrivate); 1013e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar sp<ABuffer> data = bufferMeta->getBuffer( 1014e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar header, !updateCodecBuffer /* backup */, false /* limit */); 1015d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar bufferMeta->setGraphicBuffer(graphicBuffer); 1016e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar MetadataBufferType metaType = mMetadataType[portIndex]; 1017e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar // we use gralloc source only in the codec buffers 1018e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar if (metaType == kMetadataBufferTypeGrallocSource && !updateCodecBuffer) { 1019e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar metaType = kMetadataBufferTypeANWBuffer; 1020e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar } 1021e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar if (metaType == kMetadataBufferTypeGrallocSource 1022e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar && data->capacity() >= sizeof(VideoGrallocMetadata)) { 1023e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar VideoGrallocMetadata &metadata = *(VideoGrallocMetadata *)(data->data()); 1024054219874873b41f1c815552987c10465c34ba2bLajos Molnar metadata.eType = kMetadataBufferTypeGrallocSource; 10259847fcefb183e1cb09eb48e17a09577392b0e8f4Lajos Molnar metadata.pHandle = graphicBuffer == NULL ? NULL : graphicBuffer->handle; 1026e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar } else if (metaType == kMetadataBufferTypeANWBuffer 1027e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar && data->capacity() >= sizeof(VideoNativeMetadata)) { 1028e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar VideoNativeMetadata &metadata = *(VideoNativeMetadata *)(data->data()); 1029054219874873b41f1c815552987c10465c34ba2bLajos Molnar metadata.eType = kMetadataBufferTypeANWBuffer; 1030054219874873b41f1c815552987c10465c34ba2bLajos Molnar metadata.pBuffer = graphicBuffer == NULL ? NULL : graphicBuffer->getNativeBuffer(); 1031054219874873b41f1c815552987c10465c34ba2bLajos Molnar metadata.nFenceFd = -1; 1032054219874873b41f1c815552987c10465c34ba2bLajos Molnar } else { 1033e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar CLOG_ERROR(updateGraphicBufferInMeta, BAD_VALUE, "%s:%u, %#x bad type (%d) or size (%u)", 1034054219874873b41f1c815552987c10465c34ba2bLajos Molnar portString(portIndex), portIndex, buffer, mMetadataType[portIndex], header->nAllocLen); 1035054219874873b41f1c815552987c10465c34ba2bLajos Molnar return BAD_VALUE; 1036054219874873b41f1c815552987c10465c34ba2bLajos Molnar } 1037054219874873b41f1c815552987c10465c34ba2bLajos Molnar 1038f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_BUFFER(updateGraphicBufferInMeta, "%s:%u, %#x := %p", 103949605e8ab171a2b1f474645d632d3982f5f7b8e6Lajos Molnar portString(portIndex), portIndex, buffer, 104049605e8ab171a2b1f474645d632d3982f5f7b8e6Lajos Molnar graphicBuffer == NULL ? NULL : graphicBuffer->handle); 1041d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar return OK; 1042d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar} 1043d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar 1044054219874873b41f1c815552987c10465c34ba2bLajos Molnarstatus_t OMXNodeInstance::updateGraphicBufferInMeta( 1045054219874873b41f1c815552987c10465c34ba2bLajos Molnar OMX_U32 portIndex, const sp<GraphicBuffer>& graphicBuffer, 1046054219874873b41f1c815552987c10465c34ba2bLajos Molnar OMX::buffer_id buffer) { 1047054219874873b41f1c815552987c10465c34ba2bLajos Molnar Mutex::Autolock autoLock(mLock); 104841eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim OMX_BUFFERHEADERTYPE *header = findBufferHeader(buffer, portIndex); 1049e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar // update backup buffer for input, codec buffer for output 1050e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar return updateGraphicBufferInMeta_l( 1051e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar portIndex, graphicBuffer, buffer, header, 1052d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar true /* updateCodecBuffer */); 1053054219874873b41f1c815552987c10465c34ba2bLajos Molnar} 1054054219874873b41f1c815552987c10465c34ba2bLajos Molnar 10557e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnarstatus_t OMXNodeInstance::updateNativeHandleInMeta( 10567e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar OMX_U32 portIndex, const sp<NativeHandle>& nativeHandle, OMX::buffer_id buffer) { 10577e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar Mutex::Autolock autoLock(mLock); 105841eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim OMX_BUFFERHEADERTYPE *header = findBufferHeader(buffer, portIndex); 10597e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar // No need to check |nativeHandle| since NULL is valid for it as below. 10607e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar if (header == NULL) { 10617e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar ALOGE("b/25884056"); 10627e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar return BAD_VALUE; 10637e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar } 10647e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar 10657e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar if (portIndex != kPortIndexInput && portIndex != kPortIndexOutput) { 10667e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar return BAD_VALUE; 10677e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar } 10687e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar 10697e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar BufferMeta *bufferMeta = (BufferMeta *)(header->pAppPrivate); 1070534bb6132a6a664f90b42b3ef81298b42efb3dc2Lajos Molnar // update backup buffer 10717e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar sp<ABuffer> data = bufferMeta->getBuffer( 1072d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar header, false /* backup */, false /* limit */); 10737e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar bufferMeta->setNativeHandle(nativeHandle); 10747e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar if (mMetadataType[portIndex] == kMetadataBufferTypeNativeHandleSource 10757e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar && data->capacity() >= sizeof(VideoNativeHandleMetadata)) { 10767e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar VideoNativeHandleMetadata &metadata = *(VideoNativeHandleMetadata *)(data->data()); 10777e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar metadata.eType = mMetadataType[portIndex]; 10787e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar metadata.pHandle = 10797e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar nativeHandle == NULL ? NULL : const_cast<native_handle*>(nativeHandle->handle()); 10807e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar } else { 10817e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar CLOG_ERROR(updateNativeHandleInMeta, BAD_VALUE, "%s:%u, %#x bad type (%d) or size (%zu)", 10827e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar portString(portIndex), portIndex, buffer, mMetadataType[portIndex], data->capacity()); 10837e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar return BAD_VALUE; 10847e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar } 10857e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar 10867e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar CLOG_BUFFER(updateNativeHandleInMeta, "%s:%u, %#x := %p", 10877e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar portString(portIndex), portIndex, buffer, 10887e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar nativeHandle == NULL ? NULL : nativeHandle->handle()); 10897e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar return OK; 10907e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar} 10917e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar 1092d291c222357303b9611cab89d0c3b047584ef377Chong Zhangstatus_t OMXNodeInstance::createGraphicBufferSource( 1093054219874873b41f1c815552987c10465c34ba2bLajos Molnar OMX_U32 portIndex, sp<IGraphicBufferConsumer> bufferConsumer, MetadataBufferType *type) { 1094f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden status_t err; 1095f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden 1096d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar // only allow graphic source on input port, when there are no allocated buffers yet 1097d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar if (portIndex != kPortIndexInput) { 1098d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar android_errorWriteLog(0x534e4554, "29422020"); 1099d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar return BAD_VALUE; 1100d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar } else if (mNumPortBuffers[portIndex] > 0) { 1101d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar android_errorWriteLog(0x534e4554, "29422020"); 1102d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar return INVALID_OPERATION; 1103d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar } 1104d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar 1105d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar const sp<GraphicBufferSource> surfaceCheck = getGraphicBufferSource(); 1106f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden if (surfaceCheck != NULL) { 1107054219874873b41f1c815552987c10465c34ba2bLajos Molnar if (portIndex < NELEM(mMetadataType) && type != NULL) { 1108054219874873b41f1c815552987c10465c34ba2bLajos Molnar *type = mMetadataType[portIndex]; 1109054219874873b41f1c815552987c10465c34ba2bLajos Molnar } 1110f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden return ALREADY_EXISTS; 1111f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden } 1112f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden 1113054219874873b41f1c815552987c10465c34ba2bLajos Molnar // Input buffers will hold meta-data (ANativeWindowBuffer references). 11143e328782f1e1061d08ea0c45b855cc418a2d9ea6Lajos Molnar if (type != NULL) { 11153e328782f1e1061d08ea0c45b855cc418a2d9ea6Lajos Molnar *type = kMetadataBufferTypeANWBuffer; 11163e328782f1e1061d08ea0c45b855cc418a2d9ea6Lajos Molnar } 1117054219874873b41f1c815552987c10465c34ba2bLajos Molnar err = storeMetaDataInBuffers_l(portIndex, OMX_TRUE, type); 1118f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden if (err != OK) { 1119f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden return err; 1120f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden } 1121f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden 1122f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden // Retrieve the width and height of the graphic buffer, set when the 1123f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden // codec was configured. 1124f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden OMX_PARAM_PORTDEFINITIONTYPE def; 1125f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar InitOMXParams(&def); 1126f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden def.nPortIndex = portIndex; 1127f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden OMX_ERRORTYPE oerr = OMX_GetParameter( 1128f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden mHandle, OMX_IndexParamPortDefinition, &def); 1129f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar if (oerr != OMX_ErrorNone) { 1130f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar OMX_INDEXTYPE index = OMX_IndexParamPortDefinition; 1131f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_ERROR(getParameter, oerr, "%s(%#x): %s:%u", 1132f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar asString(index), index, portString(portIndex), portIndex); 1133f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar return UNKNOWN_ERROR; 1134f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } 1135f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden 1136ba6218eae3dbcf3f962b3561b26374a214dbf5e2Andy McFadden if (def.format.video.eColorFormat != OMX_COLOR_FormatAndroidOpaque) { 1137f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOGW("createInputSurface requires COLOR_FormatSurface " 1138f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar "(AndroidOpaque) color format instead of %s(%#x)", 1139f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar asString(def.format.video.eColorFormat), def.format.video.eColorFormat); 1140ba6218eae3dbcf3f962b3561b26374a214dbf5e2Andy McFadden return INVALID_OPERATION; 1141ba6218eae3dbcf3f962b3561b26374a214dbf5e2Andy McFadden } 1142ba6218eae3dbcf3f962b3561b26374a214dbf5e2Andy McFadden 114349605e8ab171a2b1f474645d632d3982f5f7b8e6Lajos Molnar uint32_t usageBits; 114449605e8ab171a2b1f474645d632d3982f5f7b8e6Lajos Molnar oerr = OMX_GetParameter( 114549605e8ab171a2b1f474645d632d3982f5f7b8e6Lajos Molnar mHandle, (OMX_INDEXTYPE)OMX_IndexParamConsumerUsageBits, &usageBits); 114649605e8ab171a2b1f474645d632d3982f5f7b8e6Lajos Molnar if (oerr != OMX_ErrorNone) { 114749605e8ab171a2b1f474645d632d3982f5f7b8e6Lajos Molnar usageBits = 0; 114849605e8ab171a2b1f474645d632d3982f5f7b8e6Lajos Molnar } 114949605e8ab171a2b1f474645d632d3982f5f7b8e6Lajos Molnar 1150d291c222357303b9611cab89d0c3b047584ef377Chong Zhang sp<GraphicBufferSource> bufferSource = new GraphicBufferSource(this, 1151d291c222357303b9611cab89d0c3b047584ef377Chong Zhang def.format.video.nFrameWidth, 1152d291c222357303b9611cab89d0c3b047584ef377Chong Zhang def.format.video.nFrameHeight, 1153d291c222357303b9611cab89d0c3b047584ef377Chong Zhang def.nBufferCountActual, 115449605e8ab171a2b1f474645d632d3982f5f7b8e6Lajos Molnar usageBits, 1155d291c222357303b9611cab89d0c3b047584ef377Chong Zhang bufferConsumer); 1156d291c222357303b9611cab89d0c3b047584ef377Chong Zhang 1157bf153fbedc2333b14e90826d22f08d10e832db29Robert Shih if ((err = bufferSource->init()) != OK) { 1158f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden return err; 1159f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden } 1160f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden setGraphicBufferSource(bufferSource); 1161f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden 1162f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden return OK; 1163f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden} 1164f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden 1165d291c222357303b9611cab89d0c3b047584ef377Chong Zhangstatus_t OMXNodeInstance::createInputSurface( 116657fad3c31f46ec98d15bc253c16f9d269aeb8ea7Lajos Molnar OMX_U32 portIndex, android_dataspace dataSpace, 116757fad3c31f46ec98d15bc253c16f9d269aeb8ea7Lajos Molnar sp<IGraphicBufferProducer> *bufferProducer, MetadataBufferType *type) { 1168298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia if (bufferProducer == NULL) { 1169298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia ALOGE("b/25884056"); 1170298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia return BAD_VALUE; 1171298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia } 1172298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia 1173d291c222357303b9611cab89d0c3b047584ef377Chong Zhang Mutex::Autolock autolock(mLock); 1174054219874873b41f1c815552987c10465c34ba2bLajos Molnar status_t err = createGraphicBufferSource(portIndex, NULL /* bufferConsumer */, type); 1175d291c222357303b9611cab89d0c3b047584ef377Chong Zhang 1176d291c222357303b9611cab89d0c3b047584ef377Chong Zhang if (err != OK) { 1177d291c222357303b9611cab89d0c3b047584ef377Chong Zhang return err; 1178d291c222357303b9611cab89d0c3b047584ef377Chong Zhang } 1179d291c222357303b9611cab89d0c3b047584ef377Chong Zhang 118057fad3c31f46ec98d15bc253c16f9d269aeb8ea7Lajos Molnar mGraphicBufferSource->setDefaultDataSpace(dataSpace); 118157fad3c31f46ec98d15bc253c16f9d269aeb8ea7Lajos Molnar 1182d291c222357303b9611cab89d0c3b047584ef377Chong Zhang *bufferProducer = mGraphicBufferSource->getIGraphicBufferProducer(); 1183d291c222357303b9611cab89d0c3b047584ef377Chong Zhang return OK; 1184d291c222357303b9611cab89d0c3b047584ef377Chong Zhang} 1185d291c222357303b9611cab89d0c3b047584ef377Chong Zhang 1186d291c222357303b9611cab89d0c3b047584ef377Chong Zhang//static 1187d291c222357303b9611cab89d0c3b047584ef377Chong Zhangstatus_t OMXNodeInstance::createPersistentInputSurface( 1188d291c222357303b9611cab89d0c3b047584ef377Chong Zhang sp<IGraphicBufferProducer> *bufferProducer, 1189d291c222357303b9611cab89d0c3b047584ef377Chong Zhang sp<IGraphicBufferConsumer> *bufferConsumer) { 1190298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia if (bufferProducer == NULL || bufferConsumer == NULL) { 1191298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia ALOGE("b/25884056"); 1192298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia return BAD_VALUE; 1193298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia } 1194d291c222357303b9611cab89d0c3b047584ef377Chong Zhang String8 name("GraphicBufferSource"); 1195d291c222357303b9611cab89d0c3b047584ef377Chong Zhang 1196d291c222357303b9611cab89d0c3b047584ef377Chong Zhang sp<IGraphicBufferProducer> producer; 1197d291c222357303b9611cab89d0c3b047584ef377Chong Zhang sp<IGraphicBufferConsumer> consumer; 1198d291c222357303b9611cab89d0c3b047584ef377Chong Zhang BufferQueue::createBufferQueue(&producer, &consumer); 1199d291c222357303b9611cab89d0c3b047584ef377Chong Zhang consumer->setConsumerName(name); 1200d291c222357303b9611cab89d0c3b047584ef377Chong Zhang consumer->setConsumerUsageBits(GRALLOC_USAGE_HW_VIDEO_ENCODER); 1201d291c222357303b9611cab89d0c3b047584ef377Chong Zhang 1202d291c222357303b9611cab89d0c3b047584ef377Chong Zhang sp<BufferQueue::ProxyConsumerListener> proxy = 1203d291c222357303b9611cab89d0c3b047584ef377Chong Zhang new BufferQueue::ProxyConsumerListener(NULL); 120479608158c2254fe1357959157f2d0c1560a8a6c6Chong Zhang status_t err = consumer->consumerConnect(proxy, false); 1205d291c222357303b9611cab89d0c3b047584ef377Chong Zhang if (err != NO_ERROR) { 1206d291c222357303b9611cab89d0c3b047584ef377Chong Zhang ALOGE("Error connecting to BufferQueue: %s (%d)", 1207d291c222357303b9611cab89d0c3b047584ef377Chong Zhang strerror(-err), err); 1208d291c222357303b9611cab89d0c3b047584ef377Chong Zhang return err; 1209d291c222357303b9611cab89d0c3b047584ef377Chong Zhang } 1210d291c222357303b9611cab89d0c3b047584ef377Chong Zhang 1211d291c222357303b9611cab89d0c3b047584ef377Chong Zhang *bufferProducer = producer; 1212d291c222357303b9611cab89d0c3b047584ef377Chong Zhang *bufferConsumer = consumer; 1213d291c222357303b9611cab89d0c3b047584ef377Chong Zhang 1214d291c222357303b9611cab89d0c3b047584ef377Chong Zhang return OK; 1215d291c222357303b9611cab89d0c3b047584ef377Chong Zhang} 1216d291c222357303b9611cab89d0c3b047584ef377Chong Zhang 12178f469e18c307cb9dc0d16ed9225972aa8be4516fChong Zhangstatus_t OMXNodeInstance::setInputSurface( 1218054219874873b41f1c815552987c10465c34ba2bLajos Molnar OMX_U32 portIndex, const sp<IGraphicBufferConsumer> &bufferConsumer, 1219054219874873b41f1c815552987c10465c34ba2bLajos Molnar MetadataBufferType *type) { 1220d291c222357303b9611cab89d0c3b047584ef377Chong Zhang Mutex::Autolock autolock(mLock); 1221054219874873b41f1c815552987c10465c34ba2bLajos Molnar return createGraphicBufferSource(portIndex, bufferConsumer, type); 1222d291c222357303b9611cab89d0c3b047584ef377Chong Zhang} 1223d291c222357303b9611cab89d0c3b047584ef377Chong Zhang 1224b77d03b62cb743d0faf74b54aa466b4d220b5e61Lajos Molnarvoid OMXNodeInstance::signalEvent(OMX_EVENTTYPE event, OMX_U32 arg1, OMX_U32 arg2) { 1225b77d03b62cb743d0faf74b54aa466b4d220b5e61Lajos Molnar mOwner->OnEvent(mNodeID, event, arg1, arg2, NULL); 1226b77d03b62cb743d0faf74b54aa466b4d220b5e61Lajos Molnar} 1227b77d03b62cb743d0faf74b54aa466b4d220b5e61Lajos Molnar 1228f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFaddenstatus_t OMXNodeInstance::signalEndOfInputStream() { 1229f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden // For non-Surface input, the MediaCodec should convert the call to a 1230f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden // pair of requests (dequeue input buffer, queue input buffer with EOS 1231f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden // flag set). Seems easier than doing the equivalent from here. 1232f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden sp<GraphicBufferSource> bufferSource(getGraphicBufferSource()); 1233f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden if (bufferSource == NULL) { 1234f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOGW("signalEndOfInputStream can only be used with Surface input"); 1235f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden return INVALID_OPERATION; 1236f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } 1237ba6218eae3dbcf3f962b3561b26374a214dbf5e2Andy McFadden return bufferSource->signalEndOfInputStream(); 1238f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden} 1239f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden 1240a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnarstatus_t OMXNodeInstance::allocateSecureBuffer( 1241570a3cb7582daa030cb38eedc5eb6a06f86ecc7fAndreas Huber OMX_U32 portIndex, size_t size, OMX::buffer_id *buffer, 12421b40f2804a27b695e9e53fb1699b64cb0dd387f9Lajos Molnar void **buffer_data, sp<NativeHandle> *native_handle) { 1243a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnar if (buffer == NULL || buffer_data == NULL || native_handle == NULL) { 1244298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia ALOGE("b/25884056"); 1245298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia return BAD_VALUE; 1246298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia } 1247298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia 1248f80a1f5075a7c6e1982d37c68bfed7c9a611bb20Wei Jia if (portIndex >= NELEM(mSecureBufferType)) { 1249f80a1f5075a7c6e1982d37c68bfed7c9a611bb20Wei Jia ALOGE("b/31385713, portIndex(%u)", portIndex); 1250f80a1f5075a7c6e1982d37c68bfed7c9a611bb20Wei Jia android_errorWriteLog(0x534e4554, "31385713"); 1251f80a1f5075a7c6e1982d37c68bfed7c9a611bb20Wei Jia return BAD_VALUE; 1252f80a1f5075a7c6e1982d37c68bfed7c9a611bb20Wei Jia } 1253f80a1f5075a7c6e1982d37c68bfed7c9a611bb20Wei Jia 1254318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber Mutex::Autolock autoLock(mLock); 1255318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 12561618337cac09284fddb5bb14b5e0cfe2946d3431Marco Nelissen if (!mSailed) { 12571618337cac09284fddb5bb14b5e0cfe2946d3431Marco Nelissen ALOGE("b/35467458"); 12581618337cac09284fddb5bb14b5e0cfe2946d3431Marco Nelissen android_errorWriteLog(0x534e4554, "35467458"); 12591618337cac09284fddb5bb14b5e0cfe2946d3431Marco Nelissen return BAD_VALUE; 12601618337cac09284fddb5bb14b5e0cfe2946d3431Marco Nelissen } 12611618337cac09284fddb5bb14b5e0cfe2946d3431Marco Nelissen 12624647032d5d580e890f2e6c5508aaa6386624df7fDongwon Kang if (mSecureBufferType[portIndex] == kSecureBufferTypeUnknown) { 12634647032d5d580e890f2e6c5508aaa6386624df7fDongwon Kang ALOGE("b/63522818"); 12644647032d5d580e890f2e6c5508aaa6386624df7fDongwon Kang android_errorWriteLog(0x534e4554, "63522818"); 12654647032d5d580e890f2e6c5508aaa6386624df7fDongwon Kang return ERROR_UNSUPPORTED; 12664647032d5d580e890f2e6c5508aaa6386624df7fDongwon Kang } 12674647032d5d580e890f2e6c5508aaa6386624df7fDongwon Kang 126841eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim BufferMeta *buffer_meta = new BufferMeta(size, portIndex); 1269318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 1270318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_BUFFERHEADERTYPE *header; 1271318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 1272318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_ERRORTYPE err = OMX_AllocateBuffer( 1273318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber mHandle, &header, portIndex, buffer_meta, size); 1274318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 1275318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber if (err != OMX_ErrorNone) { 1276f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_ERROR(allocateBuffer, err, BUFFER_FMT(portIndex, "%zu@", size)); 1277318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber delete buffer_meta; 1278318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber buffer_meta = NULL; 1279318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 1280318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber *buffer = 0; 1281318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 1282f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar return StatusFromOMXError(err); 1283318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber } 1284318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 128503b268eac37ca2589bfff0bf58daf79d29cc14f4Andreas Huber CHECK_EQ(header->pAppPrivate, buffer_meta); 128603b268eac37ca2589bfff0bf58daf79d29cc14f4Andreas Huber 1287609b815a3131d22da38b2f452faa9f89daad4039Andy Hung *buffer = makeBufferID(header); 1288a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnar if (mSecureBufferType[portIndex] == kSecureBufferTypeNativeHandle) { 1289a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnar *buffer_data = NULL; 12901b40f2804a27b695e9e53fb1699b64cb0dd387f9Lajos Molnar *native_handle = NativeHandle::create( 12911b40f2804a27b695e9e53fb1699b64cb0dd387f9Lajos Molnar (native_handle_t *)header->pBuffer, false /* ownsHandle */); 1292a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnar } else { 1293a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnar *buffer_data = header->pBuffer; 1294a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnar *native_handle = NULL; 1295a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnar } 1296318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 1297d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber addActiveBuffer(portIndex, *buffer); 1298d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber 1299f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden sp<GraphicBufferSource> bufferSource(getGraphicBufferSource()); 1300f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden if (bufferSource != NULL && portIndex == kPortIndexInput) { 1301f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden bufferSource->addCodecBuffer(header); 1302f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden } 1303a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnar CLOG_BUFFER(allocateSecureBuffer, NEW_BUFFER_FMT( 13041b40f2804a27b695e9e53fb1699b64cb0dd387f9Lajos Molnar *buffer, portIndex, "%zu@%p:%p", size, *buffer_data, 13051b40f2804a27b695e9e53fb1699b64cb0dd387f9Lajos Molnar *native_handle == NULL ? NULL : (*native_handle)->handle())); 1306f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden 1307318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber return OK; 1308318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 1309318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 1310318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::allocateBufferWithBackup( 1311318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_U32 portIndex, const sp<IMemory> ¶ms, 1312cc7cc67349b7a3f498882087aa42ffc05a2daf11Lajos Molnar OMX::buffer_id *buffer, OMX_U32 allottedSize) { 1313298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia if (params == NULL || buffer == NULL) { 1314298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia ALOGE("b/25884056"); 1315298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia return BAD_VALUE; 1316298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia } 1317298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia 1318318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber Mutex::Autolock autoLock(mLock); 1319d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar if (allottedSize > params->size() || portIndex >= NELEM(mNumPortBuffers)) { 1320cc7cc67349b7a3f498882087aa42ffc05a2daf11Lajos Molnar return BAD_VALUE; 1321cc7cc67349b7a3f498882087aa42ffc05a2daf11Lajos Molnar } 1322318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 13231618337cac09284fddb5bb14b5e0cfe2946d3431Marco Nelissen if (!mSailed) { 13241618337cac09284fddb5bb14b5e0cfe2946d3431Marco Nelissen ALOGE("b/35467458"); 13251618337cac09284fddb5bb14b5e0cfe2946d3431Marco Nelissen android_errorWriteLog(0x534e4554, "35467458"); 13261618337cac09284fddb5bb14b5e0cfe2946d3431Marco Nelissen return BAD_VALUE; 13271618337cac09284fddb5bb14b5e0cfe2946d3431Marco Nelissen } 13281618337cac09284fddb5bb14b5e0cfe2946d3431Marco Nelissen 13294647032d5d580e890f2e6c5508aaa6386624df7fDongwon Kang if (mSecureBufferType[portIndex] != kSecureBufferTypeUnknown) { 13304647032d5d580e890f2e6c5508aaa6386624df7fDongwon Kang ALOGE("b/63522818"); 13314647032d5d580e890f2e6c5508aaa6386624df7fDongwon Kang android_errorWriteLog(0x534e4554, "63522818"); 13324647032d5d580e890f2e6c5508aaa6386624df7fDongwon Kang return ERROR_UNSUPPORTED; 13334647032d5d580e890f2e6c5508aaa6386624df7fDongwon Kang } 13344647032d5d580e890f2e6c5508aaa6386624df7fDongwon Kang 1335d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar // metadata buffers are not connected cross process; only copy if not meta 1336d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar bool copy = mMetadataType[portIndex] == kMetadataBufferTypeInvalid; 1337d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar 1338d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar BufferMeta *buffer_meta = new BufferMeta( 1339d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar params, portIndex, 1340d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar (portIndex == kPortIndexInput) && copy /* copyToOmx */, 1341d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar (portIndex == kPortIndexOutput) && copy /* copyFromOmx */, 1342d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar NULL /* data */); 1343318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 1344318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_BUFFERHEADERTYPE *header; 1345318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 1346318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_ERRORTYPE err = OMX_AllocateBuffer( 1347cc7cc67349b7a3f498882087aa42ffc05a2daf11Lajos Molnar mHandle, &header, portIndex, buffer_meta, allottedSize); 1348318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber if (err != OMX_ErrorNone) { 1349f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_ERROR(allocateBufferWithBackup, err, 1350cc7cc67349b7a3f498882087aa42ffc05a2daf11Lajos Molnar SIMPLE_BUFFER(portIndex, (size_t)allottedSize, params->pointer())); 1351318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber delete buffer_meta; 1352318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber buffer_meta = NULL; 1353318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 1354318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber *buffer = 0; 1355318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 1356f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar return StatusFromOMXError(err); 1357318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber } 1358318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 135903b268eac37ca2589bfff0bf58daf79d29cc14f4Andreas Huber CHECK_EQ(header->pAppPrivate, buffer_meta); 136003b268eac37ca2589bfff0bf58daf79d29cc14f4Andreas Huber 1361609b815a3131d22da38b2f452faa9f89daad4039Andy Hung *buffer = makeBufferID(header); 1362318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 1363d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber addActiveBuffer(portIndex, *buffer); 1364d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber 1365f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden sp<GraphicBufferSource> bufferSource(getGraphicBufferSource()); 1366f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden if (bufferSource != NULL && portIndex == kPortIndexInput) { 1367f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden bufferSource->addCodecBuffer(header); 1368f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden } 1369f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden 13705fb8b2987ab96ad65dc4b046616607ece16d6fb3Lajos Molnar CLOG_BUFFER(allocateBufferWithBackup, NEW_BUFFER_FMT(*buffer, portIndex, "%zu@%p :> %u@%p", 13715fb8b2987ab96ad65dc4b046616607ece16d6fb3Lajos Molnar params->size(), params->pointer(), allottedSize, header->pBuffer)); 1372f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 1373318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber return OK; 1374318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 1375318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 1376318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::freeBuffer( 1377318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_U32 portIndex, OMX::buffer_id buffer) { 1378318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber Mutex::Autolock autoLock(mLock); 1379f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_BUFFER(freeBuffer, "%s:%u %#x", portString(portIndex), portIndex, buffer); 1380318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 1381d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber removeActiveBuffer(portIndex, buffer); 1382d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber 138341eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim OMX_BUFFERHEADERTYPE *header = findBufferHeader(buffer, portIndex); 1384298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia if (header == NULL) { 1385298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia ALOGE("b/25884056"); 1386298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia return BAD_VALUE; 1387298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia } 1388318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber BufferMeta *buffer_meta = static_cast<BufferMeta *>(header->pAppPrivate); 1389318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 1390318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_ERRORTYPE err = OMX_FreeBuffer(mHandle, portIndex, header); 1391f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_IF_ERROR(freeBuffer, err, "%s:%u %#x", portString(portIndex), portIndex, buffer); 1392318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 1393318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber delete buffer_meta; 1394318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber buffer_meta = NULL; 1395609b815a3131d22da38b2f452faa9f89daad4039Andy Hung invalidateBufferID(buffer); 1396318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 1397318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber return StatusFromOMXError(err); 1398318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 1399318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 140015ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnarstatus_t OMXNodeInstance::fillBuffer(OMX::buffer_id buffer, int fenceFd) { 1401318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber Mutex::Autolock autoLock(mLock); 1402318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 140341eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim OMX_BUFFERHEADERTYPE *header = findBufferHeader(buffer, kPortIndexOutput); 1404298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia if (header == NULL) { 1405298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia ALOGE("b/25884056"); 1406298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia return BAD_VALUE; 1407298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia } 1408318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber header->nFilledLen = 0; 1409318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber header->nOffset = 0; 1410318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber header->nFlags = 0; 1411318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 141215ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar // meta now owns fenceFd 141315ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar status_t res = storeFenceInMeta_l(header, fenceFd, kPortIndexOutput); 141415ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar if (res != OK) { 141515ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar CLOG_ERROR(fillBuffer::storeFenceInMeta, res, EMPTY_BUFFER(buffer, header, fenceFd)); 141615ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar return res; 141715ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar } 141815ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar 1419f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar { 1420f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar Mutex::Autolock _l(mDebugLock); 1421f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar mOutputBuffersWithCodec.add(header); 142215ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar CLOG_BUMPED_BUFFER(fillBuffer, WITH_STATS(EMPTY_BUFFER(buffer, header, fenceFd))); 1423f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } 1424318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 1425f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar OMX_ERRORTYPE err = OMX_FillThisBuffer(mHandle, header); 1426f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar if (err != OMX_ErrorNone) { 142715ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar CLOG_ERROR(fillBuffer, err, EMPTY_BUFFER(buffer, header, fenceFd)); 1428f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar Mutex::Autolock _l(mDebugLock); 1429f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar mOutputBuffersWithCodec.remove(header); 1430f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } 1431318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber return StatusFromOMXError(err); 1432318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 1433318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 1434318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::emptyBuffer( 1435318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX::buffer_id buffer, 1436318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_U32 rangeOffset, OMX_U32 rangeLength, 143715ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar OMX_U32 flags, OMX_TICKS timestamp, int fenceFd) { 1438318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber Mutex::Autolock autoLock(mLock); 1439318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 1440d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar // no emptybuffer if using input surface 1441d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar if (getGraphicBufferSource() != NULL) { 1442d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar android_errorWriteLog(0x534e4554, "29422020"); 1443d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar return INVALID_OPERATION; 1444d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar } 1445d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar 144641eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim OMX_BUFFERHEADERTYPE *header = findBufferHeader(buffer, kPortIndexInput); 1447298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia if (header == NULL) { 1448298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia ALOGE("b/25884056"); 1449298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia return BAD_VALUE; 1450298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia } 1451318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber BufferMeta *buffer_meta = 1452318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber static_cast<BufferMeta *>(header->pAppPrivate); 1453534bb6132a6a664f90b42b3ef81298b42efb3dc2Lajos Molnar 1454534bb6132a6a664f90b42b3ef81298b42efb3dc2Lajos Molnar // set up proper filled length if component is configured for gralloc metadata mode 1455534bb6132a6a664f90b42b3ef81298b42efb3dc2Lajos Molnar // ignore rangeOffset in this case (as client may be assuming ANW meta buffers). 1456534bb6132a6a664f90b42b3ef81298b42efb3dc2Lajos Molnar if (mMetadataType[kPortIndexInput] == kMetadataBufferTypeGrallocSource) { 1457534bb6132a6a664f90b42b3ef81298b42efb3dc2Lajos Molnar header->nFilledLen = rangeLength ? sizeof(VideoGrallocMetadata) : 0; 14585fb8b2987ab96ad65dc4b046616607ece16d6fb3Lajos Molnar header->nOffset = 0; 1459054219874873b41f1c815552987c10465c34ba2bLajos Molnar } else { 14605fb8b2987ab96ad65dc4b046616607ece16d6fb3Lajos Molnar // rangeLength and rangeOffset must be a subset of the allocated data in the buffer. 14615fb8b2987ab96ad65dc4b046616607ece16d6fb3Lajos Molnar // corner case: we permit rangeOffset == end-of-buffer with rangeLength == 0. 14625fb8b2987ab96ad65dc4b046616607ece16d6fb3Lajos Molnar if (rangeOffset > header->nAllocLen 14635fb8b2987ab96ad65dc4b046616607ece16d6fb3Lajos Molnar || rangeLength > header->nAllocLen - rangeOffset) { 1464ec4ed7d541f48d1d0af8f93cd26ec291ca82061bLajos Molnar CLOG_ERROR(emptyBuffer, OMX_ErrorBadParameter, FULL_BUFFER(NULL, header, fenceFd)); 14655fb8b2987ab96ad65dc4b046616607ece16d6fb3Lajos Molnar if (fenceFd >= 0) { 14665fb8b2987ab96ad65dc4b046616607ece16d6fb3Lajos Molnar ::close(fenceFd); 14675fb8b2987ab96ad65dc4b046616607ece16d6fb3Lajos Molnar } 14685fb8b2987ab96ad65dc4b046616607ece16d6fb3Lajos Molnar return BAD_VALUE; 14695fb8b2987ab96ad65dc4b046616607ece16d6fb3Lajos Molnar } 14705fb8b2987ab96ad65dc4b046616607ece16d6fb3Lajos Molnar header->nFilledLen = rangeLength; 14715fb8b2987ab96ad65dc4b046616607ece16d6fb3Lajos Molnar header->nOffset = rangeOffset; 14725fb8b2987ab96ad65dc4b046616607ece16d6fb3Lajos Molnar 1473054219874873b41f1c815552987c10465c34ba2bLajos Molnar buffer_meta->CopyToOMX(header); 1474054219874873b41f1c815552987c10465c34ba2bLajos Molnar } 1475318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 147615ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar return emptyBuffer_l(header, flags, timestamp, (intptr_t)buffer, fenceFd); 1477f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar} 1478f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 1479f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar// log queued buffer activity for the next few input and/or output frames 1480f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar// if logging at internal state level 1481f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnarvoid OMXNodeInstance::bumpDebugLevel_l(size_t numInputBuffers, size_t numOutputBuffers) { 1482f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar if (DEBUG == ADebug::kDebugInternalState) { 1483f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar DEBUG_BUMP = ADebug::kDebugAll; 1484f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar if (numInputBuffers > 0) { 1485f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar mDebugLevelBumpPendingBuffers[kPortIndexInput] = numInputBuffers; 1486f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } 1487f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar if (numOutputBuffers > 0) { 1488f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar mDebugLevelBumpPendingBuffers[kPortIndexOutput] = numOutputBuffers; 1489f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } 1490f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } 1491f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar} 1492f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 1493f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnarvoid OMXNodeInstance::unbumpDebugLevel_l(size_t portIndex) { 1494f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar if (mDebugLevelBumpPendingBuffers[portIndex]) { 1495f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar --mDebugLevelBumpPendingBuffers[portIndex]; 1496f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } 1497f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar if (!mDebugLevelBumpPendingBuffers[0] 1498f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar && !mDebugLevelBumpPendingBuffers[1]) { 1499f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar DEBUG_BUMP = DEBUG; 1500f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } 1501f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar} 1502f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 150315ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnarstatus_t OMXNodeInstance::storeFenceInMeta_l( 150415ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar OMX_BUFFERHEADERTYPE *header, int fenceFd, OMX_U32 portIndex) { 150515ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar // propagate fence if component supports it; wait for it otherwise 150615ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar OMX_U32 metaSize = portIndex == kPortIndexInput ? header->nFilledLen : header->nAllocLen; 150715ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar if (mMetadataType[portIndex] == kMetadataBufferTypeANWBuffer 150815ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar && metaSize >= sizeof(VideoNativeMetadata)) { 150915ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar VideoNativeMetadata &nativeMeta = *(VideoNativeMetadata *)(header->pBuffer); 151015ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar if (nativeMeta.nFenceFd >= 0) { 151115ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar ALOGE("fence (%d) already exists in meta", nativeMeta.nFenceFd); 151215ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar if (fenceFd >= 0) { 151315ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar ::close(fenceFd); 151415ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar } 151515ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar return ALREADY_EXISTS; 151615ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar } 151715ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar nativeMeta.nFenceFd = fenceFd; 151815ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar } else if (fenceFd >= 0) { 151915ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar CLOG_BUFFER(storeFenceInMeta, "waiting for fence %d", fenceFd); 152015ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar sp<Fence> fence = new Fence(fenceFd); 152115ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar return fence->wait(IOMX::kFenceTimeoutMs); 152215ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar } 152315ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar return OK; 152415ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar} 152515ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar 152615ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnarint OMXNodeInstance::retrieveFenceFromMeta_l( 152715ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar OMX_BUFFERHEADERTYPE *header, OMX_U32 portIndex) { 152815ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar OMX_U32 metaSize = portIndex == kPortIndexInput ? header->nAllocLen : header->nFilledLen; 152915ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar int fenceFd = -1; 153015ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar if (mMetadataType[portIndex] == kMetadataBufferTypeANWBuffer 153115ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar && header->nAllocLen >= sizeof(VideoNativeMetadata)) { 153215ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar VideoNativeMetadata &nativeMeta = *(VideoNativeMetadata *)(header->pBuffer); 153315ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar if (nativeMeta.eType == kMetadataBufferTypeANWBuffer) { 153415ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar fenceFd = nativeMeta.nFenceFd; 153515ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar nativeMeta.nFenceFd = -1; 153615ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar } 153715ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar if (metaSize < sizeof(nativeMeta) && fenceFd >= 0) { 153815ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar CLOG_ERROR(foundFenceInEmptyMeta, BAD_VALUE, FULL_BUFFER( 153915ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar NULL, header, nativeMeta.nFenceFd)); 154015ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar fenceFd = -1; 154115ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar } 154215ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar } 154315ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar return fenceFd; 154415ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar} 154515ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar 1546f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnarstatus_t OMXNodeInstance::emptyBuffer_l( 154715ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar OMX_BUFFERHEADERTYPE *header, OMX_U32 flags, OMX_TICKS timestamp, 154815ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar intptr_t debugAddr, int fenceFd) { 1549f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar header->nFlags = flags; 1550f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar header->nTimeStamp = timestamp; 1551f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 155215ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar status_t res = storeFenceInMeta_l(header, fenceFd, kPortIndexInput); 155315ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar if (res != OK) { 155415ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar CLOG_ERROR(emptyBuffer::storeFenceInMeta, res, WITH_STATS( 155515ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar FULL_BUFFER(debugAddr, header, fenceFd))); 155615ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar return res; 155715ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar } 155815ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar 1559f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar { 1560f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar Mutex::Autolock _l(mDebugLock); 1561f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar mInputBuffersWithCodec.add(header); 1562f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 1563f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar // bump internal-state debug level for 2 input frames past a buffer with CSD 1564f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar if ((flags & OMX_BUFFERFLAG_CODECCONFIG) != 0) { 1565f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar bumpDebugLevel_l(2 /* numInputBuffers */, 0 /* numOutputBuffers */); 1566f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } 1567f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 156815ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar CLOG_BUMPED_BUFFER(emptyBuffer, WITH_STATS(FULL_BUFFER(debugAddr, header, fenceFd))); 1569f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } 1570f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 1571318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_ERRORTYPE err = OMX_EmptyThisBuffer(mHandle, header); 157215ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar CLOG_IF_ERROR(emptyBuffer, err, FULL_BUFFER(debugAddr, header, fenceFd)); 1573f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 1574f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar { 1575f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar Mutex::Autolock _l(mDebugLock); 1576f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar if (err != OMX_ErrorNone) { 1577f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar mInputBuffersWithCodec.remove(header); 1578f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } else if (!(flags & OMX_BUFFERFLAG_CODECCONFIG)) { 1579f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar unbumpDebugLevel_l(kPortIndexInput); 1580f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } 1581f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } 1582318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 1583318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber return StatusFromOMXError(err); 1584318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 1585318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 1586f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden// like emptyBuffer, but the data is already in header->pBuffer 1587054219874873b41f1c815552987c10465c34ba2bLajos Molnarstatus_t OMXNodeInstance::emptyGraphicBuffer( 1588054219874873b41f1c815552987c10465c34ba2bLajos Molnar OMX_BUFFERHEADERTYPE *header, const sp<GraphicBuffer> &graphicBuffer, 158915ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar OMX_U32 flags, OMX_TICKS timestamp, int fenceFd) { 1590298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia if (header == NULL) { 1591298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia ALOGE("b/25884056"); 1592298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia return BAD_VALUE; 1593298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia } 1594298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia 1595f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden Mutex::Autolock autoLock(mLock); 1596054219874873b41f1c815552987c10465c34ba2bLajos Molnar OMX::buffer_id buffer = findBufferID(header); 1597e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar status_t err = updateGraphicBufferInMeta_l( 1598e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar kPortIndexInput, graphicBuffer, buffer, header, 1599e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar true /* updateCodecBuffer */); 1600054219874873b41f1c815552987c10465c34ba2bLajos Molnar if (err != OK) { 160115ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar CLOG_ERROR(emptyGraphicBuffer, err, FULL_BUFFER( 160215ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar (intptr_t)header->pBuffer, header, fenceFd)); 1603054219874873b41f1c815552987c10465c34ba2bLajos Molnar return err; 1604054219874873b41f1c815552987c10465c34ba2bLajos Molnar } 1605f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden 1606054219874873b41f1c815552987c10465c34ba2bLajos Molnar header->nOffset = 0; 1607e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar if (graphicBuffer == NULL) { 1608e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar header->nFilledLen = 0; 1609e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar } else if (mMetadataType[kPortIndexInput] == kMetadataBufferTypeGrallocSource) { 1610e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar header->nFilledLen = sizeof(VideoGrallocMetadata); 1611e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar } else { 1612e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar header->nFilledLen = sizeof(VideoNativeMetadata); 1613e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar } 161415ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar return emptyBuffer_l(header, flags, timestamp, (intptr_t)header->pBuffer, fenceFd); 1615f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden} 1616f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden 1617318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::getExtensionIndex( 1618318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber const char *parameterName, OMX_INDEXTYPE *index) { 1619318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber Mutex::Autolock autoLock(mLock); 1620318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 1621318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_ERRORTYPE err = OMX_GetExtensionIndex( 1622318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber mHandle, const_cast<char *>(parameterName), index); 1623318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 1624318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber return StatusFromOMXError(err); 1625318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 1626318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 1627f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnarinline static const char *asString(IOMX::InternalOptionType i, const char *def = "??") { 1628f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar switch (i) { 1629f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar case IOMX::INTERNAL_OPTION_SUSPEND: return "SUSPEND"; 1630f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar case IOMX::INTERNAL_OPTION_REPEAT_PREVIOUS_FRAME_DELAY: 1631f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar return "REPEAT_PREVIOUS_FRAME_DELAY"; 1632f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar case IOMX::INTERNAL_OPTION_MAX_TIMESTAMP_GAP: return "MAX_TIMESTAMP_GAP"; 163337b2b389139ed638831e49708c947863eef631efRonghua Wu case IOMX::INTERNAL_OPTION_MAX_FPS: return "MAX_FPS"; 1634f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar case IOMX::INTERNAL_OPTION_START_TIME: return "START_TIME"; 1635f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar case IOMX::INTERNAL_OPTION_TIME_LAPSE: return "TIME_LAPSE"; 163661fcfd1b0b58dff9284ede8dc49749ca7395856dHangyu Kuang case IOMX::INTERNAL_OPTION_TIME_OFFSET: return "TIME_OFFSET"; 1637f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar default: return def; 1638f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } 1639f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar} 1640f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 1641dd81af7ef969981748f35ec839869d34ed0cc768Lajos Molnartemplate<typename T> 1642dd81af7ef969981748f35ec839869d34ed0cc768Lajos Molnarstatic bool getInternalOption( 1643dd81af7ef969981748f35ec839869d34ed0cc768Lajos Molnar const void *data, size_t size, T *out) { 1644dd81af7ef969981748f35ec839869d34ed0cc768Lajos Molnar if (size != sizeof(T)) { 1645dd81af7ef969981748f35ec839869d34ed0cc768Lajos Molnar return false; 1646dd81af7ef969981748f35ec839869d34ed0cc768Lajos Molnar } 1647dd81af7ef969981748f35ec839869d34ed0cc768Lajos Molnar *out = *(T*)data; 1648dd81af7ef969981748f35ec839869d34ed0cc768Lajos Molnar return true; 1649dd81af7ef969981748f35ec839869d34ed0cc768Lajos Molnar} 1650dd81af7ef969981748f35ec839869d34ed0cc768Lajos Molnar 1651e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huberstatus_t OMXNodeInstance::setInternalOption( 1652e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber OMX_U32 portIndex, 1653e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber IOMX::InternalOptionType type, 1654e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber const void *data, 1655e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber size_t size) { 1656f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_CONFIG(setInternalOption, "%s(%d): %s:%u %zu@%p", 1657f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar asString(type), type, portString(portIndex), portIndex, size, data); 1658e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber switch (type) { 1659e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber case IOMX::INTERNAL_OPTION_SUSPEND: 1660a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber case IOMX::INTERNAL_OPTION_REPEAT_PREVIOUS_FRAME_DELAY: 166194ee4b708acfa941581160b267afb79192b1d816Chong Zhang case IOMX::INTERNAL_OPTION_MAX_TIMESTAMP_GAP: 166237b2b389139ed638831e49708c947863eef631efRonghua Wu case IOMX::INTERNAL_OPTION_MAX_FPS: 166372cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang case IOMX::INTERNAL_OPTION_START_TIME: 16642c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang case IOMX::INTERNAL_OPTION_TIME_LAPSE: 166561fcfd1b0b58dff9284ede8dc49749ca7395856dHangyu Kuang case IOMX::INTERNAL_OPTION_TIME_OFFSET: 1666dd81af7ef969981748f35ec839869d34ed0cc768Lajos Molnar case IOMX::INTERNAL_OPTION_COLOR_ASPECTS: 1667e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber { 1668e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber const sp<GraphicBufferSource> &bufferSource = 1669e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber getGraphicBufferSource(); 1670e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber 1671e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber if (bufferSource == NULL || portIndex != kPortIndexInput) { 1672f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOGW("setInternalOption is only for Surface input"); 1673e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber return ERROR_UNSUPPORTED; 1674e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber } 1675e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber 1676a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber if (type == IOMX::INTERNAL_OPTION_SUSPEND) { 1677dd81af7ef969981748f35ec839869d34ed0cc768Lajos Molnar bool suspend; 1678dd81af7ef969981748f35ec839869d34ed0cc768Lajos Molnar if (!getInternalOption(data, size, &suspend)) { 1679a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber return INVALID_OPERATION; 1680a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber } 1681a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber 1682f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_CONFIG(setInternalOption, "suspend=%d", suspend); 1683a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber bufferSource->suspend(suspend); 1684dd81af7ef969981748f35ec839869d34ed0cc768Lajos Molnar } else if (type == IOMX::INTERNAL_OPTION_REPEAT_PREVIOUS_FRAME_DELAY) { 1685dd81af7ef969981748f35ec839869d34ed0cc768Lajos Molnar int64_t delayUs; 1686dd81af7ef969981748f35ec839869d34ed0cc768Lajos Molnar if (!getInternalOption(data, size, &delayUs)) { 1687a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber return INVALID_OPERATION; 1688a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber } 1689a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber 1690f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_CONFIG(setInternalOption, "delayUs=%lld", (long long)delayUs); 1691a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber return bufferSource->setRepeatPreviousFrameDelayUs(delayUs); 169261fcfd1b0b58dff9284ede8dc49749ca7395856dHangyu Kuang } else if (type == IOMX::INTERNAL_OPTION_TIME_OFFSET) { 169361fcfd1b0b58dff9284ede8dc49749ca7395856dHangyu Kuang int64_t timeOffsetUs; 169461fcfd1b0b58dff9284ede8dc49749ca7395856dHangyu Kuang if (!getInternalOption(data, size, &timeOffsetUs)) { 169561fcfd1b0b58dff9284ede8dc49749ca7395856dHangyu Kuang return INVALID_OPERATION; 169661fcfd1b0b58dff9284ede8dc49749ca7395856dHangyu Kuang } 169761fcfd1b0b58dff9284ede8dc49749ca7395856dHangyu Kuang CLOG_CONFIG(setInternalOption, "bufferOffsetUs=%lld", (long long)timeOffsetUs); 169861fcfd1b0b58dff9284ede8dc49749ca7395856dHangyu Kuang return bufferSource->setInputBufferTimeOffset(timeOffsetUs); 1699dd81af7ef969981748f35ec839869d34ed0cc768Lajos Molnar } else if (type == IOMX::INTERNAL_OPTION_MAX_TIMESTAMP_GAP) { 1700dd81af7ef969981748f35ec839869d34ed0cc768Lajos Molnar int64_t maxGapUs; 1701dd81af7ef969981748f35ec839869d34ed0cc768Lajos Molnar if (!getInternalOption(data, size, &maxGapUs)) { 170294ee4b708acfa941581160b267afb79192b1d816Chong Zhang return INVALID_OPERATION; 170394ee4b708acfa941581160b267afb79192b1d816Chong Zhang } 170494ee4b708acfa941581160b267afb79192b1d816Chong Zhang 1705f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_CONFIG(setInternalOption, "gapUs=%lld", (long long)maxGapUs); 170694ee4b708acfa941581160b267afb79192b1d816Chong Zhang return bufferSource->setMaxTimestampGapUs(maxGapUs); 170737b2b389139ed638831e49708c947863eef631efRonghua Wu } else if (type == IOMX::INTERNAL_OPTION_MAX_FPS) { 1708dd81af7ef969981748f35ec839869d34ed0cc768Lajos Molnar float maxFps; 1709dd81af7ef969981748f35ec839869d34ed0cc768Lajos Molnar if (!getInternalOption(data, size, &maxFps)) { 171037b2b389139ed638831e49708c947863eef631efRonghua Wu return INVALID_OPERATION; 171137b2b389139ed638831e49708c947863eef631efRonghua Wu } 171237b2b389139ed638831e49708c947863eef631efRonghua Wu 171337b2b389139ed638831e49708c947863eef631efRonghua Wu CLOG_CONFIG(setInternalOption, "maxFps=%f", maxFps); 171437b2b389139ed638831e49708c947863eef631efRonghua Wu return bufferSource->setMaxFps(maxFps); 17152c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang } else if (type == IOMX::INTERNAL_OPTION_START_TIME) { 1716dd81af7ef969981748f35ec839869d34ed0cc768Lajos Molnar int64_t skipFramesBeforeUs; 1717dd81af7ef969981748f35ec839869d34ed0cc768Lajos Molnar if (!getInternalOption(data, size, &skipFramesBeforeUs)) { 171872cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang return INVALID_OPERATION; 171972cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang } 172072cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang 1721f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_CONFIG(setInternalOption, "beforeUs=%lld", (long long)skipFramesBeforeUs); 172272cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang bufferSource->setSkipFramesBeforeUs(skipFramesBeforeUs); 1723dd81af7ef969981748f35ec839869d34ed0cc768Lajos Molnar } else if (type == IOMX::INTERNAL_OPTION_TIME_LAPSE) { 1724dd81af7ef969981748f35ec839869d34ed0cc768Lajos Molnar GraphicBufferSource::TimeLapseConfig config; 1725dd81af7ef969981748f35ec839869d34ed0cc768Lajos Molnar if (!getInternalOption(data, size, &config)) { 17262c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang return INVALID_OPERATION; 17272c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang } 17282c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang 1729f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_CONFIG(setInternalOption, "perFrameUs=%lld perCaptureUs=%lld", 1730dd81af7ef969981748f35ec839869d34ed0cc768Lajos Molnar (long long)config.mTimePerFrameUs, (long long)config.mTimePerCaptureUs); 1731dd81af7ef969981748f35ec839869d34ed0cc768Lajos Molnar 1732dd81af7ef969981748f35ec839869d34ed0cc768Lajos Molnar return bufferSource->setTimeLapseConfig(config); 1733dd81af7ef969981748f35ec839869d34ed0cc768Lajos Molnar } else if (type == IOMX::INTERNAL_OPTION_COLOR_ASPECTS) { 1734dd81af7ef969981748f35ec839869d34ed0cc768Lajos Molnar ColorAspects aspects; 1735dd81af7ef969981748f35ec839869d34ed0cc768Lajos Molnar if (!getInternalOption(data, size, &aspects)) { 1736dd81af7ef969981748f35ec839869d34ed0cc768Lajos Molnar return INVALID_OPERATION; 1737dd81af7ef969981748f35ec839869d34ed0cc768Lajos Molnar } 1738f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 1739dd81af7ef969981748f35ec839869d34ed0cc768Lajos Molnar CLOG_CONFIG(setInternalOption, "setting color aspects"); 1740dd81af7ef969981748f35ec839869d34ed0cc768Lajos Molnar bufferSource->setColorAspects(aspects); 1741a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber } 1742e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber 1743e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber return OK; 1744e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber } 1745e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber 1746e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber default: 1747e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber return ERROR_UNSUPPORTED; 1748e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber } 1749e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber} 1750e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber 175126a48f304a8754d655e554178ffb6d7ba4c5aac3Lajos Molnarbool OMXNodeInstance::handleMessage(omx_message &msg) { 175294ee4b708acfa941581160b267afb79192b1d816Chong Zhang const sp<GraphicBufferSource>& bufferSource(getGraphicBufferSource()); 175394ee4b708acfa941581160b267afb79192b1d816Chong Zhang 1754318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber if (msg.type == omx_message::FILL_BUFFER_DONE) { 1755318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_BUFFERHEADERTYPE *buffer = 175641eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim findBufferHeader(msg.u.extended_buffer_data.buffer, kPortIndexOutput); 1757298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia if (buffer == NULL) { 1758298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia ALOGE("b/25884056"); 175941eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim return false; 1760298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia } 1761318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 1762f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar { 1763f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar Mutex::Autolock _l(mDebugLock); 1764f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar mOutputBuffersWithCodec.remove(buffer); 1765f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 1766f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_BUMPED_BUFFER( 176715ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar FBD, WITH_STATS(FULL_BUFFER( 176815ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar msg.u.extended_buffer_data.buffer, buffer, msg.fenceFd))); 1769f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 1770f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar unbumpDebugLevel_l(kPortIndexOutput); 1771f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } 1772f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 1773318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber BufferMeta *buffer_meta = 1774318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber static_cast<BufferMeta *>(buffer->pAppPrivate); 1775318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 1776ec4ed7d541f48d1d0af8f93cd26ec291ca82061bLajos Molnar if (buffer->nOffset + buffer->nFilledLen < buffer->nOffset 1777ec4ed7d541f48d1d0af8f93cd26ec291ca82061bLajos Molnar || buffer->nOffset + buffer->nFilledLen > buffer->nAllocLen) { 1778ec4ed7d541f48d1d0af8f93cd26ec291ca82061bLajos Molnar CLOG_ERROR(onFillBufferDone, OMX_ErrorBadParameter, 1779ec4ed7d541f48d1d0af8f93cd26ec291ca82061bLajos Molnar FULL_BUFFER(NULL, buffer, msg.fenceFd)); 1780ec4ed7d541f48d1d0af8f93cd26ec291ca82061bLajos Molnar } 1781318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber buffer_meta->CopyFromOMX(buffer); 17821b4ca5cebd7f42a8f8842e45bfabe19001e9a435Andreas Huber 17831b4ca5cebd7f42a8f8842e45bfabe19001e9a435Andreas Huber if (bufferSource != NULL) { 178494ee4b708acfa941581160b267afb79192b1d816Chong Zhang // fix up the buffer info (especially timestamp) if needed 178594ee4b708acfa941581160b267afb79192b1d816Chong Zhang bufferSource->codecBufferFilled(buffer); 178694ee4b708acfa941581160b267afb79192b1d816Chong Zhang 178726a48f304a8754d655e554178ffb6d7ba4c5aac3Lajos Molnar msg.u.extended_buffer_data.timestamp = buffer->nTimeStamp; 178894ee4b708acfa941581160b267afb79192b1d816Chong Zhang } 178994ee4b708acfa941581160b267afb79192b1d816Chong Zhang } else if (msg.type == omx_message::EMPTY_BUFFER_DONE) { 1790f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar OMX_BUFFERHEADERTYPE *buffer = 179141eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim findBufferHeader(msg.u.buffer_data.buffer, kPortIndexInput); 179241eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim if (buffer == NULL) { 179341eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim return false; 179441eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim } 1795f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 1796f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar { 1797f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar Mutex::Autolock _l(mDebugLock); 1798f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar mInputBuffersWithCodec.remove(buffer); 1799f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 1800f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_BUMPED_BUFFER( 180115ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar EBD, WITH_STATS(EMPTY_BUFFER(msg.u.buffer_data.buffer, buffer, msg.fenceFd))); 1802f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } 1803f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 180494ee4b708acfa941581160b267afb79192b1d816Chong Zhang if (bufferSource != NULL) { 18051b4ca5cebd7f42a8f8842e45bfabe19001e9a435Andreas Huber // This is one of the buffers used exclusively by 18061b4ca5cebd7f42a8f8842e45bfabe19001e9a435Andreas Huber // GraphicBufferSource. 18071b4ca5cebd7f42a8f8842e45bfabe19001e9a435Andreas Huber // Don't dispatch a message back to ACodec, since it doesn't 18081b4ca5cebd7f42a8f8842e45bfabe19001e9a435Andreas Huber // know that anyone asked to have the buffer emptied and will 18091b4ca5cebd7f42a8f8842e45bfabe19001e9a435Andreas Huber // be very confused. 181015ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar bufferSource->codecBufferEmptied(buffer, msg.fenceFd); 181126a48f304a8754d655e554178ffb6d7ba4c5aac3Lajos Molnar return true; 181226a48f304a8754d655e554178ffb6d7ba4c5aac3Lajos Molnar } 181326a48f304a8754d655e554178ffb6d7ba4c5aac3Lajos Molnar } 181426a48f304a8754d655e554178ffb6d7ba4c5aac3Lajos Molnar 181526a48f304a8754d655e554178ffb6d7ba4c5aac3Lajos Molnar return false; 181626a48f304a8754d655e554178ffb6d7ba4c5aac3Lajos Molnar} 181726a48f304a8754d655e554178ffb6d7ba4c5aac3Lajos Molnar 181826a48f304a8754d655e554178ffb6d7ba4c5aac3Lajos Molnarvoid OMXNodeInstance::onMessages(std::list<omx_message> &messages) { 181926a48f304a8754d655e554178ffb6d7ba4c5aac3Lajos Molnar for (std::list<omx_message>::iterator it = messages.begin(); it != messages.end(); ) { 182026a48f304a8754d655e554178ffb6d7ba4c5aac3Lajos Molnar if (handleMessage(*it)) { 182126a48f304a8754d655e554178ffb6d7ba4c5aac3Lajos Molnar messages.erase(it++); 182226a48f304a8754d655e554178ffb6d7ba4c5aac3Lajos Molnar } else { 182326a48f304a8754d655e554178ffb6d7ba4c5aac3Lajos Molnar ++it; 18241b4ca5cebd7f42a8f8842e45bfabe19001e9a435Andreas Huber } 1825318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber } 1826318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 1827984a54322f7c70bc75e862d91bdd975814872affLajos Molnar if (!messages.empty()) { 1828984a54322f7c70bc75e862d91bdd975814872affLajos Molnar mObserver->onMessages(messages); 1829984a54322f7c70bc75e862d91bdd975814872affLajos Molnar } 1830318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 1831318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 1832f0fb96c352f30b812a4903a1d783a715e1e817bdAndreas Hubervoid OMXNodeInstance::onObserverDied(OMXMaster *master) { 183329357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("!!! Observer died. Quickly, do something, ... anything..."); 1834318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 1835318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber // Try to force shutdown of the node and hope for the best. 1836f0fb96c352f30b812a4903a1d783a715e1e817bdAndreas Huber freeNode(master); 1837318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 1838318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 1839318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Hubervoid OMXNodeInstance::onGetHandleFailed() { 1840318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber delete this; 1841318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 1842318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 1843f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden// OMXNodeInstance::OnEvent calls OMX::OnEvent, which then calls here. 1844f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden// Don't try to acquire mLock here -- in rare circumstances this will hang. 1845f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFaddenvoid OMXNodeInstance::onEvent( 1846f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden OMX_EVENTTYPE event, OMX_U32 arg1, OMX_U32 arg2) { 1847f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar const char *arg1String = "??"; 1848f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar const char *arg2String = "??"; 1849f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar ADebug::Level level = ADebug::kDebugInternalState; 1850f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 1851f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar switch (event) { 1852f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar case OMX_EventCmdComplete: 1853f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar arg1String = asString((OMX_COMMANDTYPE)arg1); 1854f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar switch (arg1) { 1855f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar case OMX_CommandStateSet: 1856f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar arg2String = asString((OMX_STATETYPE)arg2); 1857f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar level = ADebug::kDebugState; 1858f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar break; 1859f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar case OMX_CommandFlush: 1860f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar case OMX_CommandPortEnable: 1861f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar { 1862f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar // bump internal-state debug level for 2 input and output frames 1863f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar Mutex::Autolock _l(mDebugLock); 1864f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar bumpDebugLevel_l(2 /* numInputBuffers */, 2 /* numOutputBuffers */); 1865f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } 1866f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar // fall through 1867f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar default: 1868f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar arg2String = portString(arg2); 1869f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } 1870f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar break; 1871f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar case OMX_EventError: 1872f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar arg1String = asString((OMX_ERRORTYPE)arg1); 1873f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar level = ADebug::kDebugLifeCycle; 1874f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar break; 1875f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar case OMX_EventPortSettingsChanged: 1876f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar arg2String = asString((OMX_INDEXEXTTYPE)arg2); 1877f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar // fall through 1878f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar default: 1879f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar arg1String = portString(arg1); 1880f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } 1881f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 1882f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOGI_(level, onEvent, "%s(%x), %s(%x), %s(%x)", 1883f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar asString(event), event, arg1String, arg1, arg2String, arg2); 1884f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden const sp<GraphicBufferSource>& bufferSource(getGraphicBufferSource()); 1885f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden 1886e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber if (bufferSource != NULL 1887e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber && event == OMX_EventCmdComplete 1888e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber && arg1 == OMX_CommandStateSet 1889e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber && arg2 == OMX_StateExecuting) { 1890e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber bufferSource->omxExecuting(); 1891f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden } 18926392ae13cf6e15c706fce45396ec1e79af6171a9Lajos Molnar 18936392ae13cf6e15c706fce45396ec1e79af6171a9Lajos Molnar // allow configuration if we return to the loaded state 18946392ae13cf6e15c706fce45396ec1e79af6171a9Lajos Molnar if (event == OMX_EventCmdComplete 18956392ae13cf6e15c706fce45396ec1e79af6171a9Lajos Molnar && arg1 == OMX_CommandStateSet 18966392ae13cf6e15c706fce45396ec1e79af6171a9Lajos Molnar && arg2 == OMX_StateLoaded) { 18976392ae13cf6e15c706fce45396ec1e79af6171a9Lajos Molnar mSailed = false; 18986392ae13cf6e15c706fce45396ec1e79af6171a9Lajos Molnar } 1899f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden} 1900f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden 1901318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber// static 1902318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas HuberOMX_ERRORTYPE OMXNodeInstance::OnEvent( 190384333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber OMX_IN OMX_HANDLETYPE /* hComponent */, 1904318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_IN OMX_PTR pAppData, 1905318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_IN OMX_EVENTTYPE eEvent, 1906318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_IN OMX_U32 nData1, 1907318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_IN OMX_U32 nData2, 1908318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_IN OMX_PTR pEventData) { 1909298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia if (pAppData == NULL) { 1910298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia ALOGE("b/25884056"); 1911298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia return OMX_ErrorBadParameter; 1912298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia } 1913318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMXNodeInstance *instance = static_cast<OMXNodeInstance *>(pAppData); 1914134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber if (instance->mDying) { 1915134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber return OMX_ErrorNone; 1916134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber } 1917318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber return instance->owner()->OnEvent( 1918318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber instance->nodeID(), eEvent, nData1, nData2, pEventData); 1919318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 1920318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 1921318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber// static 1922318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas HuberOMX_ERRORTYPE OMXNodeInstance::OnEmptyBufferDone( 192384333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber OMX_IN OMX_HANDLETYPE /* hComponent */, 1924318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_IN OMX_PTR pAppData, 1925318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_IN OMX_BUFFERHEADERTYPE* pBuffer) { 1926298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia if (pAppData == NULL) { 1927298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia ALOGE("b/25884056"); 1928298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia return OMX_ErrorBadParameter; 1929298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia } 1930318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMXNodeInstance *instance = static_cast<OMXNodeInstance *>(pAppData); 1931134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber if (instance->mDying) { 1932134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber return OMX_ErrorNone; 1933134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber } 193415ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar int fenceFd = instance->retrieveFenceFromMeta_l(pBuffer, kPortIndexOutput); 1935609b815a3131d22da38b2f452faa9f89daad4039Andy Hung return instance->owner()->OnEmptyBufferDone(instance->nodeID(), 193615ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar instance->findBufferID(pBuffer), pBuffer, fenceFd); 1937318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 1938318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 1939318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber// static 1940318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas HuberOMX_ERRORTYPE OMXNodeInstance::OnFillBufferDone( 194184333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber OMX_IN OMX_HANDLETYPE /* hComponent */, 1942318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_IN OMX_PTR pAppData, 1943318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_IN OMX_BUFFERHEADERTYPE* pBuffer) { 1944298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia if (pAppData == NULL) { 1945298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia ALOGE("b/25884056"); 1946298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia return OMX_ErrorBadParameter; 1947298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia } 1948318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMXNodeInstance *instance = static_cast<OMXNodeInstance *>(pAppData); 1949134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber if (instance->mDying) { 1950134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber return OMX_ErrorNone; 1951134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber } 195215ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar int fenceFd = instance->retrieveFenceFromMeta_l(pBuffer, kPortIndexOutput); 1953609b815a3131d22da38b2f452faa9f89daad4039Andy Hung return instance->owner()->OnFillBufferDone(instance->nodeID(), 195415ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar instance->findBufferID(pBuffer), pBuffer, fenceFd); 1955318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 1956318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 1957d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Hubervoid OMXNodeInstance::addActiveBuffer(OMX_U32 portIndex, OMX::buffer_id id) { 1958d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber ActiveBuffer active; 1959d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber active.mPortIndex = portIndex; 1960d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber active.mID = id; 1961d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber mActiveBuffers.push(active); 1962f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 1963f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar if (portIndex < NELEM(mNumPortBuffers)) { 1964f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar ++mNumPortBuffers[portIndex]; 1965f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } 1966d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber} 1967d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber 1968d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Hubervoid OMXNodeInstance::removeActiveBuffer( 1969d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber OMX_U32 portIndex, OMX::buffer_id id) { 1970d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber for (size_t i = 0; i < mActiveBuffers.size(); ++i) { 1971d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber if (mActiveBuffers[i].mPortIndex == portIndex 1972f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar && mActiveBuffers[i].mID == id) { 1973d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber mActiveBuffers.removeItemsAt(i); 1974f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 1975f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar if (portIndex < NELEM(mNumPortBuffers)) { 1976f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar --mNumPortBuffers[portIndex]; 1977f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } 1978f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar return; 1979d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber } 1980d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber } 1981d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber 1982f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOGW("Attempt to remove an active buffer [%#x] we know nothing about...", id); 1983d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber} 1984d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber 1985d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Hubervoid OMXNodeInstance::freeActiveBuffers() { 1986d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber // Make sure to count down here, as freeBuffer will in turn remove 1987d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber // the active buffer from the vector... 1988b92add32c22656dedfb82d26ccc168c43c92b8ebChad Brubaker for (size_t i = mActiveBuffers.size(); i > 0;) { 1989b92add32c22656dedfb82d26ccc168c43c92b8ebChad Brubaker i--; 1990d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber freeBuffer(mActiveBuffers[i].mPortIndex, mActiveBuffers[i].mID); 1991d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber } 1992d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber} 1993d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber 1994609b815a3131d22da38b2f452faa9f89daad4039Andy HungOMX::buffer_id OMXNodeInstance::makeBufferID(OMX_BUFFERHEADERTYPE *bufferHeader) { 1995609b815a3131d22da38b2f452faa9f89daad4039Andy Hung if (bufferHeader == NULL) { 1996609b815a3131d22da38b2f452faa9f89daad4039Andy Hung return 0; 1997609b815a3131d22da38b2f452faa9f89daad4039Andy Hung } 1998609b815a3131d22da38b2f452faa9f89daad4039Andy Hung Mutex::Autolock autoLock(mBufferIDLock); 1999609b815a3131d22da38b2f452faa9f89daad4039Andy Hung OMX::buffer_id buffer; 2000609b815a3131d22da38b2f452faa9f89daad4039Andy Hung do { // handle the very unlikely case of ID overflow 2001609b815a3131d22da38b2f452faa9f89daad4039Andy Hung if (++mBufferIDCount == 0) { 2002f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar ++mBufferIDCount; 2003609b815a3131d22da38b2f452faa9f89daad4039Andy Hung } 2004609b815a3131d22da38b2f452faa9f89daad4039Andy Hung buffer = (OMX::buffer_id)mBufferIDCount; 2005609b815a3131d22da38b2f452faa9f89daad4039Andy Hung } while (mBufferIDToBufferHeader.indexOfKey(buffer) >= 0); 2006609b815a3131d22da38b2f452faa9f89daad4039Andy Hung mBufferIDToBufferHeader.add(buffer, bufferHeader); 2007609b815a3131d22da38b2f452faa9f89daad4039Andy Hung mBufferHeaderToBufferID.add(bufferHeader, buffer); 2008609b815a3131d22da38b2f452faa9f89daad4039Andy Hung return buffer; 2009609b815a3131d22da38b2f452faa9f89daad4039Andy Hung} 2010609b815a3131d22da38b2f452faa9f89daad4039Andy Hung 201141eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik KimOMX_BUFFERHEADERTYPE *OMXNodeInstance::findBufferHeader( 201241eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim OMX::buffer_id buffer, OMX_U32 portIndex) { 2013609b815a3131d22da38b2f452faa9f89daad4039Andy Hung if (buffer == 0) { 2014609b815a3131d22da38b2f452faa9f89daad4039Andy Hung return NULL; 2015609b815a3131d22da38b2f452faa9f89daad4039Andy Hung } 2016609b815a3131d22da38b2f452faa9f89daad4039Andy Hung Mutex::Autolock autoLock(mBufferIDLock); 20175419242328f33f4d126a22ef6296c99353f4dfb4Chong Zhang ssize_t index = mBufferIDToBufferHeader.indexOfKey(buffer); 20185419242328f33f4d126a22ef6296c99353f4dfb4Chong Zhang if (index < 0) { 20195419242328f33f4d126a22ef6296c99353f4dfb4Chong Zhang CLOGW("findBufferHeader: buffer %u not found", buffer); 20205419242328f33f4d126a22ef6296c99353f4dfb4Chong Zhang return NULL; 20215419242328f33f4d126a22ef6296c99353f4dfb4Chong Zhang } 202241eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim OMX_BUFFERHEADERTYPE *header = mBufferIDToBufferHeader.valueAt(index); 202341eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim BufferMeta *buffer_meta = 202441eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim static_cast<BufferMeta *>(header->pAppPrivate); 202541eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim if (buffer_meta->getPortIndex() != portIndex) { 202641eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim CLOGW("findBufferHeader: buffer %u found but with incorrect port index.", buffer); 202741eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim android_errorWriteLog(0x534e4554, "28816827"); 202841eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim return NULL; 202941eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim } 203041eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim return header; 2031609b815a3131d22da38b2f452faa9f89daad4039Andy Hung} 2032609b815a3131d22da38b2f452faa9f89daad4039Andy Hung 2033609b815a3131d22da38b2f452faa9f89daad4039Andy HungOMX::buffer_id OMXNodeInstance::findBufferID(OMX_BUFFERHEADERTYPE *bufferHeader) { 2034609b815a3131d22da38b2f452faa9f89daad4039Andy Hung if (bufferHeader == NULL) { 2035609b815a3131d22da38b2f452faa9f89daad4039Andy Hung return 0; 2036609b815a3131d22da38b2f452faa9f89daad4039Andy Hung } 2037609b815a3131d22da38b2f452faa9f89daad4039Andy Hung Mutex::Autolock autoLock(mBufferIDLock); 20385419242328f33f4d126a22ef6296c99353f4dfb4Chong Zhang ssize_t index = mBufferHeaderToBufferID.indexOfKey(bufferHeader); 20395419242328f33f4d126a22ef6296c99353f4dfb4Chong Zhang if (index < 0) { 20405419242328f33f4d126a22ef6296c99353f4dfb4Chong Zhang CLOGW("findBufferID: bufferHeader %p not found", bufferHeader); 20415419242328f33f4d126a22ef6296c99353f4dfb4Chong Zhang return 0; 20425419242328f33f4d126a22ef6296c99353f4dfb4Chong Zhang } 20435419242328f33f4d126a22ef6296c99353f4dfb4Chong Zhang return mBufferHeaderToBufferID.valueAt(index); 2044609b815a3131d22da38b2f452faa9f89daad4039Andy Hung} 2045609b815a3131d22da38b2f452faa9f89daad4039Andy Hung 2046609b815a3131d22da38b2f452faa9f89daad4039Andy Hungvoid OMXNodeInstance::invalidateBufferID(OMX::buffer_id buffer) { 2047609b815a3131d22da38b2f452faa9f89daad4039Andy Hung if (buffer == 0) { 2048609b815a3131d22da38b2f452faa9f89daad4039Andy Hung return; 2049609b815a3131d22da38b2f452faa9f89daad4039Andy Hung } 2050609b815a3131d22da38b2f452faa9f89daad4039Andy Hung Mutex::Autolock autoLock(mBufferIDLock); 20515419242328f33f4d126a22ef6296c99353f4dfb4Chong Zhang ssize_t index = mBufferIDToBufferHeader.indexOfKey(buffer); 20525419242328f33f4d126a22ef6296c99353f4dfb4Chong Zhang if (index < 0) { 20535419242328f33f4d126a22ef6296c99353f4dfb4Chong Zhang CLOGW("invalidateBufferID: buffer %u not found", buffer); 20545419242328f33f4d126a22ef6296c99353f4dfb4Chong Zhang return; 20555419242328f33f4d126a22ef6296c99353f4dfb4Chong Zhang } 20565419242328f33f4d126a22ef6296c99353f4dfb4Chong Zhang mBufferHeaderToBufferID.removeItem(mBufferIDToBufferHeader.valueAt(index)); 20575419242328f33f4d126a22ef6296c99353f4dfb4Chong Zhang mBufferIDToBufferHeader.removeItemsAt(index); 2058609b815a3131d22da38b2f452faa9f89daad4039Andy Hung} 2059609b815a3131d22da38b2f452faa9f89daad4039Andy Hung 2060318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} // namespace android 2061