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 23255735a38b9d5c3755c7b819bdc8fdaf4357d860Pawin Vongmasa#include <media/stagefright/omx/OMXNodeInstance.h> 24255735a38b9d5c3755c7b819bdc8fdaf4357d860Pawin Vongmasa#include <media/stagefright/omx/OMXMaster.h> 25255735a38b9d5c3755c7b819bdc8fdaf4357d860Pawin Vongmasa#include <media/stagefright/omx/OMXUtils.h> 266d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang#include <android/IOMXBufferSource.h> 27318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 28255735a38b9d5c3755c7b819bdc8fdaf4357d860Pawin Vongmasa#include <media/openmax/OMX_Component.h> 29255735a38b9d5c3755c7b819bdc8fdaf4357d860Pawin Vongmasa#include <media/openmax/OMX_IndexExt.h> 30255735a38b9d5c3755c7b819bdc8fdaf4357d860Pawin Vongmasa#include <media/openmax/OMX_VideoExt.h> 31255735a38b9d5c3755c7b819bdc8fdaf4357d860Pawin Vongmasa#include <media/openmax/OMX_AsString.h> 32318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 33318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber#include <binder/IMemory.h> 34aef47bf801dcbcb88cec8426c03237c6313da1c2Lajos Molnar#include <cutils/properties.h> 35f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden#include <gui/BufferQueue.h> 36255735a38b9d5c3755c7b819bdc8fdaf4357d860Pawin Vongmasa#include <media/hardware/HardwareAPI.h> 37f1d5aa162c02a16b7195a43a9bcea4d592600ac4James Dong#include <media/stagefright/foundation/ADebug.h> 38054219874873b41f1c815552987c10465c34ba2bLajos Molnar#include <media/stagefright/foundation/ABuffer.h> 396cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang#include <media/stagefright/foundation/ColorUtils.h> 402a3847ee1cbdaa8a65eee397a0173bb02211c459Andreas Huber#include <media/stagefright/MediaErrors.h> 41f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar#include <utils/misc.h> 427e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar#include <utils/NativeHandle.h> 433fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang#include <media/OMXBuffer.h> 442be091cebb9462b63d7160d0fa2cfa8703973a69Pawin Vongmasa#include <media/stagefright/xmlparser/MediaCodecsXmlParser.h> 45f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 46f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa#include <hidlmemory/mapping.h> 47f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa 48f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFaddenstatic const OMX_U32 kPortIndexInput = 0; 49f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnarstatic const OMX_U32 kPortIndexOutput = 1; 50f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 51d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang#define CLOGW(fmt, ...) ALOGW("[%p:%s] " fmt, mHandle, mName, ##__VA_ARGS__) 52f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 53f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar#define CLOG_ERROR_IF(cond, fn, err, fmt, ...) \ 54d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang ALOGE_IF(cond, #fn "(%p:%s, " fmt ") ERROR: %s(%#x)", \ 55d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang mHandle, mName, ##__VA_ARGS__, asString(err), err) 56f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar#define CLOG_ERROR(fn, err, fmt, ...) CLOG_ERROR_IF(true, fn, err, fmt, ##__VA_ARGS__) 57f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar#define CLOG_IF_ERROR(fn, err, fmt, ...) \ 58f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_ERROR_IF((err) != OMX_ErrorNone, fn, err, fmt, ##__VA_ARGS__) 59f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 60f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar#define CLOGI_(level, fn, fmt, ...) \ 61d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang ALOGI_IF(DEBUG >= (level), #fn "(%p:%s, " fmt ")", mHandle, mName, ##__VA_ARGS__) 62f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar#define CLOGD_(level, fn, fmt, ...) \ 63d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang ALOGD_IF(DEBUG >= (level), #fn "(%p:%s, " fmt ")", mHandle, mName, ##__VA_ARGS__) 64f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 65f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar#define CLOG_LIFE(fn, fmt, ...) CLOGI_(ADebug::kDebugLifeCycle, fn, fmt, ##__VA_ARGS__) 66f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar#define CLOG_STATE(fn, fmt, ...) CLOGI_(ADebug::kDebugState, fn, fmt, ##__VA_ARGS__) 67f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar#define CLOG_CONFIG(fn, fmt, ...) CLOGI_(ADebug::kDebugConfig, fn, fmt, ##__VA_ARGS__) 68f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar#define CLOG_INTERNAL(fn, fmt, ...) CLOGD_(ADebug::kDebugInternalState, fn, fmt, ##__VA_ARGS__) 69f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 70f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar#define CLOG_DEBUG_IF(cond, fn, fmt, ...) \ 71d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang ALOGD_IF(cond, #fn "(%p, " fmt ")", mHandle, ##__VA_ARGS__) 72f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 73f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar#define CLOG_BUFFER(fn, fmt, ...) \ 74f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_DEBUG_IF(DEBUG >= ADebug::kDebugAll, fn, fmt, ##__VA_ARGS__) 75f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar#define CLOG_BUMPED_BUFFER(fn, fmt, ...) \ 76f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_DEBUG_IF(DEBUG_BUMP >= ADebug::kDebugAll, fn, fmt, ##__VA_ARGS__) 77f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 78f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar/* buffer formatting */ 79f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar#define BUFFER_FMT(port, fmt, ...) "%s:%u " fmt, portString(port), (port), ##__VA_ARGS__ 80f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar#define NEW_BUFFER_FMT(buffer_id, port, fmt, ...) \ 81f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar BUFFER_FMT(port, fmt ") (#%zu => %#x", ##__VA_ARGS__, mActiveBuffers.size(), (buffer_id)) 82f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 83f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar#define SIMPLE_BUFFER(port, size, data) BUFFER_FMT(port, "%zu@%p", (size), (data)) 84f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar#define SIMPLE_NEW_BUFFER(buffer_id, port, size, data) \ 85f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar NEW_BUFFER_FMT(buffer_id, port, "%zu@%p", (size), (data)) 86f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 8715ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar#define EMPTY_BUFFER(addr, header, fenceFd) "%#x [%u@%p fc=%d]", \ 8815ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar (addr), (header)->nAllocLen, (header)->pBuffer, (fenceFd) 8915ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar#define FULL_BUFFER(addr, header, fenceFd) "%#" PRIxPTR " [%u@%p (%u..+%u) f=%x ts=%lld fc=%d]", \ 90f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar (intptr_t)(addr), (header)->nAllocLen, (header)->pBuffer, \ 9115ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar (header)->nOffset, (header)->nFilledLen, (header)->nFlags, (header)->nTimeStamp, (fenceFd) 92f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 93f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar#define WITH_STATS_WRAPPER(fmt, ...) fmt " { IN=%zu/%zu OUT=%zu/%zu }", ##__VA_ARGS__, \ 94f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar mInputBuffersWithCodec.size(), mNumPortBuffers[kPortIndexInput], \ 95f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar mOutputBuffersWithCodec.size(), mNumPortBuffers[kPortIndexOutput] 96f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar// TRICKY: this is needed so formatting macros expand before substitution 97f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar#define WITH_STATS(fmt, ...) WITH_STATS_WRAPPER(fmt, ##__VA_ARGS__) 98f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 99318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Hubernamespace android { 100318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 101318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstruct BufferMeta { 10271aba39b8767de04e35b3366a6413928f50582f0Lajos Molnar explicit BufferMeta( 103f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa const sp<IMemory> &mem, const sp<IHidlMemory> &hidlMemory, 104f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa OMX_U32 portIndex, bool copy, OMX_U8 *backup) 105318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber : mMem(mem), 106f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa mHidlMemory(hidlMemory), 10721b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang mCopyFromOmx(portIndex == kPortIndexOutput && copy), 10821b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang mCopyToOmx(portIndex == kPortIndexInput && copy), 109d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar mPortIndex(portIndex), 110d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar mBackup(backup) { 111318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber } 112318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 11321b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang explicit BufferMeta(OMX_U32 portIndex) 11421b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang : mCopyFromOmx(false), 115d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar mCopyToOmx(false), 116d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar mPortIndex(portIndex), 117d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar mBackup(NULL) { 118318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber } 119318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 120bff5b5a8bb44754e0b51631527de1c49ab7e5a43Wonsik Kim explicit BufferMeta(const sp<GraphicBuffer> &graphicBuffer, OMX_U32 portIndex) 12183750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis : mGraphicBuffer(graphicBuffer), 122d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar mCopyFromOmx(false), 123d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar mCopyToOmx(false), 124d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar mPortIndex(portIndex), 125d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar mBackup(NULL) { 12683750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis } 12783750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis 128f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa OMX_U8 *getPointer() { 129f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa return mMem.get() ? static_cast<OMX_U8*>(mMem->pointer()) : 130f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa mHidlMemory.get() ? static_cast<OMX_U8*>( 131f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa static_cast<void*>(mHidlMemory->getPointer())) : nullptr; 132f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa } 133f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa 134ef777c71a051f519e0b6998ad663fa5bd291d48aLajos Molnar void CopyFromOMX(const OMX_BUFFERHEADERTYPE *header) { 135d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar if (!mCopyFromOmx) { 136318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber return; 137318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber } 138318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 139ec4ed7d541f48d1d0af8f93cd26ec291ca82061bLajos Molnar // check component returns proper range 14021b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang sp<ABuffer> codec = getBuffer(header, true /* limit */); 141ec4ed7d541f48d1d0af8f93cd26ec291ca82061bLajos Molnar 142f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa memcpy(getPointer() + header->nOffset, codec->data(), codec->size()); 143318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber } 144318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 145ef777c71a051f519e0b6998ad663fa5bd291d48aLajos Molnar void CopyToOMX(const OMX_BUFFERHEADERTYPE *header) { 146d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar if (!mCopyToOmx) { 147318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber return; 148318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber } 149318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 150318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber memcpy(header->pBuffer + header->nOffset, 151f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa getPointer() + header->nOffset, 152f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar header->nFilledLen); 153318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber } 154318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 15521b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang // return the codec buffer 15621b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang sp<ABuffer> getBuffer(const OMX_BUFFERHEADERTYPE *header, bool limit) { 15721b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang sp<ABuffer> buf = new ABuffer(header->pBuffer, header->nAllocLen); 158ec4ed7d541f48d1d0af8f93cd26ec291ca82061bLajos Molnar if (limit) { 159ec4ed7d541f48d1d0af8f93cd26ec291ca82061bLajos Molnar if (header->nOffset + header->nFilledLen > header->nOffset 160ec4ed7d541f48d1d0af8f93cd26ec291ca82061bLajos Molnar && header->nOffset + header->nFilledLen <= header->nAllocLen) { 161ec4ed7d541f48d1d0af8f93cd26ec291ca82061bLajos Molnar buf->setRange(header->nOffset, header->nFilledLen); 162ec4ed7d541f48d1d0af8f93cd26ec291ca82061bLajos Molnar } else { 163ec4ed7d541f48d1d0af8f93cd26ec291ca82061bLajos Molnar buf->setRange(0, 0); 164ec4ed7d541f48d1d0af8f93cd26ec291ca82061bLajos Molnar } 165ec4ed7d541f48d1d0af8f93cd26ec291ca82061bLajos Molnar } 166054219874873b41f1c815552987c10465c34ba2bLajos Molnar return buf; 167054219874873b41f1c815552987c10465c34ba2bLajos Molnar } 168054219874873b41f1c815552987c10465c34ba2bLajos Molnar 169d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar void setGraphicBuffer(const sp<GraphicBuffer> &graphicBuffer) { 170d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar mGraphicBuffer = graphicBuffer; 171d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar } 172d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar 1737e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar void setNativeHandle(const sp<NativeHandle> &nativeHandle) { 1747e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar mNativeHandle = nativeHandle; 1757e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar } 1767e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar 17741eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim OMX_U32 getPortIndex() { 17841eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim return mPortIndex; 17941eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim } 18041eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim 181d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar ~BufferMeta() { 182d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar delete[] mBackup; 183d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar } 184d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar 185318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberprivate: 18683750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis sp<GraphicBuffer> mGraphicBuffer; 1877e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar sp<NativeHandle> mNativeHandle; 188318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber sp<IMemory> mMem; 189f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa sp<IHidlMemory> mHidlMemory; 190d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar bool mCopyFromOmx; 191d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar bool mCopyToOmx; 19241eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim OMX_U32 mPortIndex; 193d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar OMX_U8 *mBackup; 194318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 195318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber BufferMeta(const BufferMeta &); 196318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber BufferMeta &operator=(const BufferMeta &); 197318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}; 198318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 199318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber// static 200318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas HuberOMX_CALLBACKTYPE OMXNodeInstance::kCallbacks = { 201318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber &OnEvent, &OnEmptyBufferDone, &OnFillBufferDone 202318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}; 203318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 204f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnarstatic inline const char *portString(OMX_U32 portIndex) { 205f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar switch (portIndex) { 206f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar case kPortIndexInput: return "Input"; 207f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar case kPortIndexOutput: return "Output"; 208011734f0ce7e8b2e3066f90ef51c323ee7d4dea2Bill Yi case ~0U: return "All"; 209f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar default: return "port"; 210f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } 211f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar} 212f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 213d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang//////////////////////////////////////////////////////////////////////////////// 214d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang 215d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang// This provides the underlying Thread used by CallbackDispatcher. 216d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang// Note that deriving CallbackDispatcher from Thread does not work. 217d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang 218d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhangstruct OMXNodeInstance::CallbackDispatcherThread : public Thread { 219d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang explicit CallbackDispatcherThread(CallbackDispatcher *dispatcher) 220d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang : mDispatcher(dispatcher) { 221d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang } 222d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang 223d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhangprivate: 224d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang CallbackDispatcher *mDispatcher; 225d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang 226d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang bool threadLoop(); 227d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang 228d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang CallbackDispatcherThread(const CallbackDispatcherThread &); 229d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang CallbackDispatcherThread &operator=(const CallbackDispatcherThread &); 230d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang}; 231d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang 232d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang//////////////////////////////////////////////////////////////////////////////// 233d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang 234d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhangstruct OMXNodeInstance::CallbackDispatcher : public RefBase { 235d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang explicit CallbackDispatcher(const sp<OMXNodeInstance> &owner); 236d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang 237d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang // Posts |msg| to the listener's queue. If |realTime| is true, the listener thread is notified 238d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang // that a new message is available on the queue. Otherwise, the message stays on the queue, but 239d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang // the listener is not notified of it. It will process this message when a subsequent message 240d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang // is posted with |realTime| set to true. 241d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang void post(const omx_message &msg, bool realTime = true); 242d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang 243d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang bool loop(); 244d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang 245d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhangprotected: 246d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang virtual ~CallbackDispatcher(); 247d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang 248d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhangprivate: 24936f05c7f071e5c877e65943fe181d2b48c7bd6b0Lajos Molnar enum { 25036f05c7f071e5c877e65943fe181d2b48c7bd6b0Lajos Molnar // This is used for frame_rendered message batching, which will eventually end up in a 25136f05c7f071e5c877e65943fe181d2b48c7bd6b0Lajos Molnar // single AMessage in MediaCodec when it is signaled to the app. AMessage can contain 25236f05c7f071e5c877e65943fe181d2b48c7bd6b0Lajos Molnar // up-to 64 key-value pairs, and each frame_rendered message uses 2 keys, so the max 25336f05c7f071e5c877e65943fe181d2b48c7bd6b0Lajos Molnar // value for this would be 32. Nonetheless, limit this to 12 to which gives at least 10 25436f05c7f071e5c877e65943fe181d2b48c7bd6b0Lajos Molnar // mseconds of batching at 120Hz. 25536f05c7f071e5c877e65943fe181d2b48c7bd6b0Lajos Molnar kMaxQueueSize = 12, 25636f05c7f071e5c877e65943fe181d2b48c7bd6b0Lajos Molnar }; 25736f05c7f071e5c877e65943fe181d2b48c7bd6b0Lajos Molnar 258d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang Mutex mLock; 259d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang 260d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang sp<OMXNodeInstance> const mOwner; 261d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang bool mDone; 262d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang Condition mQueueChanged; 263d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang std::list<omx_message> mQueue; 264d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang 265d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang sp<CallbackDispatcherThread> mThread; 266d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang 267d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang void dispatch(std::list<omx_message> &messages); 268d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang 269d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang CallbackDispatcher(const CallbackDispatcher &); 270d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang CallbackDispatcher &operator=(const CallbackDispatcher &); 271d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang}; 272d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang 273d59b97223424a3974d2ac31cff998d02eecf2eedChong ZhangOMXNodeInstance::CallbackDispatcher::CallbackDispatcher(const sp<OMXNodeInstance> &owner) 274d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang : mOwner(owner), 275d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang mDone(false) { 276d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang mThread = new CallbackDispatcherThread(this); 277d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang mThread->run("OMXCallbackDisp", ANDROID_PRIORITY_FOREGROUND); 278d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang} 279d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang 280d59b97223424a3974d2ac31cff998d02eecf2eedChong ZhangOMXNodeInstance::CallbackDispatcher::~CallbackDispatcher() { 281d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang { 282d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang Mutex::Autolock autoLock(mLock); 283d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang 284d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang mDone = true; 285d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang mQueueChanged.signal(); 286d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang } 287d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang 288d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang // A join on self can happen if the last ref to CallbackDispatcher 289d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang // is released within the CallbackDispatcherThread loop 290d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang status_t status = mThread->join(); 291d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang if (status != WOULD_BLOCK) { 292d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang // Other than join to self, the only other error return codes are 293d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang // whatever readyToRun() returns, and we don't override that 294d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang CHECK_EQ(status, (status_t)NO_ERROR); 295d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang } 296d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang} 297d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang 298d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhangvoid OMXNodeInstance::CallbackDispatcher::post(const omx_message &msg, bool realTime) { 299d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang Mutex::Autolock autoLock(mLock); 300d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang 301d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang mQueue.push_back(msg); 30236f05c7f071e5c877e65943fe181d2b48c7bd6b0Lajos Molnar if (realTime || mQueue.size() >= kMaxQueueSize) { 303d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang mQueueChanged.signal(); 304d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang } 305d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang} 306d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang 307d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhangvoid OMXNodeInstance::CallbackDispatcher::dispatch(std::list<omx_message> &messages) { 308d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang if (mOwner == NULL) { 309d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang ALOGV("Would have dispatched a message to a node that's already gone."); 310d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang return; 311d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang } 312d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang mOwner->onMessages(messages); 313d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang} 314d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang 315d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhangbool OMXNodeInstance::CallbackDispatcher::loop() { 316d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang for (;;) { 317d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang std::list<omx_message> messages; 318d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang 319d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang { 320d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang Mutex::Autolock autoLock(mLock); 321d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang while (!mDone && mQueue.empty()) { 322d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang mQueueChanged.wait(mLock); 323d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang } 324d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang 325d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang if (mDone) { 326d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang break; 327d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang } 328d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang 329d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang messages.swap(mQueue); 330d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang } 331d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang 332d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang dispatch(messages); 333d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang } 334d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang 335d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang return false; 336d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang} 337d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang 338d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang//////////////////////////////////////////////////////////////////////////////// 339d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang 340d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhangbool OMXNodeInstance::CallbackDispatcherThread::threadLoop() { 341d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang return mDispatcher->loop(); 342d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang} 343d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang 344d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang//////////////////////////////////////////////////////////////////////////////// 345d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang 346318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas HuberOMXNodeInstance::OMXNodeInstance( 347e7b894297aebc24939ddfa632ea3dd2d405d9f93Pawin Vongmasa Omx *owner, const sp<IOMXObserver> &observer, const char *name) 348318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber : mOwner(owner), 349318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber mHandle(NULL), 350134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber mObserver(observer), 3519113c1e619fd78fe53b548180fdc02300d33303dAndy Hung mDying(false), 352d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar mSailed(false), 353d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar mQueriedProhibitedExtensions(false), 35421b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang mQuirks(0), 3556d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang mBufferIDCount(0), 3563604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang mRestorePtsFailed(false), 3576c2d0add22ee72566623834bbfeb6170b4c94588Chong Zhang mMaxTimestampGapUs(0ll), 3583604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang mPrevOriginalTimeUs(-1ll), 3593604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang mPrevModifiedTimeUs(-1ll) 360609b815a3131d22da38b2f452faa9f89daad4039Andy Hung{ 361f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar mName = ADebug::GetDebugName(name); 362f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar DEBUG = ADebug::GetDebugLevelFromProperty(name, "debug.stagefright.omx-debug"); 363f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar ALOGV("debug level for %s is %d", name, DEBUG); 364f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar DEBUG_BUMP = DEBUG; 365f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar mNumPortBuffers[0] = 0; 366f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar mNumPortBuffers[1] = 0; 367f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar mDebugLevelBumpPendingBuffers[0] = 0; 368f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar mDebugLevelBumpPendingBuffers[1] = 0; 369054219874873b41f1c815552987c10465c34ba2bLajos Molnar mMetadataType[0] = kMetadataBufferTypeInvalid; 370054219874873b41f1c815552987c10465c34ba2bLajos Molnar mMetadataType[1] = kMetadataBufferTypeInvalid; 371d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang mPortMode[0] = IOMX::kPortModePresetByteBuffer; 372d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang mPortMode[1] = IOMX::kPortModePresetByteBuffer; 373a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnar mSecureBufferType[0] = kSecureBufferTypeUnknown; 374a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnar mSecureBufferType[1] = kSecureBufferTypeUnknown; 37577d00ee0c03ab8043e2f422232b27f5852bb3bb5Dongwon Kang mGraphicBufferEnabled[0] = false; 37677d00ee0c03ab8043e2f422232b27f5852bb3bb5Dongwon Kang mGraphicBufferEnabled[1] = false; 3778dde7269a5356503d2b283234b6cb46d0c3f214eWei Jia mIsSecure = AString(name).endsWith(".secure"); 378d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang mLegacyAdaptiveExperiment = ADebug::isExperimentEnabled("legacy-adaptive"); 379318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 380318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 381318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas HuberOMXNodeInstance::~OMXNodeInstance() { 382f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar free(mName); 383f1d5aa162c02a16b7195a43a9bcea4d592600ac4James Dong CHECK(mHandle == NULL); 384318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 385318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 386d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhangvoid OMXNodeInstance::setHandle(OMX_HANDLETYPE handle) { 387f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_LIFE(allocateNode, "handle=%p", handle); 388f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CHECK(mHandle == NULL); 389318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber mHandle = handle; 390d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang if (handle != NULL) { 391d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang mDispatcher = new CallbackDispatcher(this); 392d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang } 393318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 394318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 3956d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhangsp<IOMXBufferSource> OMXNodeInstance::getBufferSource() { 3966d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang Mutex::Autolock autoLock(mOMXBufferSourceLock); 3976d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang return mOMXBufferSource; 398f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden} 399f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden 4006d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhangvoid OMXNodeInstance::setBufferSource(const sp<IOMXBufferSource>& bufferSource) { 4016d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang Mutex::Autolock autoLock(mOMXBufferSourceLock); 4026d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang CLOG_INTERNAL(setBufferSource, "%p", bufferSource.get()); 4036d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang mOMXBufferSource = bufferSource; 404f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden} 405f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden 406d59b97223424a3974d2ac31cff998d02eecf2eedChong ZhangOMX_HANDLETYPE OMXNodeInstance::handle() { 407d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang return mHandle; 408318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 409318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 410318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Hubersp<IOMXObserver> OMXNodeInstance::observer() { 411318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber return mObserver; 412318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 413318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 414d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhangstatus_t OMXNodeInstance::freeNode() { 415f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_LIFE(freeNode, "handle=%p", mHandle); 41643e5eca7048a3b7b3ee0223b7f3cbd837ed10ae5Andreas Huber static int32_t kMaxNumIterations = 10; 41743e5eca7048a3b7b3ee0223b7f3cbd837ed10ae5Andreas Huber 418d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber // Transition the node from its current state all the way down 419d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber // to "Loaded". 420d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber // This ensures that all active buffers are properly freed even 421d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber // for components that don't do this themselves on a call to 422d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber // "FreeHandle". 423d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber 424134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber // The code below may trigger some more events to be dispatched 425134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber // by the OMX component - we want to ignore them as our client 426134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber // does not expect them. 4273e378967b379afcd559b53d70d00e758f9c2616dWonsik Kim bool expected = false; 4283e378967b379afcd559b53d70d00e758f9c2616dWonsik Kim if (!mDying.compare_exchange_strong(expected, true)) { 4293e378967b379afcd559b53d70d00e758f9c2616dWonsik Kim // exit if we have already freed the node or doing so right now. 4303e378967b379afcd559b53d70d00e758f9c2616dWonsik Kim // NOTE: this ensures that the block below executes at most once. 4313e378967b379afcd559b53d70d00e758f9c2616dWonsik Kim ALOGV("Already dying"); 4323e378967b379afcd559b53d70d00e758f9c2616dWonsik Kim return OK; 4333e378967b379afcd559b53d70d00e758f9c2616dWonsik Kim } 434134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber 435d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber OMX_STATETYPE state; 436d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber CHECK_EQ(OMX_GetState(mHandle, &state), OMX_ErrorNone); 437d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber switch (state) { 438d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber case OMX_StateExecuting: 439d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber { 4403856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("forcing Executing->Idle"); 441d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber sendCommand(OMX_CommandStateSet, OMX_StateIdle); 442d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber OMX_ERRORTYPE err; 44343e5eca7048a3b7b3ee0223b7f3cbd837ed10ae5Andreas Huber int32_t iteration = 0; 444d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber while ((err = OMX_GetState(mHandle, &state)) == OMX_ErrorNone 445f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar && state != OMX_StateIdle 446f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar && state != OMX_StateInvalid) { 44743e5eca7048a3b7b3ee0223b7f3cbd837ed10ae5Andreas Huber if (++iteration > kMaxNumIterations) { 448f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOGW("failed to enter Idle state (now %s(%d), aborting.", 449f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar asString(state), state); 45043e5eca7048a3b7b3ee0223b7f3cbd837ed10ae5Andreas Huber state = OMX_StateInvalid; 45143e5eca7048a3b7b3ee0223b7f3cbd837ed10ae5Andreas Huber break; 45243e5eca7048a3b7b3ee0223b7f3cbd837ed10ae5Andreas Huber } 45343e5eca7048a3b7b3ee0223b7f3cbd837ed10ae5Andreas Huber 454d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber usleep(100000); 455d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber } 456d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber CHECK_EQ(err, OMX_ErrorNone); 457d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber 4580d681df3b0ded2c1e335b6b5785439da4ce2c238Andreas Huber if (state == OMX_StateInvalid) { 4590d681df3b0ded2c1e335b6b5785439da4ce2c238Andreas Huber break; 4600d681df3b0ded2c1e335b6b5785439da4ce2c238Andreas Huber } 4610d681df3b0ded2c1e335b6b5785439da4ce2c238Andreas Huber 462d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber // fall through 463d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber } 464d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber 465d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber case OMX_StateIdle: 466d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber { 4673856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("forcing Idle->Loaded"); 468d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber sendCommand(OMX_CommandStateSet, OMX_StateLoaded); 469d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber 470d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber freeActiveBuffers(); 471d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber 472d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber OMX_ERRORTYPE err; 47343e5eca7048a3b7b3ee0223b7f3cbd837ed10ae5Andreas Huber int32_t iteration = 0; 474d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber while ((err = OMX_GetState(mHandle, &state)) == OMX_ErrorNone 475f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar && state != OMX_StateLoaded 476f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar && state != OMX_StateInvalid) { 47743e5eca7048a3b7b3ee0223b7f3cbd837ed10ae5Andreas Huber if (++iteration > kMaxNumIterations) { 478f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOGW("failed to enter Loaded state (now %s(%d), aborting.", 479f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar asString(state), state); 48043e5eca7048a3b7b3ee0223b7f3cbd837ed10ae5Andreas Huber state = OMX_StateInvalid; 48143e5eca7048a3b7b3ee0223b7f3cbd837ed10ae5Andreas Huber break; 48243e5eca7048a3b7b3ee0223b7f3cbd837ed10ae5Andreas Huber } 48343e5eca7048a3b7b3ee0223b7f3cbd837ed10ae5Andreas Huber 4843856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("waiting for Loaded state..."); 485d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber usleep(100000); 486d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber } 487d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber CHECK_EQ(err, OMX_ErrorNone); 488d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber 489d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber // fall through 490d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber } 491d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber 492d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber case OMX_StateLoaded: 493fa70cad40b01627ac1c22e04cdd548ece9c2654fAndreas Huber case OMX_StateInvalid: 494d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber break; 495d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber 496d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber default: 497f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar LOG_ALWAYS_FATAL("unknown state %s(%#x).", asString(state), state); 498d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber break; 499d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber } 500bdc0f0f0ab2e2c8d1ef43637eafba0b58549f089Lajos Molnar 501bdc0f0f0ab2e2c8d1ef43637eafba0b58549f089Lajos Molnar Mutex::Autolock _l(mLock); 502bdc0f0f0ab2e2c8d1ef43637eafba0b58549f089Lajos Molnar 503d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang status_t err = mOwner->freeNode(this); 504d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber 505d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang mDispatcher.clear(); 506addf2cbb120346ae42e78fa739245a353db5edadChong Zhang mOMXBufferSource.clear(); 507f0fb96c352f30b812a4903a1d783a715e1e817bdAndreas Huber 508318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber mHandle = NULL; 509f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_IF_ERROR(freeNode, err, ""); 510f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar free(mName); 511f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar mName = NULL; 512318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 5133856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("OMXNodeInstance going away."); 514318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 515d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang return err; 516318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 517318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 518318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::sendCommand( 519318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_COMMANDTYPE cmd, OMX_S32 param) { 5206d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang const sp<IOMXBufferSource> bufferSource(getBufferSource()); 521ad3b7e8d40bf1c97347f1538d30bba78ca371f67Andreas Huber if (bufferSource != NULL && cmd == OMX_CommandStateSet) { 522ad3b7e8d40bf1c97347f1538d30bba78ca371f67Andreas Huber if (param == OMX_StateIdle) { 523ad3b7e8d40bf1c97347f1538d30bba78ca371f67Andreas Huber // Initiating transition from Executing -> Idle 524ad3b7e8d40bf1c97347f1538d30bba78ca371f67Andreas Huber // ACodec is waiting for all buffers to be returned, do NOT 525ad3b7e8d40bf1c97347f1538d30bba78ca371f67Andreas Huber // submit any more buffers to the codec. 5266d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang bufferSource->onOmxIdle(); 527ad3b7e8d40bf1c97347f1538d30bba78ca371f67Andreas Huber } else if (param == OMX_StateLoaded) { 528ad3b7e8d40bf1c97347f1538d30bba78ca371f67Andreas Huber // Initiating transition from Idle/Executing -> Loaded 529ad3b7e8d40bf1c97347f1538d30bba78ca371f67Andreas Huber // Buffers are about to be freed. 5306d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang bufferSource->onOmxLoaded(); 5316d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang setBufferSource(NULL); 532ad3b7e8d40bf1c97347f1538d30bba78ca371f67Andreas Huber } 533e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber 534e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber // fall through 535e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber } 536e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber 537318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber Mutex::Autolock autoLock(mLock); 538318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 5396d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang if (cmd == OMX_CommandStateSet) { 5406d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang // There are no configurations past first StateSet command. 5416d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang mSailed = true; 5426d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang } 5436d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang 544f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar // bump internal-state debug level for 2 input and output frames past a command 545f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar { 546f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar Mutex::Autolock _l(mDebugLock); 547f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar bumpDebugLevel_l(2 /* numInputBuffers */, 2 /* numOutputBuffers */); 548f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } 549f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 550f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar const char *paramString = 551f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar cmd == OMX_CommandStateSet ? asString((OMX_STATETYPE)param) : portString(param); 552f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_STATE(sendCommand, "%s(%d), %s(%d)", asString(cmd), cmd, paramString, param); 553318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_ERRORTYPE err = OMX_SendCommand(mHandle, cmd, param, NULL); 554f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_IF_ERROR(sendCommand, err, "%s(%d), %s(%d)", asString(cmd), cmd, paramString, param); 555318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber return StatusFromOMXError(err); 556318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 557318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 558d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnarbool OMXNodeInstance::isProhibitedIndex_l(OMX_INDEXTYPE index) { 559d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar // these extensions can only be used from OMXNodeInstance, not by clients directly. 560d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar static const char *restricted_extensions[] = { 561d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar "OMX.google.android.index.storeMetaDataInBuffers", 562d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar "OMX.google.android.index.storeANWBufferInMetadata", 563d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar "OMX.google.android.index.prepareForAdaptivePlayback", 564d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar "OMX.google.android.index.configureVideoTunnelMode", 565d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar "OMX.google.android.index.useAndroidNativeBuffer2", 566d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar "OMX.google.android.index.useAndroidNativeBuffer", 567d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar "OMX.google.android.index.enableAndroidNativeBuffers", 568d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar "OMX.google.android.index.allocateNativeHandle", 569d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar "OMX.google.android.index.getAndroidNativeBufferUsage", 570d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar }; 571d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar 5723604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang if ((index > OMX_IndexComponentStartUnused && index < OMX_IndexComponentEndUnused) 5733604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang || (index > OMX_IndexPortStartUnused && index < OMX_IndexPortEndUnused) 5743604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang || (index > OMX_IndexAudioStartUnused && index < OMX_IndexAudioEndUnused) 5753604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang || (index > OMX_IndexVideoStartUnused && index < OMX_IndexVideoEndUnused) 5763604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang || (index > OMX_IndexCommonStartUnused && index < OMX_IndexCommonEndUnused) 577d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar || (index > (OMX_INDEXTYPE)OMX_IndexExtAudioStartUnused 5783604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang && index < (OMX_INDEXTYPE)OMX_IndexExtAudioEndUnused) 579d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar || (index > (OMX_INDEXTYPE)OMX_IndexExtVideoStartUnused 5803604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang && index < (OMX_INDEXTYPE)OMX_IndexExtVideoEndUnused) 581d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar || (index > (OMX_INDEXTYPE)OMX_IndexExtOtherStartUnused 5823604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang && index < (OMX_INDEXTYPE)OMX_IndexExtOtherEndUnused)) { 583d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar return false; 584d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar } 585d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar 586d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar if (!mQueriedProhibitedExtensions) { 587d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar for (size_t i = 0; i < NELEM(restricted_extensions); ++i) { 588d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar OMX_INDEXTYPE ext; 589d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar if (OMX_GetExtensionIndex(mHandle, (OMX_STRING)restricted_extensions[i], &ext) == OMX_ErrorNone) { 590d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar mProhibitedExtensions.add(ext); 591d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar } 592d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar } 593d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar mQueriedProhibitedExtensions = true; 594d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar } 595d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar 596d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar return mProhibitedExtensions.indexOf(index) >= 0; 597d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar} 598d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar 599318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::getParameter( 60084333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber OMX_INDEXTYPE index, void *params, size_t /* size */) { 601318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber Mutex::Autolock autoLock(mLock); 602318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 603d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar if (isProhibitedIndex_l(index)) { 604d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar android_errorWriteLog(0x534e4554, "29422020"); 605d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar return BAD_INDEX; 606d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar } 607d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar 608318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_ERRORTYPE err = OMX_GetParameter(mHandle, index, params); 609f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar OMX_INDEXEXTTYPE extIndex = (OMX_INDEXEXTTYPE)index; 610f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar // some errors are expected for getParameter 611f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar if (err != OMX_ErrorNoMore) { 612f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_IF_ERROR(getParameter, err, "%s(%#x)", asString(extIndex), index); 613f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } 614318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber return StatusFromOMXError(err); 615318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 616318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 617318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::setParameter( 618f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar OMX_INDEXTYPE index, const void *params, size_t size) { 619318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber Mutex::Autolock autoLock(mLock); 620f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar OMX_INDEXEXTTYPE extIndex = (OMX_INDEXEXTTYPE)index; 621f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_CONFIG(setParameter, "%s(%#x), %zu@%p)", asString(extIndex), index, size, params); 622318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 6233604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang if (extIndex == OMX_IndexParamMaxFrameDurationForBitrateControl) { 6243604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang return setMaxPtsGapUs(params, size); 6253604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang } 6263604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang 627d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar if (isProhibitedIndex_l(index)) { 628d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar android_errorWriteLog(0x534e4554, "29422020"); 629d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar return BAD_INDEX; 630d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar } 631d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar 632318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_ERRORTYPE err = OMX_SetParameter( 633318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber mHandle, index, const_cast<void *>(params)); 634f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_IF_ERROR(setParameter, err, "%s(%#x)", asString(extIndex), index); 635318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber return StatusFromOMXError(err); 636318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 637318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 638318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::getConfig( 63984333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber OMX_INDEXTYPE index, void *params, size_t /* size */) { 640318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber Mutex::Autolock autoLock(mLock); 641318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 642d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar if (isProhibitedIndex_l(index)) { 643d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar android_errorWriteLog(0x534e4554, "29422020"); 644d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar return BAD_INDEX; 645d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar } 646d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar 647318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_ERRORTYPE err = OMX_GetConfig(mHandle, index, params); 648f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar OMX_INDEXEXTTYPE extIndex = (OMX_INDEXEXTTYPE)index; 649f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar // some errors are expected for getConfig 650f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar if (err != OMX_ErrorNoMore) { 651f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_IF_ERROR(getConfig, err, "%s(%#x)", asString(extIndex), index); 652f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } 653318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber return StatusFromOMXError(err); 654318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 655318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 656318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::setConfig( 657f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar OMX_INDEXTYPE index, const void *params, size_t size) { 658318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber Mutex::Autolock autoLock(mLock); 659f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar OMX_INDEXEXTTYPE extIndex = (OMX_INDEXEXTTYPE)index; 660f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_CONFIG(setConfig, "%s(%#x), %zu@%p)", asString(extIndex), index, size, params); 661318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 662d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar if (isProhibitedIndex_l(index)) { 663d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar android_errorWriteLog(0x534e4554, "29422020"); 664d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar return BAD_INDEX; 665d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar } 666d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar 667318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_ERRORTYPE err = OMX_SetConfig( 668318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber mHandle, index, const_cast<void *>(params)); 669f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_IF_ERROR(setConfig, err, "%s(%#x)", asString(extIndex), index); 670318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber return StatusFromOMXError(err); 671b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis} 672b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis 673d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhangstatus_t OMXNodeInstance::setPortMode(OMX_U32 portIndex, IOMX::PortMode mode) { 674d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang Mutex::Autolock autoLock(mLock); 675d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang 676d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang if (portIndex >= NELEM(mPortMode)) { 677d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang ALOGE("b/31385713, portIndex(%u)", portIndex); 678d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang android_errorWriteLog(0x534e4554, "31385713"); 679d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang return BAD_VALUE; 680d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang } 681d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang 682ced401e56169d17b9b8d104dd2590690ab7a9e1eRam Mohan if (mSailed || mNumPortBuffers[portIndex] > 0) { 683ced401e56169d17b9b8d104dd2590690ab7a9e1eRam Mohan android_errorWriteLog(0x534e4554, "29422020"); 684ced401e56169d17b9b8d104dd2590690ab7a9e1eRam Mohan return INVALID_OPERATION; 685ced401e56169d17b9b8d104dd2590690ab7a9e1eRam Mohan } 686ced401e56169d17b9b8d104dd2590690ab7a9e1eRam Mohan 687d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang CLOG_CONFIG(setPortMode, "%s(%d), port %d", asString(mode), mode, portIndex); 688d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang 6897d54e8f905784fddcc4c37fd094d4e18a73767bcWonsik Kim status_t err = OK; 690d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang switch (mode) { 691d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang case IOMX::kPortModeDynamicANWBuffer: 692d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang { 693d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang if (portIndex == kPortIndexOutput) { 694d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang if (mLegacyAdaptiveExperiment) { 695d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang CLOG_INTERNAL(setPortMode, "Legacy adaptive experiment: " 696d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang "not setting port mode to %s(%d) on output", 697d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang asString(mode), mode); 6987d54e8f905784fddcc4c37fd094d4e18a73767bcWonsik Kim err = StatusFromOMXError(OMX_ErrorUnsupportedIndex); 6997d54e8f905784fddcc4c37fd094d4e18a73767bcWonsik Kim break; 700d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang } 701d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang 7027d54e8f905784fddcc4c37fd094d4e18a73767bcWonsik Kim err = enableNativeBuffers_l( 703d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang portIndex, OMX_TRUE /*graphic*/, OMX_TRUE); 704d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang if (err != OK) { 7057d54e8f905784fddcc4c37fd094d4e18a73767bcWonsik Kim break; 706d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang } 707d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang } 708d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang (void)enableNativeBuffers_l(portIndex, OMX_FALSE /*graphic*/, OMX_FALSE); 7097d54e8f905784fddcc4c37fd094d4e18a73767bcWonsik Kim err = storeMetaDataInBuffers_l(portIndex, OMX_TRUE, NULL); 7107d54e8f905784fddcc4c37fd094d4e18a73767bcWonsik Kim break; 711d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang } 712d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang 713d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang case IOMX::kPortModeDynamicNativeHandle: 714d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang { 715d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang if (portIndex != kPortIndexInput) { 716d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang CLOG_ERROR(setPortMode, BAD_VALUE, 717d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang "%s(%d) mode is only supported on input port", asString(mode), mode); 7187d54e8f905784fddcc4c37fd094d4e18a73767bcWonsik Kim err = BAD_VALUE; 7197d54e8f905784fddcc4c37fd094d4e18a73767bcWonsik Kim break; 720d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang } 721d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang (void)enableNativeBuffers_l(portIndex, OMX_TRUE /*graphic*/, OMX_FALSE); 722d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang (void)enableNativeBuffers_l(portIndex, OMX_FALSE /*graphic*/, OMX_FALSE); 723d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang 724d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang MetadataBufferType metaType = kMetadataBufferTypeNativeHandleSource; 7257d54e8f905784fddcc4c37fd094d4e18a73767bcWonsik Kim err = storeMetaDataInBuffers_l(portIndex, OMX_TRUE, &metaType); 7267d54e8f905784fddcc4c37fd094d4e18a73767bcWonsik Kim break; 727d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang } 728d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang 729d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang case IOMX::kPortModePresetSecureBuffer: 730d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang { 731d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang // Allow on both input and output. 732d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang (void)storeMetaDataInBuffers_l(portIndex, OMX_FALSE, NULL); 733d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang (void)enableNativeBuffers_l(portIndex, OMX_TRUE /*graphic*/, OMX_FALSE); 7347d54e8f905784fddcc4c37fd094d4e18a73767bcWonsik Kim err = enableNativeBuffers_l(portIndex, OMX_FALSE /*graphic*/, OMX_TRUE); 7357d54e8f905784fddcc4c37fd094d4e18a73767bcWonsik Kim break; 736d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang } 737d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang 738d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang case IOMX::kPortModePresetANWBuffer: 739d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang { 740d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang if (portIndex != kPortIndexOutput) { 741d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang CLOG_ERROR(setPortMode, BAD_VALUE, 742d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang "%s(%d) mode is only supported on output port", asString(mode), mode); 7437d54e8f905784fddcc4c37fd094d4e18a73767bcWonsik Kim err = BAD_VALUE; 7447d54e8f905784fddcc4c37fd094d4e18a73767bcWonsik Kim break; 745d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang } 746d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang 747d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang // Check if we're simulating legacy mode with metadata mode, 748d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang // if so, enable metadata mode. 749d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang if (mLegacyAdaptiveExperiment) { 750d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang if (storeMetaDataInBuffers_l(portIndex, OMX_TRUE, NULL) == OK) { 751d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang CLOG_INTERNAL(setPortMode, "Legacy adaptive experiment: " 752d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang "metdata mode enabled successfully"); 7537d54e8f905784fddcc4c37fd094d4e18a73767bcWonsik Kim break; 754d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang } 755d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang 756d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang CLOG_INTERNAL(setPortMode, "Legacy adaptive experiment: " 757d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang "unable to enable metadata mode on output"); 758d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang 759d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang mLegacyAdaptiveExperiment = false; 760d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang } 761d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang 762d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang // Disable secure buffer and enable graphic buffer 763d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang (void)enableNativeBuffers_l(portIndex, OMX_FALSE /*graphic*/, OMX_FALSE); 7647d54e8f905784fddcc4c37fd094d4e18a73767bcWonsik Kim err = enableNativeBuffers_l(portIndex, OMX_TRUE /*graphic*/, OMX_TRUE); 765d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang if (err != OK) { 7667d54e8f905784fddcc4c37fd094d4e18a73767bcWonsik Kim break; 767d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang } 768d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang 769d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang // Not running experiment, or metadata is not supported. 770d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang // Disable metadata mode and use legacy mode. 771d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang (void)storeMetaDataInBuffers_l(portIndex, OMX_FALSE, NULL); 7727d54e8f905784fddcc4c37fd094d4e18a73767bcWonsik Kim break; 773d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang } 774d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang 775d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang case IOMX::kPortModePresetByteBuffer: 776d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang { 777d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang // Disable secure buffer, native buffer and metadata. 778d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang (void)enableNativeBuffers_l(portIndex, OMX_TRUE /*graphic*/, OMX_FALSE); 779d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang (void)enableNativeBuffers_l(portIndex, OMX_FALSE /*graphic*/, OMX_FALSE); 780d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang (void)storeMetaDataInBuffers_l(portIndex, OMX_FALSE, NULL); 7817d54e8f905784fddcc4c37fd094d4e18a73767bcWonsik Kim break; 782d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang } 783d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang 784d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang default: 7857d54e8f905784fddcc4c37fd094d4e18a73767bcWonsik Kim CLOG_ERROR(setPortMode, BAD_VALUE, "invalid port mode %d", mode); 7867d54e8f905784fddcc4c37fd094d4e18a73767bcWonsik Kim err = BAD_VALUE; 787d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang break; 788d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang } 789d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang 7907d54e8f905784fddcc4c37fd094d4e18a73767bcWonsik Kim if (err == OK) { 7917d54e8f905784fddcc4c37fd094d4e18a73767bcWonsik Kim mPortMode[portIndex] = mode; 7927d54e8f905784fddcc4c37fd094d4e18a73767bcWonsik Kim } 7937d54e8f905784fddcc4c37fd094d4e18a73767bcWonsik Kim return err; 794d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang} 795d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang 796d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhangstatus_t OMXNodeInstance::enableNativeBuffers_l( 797a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnar OMX_U32 portIndex, OMX_BOOL graphic, OMX_BOOL enable) { 798f80a1f5075a7c6e1982d37c68bfed7c9a611bb20Wei Jia if (portIndex >= NELEM(mSecureBufferType)) { 799f80a1f5075a7c6e1982d37c68bfed7c9a611bb20Wei Jia ALOGE("b/31385713, portIndex(%u)", portIndex); 800f80a1f5075a7c6e1982d37c68bfed7c9a611bb20Wei Jia android_errorWriteLog(0x534e4554, "31385713"); 801f80a1f5075a7c6e1982d37c68bfed7c9a611bb20Wei Jia return BAD_VALUE; 802f80a1f5075a7c6e1982d37c68bfed7c9a611bb20Wei Jia } 803f80a1f5075a7c6e1982d37c68bfed7c9a611bb20Wei Jia 804a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnar CLOG_CONFIG(enableNativeBuffers, "%s:%u%s, %d", portString(portIndex), portIndex, 805a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnar graphic ? ", graphic" : "", enable); 806ce18d7d85a78ac6642624fef1b5831eff4c72d56Jamie Gennis OMX_STRING name = const_cast<OMX_STRING>( 807a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnar graphic ? "OMX.google.android.index.enableAndroidNativeBuffers" 808a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnar : "OMX.google.android.index.allocateNativeHandle"); 80983750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis 81083750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis OMX_INDEXTYPE index; 811ce18d7d85a78ac6642624fef1b5831eff4c72d56Jamie Gennis OMX_ERRORTYPE err = OMX_GetExtensionIndex(mHandle, name, &index); 81283750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis 813a94c49819fd1513f1d60dbfb433017ca64bbd7dbJeff Tinker if (err == OMX_ErrorNone) { 814a94c49819fd1513f1d60dbfb433017ca64bbd7dbJeff Tinker EnableAndroidNativeBuffersParams params; 815a94c49819fd1513f1d60dbfb433017ca64bbd7dbJeff Tinker InitOMXParams(¶ms); 816a94c49819fd1513f1d60dbfb433017ca64bbd7dbJeff Tinker params.nPortIndex = portIndex; 817a94c49819fd1513f1d60dbfb433017ca64bbd7dbJeff Tinker params.enable = enable; 818a94c49819fd1513f1d60dbfb433017ca64bbd7dbJeff Tinker 819a94c49819fd1513f1d60dbfb433017ca64bbd7dbJeff Tinker err = OMX_SetParameter(mHandle, index, ¶ms); 820a94c49819fd1513f1d60dbfb433017ca64bbd7dbJeff Tinker CLOG_IF_ERROR(setParameter, err, "%s(%#x): %s:%u en=%d", name, index, 821a94c49819fd1513f1d60dbfb433017ca64bbd7dbJeff Tinker portString(portIndex), portIndex, enable); 822a94c49819fd1513f1d60dbfb433017ca64bbd7dbJeff Tinker if (!graphic) { 823a94c49819fd1513f1d60dbfb433017ca64bbd7dbJeff Tinker if (err == OMX_ErrorNone) { 824a94c49819fd1513f1d60dbfb433017ca64bbd7dbJeff Tinker mSecureBufferType[portIndex] = 825a94c49819fd1513f1d60dbfb433017ca64bbd7dbJeff Tinker enable ? kSecureBufferTypeNativeHandle : kSecureBufferTypeOpaque; 826a94c49819fd1513f1d60dbfb433017ca64bbd7dbJeff Tinker } else if (mSecureBufferType[portIndex] == kSecureBufferTypeUnknown) { 827a94c49819fd1513f1d60dbfb433017ca64bbd7dbJeff Tinker mSecureBufferType[portIndex] = kSecureBufferTypeOpaque; 828a94c49819fd1513f1d60dbfb433017ca64bbd7dbJeff Tinker } 82977d00ee0c03ab8043e2f422232b27f5852bb3bb5Dongwon Kang } else { 83077d00ee0c03ab8043e2f422232b27f5852bb3bb5Dongwon Kang if (err == OMX_ErrorNone) { 83177d00ee0c03ab8043e2f422232b27f5852bb3bb5Dongwon Kang mGraphicBufferEnabled[portIndex] = enable; 83277d00ee0c03ab8043e2f422232b27f5852bb3bb5Dongwon Kang } else if (enable) { 83377d00ee0c03ab8043e2f422232b27f5852bb3bb5Dongwon Kang mGraphicBufferEnabled[portIndex] = false; 83477d00ee0c03ab8043e2f422232b27f5852bb3bb5Dongwon Kang } 835a94c49819fd1513f1d60dbfb433017ca64bbd7dbJeff Tinker } 836a94c49819fd1513f1d60dbfb433017ca64bbd7dbJeff Tinker } else { 837f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_ERROR_IF(enable, getExtensionIndex, err, "%s", name); 838a94c49819fd1513f1d60dbfb433017ca64bbd7dbJeff Tinker if (!graphic) { 839a94c49819fd1513f1d60dbfb433017ca64bbd7dbJeff Tinker // Extension not supported, check for manual override with system property 840a94c49819fd1513f1d60dbfb433017ca64bbd7dbJeff Tinker // This is a temporary workaround until partners support the OMX extension 84196626b7f9a4e5c9e1e04f7f710383631d1470364Marco Nelissen if (property_get_bool("media.mediadrmservice.enable", false)) { 842aef47bf801dcbcb88cec8426c03237c6313da1c2Lajos Molnar CLOG_CONFIG(enableNativeBuffers, "system property override: using native-handles"); 843aef47bf801dcbcb88cec8426c03237c6313da1c2Lajos Molnar mSecureBufferType[portIndex] = kSecureBufferTypeNativeHandle; 844a94c49819fd1513f1d60dbfb433017ca64bbd7dbJeff Tinker } else if (mSecureBufferType[portIndex] == kSecureBufferTypeUnknown) { 845a94c49819fd1513f1d60dbfb433017ca64bbd7dbJeff Tinker mSecureBufferType[portIndex] = kSecureBufferTypeOpaque; 846aef47bf801dcbcb88cec8426c03237c6313da1c2Lajos Molnar } 847a94c49819fd1513f1d60dbfb433017ca64bbd7dbJeff Tinker err = OMX_ErrorNone; 848a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnar } 849a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnar } 850a94c49819fd1513f1d60dbfb433017ca64bbd7dbJeff Tinker 851f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar return StatusFromOMXError(err); 85283750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis} 85383750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis 854e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennisstatus_t OMXNodeInstance::getGraphicBufferUsage( 855e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis OMX_U32 portIndex, OMX_U32* usage) { 856e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis Mutex::Autolock autoLock(mLock); 857e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis 858e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis OMX_INDEXTYPE index; 859ce18d7d85a78ac6642624fef1b5831eff4c72d56Jamie Gennis OMX_STRING name = const_cast<OMX_STRING>( 860ce18d7d85a78ac6642624fef1b5831eff4c72d56Jamie Gennis "OMX.google.android.index.getAndroidNativeBufferUsage"); 861ce18d7d85a78ac6642624fef1b5831eff4c72d56Jamie Gennis OMX_ERRORTYPE err = OMX_GetExtensionIndex(mHandle, name, &index); 862e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis 863e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis if (err != OMX_ErrorNone) { 864f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_ERROR(getExtensionIndex, err, "%s", name); 865e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis return StatusFromOMXError(err); 866e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis } 867e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis 868f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar GetAndroidNativeBufferUsageParams params; 869f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar InitOMXParams(¶ms); 870f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar params.nPortIndex = portIndex; 871e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis 872e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis err = OMX_GetParameter(mHandle, index, ¶ms); 873e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis if (err != OMX_ErrorNone) { 874f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_ERROR(getParameter, err, "%s(%#x): %s:%u", name, index, 875f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar portString(portIndex), portIndex); 876f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar return StatusFromOMXError(err); 877e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis } 878e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis 879e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis *usage = params.nUsage; 880e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis 881e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis return OK; 882e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis} 883e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis 884f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFaddenstatus_t OMXNodeInstance::storeMetaDataInBuffers_l( 885054219874873b41f1c815552987c10465c34ba2bLajos Molnar OMX_U32 portIndex, OMX_BOOL enable, MetadataBufferType *type) { 886d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar if (mSailed) { 887d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar android_errorWriteLog(0x534e4554, "29422020"); 888d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar return INVALID_OPERATION; 889d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar } 890054219874873b41f1c815552987c10465c34ba2bLajos Molnar if (portIndex != kPortIndexInput && portIndex != kPortIndexOutput) { 8911a19076c36cbe76a537b5742e96747135b4f0d46mspector@google.com android_errorWriteLog(0x534e4554, "26324358"); 8923e328782f1e1061d08ea0c45b855cc418a2d9ea6Lajos Molnar if (type != NULL) { 8933e328782f1e1061d08ea0c45b855cc418a2d9ea6Lajos Molnar *type = kMetadataBufferTypeInvalid; 8943e328782f1e1061d08ea0c45b855cc418a2d9ea6Lajos Molnar } 895054219874873b41f1c815552987c10465c34ba2bLajos Molnar return BAD_VALUE; 896054219874873b41f1c815552987c10465c34ba2bLajos Molnar } 897054219874873b41f1c815552987c10465c34ba2bLajos Molnar 898e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong OMX_INDEXTYPE index; 899e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong OMX_STRING name = const_cast<OMX_STRING>( 900e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong "OMX.google.android.index.storeMetaDataInBuffers"); 901e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong 902054219874873b41f1c815552987c10465c34ba2bLajos Molnar OMX_STRING nativeBufferName = const_cast<OMX_STRING>( 903054219874873b41f1c815552987c10465c34ba2bLajos Molnar "OMX.google.android.index.storeANWBufferInMetadata"); 904054219874873b41f1c815552987c10465c34ba2bLajos Molnar MetadataBufferType negotiatedType; 9053e328782f1e1061d08ea0c45b855cc418a2d9ea6Lajos Molnar MetadataBufferType requestedType = type != NULL ? *type : kMetadataBufferTypeANWBuffer; 906512e979284de984427e5b2f73b9054ae1b5e2b0aLajos Molnar 907054219874873b41f1c815552987c10465c34ba2bLajos Molnar StoreMetaDataInBuffersParams params; 908054219874873b41f1c815552987c10465c34ba2bLajos Molnar InitOMXParams(¶ms); 909054219874873b41f1c815552987c10465c34ba2bLajos Molnar params.nPortIndex = portIndex; 910054219874873b41f1c815552987c10465c34ba2bLajos Molnar params.bStoreMetaData = enable; 911512e979284de984427e5b2f73b9054ae1b5e2b0aLajos Molnar 9123e328782f1e1061d08ea0c45b855cc418a2d9ea6Lajos Molnar OMX_ERRORTYPE err = 9133e328782f1e1061d08ea0c45b855cc418a2d9ea6Lajos Molnar requestedType == kMetadataBufferTypeANWBuffer 9143e328782f1e1061d08ea0c45b855cc418a2d9ea6Lajos Molnar ? OMX_GetExtensionIndex(mHandle, nativeBufferName, &index) 9153e328782f1e1061d08ea0c45b855cc418a2d9ea6Lajos Molnar : OMX_ErrorUnsupportedIndex; 916f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar OMX_ERRORTYPE xerr = err; 917f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar if (err == OMX_ErrorNone) { 918f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar err = OMX_SetParameter(mHandle, index, ¶ms); 919054219874873b41f1c815552987c10465c34ba2bLajos Molnar if (err == OMX_ErrorNone) { 920054219874873b41f1c815552987c10465c34ba2bLajos Molnar name = nativeBufferName; // set name for debugging 9213e328782f1e1061d08ea0c45b855cc418a2d9ea6Lajos Molnar negotiatedType = requestedType; 922054219874873b41f1c815552987c10465c34ba2bLajos Molnar } 923054219874873b41f1c815552987c10465c34ba2bLajos Molnar } 924054219874873b41f1c815552987c10465c34ba2bLajos Molnar if (err != OMX_ErrorNone) { 925054219874873b41f1c815552987c10465c34ba2bLajos Molnar err = OMX_GetExtensionIndex(mHandle, name, &index); 926054219874873b41f1c815552987c10465c34ba2bLajos Molnar xerr = err; 927054219874873b41f1c815552987c10465c34ba2bLajos Molnar if (err == OMX_ErrorNone) { 9283e328782f1e1061d08ea0c45b855cc418a2d9ea6Lajos Molnar negotiatedType = 9293e328782f1e1061d08ea0c45b855cc418a2d9ea6Lajos Molnar requestedType == kMetadataBufferTypeANWBuffer 9303e328782f1e1061d08ea0c45b855cc418a2d9ea6Lajos Molnar ? kMetadataBufferTypeGrallocSource : requestedType; 931054219874873b41f1c815552987c10465c34ba2bLajos Molnar err = OMX_SetParameter(mHandle, index, ¶ms); 932054219874873b41f1c815552987c10465c34ba2bLajos Molnar } 9332c8fec10807dc50c2d65d250e7a9157580f7094cRobert Shih if (err == OMX_ErrorBadParameter) { 9342c8fec10807dc50c2d65d250e7a9157580f7094cRobert Shih err = OMX_ErrorUnsupportedIndex; 9352c8fec10807dc50c2d65d250e7a9157580f7094cRobert Shih } 936f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } 937e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong 938f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar // don't log loud error if component does not support metadata mode on the output 939f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar if (err != OMX_ErrorNone) { 940f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar if (err == OMX_ErrorUnsupportedIndex && portIndex == kPortIndexOutput) { 941f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOGW("component does not support metadata mode; using fallback"); 942f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } else if (xerr != OMX_ErrorNone) { 943f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_ERROR(getExtensionIndex, xerr, "%s", name); 944f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } else { 945054219874873b41f1c815552987c10465c34ba2bLajos Molnar CLOG_ERROR(setParameter, err, "%s(%#x): %s:%u en=%d type=%d", name, index, 946054219874873b41f1c815552987c10465c34ba2bLajos Molnar portString(portIndex), portIndex, enable, negotiatedType); 947f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } 948054219874873b41f1c815552987c10465c34ba2bLajos Molnar negotiatedType = mMetadataType[portIndex]; 949054219874873b41f1c815552987c10465c34ba2bLajos Molnar } else { 950054219874873b41f1c815552987c10465c34ba2bLajos Molnar if (!enable) { 951054219874873b41f1c815552987c10465c34ba2bLajos Molnar negotiatedType = kMetadataBufferTypeInvalid; 952054219874873b41f1c815552987c10465c34ba2bLajos Molnar } 953054219874873b41f1c815552987c10465c34ba2bLajos Molnar mMetadataType[portIndex] = negotiatedType; 954054219874873b41f1c815552987c10465c34ba2bLajos Molnar } 9553e328782f1e1061d08ea0c45b855cc418a2d9ea6Lajos Molnar CLOG_CONFIG(storeMetaDataInBuffers, "%s:%u %srequested %s:%d negotiated %s:%d", 9563e328782f1e1061d08ea0c45b855cc418a2d9ea6Lajos Molnar portString(portIndex), portIndex, enable ? "" : "UN", 9573e328782f1e1061d08ea0c45b855cc418a2d9ea6Lajos Molnar asString(requestedType), requestedType, asString(negotiatedType), negotiatedType); 958054219874873b41f1c815552987c10465c34ba2bLajos Molnar 959054219874873b41f1c815552987c10465c34ba2bLajos Molnar if (type != NULL) { 960054219874873b41f1c815552987c10465c34ba2bLajos Molnar *type = negotiatedType; 961e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong } 962054219874873b41f1c815552987c10465c34ba2bLajos Molnar 963f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar return StatusFromOMXError(err); 964e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong} 965e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong 96656ce726019f700a95ce5b45beebceadae4836e30Lajos Molnarstatus_t OMXNodeInstance::prepareForAdaptivePlayback( 96756ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar OMX_U32 portIndex, OMX_BOOL enable, OMX_U32 maxFrameWidth, 96856ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar OMX_U32 maxFrameHeight) { 96956ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar Mutex::Autolock autolock(mLock); 970d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar if (mSailed) { 971d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar android_errorWriteLog(0x534e4554, "29422020"); 972d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar return INVALID_OPERATION; 973d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar } 974f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_CONFIG(prepareForAdaptivePlayback, "%s:%u en=%d max=%ux%u", 975f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar portString(portIndex), portIndex, enable, maxFrameWidth, maxFrameHeight); 97656ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar 977d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang if (mLegacyAdaptiveExperiment) { 978d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang CLOG_INTERNAL(prepareForAdaptivePlayback, 979d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang "Legacy adaptive experiment: reporting success"); 980d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang return OK; 981d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang } 982d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang 98356ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar OMX_INDEXTYPE index; 98456ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar OMX_STRING name = const_cast<OMX_STRING>( 98556ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar "OMX.google.android.index.prepareForAdaptivePlayback"); 98656ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar 98756ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar OMX_ERRORTYPE err = OMX_GetExtensionIndex(mHandle, name, &index); 98856ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar if (err != OMX_ErrorNone) { 989f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_ERROR_IF(enable, getExtensionIndex, err, "%s", name); 99056ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar return StatusFromOMXError(err); 99156ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar } 99256ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar 99356ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar PrepareForAdaptivePlaybackParams params; 994f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar InitOMXParams(¶ms); 99556ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar params.nPortIndex = portIndex; 99656ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar params.bEnable = enable; 99756ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar params.nMaxFrameWidth = maxFrameWidth; 99856ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar params.nMaxFrameHeight = maxFrameHeight; 999f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 1000f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar err = OMX_SetParameter(mHandle, index, ¶ms); 1001f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_IF_ERROR(setParameter, err, "%s(%#x): %s:%u en=%d max=%ux%u", name, index, 1002f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar portString(portIndex), portIndex, enable, maxFrameWidth, maxFrameHeight); 1003f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar return StatusFromOMXError(err); 100456ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar} 100556ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar 10065a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachadstatus_t OMXNodeInstance::configureVideoTunnelMode( 10075a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad OMX_U32 portIndex, OMX_BOOL tunneled, OMX_U32 audioHwSync, 10085a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad native_handle_t **sidebandHandle) { 10095a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad Mutex::Autolock autolock(mLock); 1010d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar if (mSailed) { 1011d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar android_errorWriteLog(0x534e4554, "29422020"); 1012d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar return INVALID_OPERATION; 1013d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar } 1014f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_CONFIG(configureVideoTunnelMode, "%s:%u tun=%d sync=%u", 1015f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar portString(portIndex), portIndex, tunneled, audioHwSync); 10165a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad 10175a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad OMX_INDEXTYPE index; 10185a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad OMX_STRING name = const_cast<OMX_STRING>( 10195a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad "OMX.google.android.index.configureVideoTunnelMode"); 10205a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad 10215a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad OMX_ERRORTYPE err = OMX_GetExtensionIndex(mHandle, name, &index); 10225a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad if (err != OMX_ErrorNone) { 1023f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_ERROR_IF(tunneled, getExtensionIndex, err, "%s", name); 10245a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad return StatusFromOMXError(err); 10255a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad } 10265a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad 10275a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad ConfigureVideoTunnelModeParams tunnelParams; 1028f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar InitOMXParams(&tunnelParams); 10295a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad tunnelParams.nPortIndex = portIndex; 10305a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad tunnelParams.bTunneled = tunneled; 10315a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad tunnelParams.nAudioHwSync = audioHwSync; 10325a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad err = OMX_SetParameter(mHandle, index, &tunnelParams); 10335a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad if (err != OMX_ErrorNone) { 1034f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_ERROR(setParameter, err, "%s(%#x): %s:%u tun=%d sync=%u", name, index, 1035f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar portString(portIndex), portIndex, tunneled, audioHwSync); 1036f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar return StatusFromOMXError(err); 10375a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad } 10385a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad 10395a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad err = OMX_GetParameter(mHandle, index, &tunnelParams); 10405a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad if (err != OMX_ErrorNone) { 1041f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_ERROR(getParameter, err, "%s(%#x): %s:%u tun=%d sync=%u", name, index, 1042f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar portString(portIndex), portIndex, tunneled, audioHwSync); 1043f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar return StatusFromOMXError(err); 10445a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad } 10455a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad if (sidebandHandle) { 10465a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad *sidebandHandle = (native_handle_t*)tunnelParams.pSidebandWindow; 10475a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad } 10485a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad 1049f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar return OK; 10505a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad} 10515a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad 1052318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::useBuffer( 1053d3ed3883c2d7bf3fb871be512055ed72cea964daPawin Vongmasa OMX_U32 portIndex, const OMXBuffer &omxBuffer, IOMX::buffer_id *buffer) { 1054d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang if (buffer == NULL) { 1055d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang ALOGE("b/25884056"); 1056d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang return BAD_VALUE; 10573fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang } 10583fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang 1059d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang if (portIndex >= NELEM(mNumPortBuffers)) { 1060298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia return BAD_VALUE; 1061298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia } 1062298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia 1063318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber Mutex::Autolock autoLock(mLock); 106481b554b04c93aebf3e74116330024272770d2967Marco Nelissen if (!mSailed) { 106581b554b04c93aebf3e74116330024272770d2967Marco Nelissen ALOGE("b/35467458"); 106681b554b04c93aebf3e74116330024272770d2967Marco Nelissen android_errorWriteLog(0x534e4554, "35467458"); 106781b554b04c93aebf3e74116330024272770d2967Marco Nelissen return BAD_VALUE; 106881b554b04c93aebf3e74116330024272770d2967Marco Nelissen } 1069d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang 1070d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang switch (omxBuffer.mBufferType) { 10717d54e8f905784fddcc4c37fd094d4e18a73767bcWonsik Kim case OMXBuffer::kBufferTypePreset: { 10727d54e8f905784fddcc4c37fd094d4e18a73767bcWonsik Kim if (mPortMode[portIndex] != IOMX::kPortModeDynamicANWBuffer 10737d54e8f905784fddcc4c37fd094d4e18a73767bcWonsik Kim && mPortMode[portIndex] != IOMX::kPortModeDynamicNativeHandle) { 10747d54e8f905784fddcc4c37fd094d4e18a73767bcWonsik Kim break; 10757d54e8f905784fddcc4c37fd094d4e18a73767bcWonsik Kim } 1076f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa return useBuffer_l(portIndex, NULL, NULL, buffer); 10777d54e8f905784fddcc4c37fd094d4e18a73767bcWonsik Kim } 1078d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang 10797d54e8f905784fddcc4c37fd094d4e18a73767bcWonsik Kim case OMXBuffer::kBufferTypeSharedMem: { 1080bda339098d273066fe50d4cb77503bac5ea4ede0Sanjay Singh if (mPortMode[portIndex] != IOMX::kPortModePresetByteBuffer 1081bda339098d273066fe50d4cb77503bac5ea4ede0Sanjay Singh && mPortMode[portIndex] != IOMX::kPortModeDynamicANWBuffer) { 10827d54e8f905784fddcc4c37fd094d4e18a73767bcWonsik Kim break; 10837d54e8f905784fddcc4c37fd094d4e18a73767bcWonsik Kim } 1084f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa return useBuffer_l(portIndex, omxBuffer.mMem, NULL, buffer); 10857d54e8f905784fddcc4c37fd094d4e18a73767bcWonsik Kim } 1086d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang 10877d54e8f905784fddcc4c37fd094d4e18a73767bcWonsik Kim case OMXBuffer::kBufferTypeANWBuffer: { 10887d54e8f905784fddcc4c37fd094d4e18a73767bcWonsik Kim if (mPortMode[portIndex] != IOMX::kPortModePresetANWBuffer) { 10897d54e8f905784fddcc4c37fd094d4e18a73767bcWonsik Kim break; 10907d54e8f905784fddcc4c37fd094d4e18a73767bcWonsik Kim } 1091f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa return useGraphicBuffer_l(portIndex, omxBuffer.mGraphicBuffer, buffer); 10927d54e8f905784fddcc4c37fd094d4e18a73767bcWonsik Kim } 1093d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang 1094f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa case OMXBuffer::kBufferTypeHidlMemory: { 10957d54e8f905784fddcc4c37fd094d4e18a73767bcWonsik Kim if (mPortMode[portIndex] != IOMX::kPortModePresetByteBuffer 1096bda339098d273066fe50d4cb77503bac5ea4ede0Sanjay Singh && mPortMode[portIndex] != IOMX::kPortModeDynamicANWBuffer 1097bda339098d273066fe50d4cb77503bac5ea4ede0Sanjay Singh && mPortMode[portIndex] != IOMX::kPortModeDynamicNativeHandle) { 10987d54e8f905784fddcc4c37fd094d4e18a73767bcWonsik Kim break; 10997d54e8f905784fddcc4c37fd094d4e18a73767bcWonsik Kim } 1100f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa sp<IHidlMemory> hidlMemory = mapMemory(omxBuffer.mHidlMemory); 1101f851e5a9f968c519f659bf85e3bd7127dc2a2885Pawin Vongmasa if (hidlMemory == nullptr) { 1102f851e5a9f968c519f659bf85e3bd7127dc2a2885Pawin Vongmasa ALOGE("OMXNodeInstance useBuffer() failed to map memory"); 1103f851e5a9f968c519f659bf85e3bd7127dc2a2885Pawin Vongmasa return NO_MEMORY; 1104f851e5a9f968c519f659bf85e3bd7127dc2a2885Pawin Vongmasa } 1105f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa return useBuffer_l(portIndex, NULL, hidlMemory, buffer); 11067d54e8f905784fddcc4c37fd094d4e18a73767bcWonsik Kim } 1107f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa default: 11087d54e8f905784fddcc4c37fd094d4e18a73767bcWonsik Kim return BAD_VALUE; 1109f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa break; 1110cc7cc67349b7a3f498882087aa42ffc05a2daf11Lajos Molnar } 1111318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 1112bda339098d273066fe50d4cb77503bac5ea4ede0Sanjay Singh ALOGE("b/77486542 : bufferType = %d vs. portMode = %d", 1113bda339098d273066fe50d4cb77503bac5ea4ede0Sanjay Singh omxBuffer.mBufferType, mPortMode[portIndex]); 11147d54e8f905784fddcc4c37fd094d4e18a73767bcWonsik Kim android_errorWriteLog(0x534e4554, "77486542"); 11157d54e8f905784fddcc4c37fd094d4e18a73767bcWonsik Kim return INVALID_OPERATION; 11163fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang} 11173fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang 11183fd200feb657c157125e45e30c2a7262e3c0244dChong Zhangstatus_t OMXNodeInstance::useBuffer_l( 1119f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa OMX_U32 portIndex, const sp<IMemory> ¶ms, 1120f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa const sp<IHidlMemory> &hParams, IOMX::buffer_id *buffer) { 1121d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar BufferMeta *buffer_meta; 112221b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang OMX_BUFFERHEADERTYPE *header; 112321b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang OMX_ERRORTYPE err = OMX_ErrorNone; 112421b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang bool isMetadata = mMetadataType[portIndex] != kMetadataBufferTypeInvalid; 1125d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang 112677d00ee0c03ab8043e2f422232b27f5852bb3bb5Dongwon Kang if (!isMetadata && mGraphicBufferEnabled[portIndex]) { 112777d00ee0c03ab8043e2f422232b27f5852bb3bb5Dongwon Kang ALOGE("b/62948670"); 112877d00ee0c03ab8043e2f422232b27f5852bb3bb5Dongwon Kang android_errorWriteLog(0x534e4554, "62948670"); 112977d00ee0c03ab8043e2f422232b27f5852bb3bb5Dongwon Kang return INVALID_OPERATION; 113077d00ee0c03ab8043e2f422232b27f5852bb3bb5Dongwon Kang } 113177d00ee0c03ab8043e2f422232b27f5852bb3bb5Dongwon Kang 1132f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa size_t paramsSize; 1133f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa void* paramsPointer; 1134f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa if (params != NULL && hParams != NULL) { 1135f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa return BAD_VALUE; 1136f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa } 1137f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa if (params != NULL) { 1138f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa paramsPointer = params->pointer(); 1139f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa paramsSize = params->size(); 1140f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa } else if (hParams != NULL) { 1141f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa paramsPointer = hParams->getPointer(); 1142f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa paramsSize = hParams->getSize(); 1143f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa } else { 1144f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa paramsPointer = nullptr; 1145f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa } 1146f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa 1147d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang OMX_U32 allottedSize; 1148d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang if (isMetadata) { 1149d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang if (mMetadataType[portIndex] == kMetadataBufferTypeGrallocSource) { 1150d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang allottedSize = sizeof(VideoGrallocMetadata); 1151d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang } else if (mMetadataType[portIndex] == kMetadataBufferTypeANWBuffer) { 1152d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang allottedSize = sizeof(VideoNativeMetadata); 1153d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang } else if (mMetadataType[portIndex] == kMetadataBufferTypeNativeHandleSource) { 1154d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang allottedSize = sizeof(VideoNativeHandleMetadata); 1155d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang } else { 1156d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang return BAD_VALUE; 1157d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang } 1158d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang } else { 1159d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang // NULL params is allowed only in metadata mode. 1160f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa if (paramsPointer == nullptr) { 1161d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang ALOGE("b/25884056"); 1162d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang return BAD_VALUE; 1163d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang } 1164f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa allottedSize = paramsSize; 1165d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang } 1166d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang 1167ecc97eb44a0675974fcf43b0c68edaaa539d2996Chong Zhang bool isOutputGraphicMetadata = (portIndex == kPortIndexOutput) && 1168ecc97eb44a0675974fcf43b0c68edaaa539d2996Chong Zhang (mMetadataType[portIndex] == kMetadataBufferTypeGrallocSource || 1169ecc97eb44a0675974fcf43b0c68edaaa539d2996Chong Zhang mMetadataType[portIndex] == kMetadataBufferTypeANWBuffer); 1170d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar 117121b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang uint32_t requiresAllocateBufferBit = 117221b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang (portIndex == kPortIndexInput) 117321b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang ? kRequiresAllocateBufferOnInputPorts 117421b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang : kRequiresAllocateBufferOnOutputPorts; 1175d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar 1176ecc97eb44a0675974fcf43b0c68edaaa539d2996Chong Zhang // we use useBuffer for output metadata regardless of quirks 1177ecc97eb44a0675974fcf43b0c68edaaa539d2996Chong Zhang if (!isOutputGraphicMetadata && (mQuirks & requiresAllocateBufferBit)) { 117821b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang // metadata buffers are not connected cross process; only copy if not meta. 1179d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar buffer_meta = new BufferMeta( 1180f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa params, hParams, portIndex, !isMetadata /* copy */, NULL /* data */); 118121b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang 118221b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang err = OMX_AllocateBuffer( 118321b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang mHandle, &header, portIndex, buffer_meta, allottedSize); 118421b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang 118521b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang if (err != OMX_ErrorNone) { 118621b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang CLOG_ERROR(allocateBuffer, err, 11873fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang SIMPLE_BUFFER(portIndex, (size_t)allottedSize, 1188f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa paramsPointer)); 118921b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang } 1190d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar } else { 11913fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang OMX_U8 *data = NULL; 119221b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang 119321b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang // metadata buffers are not connected cross process 119421b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang // use a backup buffer instead of the actual buffer 119521b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang if (isMetadata) { 119621b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang data = new (std::nothrow) OMX_U8[allottedSize]; 119721b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang if (data == NULL) { 119821b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang return NO_MEMORY; 119921b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang } 120021b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang memset(data, 0, allottedSize); 1201318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 120221b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang buffer_meta = new BufferMeta( 1203f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa params, hParams, portIndex, false /* copy */, data); 120421b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang } else { 12058a21c0191f974a0b9cbd5818052e2655e0aaa306Pawin Vongmasa data = static_cast<OMX_U8 *>(paramsPointer); 12063fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang 120721b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang buffer_meta = new BufferMeta( 1208f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa params, hParams, portIndex, false /* copy */, NULL); 120921b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang } 1210318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 121121b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang err = OMX_UseBuffer( 121221b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang mHandle, &header, portIndex, buffer_meta, 121321b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang allottedSize, data); 121421b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang 121521b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang if (err != OMX_ErrorNone) { 121621b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang CLOG_ERROR(useBuffer, err, SIMPLE_BUFFER( 121721b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang portIndex, (size_t)allottedSize, data)); 121821b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang } 121921b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang } 1220318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 122121b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang if (err != OMX_ErrorNone) { 1222318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber delete buffer_meta; 1223318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber buffer_meta = NULL; 1224318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 1225318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber *buffer = 0; 1226318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 1227f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar return StatusFromOMXError(err); 1228318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber } 1229318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 123003b268eac37ca2589bfff0bf58daf79d29cc14f4Andreas Huber CHECK_EQ(header->pAppPrivate, buffer_meta); 123103b268eac37ca2589bfff0bf58daf79d29cc14f4Andreas Huber 1232609b815a3131d22da38b2f452faa9f89daad4039Andy Hung *buffer = makeBufferID(header); 1233318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 1234d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber addActiveBuffer(portIndex, *buffer); 1235d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber 12366d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang sp<IOMXBufferSource> bufferSource(getBufferSource()); 1237f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden if (bufferSource != NULL && portIndex == kPortIndexInput) { 12386d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang bufferSource->onInputBufferAdded(*buffer); 1239f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden } 1240f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden 1241f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_BUFFER(useBuffer, NEW_BUFFER_FMT( 1242f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa *buffer, portIndex, "%u(%zu)@%p", allottedSize, paramsSize, paramsPointer)); 1243318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber return OK; 1244318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 1245318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 1246c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajanstatus_t OMXNodeInstance::useGraphicBuffer2_l( 1247c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan OMX_U32 portIndex, const sp<GraphicBuffer>& graphicBuffer, 1248d3ed3883c2d7bf3fb871be512055ed72cea964daPawin Vongmasa IOMX::buffer_id *buffer) { 1249298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia if (graphicBuffer == NULL || buffer == NULL) { 1250298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia ALOGE("b/25884056"); 1251298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia return BAD_VALUE; 1252298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia } 1253c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan 1254c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan // port definition 1255c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan OMX_PARAM_PORTDEFINITIONTYPE def; 1256f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar InitOMXParams(&def); 1257c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan def.nPortIndex = portIndex; 1258c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan OMX_ERRORTYPE err = OMX_GetParameter(mHandle, OMX_IndexParamPortDefinition, &def); 1259f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar if (err != OMX_ErrorNone) { 1260f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar OMX_INDEXTYPE index = OMX_IndexParamPortDefinition; 1261f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_ERROR(getParameter, err, "%s(%#x): %s:%u", 1262f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar asString(index), index, portString(portIndex), portIndex); 1263f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar return UNKNOWN_ERROR; 1264c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan } 1265c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan 126641eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim BufferMeta *bufferMeta = new BufferMeta(graphicBuffer, portIndex); 1267c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan 1268c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan OMX_BUFFERHEADERTYPE *header = NULL; 1269c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan OMX_U8* bufferHandle = const_cast<OMX_U8*>( 1270c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan reinterpret_cast<const OMX_U8*>(graphicBuffer->handle)); 1271c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan 1272c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan err = OMX_UseBuffer( 1273c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan mHandle, 1274c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan &header, 1275c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan portIndex, 1276c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan bufferMeta, 1277c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan def.nBufferSize, 1278c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan bufferHandle); 1279c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan 1280c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan if (err != OMX_ErrorNone) { 1281f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_ERROR(useBuffer, err, BUFFER_FMT(portIndex, "%u@%p", def.nBufferSize, bufferHandle)); 1282c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan delete bufferMeta; 1283c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan bufferMeta = NULL; 1284c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan *buffer = 0; 1285f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar return StatusFromOMXError(err); 1286c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan } 1287c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan 1288c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan CHECK_EQ(header->pBuffer, bufferHandle); 1289c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan CHECK_EQ(header->pAppPrivate, bufferMeta); 1290c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan 1291609b815a3131d22da38b2f452faa9f89daad4039Andy Hung *buffer = makeBufferID(header); 1292c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan 1293c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan addActiveBuffer(portIndex, *buffer); 1294f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_BUFFER(useGraphicBuffer2, NEW_BUFFER_FMT( 1295f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar *buffer, portIndex, "%u@%p", def.nBufferSize, bufferHandle)); 1296c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan return OK; 1297c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan} 1298c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan 1299c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan// XXX: This function is here for backwards compatibility. Once the OMX 1300c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan// implementations have been updated this can be removed and useGraphicBuffer2 1301c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan// can be renamed to useGraphicBuffer. 1302d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhangstatus_t OMXNodeInstance::useGraphicBuffer_l( 130383750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis OMX_U32 portIndex, const sp<GraphicBuffer>& graphicBuffer, 1304d3ed3883c2d7bf3fb871be512055ed72cea964daPawin Vongmasa IOMX::buffer_id *buffer) { 1305298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia if (graphicBuffer == NULL || buffer == NULL) { 1306298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia ALOGE("b/25884056"); 1307298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia return BAD_VALUE; 1308298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia } 130983750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis 13103fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang // First, see if we're in metadata mode. We could be running an experiment to simulate 13113fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang // legacy behavior (preallocated buffers) on devices that supports meta. 13123fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang if (mMetadataType[portIndex] != kMetadataBufferTypeInvalid) { 13133fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang return useGraphicBufferWithMetadata_l( 13143fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang portIndex, graphicBuffer, buffer); 13153fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang } 13163fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang 131777d00ee0c03ab8043e2f422232b27f5852bb3bb5Dongwon Kang if (!mGraphicBufferEnabled[portIndex]) { 131877d00ee0c03ab8043e2f422232b27f5852bb3bb5Dongwon Kang // Report error if this is not in graphic buffer mode. 131977d00ee0c03ab8043e2f422232b27f5852bb3bb5Dongwon Kang ALOGE("b/62948670"); 132077d00ee0c03ab8043e2f422232b27f5852bb3bb5Dongwon Kang android_errorWriteLog(0x534e4554, "62948670"); 132177d00ee0c03ab8043e2f422232b27f5852bb3bb5Dongwon Kang return INVALID_OPERATION; 132277d00ee0c03ab8043e2f422232b27f5852bb3bb5Dongwon Kang } 132377d00ee0c03ab8043e2f422232b27f5852bb3bb5Dongwon Kang 1324c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan // See if the newer version of the extension is present. 132583750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis OMX_INDEXTYPE index; 1326c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan if (OMX_GetExtensionIndex( 1327c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan mHandle, 1328c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan const_cast<OMX_STRING>("OMX.google.android.index.useAndroidNativeBuffer2"), 1329c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan &index) == OMX_ErrorNone) { 1330c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan return useGraphicBuffer2_l(portIndex, graphicBuffer, buffer); 1331c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan } 1332c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan 1333ce18d7d85a78ac6642624fef1b5831eff4c72d56Jamie Gennis OMX_STRING name = const_cast<OMX_STRING>( 1334ce18d7d85a78ac6642624fef1b5831eff4c72d56Jamie Gennis "OMX.google.android.index.useAndroidNativeBuffer"); 1335ce18d7d85a78ac6642624fef1b5831eff4c72d56Jamie Gennis OMX_ERRORTYPE err = OMX_GetExtensionIndex(mHandle, name, &index); 133683750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis if (err != OMX_ErrorNone) { 1337f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_ERROR(getExtensionIndex, err, "%s", name); 133883750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis return StatusFromOMXError(err); 133983750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis } 134083750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis 134141eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim BufferMeta *bufferMeta = new BufferMeta(graphicBuffer, portIndex); 134283750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis 134383750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis OMX_BUFFERHEADERTYPE *header; 134483750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis 134583750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis OMX_VERSIONTYPE ver; 134683750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis ver.s.nVersionMajor = 1; 134783750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis ver.s.nVersionMinor = 0; 134883750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis ver.s.nRevision = 0; 134983750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis ver.s.nStep = 0; 135083750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis UseAndroidNativeBufferParams params = { 135183750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis sizeof(UseAndroidNativeBufferParams), ver, portIndex, bufferMeta, 135283750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis &header, graphicBuffer, 135383750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis }; 135483750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis 135583750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis err = OMX_SetParameter(mHandle, index, ¶ms); 135683750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis 135783750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis if (err != OMX_ErrorNone) { 1358f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_ERROR(setParameter, err, "%s(%#x): %s:%u meta=%p GB=%p", name, index, 1359f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar portString(portIndex), portIndex, bufferMeta, graphicBuffer->handle); 136083750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis 136183750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis delete bufferMeta; 136283750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis bufferMeta = NULL; 136383750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis 136483750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis *buffer = 0; 136583750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis 1366f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar return StatusFromOMXError(err); 136783750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis } 136883750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis 136983750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis CHECK_EQ(header->pAppPrivate, bufferMeta); 137083750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis 1371609b815a3131d22da38b2f452faa9f89daad4039Andy Hung *buffer = makeBufferID(header); 137283750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis 137383750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis addActiveBuffer(portIndex, *buffer); 1374f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_BUFFER(useGraphicBuffer, NEW_BUFFER_FMT( 1375f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar *buffer, portIndex, "GB=%p", graphicBuffer->handle)); 137683750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis return OK; 137783750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis} 137883750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis 13793fd200feb657c157125e45e30c2a7262e3c0244dChong Zhangstatus_t OMXNodeInstance::useGraphicBufferWithMetadata_l( 13803fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang OMX_U32 portIndex, const sp<GraphicBuffer> &graphicBuffer, 1381d3ed3883c2d7bf3fb871be512055ed72cea964daPawin Vongmasa IOMX::buffer_id *buffer) { 13823fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang if (portIndex != kPortIndexOutput) { 13833fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang return BAD_VALUE; 13843fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang } 13853fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang 1386d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang if (mMetadataType[portIndex] != kMetadataBufferTypeGrallocSource && 1387d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang mMetadataType[portIndex] != kMetadataBufferTypeANWBuffer) { 13883fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang return BAD_VALUE; 13893fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang } 13903fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang 1391f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa status_t err = useBuffer_l(portIndex, NULL, NULL, buffer); 13923fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang if (err != OK) { 13933fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang return err; 13943fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang } 13953fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang 13963fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang OMX_BUFFERHEADERTYPE *header = findBufferHeader(*buffer, portIndex); 13973fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang 13983fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang return updateGraphicBufferInMeta_l(portIndex, graphicBuffer, *buffer, header); 13993fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang 14003fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang} 14013fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang 1402054219874873b41f1c815552987c10465c34ba2bLajos Molnarstatus_t OMXNodeInstance::updateGraphicBufferInMeta_l( 1403f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar OMX_U32 portIndex, const sp<GraphicBuffer>& graphicBuffer, 1404d3ed3883c2d7bf3fb871be512055ed72cea964daPawin Vongmasa IOMX::buffer_id buffer, OMX_BUFFERHEADERTYPE *header) { 1405298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia // No need to check |graphicBuffer| since NULL is valid for it as below. 1406298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia if (header == NULL) { 1407298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia ALOGE("b/25884056"); 1408298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia return BAD_VALUE; 1409298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia } 1410298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia 1411054219874873b41f1c815552987c10465c34ba2bLajos Molnar if (portIndex != kPortIndexInput && portIndex != kPortIndexOutput) { 1412054219874873b41f1c815552987c10465c34ba2bLajos Molnar return BAD_VALUE; 1413054219874873b41f1c815552987c10465c34ba2bLajos Molnar } 1414d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar 1415d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar BufferMeta *bufferMeta = (BufferMeta *)(header->pAppPrivate); 141621b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang sp<ABuffer> data = bufferMeta->getBuffer(header, false /* limit */); 1417d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar bufferMeta->setGraphicBuffer(graphicBuffer); 1418e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar MetadataBufferType metaType = mMetadataType[portIndex]; 1419e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar if (metaType == kMetadataBufferTypeGrallocSource 1420e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar && data->capacity() >= sizeof(VideoGrallocMetadata)) { 1421e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar VideoGrallocMetadata &metadata = *(VideoGrallocMetadata *)(data->data()); 1422054219874873b41f1c815552987c10465c34ba2bLajos Molnar metadata.eType = kMetadataBufferTypeGrallocSource; 14239847fcefb183e1cb09eb48e17a09577392b0e8f4Lajos Molnar metadata.pHandle = graphicBuffer == NULL ? NULL : graphicBuffer->handle; 1424e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar } else if (metaType == kMetadataBufferTypeANWBuffer 1425e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar && data->capacity() >= sizeof(VideoNativeMetadata)) { 1426e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar VideoNativeMetadata &metadata = *(VideoNativeMetadata *)(data->data()); 1427054219874873b41f1c815552987c10465c34ba2bLajos Molnar metadata.eType = kMetadataBufferTypeANWBuffer; 1428054219874873b41f1c815552987c10465c34ba2bLajos Molnar metadata.pBuffer = graphicBuffer == NULL ? NULL : graphicBuffer->getNativeBuffer(); 1429054219874873b41f1c815552987c10465c34ba2bLajos Molnar metadata.nFenceFd = -1; 1430054219874873b41f1c815552987c10465c34ba2bLajos Molnar } else { 1431e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar CLOG_ERROR(updateGraphicBufferInMeta, BAD_VALUE, "%s:%u, %#x bad type (%d) or size (%u)", 1432054219874873b41f1c815552987c10465c34ba2bLajos Molnar portString(portIndex), portIndex, buffer, mMetadataType[portIndex], header->nAllocLen); 1433054219874873b41f1c815552987c10465c34ba2bLajos Molnar return BAD_VALUE; 1434054219874873b41f1c815552987c10465c34ba2bLajos Molnar } 1435054219874873b41f1c815552987c10465c34ba2bLajos Molnar 1436f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_BUFFER(updateGraphicBufferInMeta, "%s:%u, %#x := %p", 143749605e8ab171a2b1f474645d632d3982f5f7b8e6Lajos Molnar portString(portIndex), portIndex, buffer, 143849605e8ab171a2b1f474645d632d3982f5f7b8e6Lajos Molnar graphicBuffer == NULL ? NULL : graphicBuffer->handle); 1439d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar return OK; 1440d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar} 1441d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar 14423fd200feb657c157125e45e30c2a7262e3c0244dChong Zhangstatus_t OMXNodeInstance::updateNativeHandleInMeta_l( 14433fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang OMX_U32 portIndex, const sp<NativeHandle>& nativeHandle, 1444d3ed3883c2d7bf3fb871be512055ed72cea964daPawin Vongmasa IOMX::buffer_id buffer, OMX_BUFFERHEADERTYPE *header) { 14457e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar // No need to check |nativeHandle| since NULL is valid for it as below. 14467e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar if (header == NULL) { 14477e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar ALOGE("b/25884056"); 14487e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar return BAD_VALUE; 14497e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar } 14507e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar 14517e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar if (portIndex != kPortIndexInput && portIndex != kPortIndexOutput) { 14527e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar return BAD_VALUE; 14537e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar } 14547e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar 14557e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar BufferMeta *bufferMeta = (BufferMeta *)(header->pAppPrivate); 145621b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang sp<ABuffer> data = bufferMeta->getBuffer(header, false /* limit */); 14577e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar bufferMeta->setNativeHandle(nativeHandle); 14587e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar if (mMetadataType[portIndex] == kMetadataBufferTypeNativeHandleSource 14597e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar && data->capacity() >= sizeof(VideoNativeHandleMetadata)) { 14607e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar VideoNativeHandleMetadata &metadata = *(VideoNativeHandleMetadata *)(data->data()); 14617e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar metadata.eType = mMetadataType[portIndex]; 14627e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar metadata.pHandle = 14637e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar nativeHandle == NULL ? NULL : const_cast<native_handle*>(nativeHandle->handle()); 14647e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar } else { 14657e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar CLOG_ERROR(updateNativeHandleInMeta, BAD_VALUE, "%s:%u, %#x bad type (%d) or size (%zu)", 14667e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar portString(portIndex), portIndex, buffer, mMetadataType[portIndex], data->capacity()); 14677e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar return BAD_VALUE; 14687e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar } 14697e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar 14707e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar CLOG_BUFFER(updateNativeHandleInMeta, "%s:%u, %#x := %p", 14717e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar portString(portIndex), portIndex, buffer, 14727e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar nativeHandle == NULL ? NULL : nativeHandle->handle()); 14737e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar return OK; 14747e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar} 14757e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar 1476addf2cbb120346ae42e78fa739245a353db5edadChong Zhangstatus_t OMXNodeInstance::setInputSurface( 1477addf2cbb120346ae42e78fa739245a353db5edadChong Zhang const sp<IOMXBufferSource> &bufferSource) { 1478addf2cbb120346ae42e78fa739245a353db5edadChong Zhang Mutex::Autolock autolock(mLock); 1479addf2cbb120346ae42e78fa739245a353db5edadChong Zhang 1480f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden status_t err; 1481f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden 1482d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar // only allow graphic source on input port, when there are no allocated buffers yet 1483addf2cbb120346ae42e78fa739245a353db5edadChong Zhang if (mNumPortBuffers[kPortIndexInput] > 0) { 1484d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar android_errorWriteLog(0x534e4554, "29422020"); 1485d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar return INVALID_OPERATION; 1486d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar } 1487d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar 14886d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang if (getBufferSource() != NULL) { 1489f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden return ALREADY_EXISTS; 1490f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden } 1491f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden 1492addf2cbb120346ae42e78fa739245a353db5edadChong Zhang err = storeMetaDataInBuffers_l(kPortIndexInput, OMX_TRUE, NULL); 1493f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden if (err != OK) { 1494f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden return err; 1495f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden } 1496f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden 1497f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden // Retrieve the width and height of the graphic buffer, set when the 1498f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden // codec was configured. 1499f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden OMX_PARAM_PORTDEFINITIONTYPE def; 1500f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar InitOMXParams(&def); 1501addf2cbb120346ae42e78fa739245a353db5edadChong Zhang def.nPortIndex = kPortIndexInput; 1502f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden OMX_ERRORTYPE oerr = OMX_GetParameter( 1503f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden mHandle, OMX_IndexParamPortDefinition, &def); 1504f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar if (oerr != OMX_ErrorNone) { 1505f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar OMX_INDEXTYPE index = OMX_IndexParamPortDefinition; 1506addf2cbb120346ae42e78fa739245a353db5edadChong Zhang CLOG_ERROR(getParameter, oerr, "%s(%#x): %s:%u", asString(index), 1507addf2cbb120346ae42e78fa739245a353db5edadChong Zhang index, portString(kPortIndexInput), kPortIndexInput); 1508f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar return UNKNOWN_ERROR; 1509f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } 1510f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden 1511ba6218eae3dbcf3f962b3561b26374a214dbf5e2Andy McFadden if (def.format.video.eColorFormat != OMX_COLOR_FormatAndroidOpaque) { 1512f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOGW("createInputSurface requires COLOR_FormatSurface " 1513f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar "(AndroidOpaque) color format instead of %s(%#x)", 1514f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar asString(def.format.video.eColorFormat), def.format.video.eColorFormat); 1515ba6218eae3dbcf3f962b3561b26374a214dbf5e2Andy McFadden return INVALID_OPERATION; 1516ba6218eae3dbcf3f962b3561b26374a214dbf5e2Andy McFadden } 1517ba6218eae3dbcf3f962b3561b26374a214dbf5e2Andy McFadden 1518addf2cbb120346ae42e78fa739245a353db5edadChong Zhang if (def.format.video.nFrameWidth == 0 1519addf2cbb120346ae42e78fa739245a353db5edadChong Zhang || def.format.video.nFrameHeight == 0) { 1520addf2cbb120346ae42e78fa739245a353db5edadChong Zhang ALOGE("Invalid video dimension %ux%u", 1521addf2cbb120346ae42e78fa739245a353db5edadChong Zhang def.format.video.nFrameWidth, 1522addf2cbb120346ae42e78fa739245a353db5edadChong Zhang def.format.video.nFrameHeight); 1523298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia return BAD_VALUE; 1524298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia } 1525298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia 1526addf2cbb120346ae42e78fa739245a353db5edadChong Zhang setBufferSource(bufferSource); 1527d291c222357303b9611cab89d0c3b047584ef377Chong Zhang return OK; 1528d291c222357303b9611cab89d0c3b047584ef377Chong Zhang} 1529d291c222357303b9611cab89d0c3b047584ef377Chong Zhang 1530a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnarstatus_t OMXNodeInstance::allocateSecureBuffer( 1531d3ed3883c2d7bf3fb871be512055ed72cea964daPawin Vongmasa OMX_U32 portIndex, size_t size, IOMX::buffer_id *buffer, 15321b40f2804a27b695e9e53fb1699b64cb0dd387f9Lajos Molnar void **buffer_data, sp<NativeHandle> *native_handle) { 1533a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnar if (buffer == NULL || buffer_data == NULL || native_handle == NULL) { 1534298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia ALOGE("b/25884056"); 1535298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia return BAD_VALUE; 1536298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia } 1537298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia 1538f80a1f5075a7c6e1982d37c68bfed7c9a611bb20Wei Jia if (portIndex >= NELEM(mSecureBufferType)) { 1539f80a1f5075a7c6e1982d37c68bfed7c9a611bb20Wei Jia ALOGE("b/31385713, portIndex(%u)", portIndex); 1540f80a1f5075a7c6e1982d37c68bfed7c9a611bb20Wei Jia android_errorWriteLog(0x534e4554, "31385713"); 1541f80a1f5075a7c6e1982d37c68bfed7c9a611bb20Wei Jia return BAD_VALUE; 1542f80a1f5075a7c6e1982d37c68bfed7c9a611bb20Wei Jia } 1543f80a1f5075a7c6e1982d37c68bfed7c9a611bb20Wei Jia 1544318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber Mutex::Autolock autoLock(mLock); 1545318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 154681b554b04c93aebf3e74116330024272770d2967Marco Nelissen if (!mSailed) { 154781b554b04c93aebf3e74116330024272770d2967Marco Nelissen ALOGE("b/35467458"); 154881b554b04c93aebf3e74116330024272770d2967Marco Nelissen android_errorWriteLog(0x534e4554, "35467458"); 154981b554b04c93aebf3e74116330024272770d2967Marco Nelissen return BAD_VALUE; 155081b554b04c93aebf3e74116330024272770d2967Marco Nelissen } 15517d54e8f905784fddcc4c37fd094d4e18a73767bcWonsik Kim if (mPortMode[portIndex] != IOMX::kPortModePresetSecureBuffer) { 15527d54e8f905784fddcc4c37fd094d4e18a73767bcWonsik Kim ALOGE("b/77486542"); 15537d54e8f905784fddcc4c37fd094d4e18a73767bcWonsik Kim android_errorWriteLog(0x534e4554, "77486542"); 15547d54e8f905784fddcc4c37fd094d4e18a73767bcWonsik Kim return INVALID_OPERATION; 15557d54e8f905784fddcc4c37fd094d4e18a73767bcWonsik Kim } 155621b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang BufferMeta *buffer_meta = new BufferMeta(portIndex); 1557318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 1558318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_BUFFERHEADERTYPE *header; 1559318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 1560318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_ERRORTYPE err = OMX_AllocateBuffer( 1561318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber mHandle, &header, portIndex, buffer_meta, size); 1562318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 1563318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber if (err != OMX_ErrorNone) { 1564f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_ERROR(allocateBuffer, err, BUFFER_FMT(portIndex, "%zu@", size)); 1565318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber delete buffer_meta; 1566318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber buffer_meta = NULL; 1567318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 1568318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber *buffer = 0; 1569318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 1570f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar return StatusFromOMXError(err); 1571318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber } 1572318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 157303b268eac37ca2589bfff0bf58daf79d29cc14f4Andreas Huber CHECK_EQ(header->pAppPrivate, buffer_meta); 157403b268eac37ca2589bfff0bf58daf79d29cc14f4Andreas Huber 1575609b815a3131d22da38b2f452faa9f89daad4039Andy Hung *buffer = makeBufferID(header); 1576a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnar if (mSecureBufferType[portIndex] == kSecureBufferTypeNativeHandle) { 1577a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnar *buffer_data = NULL; 15781b40f2804a27b695e9e53fb1699b64cb0dd387f9Lajos Molnar *native_handle = NativeHandle::create( 15791b40f2804a27b695e9e53fb1699b64cb0dd387f9Lajos Molnar (native_handle_t *)header->pBuffer, false /* ownsHandle */); 1580a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnar } else { 1581a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnar *buffer_data = header->pBuffer; 1582a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnar *native_handle = NULL; 1583a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnar } 1584318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 1585d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber addActiveBuffer(portIndex, *buffer); 1586d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber 15876d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang sp<IOMXBufferSource> bufferSource(getBufferSource()); 1588f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden if (bufferSource != NULL && portIndex == kPortIndexInput) { 15896d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang bufferSource->onInputBufferAdded(*buffer); 1590f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden } 1591a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnar CLOG_BUFFER(allocateSecureBuffer, NEW_BUFFER_FMT( 15921b40f2804a27b695e9e53fb1699b64cb0dd387f9Lajos Molnar *buffer, portIndex, "%zu@%p:%p", size, *buffer_data, 15931b40f2804a27b695e9e53fb1699b64cb0dd387f9Lajos Molnar *native_handle == NULL ? NULL : (*native_handle)->handle())); 1594f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden 1595318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber return OK; 1596318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 1597318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 1598318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::freeBuffer( 1599d3ed3883c2d7bf3fb871be512055ed72cea964daPawin Vongmasa OMX_U32 portIndex, IOMX::buffer_id buffer) { 1600318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber Mutex::Autolock autoLock(mLock); 1601f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_BUFFER(freeBuffer, "%s:%u %#x", portString(portIndex), portIndex, buffer); 1602318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 1603d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber removeActiveBuffer(portIndex, buffer); 1604d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber 160541eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim OMX_BUFFERHEADERTYPE *header = findBufferHeader(buffer, portIndex); 1606298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia if (header == NULL) { 1607298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia ALOGE("b/25884056"); 1608298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia return BAD_VALUE; 1609298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia } 1610318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber BufferMeta *buffer_meta = static_cast<BufferMeta *>(header->pAppPrivate); 1611318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 1612318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_ERRORTYPE err = OMX_FreeBuffer(mHandle, portIndex, header); 1613f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_IF_ERROR(freeBuffer, err, "%s:%u %#x", portString(portIndex), portIndex, buffer); 1614318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 1615318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber delete buffer_meta; 1616318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber buffer_meta = NULL; 1617609b815a3131d22da38b2f452faa9f89daad4039Andy Hung invalidateBufferID(buffer); 1618318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 1619318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber return StatusFromOMXError(err); 1620318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 1621318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 16223fd200feb657c157125e45e30c2a7262e3c0244dChong Zhangstatus_t OMXNodeInstance::fillBuffer( 1623d3ed3883c2d7bf3fb871be512055ed72cea964daPawin Vongmasa IOMX::buffer_id buffer, const OMXBuffer &omxBuffer, int fenceFd) { 1624318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber Mutex::Autolock autoLock(mLock); 1625318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 162641eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim OMX_BUFFERHEADERTYPE *header = findBufferHeader(buffer, kPortIndexOutput); 1627298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia if (header == NULL) { 1628298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia ALOGE("b/25884056"); 1629298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia return BAD_VALUE; 1630298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia } 16313fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang 16323fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang if (omxBuffer.mBufferType == OMXBuffer::kBufferTypeANWBuffer) { 16333fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang status_t err = updateGraphicBufferInMeta_l( 16343fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang kPortIndexOutput, omxBuffer.mGraphicBuffer, buffer, header); 16353fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang 16363fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang if (err != OK) { 16373fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang CLOG_ERROR(fillBuffer, err, FULL_BUFFER( 16383fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang (intptr_t)header->pBuffer, header, fenceFd)); 16393fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang return err; 16403fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang } 16413fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang } else if (omxBuffer.mBufferType != OMXBuffer::kBufferTypePreset) { 16423fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang return BAD_VALUE; 16433fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang } 16443fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang 1645318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber header->nFilledLen = 0; 1646318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber header->nOffset = 0; 1647318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber header->nFlags = 0; 1648318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 164915ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar // meta now owns fenceFd 165015ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar status_t res = storeFenceInMeta_l(header, fenceFd, kPortIndexOutput); 165115ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar if (res != OK) { 165215ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar CLOG_ERROR(fillBuffer::storeFenceInMeta, res, EMPTY_BUFFER(buffer, header, fenceFd)); 165315ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar return res; 165415ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar } 165515ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar 1656f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar { 1657f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar Mutex::Autolock _l(mDebugLock); 1658f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar mOutputBuffersWithCodec.add(header); 165915ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar CLOG_BUMPED_BUFFER(fillBuffer, WITH_STATS(EMPTY_BUFFER(buffer, header, fenceFd))); 1660f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } 1661318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 1662f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar OMX_ERRORTYPE err = OMX_FillThisBuffer(mHandle, header); 1663f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar if (err != OMX_ErrorNone) { 166415ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar CLOG_ERROR(fillBuffer, err, EMPTY_BUFFER(buffer, header, fenceFd)); 1665f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar Mutex::Autolock _l(mDebugLock); 1666f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar mOutputBuffersWithCodec.remove(header); 1667f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } 1668318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber return StatusFromOMXError(err); 1669318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 1670318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 1671318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::emptyBuffer( 16723fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang buffer_id buffer, const OMXBuffer &omxBuffer, 16733fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang OMX_U32 flags, OMX_TICKS timestamp, int fenceFd) { 1674d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang Mutex::Autolock autoLock(mLock); 1675d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang 1676d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang switch (omxBuffer.mBufferType) { 1677d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang case OMXBuffer::kBufferTypePreset: 1678d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang return emptyBuffer_l( 167949b2b4d30a0f74314630a5ea5f0e59697d90443eChong Zhang buffer, omxBuffer.mRangeOffset, omxBuffer.mRangeLength, 168049b2b4d30a0f74314630a5ea5f0e59697d90443eChong Zhang flags, timestamp, fenceFd); 16813fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang 1682d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang case OMXBuffer::kBufferTypeANWBuffer: 1683d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang return emptyGraphicBuffer_l( 16843fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang buffer, omxBuffer.mGraphicBuffer, flags, timestamp, fenceFd); 16853fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang 1686d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang case OMXBuffer::kBufferTypeNativeHandle: 1687d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang return emptyNativeHandleBuffer_l( 16883fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang buffer, omxBuffer.mNativeHandle, flags, timestamp, fenceFd); 1689d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang 1690d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang default: 1691d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang break; 16923fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang } 16933fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang 16943fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang return BAD_VALUE; 16953fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang} 16963fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang 1697d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhangstatus_t OMXNodeInstance::emptyBuffer_l( 1698d3ed3883c2d7bf3fb871be512055ed72cea964daPawin Vongmasa IOMX::buffer_id buffer, 1699318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_U32 rangeOffset, OMX_U32 rangeLength, 170015ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar OMX_U32 flags, OMX_TICKS timestamp, int fenceFd) { 1701318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 1702d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar // no emptybuffer if using input surface 17036d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang if (getBufferSource() != NULL) { 1704d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar android_errorWriteLog(0x534e4554, "29422020"); 1705d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar return INVALID_OPERATION; 1706d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar } 1707d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar 170841eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim OMX_BUFFERHEADERTYPE *header = findBufferHeader(buffer, kPortIndexInput); 1709298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia if (header == NULL) { 1710298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia ALOGE("b/25884056"); 1711298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia return BAD_VALUE; 1712298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia } 1713318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber BufferMeta *buffer_meta = 1714318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber static_cast<BufferMeta *>(header->pAppPrivate); 1715534bb6132a6a664f90b42b3ef81298b42efb3dc2Lajos Molnar 1716534bb6132a6a664f90b42b3ef81298b42efb3dc2Lajos Molnar // set up proper filled length if component is configured for gralloc metadata mode 1717534bb6132a6a664f90b42b3ef81298b42efb3dc2Lajos Molnar // ignore rangeOffset in this case (as client may be assuming ANW meta buffers). 1718534bb6132a6a664f90b42b3ef81298b42efb3dc2Lajos Molnar if (mMetadataType[kPortIndexInput] == kMetadataBufferTypeGrallocSource) { 1719534bb6132a6a664f90b42b3ef81298b42efb3dc2Lajos Molnar header->nFilledLen = rangeLength ? sizeof(VideoGrallocMetadata) : 0; 17205fb8b2987ab96ad65dc4b046616607ece16d6fb3Lajos Molnar header->nOffset = 0; 1721054219874873b41f1c815552987c10465c34ba2bLajos Molnar } else { 17225fb8b2987ab96ad65dc4b046616607ece16d6fb3Lajos Molnar // rangeLength and rangeOffset must be a subset of the allocated data in the buffer. 17235fb8b2987ab96ad65dc4b046616607ece16d6fb3Lajos Molnar // corner case: we permit rangeOffset == end-of-buffer with rangeLength == 0. 17245fb8b2987ab96ad65dc4b046616607ece16d6fb3Lajos Molnar if (rangeOffset > header->nAllocLen 17255fb8b2987ab96ad65dc4b046616607ece16d6fb3Lajos Molnar || rangeLength > header->nAllocLen - rangeOffset) { 1726ec4ed7d541f48d1d0af8f93cd26ec291ca82061bLajos Molnar CLOG_ERROR(emptyBuffer, OMX_ErrorBadParameter, FULL_BUFFER(NULL, header, fenceFd)); 17275fb8b2987ab96ad65dc4b046616607ece16d6fb3Lajos Molnar if (fenceFd >= 0) { 17285fb8b2987ab96ad65dc4b046616607ece16d6fb3Lajos Molnar ::close(fenceFd); 17295fb8b2987ab96ad65dc4b046616607ece16d6fb3Lajos Molnar } 17305fb8b2987ab96ad65dc4b046616607ece16d6fb3Lajos Molnar return BAD_VALUE; 17315fb8b2987ab96ad65dc4b046616607ece16d6fb3Lajos Molnar } 17325fb8b2987ab96ad65dc4b046616607ece16d6fb3Lajos Molnar header->nFilledLen = rangeLength; 17335fb8b2987ab96ad65dc4b046616607ece16d6fb3Lajos Molnar header->nOffset = rangeOffset; 17345fb8b2987ab96ad65dc4b046616607ece16d6fb3Lajos Molnar 1735ef777c71a051f519e0b6998ad663fa5bd291d48aLajos Molnar buffer_meta->CopyToOMX(header); 1736054219874873b41f1c815552987c10465c34ba2bLajos Molnar } 1737318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 173815ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar return emptyBuffer_l(header, flags, timestamp, (intptr_t)buffer, fenceFd); 1739f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar} 1740f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 1741f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar// log queued buffer activity for the next few input and/or output frames 1742f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar// if logging at internal state level 1743f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnarvoid OMXNodeInstance::bumpDebugLevel_l(size_t numInputBuffers, size_t numOutputBuffers) { 1744f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar if (DEBUG == ADebug::kDebugInternalState) { 1745f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar DEBUG_BUMP = ADebug::kDebugAll; 1746f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar if (numInputBuffers > 0) { 1747f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar mDebugLevelBumpPendingBuffers[kPortIndexInput] = numInputBuffers; 1748f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } 1749f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar if (numOutputBuffers > 0) { 1750f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar mDebugLevelBumpPendingBuffers[kPortIndexOutput] = numOutputBuffers; 1751f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } 1752f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } 1753f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar} 1754f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 1755f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnarvoid OMXNodeInstance::unbumpDebugLevel_l(size_t portIndex) { 1756f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar if (mDebugLevelBumpPendingBuffers[portIndex]) { 1757f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar --mDebugLevelBumpPendingBuffers[portIndex]; 1758f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } 1759f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar if (!mDebugLevelBumpPendingBuffers[0] 1760f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar && !mDebugLevelBumpPendingBuffers[1]) { 1761f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar DEBUG_BUMP = DEBUG; 1762f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } 1763f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar} 1764f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 176515ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnarstatus_t OMXNodeInstance::storeFenceInMeta_l( 176615ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar OMX_BUFFERHEADERTYPE *header, int fenceFd, OMX_U32 portIndex) { 176715ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar // propagate fence if component supports it; wait for it otherwise 176815ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar OMX_U32 metaSize = portIndex == kPortIndexInput ? header->nFilledLen : header->nAllocLen; 176915ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar if (mMetadataType[portIndex] == kMetadataBufferTypeANWBuffer 177015ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar && metaSize >= sizeof(VideoNativeMetadata)) { 177115ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar VideoNativeMetadata &nativeMeta = *(VideoNativeMetadata *)(header->pBuffer); 177215ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar if (nativeMeta.nFenceFd >= 0) { 177315ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar ALOGE("fence (%d) already exists in meta", nativeMeta.nFenceFd); 177415ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar if (fenceFd >= 0) { 177515ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar ::close(fenceFd); 177615ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar } 177715ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar return ALREADY_EXISTS; 177815ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar } 177915ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar nativeMeta.nFenceFd = fenceFd; 178015ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar } else if (fenceFd >= 0) { 178115ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar CLOG_BUFFER(storeFenceInMeta, "waiting for fence %d", fenceFd); 178215ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar sp<Fence> fence = new Fence(fenceFd); 178315ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar return fence->wait(IOMX::kFenceTimeoutMs); 178415ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar } 178515ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar return OK; 178615ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar} 178715ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar 178815ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnarint OMXNodeInstance::retrieveFenceFromMeta_l( 178915ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar OMX_BUFFERHEADERTYPE *header, OMX_U32 portIndex) { 179015ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar OMX_U32 metaSize = portIndex == kPortIndexInput ? header->nAllocLen : header->nFilledLen; 179115ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar int fenceFd = -1; 179215ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar if (mMetadataType[portIndex] == kMetadataBufferTypeANWBuffer 179315ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar && header->nAllocLen >= sizeof(VideoNativeMetadata)) { 179415ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar VideoNativeMetadata &nativeMeta = *(VideoNativeMetadata *)(header->pBuffer); 179515ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar if (nativeMeta.eType == kMetadataBufferTypeANWBuffer) { 179615ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar fenceFd = nativeMeta.nFenceFd; 179715ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar nativeMeta.nFenceFd = -1; 179815ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar } 179915ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar if (metaSize < sizeof(nativeMeta) && fenceFd >= 0) { 180015ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar CLOG_ERROR(foundFenceInEmptyMeta, BAD_VALUE, FULL_BUFFER( 180115ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar NULL, header, nativeMeta.nFenceFd)); 180215ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar fenceFd = -1; 180315ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar } 180415ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar } 180515ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar return fenceFd; 180615ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar} 180715ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar 1808f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnarstatus_t OMXNodeInstance::emptyBuffer_l( 180915ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar OMX_BUFFERHEADERTYPE *header, OMX_U32 flags, OMX_TICKS timestamp, 181015ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar intptr_t debugAddr, int fenceFd) { 1811f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar header->nFlags = flags; 1812f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar header->nTimeStamp = timestamp; 1813f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 181415ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar status_t res = storeFenceInMeta_l(header, fenceFd, kPortIndexInput); 181515ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar if (res != OK) { 181615ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar CLOG_ERROR(emptyBuffer::storeFenceInMeta, res, WITH_STATS( 181715ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar FULL_BUFFER(debugAddr, header, fenceFd))); 181815ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar return res; 181915ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar } 182015ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar 1821f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar { 1822f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar Mutex::Autolock _l(mDebugLock); 1823f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar mInputBuffersWithCodec.add(header); 1824f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 1825f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar // bump internal-state debug level for 2 input frames past a buffer with CSD 1826f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar if ((flags & OMX_BUFFERFLAG_CODECCONFIG) != 0) { 1827f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar bumpDebugLevel_l(2 /* numInputBuffers */, 0 /* numOutputBuffers */); 1828f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } 1829f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 183015ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar CLOG_BUMPED_BUFFER(emptyBuffer, WITH_STATS(FULL_BUFFER(debugAddr, header, fenceFd))); 1831f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } 1832f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 1833318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_ERRORTYPE err = OMX_EmptyThisBuffer(mHandle, header); 183415ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar CLOG_IF_ERROR(emptyBuffer, err, FULL_BUFFER(debugAddr, header, fenceFd)); 1835f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 1836f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar { 1837f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar Mutex::Autolock _l(mDebugLock); 1838f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar if (err != OMX_ErrorNone) { 1839f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar mInputBuffersWithCodec.remove(header); 1840f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } else if (!(flags & OMX_BUFFERFLAG_CODECCONFIG)) { 1841f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar unbumpDebugLevel_l(kPortIndexInput); 1842f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } 1843f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } 1844318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 1845318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber return StatusFromOMXError(err); 1846318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 1847318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 1848f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden// like emptyBuffer, but the data is already in header->pBuffer 1849d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhangstatus_t OMXNodeInstance::emptyGraphicBuffer_l( 1850d3ed3883c2d7bf3fb871be512055ed72cea964daPawin Vongmasa IOMX::buffer_id buffer, const sp<GraphicBuffer> &graphicBuffer, 18513604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang OMX_U32 flags, OMX_TICKS timestamp, int fenceFd) { 18526cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang OMX_BUFFERHEADERTYPE *header = findBufferHeader(buffer, kPortIndexInput); 1853298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia if (header == NULL) { 1854298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia ALOGE("b/25884056"); 1855298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia return BAD_VALUE; 1856298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia } 1857298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia 1858e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar status_t err = updateGraphicBufferInMeta_l( 185921b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang kPortIndexInput, graphicBuffer, buffer, header); 1860054219874873b41f1c815552987c10465c34ba2bLajos Molnar if (err != OK) { 186115ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar CLOG_ERROR(emptyGraphicBuffer, err, FULL_BUFFER( 186215ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar (intptr_t)header->pBuffer, header, fenceFd)); 1863054219874873b41f1c815552987c10465c34ba2bLajos Molnar return err; 1864054219874873b41f1c815552987c10465c34ba2bLajos Molnar } 1865f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden 18663604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang int64_t codecTimeUs = getCodecTimestamp(timestamp); 18676d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang 1868054219874873b41f1c815552987c10465c34ba2bLajos Molnar header->nOffset = 0; 1869e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar if (graphicBuffer == NULL) { 1870e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar header->nFilledLen = 0; 1871e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar } else if (mMetadataType[kPortIndexInput] == kMetadataBufferTypeGrallocSource) { 1872e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar header->nFilledLen = sizeof(VideoGrallocMetadata); 1873e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar } else { 1874e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar header->nFilledLen = sizeof(VideoNativeMetadata); 1875e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar } 18763604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang return emptyBuffer_l(header, flags, codecTimeUs, (intptr_t)header->pBuffer, fenceFd); 18773604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang} 18783604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang 18793604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhangstatus_t OMXNodeInstance::setMaxPtsGapUs(const void *params, size_t size) { 18803604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang if (params == NULL || size != sizeof(OMX_PARAM_U32TYPE)) { 18813604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang CLOG_ERROR(setMaxPtsGapUs, BAD_VALUE, "invalid params (%p,%zu)", params, size); 18823604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang return BAD_VALUE; 18833604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang } 18843604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang 18856c2d0add22ee72566623834bbfeb6170b4c94588Chong Zhang // The incoming number is an int32_t contained in OMX_U32. 18866c2d0add22ee72566623834bbfeb6170b4c94588Chong Zhang // Cast to int32_t first then int64_t. 18876c2d0add22ee72566623834bbfeb6170b4c94588Chong Zhang mMaxTimestampGapUs = (int32_t)((OMX_PARAM_U32TYPE*)params)->nU32; 18883604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang 18893604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang return OK; 18903604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang} 18913604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang 18923604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhangint64_t OMXNodeInstance::getCodecTimestamp(OMX_TICKS timestamp) { 18933604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang int64_t originalTimeUs = timestamp; 18943604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang 18953604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang if (mMaxTimestampGapUs > 0ll) { 18963604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang /* Cap timestamp gap between adjacent frames to specified max 18973604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang * 18983604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang * In the scenario of cast mirroring, encoding could be suspended for 18993604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang * prolonged periods. Limiting the pts gap to workaround the problem 19003604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang * where encoder's rate control logic produces huge frames after a 19013604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang * long period of suspension. 19023604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang */ 19033604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang if (mPrevOriginalTimeUs >= 0ll) { 19043604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang int64_t timestampGapUs = originalTimeUs - mPrevOriginalTimeUs; 19053604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang timestamp = (timestampGapUs < mMaxTimestampGapUs ? 19063604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang timestampGapUs : mMaxTimestampGapUs) + mPrevModifiedTimeUs; 19073604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang } 19083604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang ALOGV("IN timestamp: %lld -> %lld", 19093604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang static_cast<long long>(originalTimeUs), 19103604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang static_cast<long long>(timestamp)); 19116c2d0add22ee72566623834bbfeb6170b4c94588Chong Zhang } else if (mMaxTimestampGapUs < 0ll) { 19126c2d0add22ee72566623834bbfeb6170b4c94588Chong Zhang /* 19136c2d0add22ee72566623834bbfeb6170b4c94588Chong Zhang * Apply a fixed timestamp gap between adjacent frames. 19146c2d0add22ee72566623834bbfeb6170b4c94588Chong Zhang * 19156c2d0add22ee72566623834bbfeb6170b4c94588Chong Zhang * This is used by scenarios like still image capture where timestamps 19166c2d0add22ee72566623834bbfeb6170b4c94588Chong Zhang * on frames could go forward or backward. Some encoders may silently 19176c2d0add22ee72566623834bbfeb6170b4c94588Chong Zhang * drop frames when it goes backward (or even stay unchanged). 19186c2d0add22ee72566623834bbfeb6170b4c94588Chong Zhang */ 19196c2d0add22ee72566623834bbfeb6170b4c94588Chong Zhang if (mPrevOriginalTimeUs >= 0ll) { 19206c2d0add22ee72566623834bbfeb6170b4c94588Chong Zhang timestamp = mPrevModifiedTimeUs - mMaxTimestampGapUs; 19216c2d0add22ee72566623834bbfeb6170b4c94588Chong Zhang } 19226c2d0add22ee72566623834bbfeb6170b4c94588Chong Zhang ALOGV("IN timestamp: %lld -> %lld", 19236c2d0add22ee72566623834bbfeb6170b4c94588Chong Zhang static_cast<long long>(originalTimeUs), 19246c2d0add22ee72566623834bbfeb6170b4c94588Chong Zhang static_cast<long long>(timestamp)); 19253604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang } 19263604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang 19273604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang mPrevOriginalTimeUs = originalTimeUs; 19283604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang mPrevModifiedTimeUs = timestamp; 19293604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang 19306c2d0add22ee72566623834bbfeb6170b4c94588Chong Zhang if (mMaxTimestampGapUs != 0ll && !mRestorePtsFailed) { 19313604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang mOriginalTimeUs.add(timestamp, originalTimeUs); 19323604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang } 19333604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang 19343604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang return timestamp; 1935f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden} 1936f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden 1937d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhangstatus_t OMXNodeInstance::emptyNativeHandleBuffer_l( 1938d3ed3883c2d7bf3fb871be512055ed72cea964daPawin Vongmasa IOMX::buffer_id buffer, const sp<NativeHandle> &nativeHandle, 19393fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang OMX_U32 flags, OMX_TICKS timestamp, int fenceFd) { 19403fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang OMX_BUFFERHEADERTYPE *header = findBufferHeader(buffer, kPortIndexInput); 19413fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang if (header == NULL) { 19423fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang ALOGE("b/25884056"); 19433fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang return BAD_VALUE; 19443fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang } 19453fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang 19463fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang status_t err = updateNativeHandleInMeta_l( 19473fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang kPortIndexInput, nativeHandle, buffer, header); 19483fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang if (err != OK) { 1949d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang CLOG_ERROR(emptyNativeHandleBuffer_l, err, FULL_BUFFER( 19503fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang (intptr_t)header->pBuffer, header, fenceFd)); 19513fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang return err; 19523fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang } 19533fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang 19543fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang header->nOffset = 0; 19553fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang header->nFilledLen = (nativeHandle == NULL) ? 0 : sizeof(VideoNativeMetadata); 19563fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang 19573fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang return emptyBuffer_l(header, flags, timestamp, (intptr_t)header->pBuffer, fenceFd); 19583fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang} 19593fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang 19606d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhangvoid OMXNodeInstance::codecBufferFilled(omx_message &msg) { 1961331207d51a620bf018081950da4b20133014657fChong Zhang Mutex::Autolock autoLock(mLock); 1962318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 19636c2d0add22ee72566623834bbfeb6170b4c94588Chong Zhang if (mMaxTimestampGapUs == 0ll || mRestorePtsFailed) { 19646d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang return; 1965f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } 1966f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 19676d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang OMX_U32 &flags = msg.u.extended_buffer_data.flags; 19686d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang OMX_TICKS ×tamp = msg.u.extended_buffer_data.timestamp; 19696d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang 19706d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang if (!(flags & OMX_BUFFERFLAG_CODECCONFIG)) { 19716d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang ssize_t index = mOriginalTimeUs.indexOfKey(timestamp); 19726d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang if (index >= 0) { 19736d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang ALOGV("OUT timestamp: %lld -> %lld", 19746d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang static_cast<long long>(timestamp), 19756d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang static_cast<long long>(mOriginalTimeUs[index])); 19766d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang timestamp = mOriginalTimeUs[index]; 19776d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang mOriginalTimeUs.removeItemsAt(index); 19786d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang } else { 19796d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang // giving up the effort as encoder doesn't appear to preserve pts 19806d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang ALOGW("giving up limiting timestamp gap (pts = %lld)", timestamp); 19816d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang mRestorePtsFailed = true; 19826d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang } 1983dd81af7ef969981748f35ec839869d34ed0cc768Lajos Molnar } 1984dd81af7ef969981748f35ec839869d34ed0cc768Lajos Molnar} 1985dd81af7ef969981748f35ec839869d34ed0cc768Lajos Molnar 19866d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhangstatus_t OMXNodeInstance::getExtensionIndex( 19876d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang const char *parameterName, OMX_INDEXTYPE *index) { 19886d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang Mutex::Autolock autoLock(mLock); 1989e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber 19906d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang OMX_ERRORTYPE err = OMX_GetExtensionIndex( 19916d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang mHandle, const_cast<char *>(parameterName), index); 1992e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber 19936d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang return StatusFromOMXError(err); 1994e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber} 1995e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber 1996d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhangstatus_t OMXNodeInstance::dispatchMessage(const omx_message &msg) { 1997d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang mDispatcher->post(msg, true /*realTime*/); 199821b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang return OK; 199921b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang} 200021b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang 200121b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhangstatus_t OMXNodeInstance::setQuirks(OMX_U32 quirks) { 200221b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang if (quirks & ~kQuirksMask) { 200321b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang return BAD_VALUE; 200421b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang } 200521b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang 200621b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang mQuirks = quirks; 200721b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang 200821b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang return OK; 2009d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang} 2010d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang 201126a48f304a8754d655e554178ffb6d7ba4c5aac3Lajos Molnarbool OMXNodeInstance::handleMessage(omx_message &msg) { 2012318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber if (msg.type == omx_message::FILL_BUFFER_DONE) { 2013318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_BUFFERHEADERTYPE *buffer = 201441eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim findBufferHeader(msg.u.extended_buffer_data.buffer, kPortIndexOutput); 2015298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia if (buffer == NULL) { 2016298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia ALOGE("b/25884056"); 201741eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim return false; 2018298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia } 2019318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 2020f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar { 2021f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar Mutex::Autolock _l(mDebugLock); 2022f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar mOutputBuffersWithCodec.remove(buffer); 2023f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 2024f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_BUMPED_BUFFER( 202515ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar FBD, WITH_STATS(FULL_BUFFER( 202615ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar msg.u.extended_buffer_data.buffer, buffer, msg.fenceFd))); 2027f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 2028f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar unbumpDebugLevel_l(kPortIndexOutput); 2029f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } 2030f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 2031318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber BufferMeta *buffer_meta = 2032318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber static_cast<BufferMeta *>(buffer->pAppPrivate); 2033318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 2034ec4ed7d541f48d1d0af8f93cd26ec291ca82061bLajos Molnar if (buffer->nOffset + buffer->nFilledLen < buffer->nOffset 2035ec4ed7d541f48d1d0af8f93cd26ec291ca82061bLajos Molnar || buffer->nOffset + buffer->nFilledLen > buffer->nAllocLen) { 2036ec4ed7d541f48d1d0af8f93cd26ec291ca82061bLajos Molnar CLOG_ERROR(onFillBufferDone, OMX_ErrorBadParameter, 2037ec4ed7d541f48d1d0af8f93cd26ec291ca82061bLajos Molnar FULL_BUFFER(NULL, buffer, msg.fenceFd)); 2038ec4ed7d541f48d1d0af8f93cd26ec291ca82061bLajos Molnar } 2039ef777c71a051f519e0b6998ad663fa5bd291d48aLajos Molnar buffer_meta->CopyFromOMX(buffer); 20401b4ca5cebd7f42a8f8842e45bfabe19001e9a435Andreas Huber 20416d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang // fix up the buffer info (especially timestamp) if needed 20426d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang codecBufferFilled(msg); 204394ee4b708acfa941581160b267afb79192b1d816Chong Zhang } else if (msg.type == omx_message::EMPTY_BUFFER_DONE) { 2044f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar OMX_BUFFERHEADERTYPE *buffer = 204541eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim findBufferHeader(msg.u.buffer_data.buffer, kPortIndexInput); 204641eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim if (buffer == NULL) { 204741eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim return false; 204841eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim } 2049f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 2050f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar { 2051f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar Mutex::Autolock _l(mDebugLock); 2052f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar mInputBuffersWithCodec.remove(buffer); 2053f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 2054f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_BUMPED_BUFFER( 205515ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar EBD, WITH_STATS(EMPTY_BUFFER(msg.u.buffer_data.buffer, buffer, msg.fenceFd))); 2056f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } 2057f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 20586d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang const sp<IOMXBufferSource> bufferSource(getBufferSource()); 20596d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang 206094ee4b708acfa941581160b267afb79192b1d816Chong Zhang if (bufferSource != NULL) { 20616d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang // This is one of the buffers used exclusively by IOMXBufferSource. 20621b4ca5cebd7f42a8f8842e45bfabe19001e9a435Andreas Huber // Don't dispatch a message back to ACodec, since it doesn't 20631b4ca5cebd7f42a8f8842e45bfabe19001e9a435Andreas Huber // know that anyone asked to have the buffer emptied and will 20641b4ca5cebd7f42a8f8842e45bfabe19001e9a435Andreas Huber // be very confused. 20656d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang bufferSource->onInputBufferEmptied( 20666d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang msg.u.buffer_data.buffer, OMXFenceParcelable(msg.fenceFd)); 206726a48f304a8754d655e554178ffb6d7ba4c5aac3Lajos Molnar return true; 206826a48f304a8754d655e554178ffb6d7ba4c5aac3Lajos Molnar } 20696cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang } else if (msg.type == omx_message::EVENT && 20706cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang msg.u.event_data.event == OMX_EventDataSpaceChanged) { 20716cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang handleDataSpaceChanged(msg); 207226a48f304a8754d655e554178ffb6d7ba4c5aac3Lajos Molnar } 207326a48f304a8754d655e554178ffb6d7ba4c5aac3Lajos Molnar 207426a48f304a8754d655e554178ffb6d7ba4c5aac3Lajos Molnar return false; 207526a48f304a8754d655e554178ffb6d7ba4c5aac3Lajos Molnar} 207626a48f304a8754d655e554178ffb6d7ba4c5aac3Lajos Molnar 20776cf9a1238986880536de705255f7c2c91c1ba719Chong Zhangbool OMXNodeInstance::handleDataSpaceChanged(omx_message &msg) { 20786cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang android_dataspace dataSpace = (android_dataspace) msg.u.event_data.data1; 20796cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang android_dataspace origDataSpace = dataSpace; 20806cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang 20816cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang if (!ColorUtils::convertDataSpaceToV0(dataSpace)) { 20826cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang // Do not process the data space change, don't notify client either 20836cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang return true; 20846cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang } 20856cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang 20866cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang android_pixel_format pixelFormat = (android_pixel_format)msg.u.event_data.data3; 20876cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang 20886cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang ColorAspects requestedAspects = ColorUtils::unpackToColorAspects(msg.u.event_data.data2); 20896cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang ColorAspects aspects = requestedAspects; // initially requested aspects 20906cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang 20916cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang // request color aspects to encode 20926cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang OMX_INDEXTYPE index; 20936cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang status_t err = getExtensionIndex( 20946cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang "OMX.google.android.index.describeColorAspects", &index); 20956cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang if (err == OK) { 20966cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang // V0 dataspace 20976cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang DescribeColorAspectsParams params; 20986cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang InitOMXParams(¶ms); 20996cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang params.nPortIndex = kPortIndexInput; 21006cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang params.nDataSpace = origDataSpace; 21016cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang params.nPixelFormat = pixelFormat; 21026cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang params.bDataSpaceChanged = OMX_TRUE; 21036cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang params.sAspects = requestedAspects; 21046cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang 21056cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang err = getConfig(index, ¶ms, sizeof(params)); 21066cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang if (err == OK) { 21076cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang aspects = params.sAspects; 21086cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang ALOGD("Codec resolved it to (R:%d(%s), P:%d(%s), M:%d(%s), T:%d(%s)) err=%d(%s)", 21096cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang params.sAspects.mRange, asString(params.sAspects.mRange), 21106cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang params.sAspects.mPrimaries, asString(params.sAspects.mPrimaries), 21116cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang params.sAspects.mMatrixCoeffs, asString(params.sAspects.mMatrixCoeffs), 21126cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang params.sAspects.mTransfer, asString(params.sAspects.mTransfer), 21136cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang err, asString(err)); 21146cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang } else { 21156cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang params.sAspects = aspects; 21166cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang err = OK; 21176cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang } 21186cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang params.bDataSpaceChanged = OMX_FALSE; 21196cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang for (int triesLeft = 2; --triesLeft >= 0; ) { 21206cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang status_t err = setConfig(index, ¶ms, sizeof(params)); 21216cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang if (err == OK) { 21226cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang err = getConfig(index, ¶ms, sizeof(params)); 21236cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang } 21246cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang if (err != OK || !ColorUtils::checkIfAspectsChangedAndUnspecifyThem( 21256cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang params.sAspects, aspects)) { 21266cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang // if we can't set or get color aspects, still communicate dataspace to client 21276cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang break; 21286cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang } 21296cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang 21306cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang ALOGW_IF(triesLeft == 0, "Codec repeatedly changed requested ColorAspects."); 21316cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang } 21326cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang } 21336cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang 21346cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang ALOGV("Set color aspects to (R:%d(%s), P:%d(%s), M:%d(%s), T:%d(%s)) err=%d(%s)", 21356cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang aspects.mRange, asString(aspects.mRange), 21366cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang aspects.mPrimaries, asString(aspects.mPrimaries), 21376cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang aspects.mMatrixCoeffs, asString(aspects.mMatrixCoeffs), 21386cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang aspects.mTransfer, asString(aspects.mTransfer), 21396cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang err, asString(err)); 21406cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang 21416cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang // signal client that the dataspace has changed; this will update the output format 21426cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang // TODO: we should tie this to an output buffer somehow, and signal the change 21436cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang // just before the output buffer is returned to the client, but there are many 21446cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang // ways this could fail (e.g. flushing), and we are not yet supporting this scenario. 21456cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang 21466cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang msg.u.event_data.data1 = (OMX_U32) dataSpace; 21476cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang msg.u.event_data.data2 = (OMX_U32) ColorUtils::packToU32(aspects); 21486cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang 21496cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang return false; 21506cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang} 21516cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang 215226a48f304a8754d655e554178ffb6d7ba4c5aac3Lajos Molnarvoid OMXNodeInstance::onMessages(std::list<omx_message> &messages) { 215326a48f304a8754d655e554178ffb6d7ba4c5aac3Lajos Molnar for (std::list<omx_message>::iterator it = messages.begin(); it != messages.end(); ) { 215426a48f304a8754d655e554178ffb6d7ba4c5aac3Lajos Molnar if (handleMessage(*it)) { 215526a48f304a8754d655e554178ffb6d7ba4c5aac3Lajos Molnar messages.erase(it++); 215626a48f304a8754d655e554178ffb6d7ba4c5aac3Lajos Molnar } else { 215726a48f304a8754d655e554178ffb6d7ba4c5aac3Lajos Molnar ++it; 21581b4ca5cebd7f42a8f8842e45bfabe19001e9a435Andreas Huber } 2159318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber } 2160318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 2161984a54322f7c70bc75e862d91bdd975814872affLajos Molnar if (!messages.empty()) { 2162984a54322f7c70bc75e862d91bdd975814872affLajos Molnar mObserver->onMessages(messages); 2163984a54322f7c70bc75e862d91bdd975814872affLajos Molnar } 2164318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 2165318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 2166d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhangvoid OMXNodeInstance::onObserverDied() { 216729357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("!!! Observer died. Quickly, do something, ... anything..."); 2168318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 2169318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber // Try to force shutdown of the node and hope for the best. 2170d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang freeNode(); 2171318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 2172318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 2173f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden// OMXNodeInstance::OnEvent calls OMX::OnEvent, which then calls here. 2174f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden// Don't try to acquire mLock here -- in rare circumstances this will hang. 2175f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFaddenvoid OMXNodeInstance::onEvent( 2176f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden OMX_EVENTTYPE event, OMX_U32 arg1, OMX_U32 arg2) { 2177f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar const char *arg1String = "??"; 2178f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar const char *arg2String = "??"; 2179f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar ADebug::Level level = ADebug::kDebugInternalState; 2180f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 2181f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar switch (event) { 2182f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar case OMX_EventCmdComplete: 2183f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar arg1String = asString((OMX_COMMANDTYPE)arg1); 2184f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar switch (arg1) { 2185f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar case OMX_CommandStateSet: 2186f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar arg2String = asString((OMX_STATETYPE)arg2); 2187f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar level = ADebug::kDebugState; 2188f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar break; 2189f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar case OMX_CommandFlush: 2190f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar case OMX_CommandPortEnable: 2191f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar { 2192f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar // bump internal-state debug level for 2 input and output frames 2193f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar Mutex::Autolock _l(mDebugLock); 2194f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar bumpDebugLevel_l(2 /* numInputBuffers */, 2 /* numOutputBuffers */); 2195f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } 2196f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar // fall through 2197f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar default: 2198f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar arg2String = portString(arg2); 2199f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } 2200f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar break; 2201f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar case OMX_EventError: 2202f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar arg1String = asString((OMX_ERRORTYPE)arg1); 2203f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar level = ADebug::kDebugLifeCycle; 2204f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar break; 2205f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar case OMX_EventPortSettingsChanged: 2206f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar arg2String = asString((OMX_INDEXEXTTYPE)arg2); 2207f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar // fall through 2208f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar default: 2209f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar arg1String = portString(arg1); 2210f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } 2211f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 2212f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOGI_(level, onEvent, "%s(%x), %s(%x), %s(%x)", 2213f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar asString(event), event, arg1String, arg1, arg2String, arg2); 22146d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang const sp<IOMXBufferSource> bufferSource(getBufferSource()); 2215f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden 2216e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber if (bufferSource != NULL 2217e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber && event == OMX_EventCmdComplete 2218e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber && arg1 == OMX_CommandStateSet 2219e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber && arg2 == OMX_StateExecuting) { 22206d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang bufferSource->onOmxExecuting(); 2221f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden } 22226392ae13cf6e15c706fce45396ec1e79af6171a9Lajos Molnar 22236392ae13cf6e15c706fce45396ec1e79af6171a9Lajos Molnar // allow configuration if we return to the loaded state 22246392ae13cf6e15c706fce45396ec1e79af6171a9Lajos Molnar if (event == OMX_EventCmdComplete 22256392ae13cf6e15c706fce45396ec1e79af6171a9Lajos Molnar && arg1 == OMX_CommandStateSet 22266392ae13cf6e15c706fce45396ec1e79af6171a9Lajos Molnar && arg2 == OMX_StateLoaded) { 22276392ae13cf6e15c706fce45396ec1e79af6171a9Lajos Molnar mSailed = false; 22286392ae13cf6e15c706fce45396ec1e79af6171a9Lajos Molnar } 2229f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden} 2230f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden 2231318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber// static 2232318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas HuberOMX_ERRORTYPE OMXNodeInstance::OnEvent( 223384333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber OMX_IN OMX_HANDLETYPE /* hComponent */, 2234318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_IN OMX_PTR pAppData, 2235318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_IN OMX_EVENTTYPE eEvent, 2236318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_IN OMX_U32 nData1, 2237318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_IN OMX_U32 nData2, 2238318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_IN OMX_PTR pEventData) { 2239298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia if (pAppData == NULL) { 2240298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia ALOGE("b/25884056"); 2241298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia return OMX_ErrorBadParameter; 2242298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia } 2243318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMXNodeInstance *instance = static_cast<OMXNodeInstance *>(pAppData); 2244134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber if (instance->mDying) { 2245134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber return OMX_ErrorNone; 2246134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber } 2247d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang 2248d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang instance->onEvent(eEvent, nData1, nData2); 2249d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang 2250d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang // output rendered events are not processed as regular events until they hit the observer 2251d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang if (eEvent == OMX_EventOutputRendered) { 2252d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang if (pEventData == NULL) { 2253d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang return OMX_ErrorBadParameter; 2254d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang } 2255d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang 2256d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang // process data from array 2257d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang OMX_VIDEO_RENDEREVENTTYPE *renderData = (OMX_VIDEO_RENDEREVENTTYPE *)pEventData; 2258d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang for (size_t i = 0; i < nData1; ++i) { 2259d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang omx_message msg; 2260d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang msg.type = omx_message::FRAME_RENDERED; 2261d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang msg.fenceFd = -1; 2262d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang msg.u.render_data.timestamp = renderData[i].nMediaTimeUs; 2263d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang msg.u.render_data.nanoTime = renderData[i].nSystemTimeNs; 226436f05c7f071e5c877e65943fe181d2b48c7bd6b0Lajos Molnar bool realTime = msg.u.render_data.timestamp == INT64_MAX; 226536f05c7f071e5c877e65943fe181d2b48c7bd6b0Lajos Molnar instance->mDispatcher->post(msg, realTime); 2266d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang } 2267d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang return OMX_ErrorNone; 2268d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang } 2269d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang 2270d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang omx_message msg; 2271d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang msg.type = omx_message::EVENT; 2272d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang msg.fenceFd = -1; 2273d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang msg.u.event_data.event = eEvent; 2274d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang msg.u.event_data.data1 = nData1; 2275d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang msg.u.event_data.data2 = nData2; 2276d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang 2277d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang instance->mDispatcher->post(msg, true /* realTime */); 2278d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang 2279d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang return OMX_ErrorNone; 2280318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 2281318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 2282318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber// static 2283318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas HuberOMX_ERRORTYPE OMXNodeInstance::OnEmptyBufferDone( 228484333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber OMX_IN OMX_HANDLETYPE /* hComponent */, 2285318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_IN OMX_PTR pAppData, 2286318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_IN OMX_BUFFERHEADERTYPE* pBuffer) { 2287298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia if (pAppData == NULL) { 2288298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia ALOGE("b/25884056"); 2289298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia return OMX_ErrorBadParameter; 2290298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia } 2291318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMXNodeInstance *instance = static_cast<OMXNodeInstance *>(pAppData); 2292134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber if (instance->mDying) { 2293134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber return OMX_ErrorNone; 2294134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber } 229515ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar int fenceFd = instance->retrieveFenceFromMeta_l(pBuffer, kPortIndexOutput); 2296d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang 2297d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang omx_message msg; 2298d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang msg.type = omx_message::EMPTY_BUFFER_DONE; 2299d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang msg.fenceFd = fenceFd; 2300d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang msg.u.buffer_data.buffer = instance->findBufferID(pBuffer); 2301d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang instance->mDispatcher->post(msg); 2302d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang 2303d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang return OMX_ErrorNone; 2304318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 2305318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 2306318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber// static 2307318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas HuberOMX_ERRORTYPE OMXNodeInstance::OnFillBufferDone( 230884333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber OMX_IN OMX_HANDLETYPE /* hComponent */, 2309318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_IN OMX_PTR pAppData, 2310318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_IN OMX_BUFFERHEADERTYPE* pBuffer) { 2311298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia if (pAppData == NULL) { 2312298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia ALOGE("b/25884056"); 2313298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia return OMX_ErrorBadParameter; 2314298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia } 2315318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMXNodeInstance *instance = static_cast<OMXNodeInstance *>(pAppData); 2316134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber if (instance->mDying) { 2317134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber return OMX_ErrorNone; 2318134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber } 231915ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar int fenceFd = instance->retrieveFenceFromMeta_l(pBuffer, kPortIndexOutput); 2320d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang 2321d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang omx_message msg; 2322d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang msg.type = omx_message::FILL_BUFFER_DONE; 2323d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang msg.fenceFd = fenceFd; 2324d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang msg.u.extended_buffer_data.buffer = instance->findBufferID(pBuffer); 2325d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang msg.u.extended_buffer_data.range_offset = pBuffer->nOffset; 2326d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang msg.u.extended_buffer_data.range_length = pBuffer->nFilledLen; 2327d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang msg.u.extended_buffer_data.flags = pBuffer->nFlags; 2328d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang msg.u.extended_buffer_data.timestamp = pBuffer->nTimeStamp; 2329d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang instance->mDispatcher->post(msg); 2330d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang 2331d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang return OMX_ErrorNone; 2332318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 2333318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 2334d3ed3883c2d7bf3fb871be512055ed72cea964daPawin Vongmasavoid OMXNodeInstance::addActiveBuffer(OMX_U32 portIndex, IOMX::buffer_id id) { 2335d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber ActiveBuffer active; 2336d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber active.mPortIndex = portIndex; 2337d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber active.mID = id; 2338d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber mActiveBuffers.push(active); 2339f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 2340f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar if (portIndex < NELEM(mNumPortBuffers)) { 2341f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar ++mNumPortBuffers[portIndex]; 2342f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } 2343d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber} 2344d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber 2345d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Hubervoid OMXNodeInstance::removeActiveBuffer( 2346d3ed3883c2d7bf3fb871be512055ed72cea964daPawin Vongmasa OMX_U32 portIndex, IOMX::buffer_id id) { 2347d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber for (size_t i = 0; i < mActiveBuffers.size(); ++i) { 2348d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber if (mActiveBuffers[i].mPortIndex == portIndex 2349f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar && mActiveBuffers[i].mID == id) { 2350d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber mActiveBuffers.removeItemsAt(i); 2351f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 2352f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar if (portIndex < NELEM(mNumPortBuffers)) { 2353f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar --mNumPortBuffers[portIndex]; 2354f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } 2355f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar return; 2356d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber } 2357d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber } 2358d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber 2359f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOGW("Attempt to remove an active buffer [%#x] we know nothing about...", id); 2360d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber} 2361d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber 2362d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Hubervoid OMXNodeInstance::freeActiveBuffers() { 2363d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber // Make sure to count down here, as freeBuffer will in turn remove 2364d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber // the active buffer from the vector... 2365b92add32c22656dedfb82d26ccc168c43c92b8ebChad Brubaker for (size_t i = mActiveBuffers.size(); i > 0;) { 2366b92add32c22656dedfb82d26ccc168c43c92b8ebChad Brubaker i--; 2367d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber freeBuffer(mActiveBuffers[i].mPortIndex, mActiveBuffers[i].mID); 2368d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber } 2369d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber} 2370d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber 2371d3ed3883c2d7bf3fb871be512055ed72cea964daPawin VongmasaIOMX::buffer_id OMXNodeInstance::makeBufferID(OMX_BUFFERHEADERTYPE *bufferHeader) { 2372609b815a3131d22da38b2f452faa9f89daad4039Andy Hung if (bufferHeader == NULL) { 2373609b815a3131d22da38b2f452faa9f89daad4039Andy Hung return 0; 2374609b815a3131d22da38b2f452faa9f89daad4039Andy Hung } 2375609b815a3131d22da38b2f452faa9f89daad4039Andy Hung Mutex::Autolock autoLock(mBufferIDLock); 2376d3ed3883c2d7bf3fb871be512055ed72cea964daPawin Vongmasa IOMX::buffer_id buffer; 2377609b815a3131d22da38b2f452faa9f89daad4039Andy Hung do { // handle the very unlikely case of ID overflow 2378609b815a3131d22da38b2f452faa9f89daad4039Andy Hung if (++mBufferIDCount == 0) { 2379f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar ++mBufferIDCount; 2380609b815a3131d22da38b2f452faa9f89daad4039Andy Hung } 2381d3ed3883c2d7bf3fb871be512055ed72cea964daPawin Vongmasa buffer = (IOMX::buffer_id)mBufferIDCount; 2382609b815a3131d22da38b2f452faa9f89daad4039Andy Hung } while (mBufferIDToBufferHeader.indexOfKey(buffer) >= 0); 2383609b815a3131d22da38b2f452faa9f89daad4039Andy Hung mBufferIDToBufferHeader.add(buffer, bufferHeader); 2384609b815a3131d22da38b2f452faa9f89daad4039Andy Hung mBufferHeaderToBufferID.add(bufferHeader, buffer); 2385609b815a3131d22da38b2f452faa9f89daad4039Andy Hung return buffer; 2386609b815a3131d22da38b2f452faa9f89daad4039Andy Hung} 2387609b815a3131d22da38b2f452faa9f89daad4039Andy Hung 238841eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik KimOMX_BUFFERHEADERTYPE *OMXNodeInstance::findBufferHeader( 2389d3ed3883c2d7bf3fb871be512055ed72cea964daPawin Vongmasa IOMX::buffer_id buffer, OMX_U32 portIndex) { 2390609b815a3131d22da38b2f452faa9f89daad4039Andy Hung if (buffer == 0) { 2391609b815a3131d22da38b2f452faa9f89daad4039Andy Hung return NULL; 2392609b815a3131d22da38b2f452faa9f89daad4039Andy Hung } 2393609b815a3131d22da38b2f452faa9f89daad4039Andy Hung Mutex::Autolock autoLock(mBufferIDLock); 23945419242328f33f4d126a22ef6296c99353f4dfb4Chong Zhang ssize_t index = mBufferIDToBufferHeader.indexOfKey(buffer); 23955419242328f33f4d126a22ef6296c99353f4dfb4Chong Zhang if (index < 0) { 23965419242328f33f4d126a22ef6296c99353f4dfb4Chong Zhang CLOGW("findBufferHeader: buffer %u not found", buffer); 23975419242328f33f4d126a22ef6296c99353f4dfb4Chong Zhang return NULL; 23985419242328f33f4d126a22ef6296c99353f4dfb4Chong Zhang } 239941eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim OMX_BUFFERHEADERTYPE *header = mBufferIDToBufferHeader.valueAt(index); 240041eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim BufferMeta *buffer_meta = 240141eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim static_cast<BufferMeta *>(header->pAppPrivate); 240241eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim if (buffer_meta->getPortIndex() != portIndex) { 240341eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim CLOGW("findBufferHeader: buffer %u found but with incorrect port index.", buffer); 240441eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim android_errorWriteLog(0x534e4554, "28816827"); 240541eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim return NULL; 240641eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim } 240741eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim return header; 2408609b815a3131d22da38b2f452faa9f89daad4039Andy Hung} 2409609b815a3131d22da38b2f452faa9f89daad4039Andy Hung 2410d3ed3883c2d7bf3fb871be512055ed72cea964daPawin VongmasaIOMX::buffer_id OMXNodeInstance::findBufferID(OMX_BUFFERHEADERTYPE *bufferHeader) { 2411609b815a3131d22da38b2f452faa9f89daad4039Andy Hung if (bufferHeader == NULL) { 2412609b815a3131d22da38b2f452faa9f89daad4039Andy Hung return 0; 2413609b815a3131d22da38b2f452faa9f89daad4039Andy Hung } 2414609b815a3131d22da38b2f452faa9f89daad4039Andy Hung Mutex::Autolock autoLock(mBufferIDLock); 24155419242328f33f4d126a22ef6296c99353f4dfb4Chong Zhang ssize_t index = mBufferHeaderToBufferID.indexOfKey(bufferHeader); 24165419242328f33f4d126a22ef6296c99353f4dfb4Chong Zhang if (index < 0) { 24175419242328f33f4d126a22ef6296c99353f4dfb4Chong Zhang CLOGW("findBufferID: bufferHeader %p not found", bufferHeader); 24185419242328f33f4d126a22ef6296c99353f4dfb4Chong Zhang return 0; 24195419242328f33f4d126a22ef6296c99353f4dfb4Chong Zhang } 24205419242328f33f4d126a22ef6296c99353f4dfb4Chong Zhang return mBufferHeaderToBufferID.valueAt(index); 2421609b815a3131d22da38b2f452faa9f89daad4039Andy Hung} 2422609b815a3131d22da38b2f452faa9f89daad4039Andy Hung 2423d3ed3883c2d7bf3fb871be512055ed72cea964daPawin Vongmasavoid OMXNodeInstance::invalidateBufferID(IOMX::buffer_id buffer) { 2424609b815a3131d22da38b2f452faa9f89daad4039Andy Hung if (buffer == 0) { 2425609b815a3131d22da38b2f452faa9f89daad4039Andy Hung return; 2426609b815a3131d22da38b2f452faa9f89daad4039Andy Hung } 2427609b815a3131d22da38b2f452faa9f89daad4039Andy Hung Mutex::Autolock autoLock(mBufferIDLock); 24285419242328f33f4d126a22ef6296c99353f4dfb4Chong Zhang ssize_t index = mBufferIDToBufferHeader.indexOfKey(buffer); 24295419242328f33f4d126a22ef6296c99353f4dfb4Chong Zhang if (index < 0) { 24305419242328f33f4d126a22ef6296c99353f4dfb4Chong Zhang CLOGW("invalidateBufferID: buffer %u not found", buffer); 24315419242328f33f4d126a22ef6296c99353f4dfb4Chong Zhang return; 24325419242328f33f4d126a22ef6296c99353f4dfb4Chong Zhang } 24335419242328f33f4d126a22ef6296c99353f4dfb4Chong Zhang mBufferHeaderToBufferID.removeItem(mBufferIDToBufferHeader.valueAt(index)); 24345419242328f33f4d126a22ef6296c99353f4dfb4Chong Zhang mBufferIDToBufferHeader.removeItemsAt(index); 2435609b815a3131d22da38b2f452faa9f89daad4039Andy Hung} 2436609b815a3131d22da38b2f452faa9f89daad4039Andy Hung 2437318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} // namespace android 2438