OMXNodeInstance.cpp revision 6c2d0add22ee72566623834bbfeb6170b4c94588
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: { 10807d54e8f905784fddcc4c37fd094d4e18a73767bcWonsik Kim if (mPortMode[portIndex] != IOMX::kPortModePresetByteBuffer) { 10817d54e8f905784fddcc4c37fd094d4e18a73767bcWonsik Kim break; 10827d54e8f905784fddcc4c37fd094d4e18a73767bcWonsik Kim } 1083f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa return useBuffer_l(portIndex, omxBuffer.mMem, NULL, buffer); 10847d54e8f905784fddcc4c37fd094d4e18a73767bcWonsik Kim } 1085d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang 10867d54e8f905784fddcc4c37fd094d4e18a73767bcWonsik Kim case OMXBuffer::kBufferTypeANWBuffer: { 10877d54e8f905784fddcc4c37fd094d4e18a73767bcWonsik Kim if (mPortMode[portIndex] != IOMX::kPortModePresetANWBuffer) { 10887d54e8f905784fddcc4c37fd094d4e18a73767bcWonsik Kim break; 10897d54e8f905784fddcc4c37fd094d4e18a73767bcWonsik Kim } 1090f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa return useGraphicBuffer_l(portIndex, omxBuffer.mGraphicBuffer, buffer); 10917d54e8f905784fddcc4c37fd094d4e18a73767bcWonsik Kim } 1092d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang 1093f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa case OMXBuffer::kBufferTypeHidlMemory: { 10947d54e8f905784fddcc4c37fd094d4e18a73767bcWonsik Kim if (mPortMode[portIndex] != IOMX::kPortModePresetByteBuffer 10957d54e8f905784fddcc4c37fd094d4e18a73767bcWonsik Kim && mPortMode[portIndex] != IOMX::kPortModeDynamicANWBuffer) { 10967d54e8f905784fddcc4c37fd094d4e18a73767bcWonsik Kim break; 10977d54e8f905784fddcc4c37fd094d4e18a73767bcWonsik Kim } 1098f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa sp<IHidlMemory> hidlMemory = mapMemory(omxBuffer.mHidlMemory); 1099f851e5a9f968c519f659bf85e3bd7127dc2a2885Pawin Vongmasa if (hidlMemory == nullptr) { 1100f851e5a9f968c519f659bf85e3bd7127dc2a2885Pawin Vongmasa ALOGE("OMXNodeInstance useBuffer() failed to map memory"); 1101f851e5a9f968c519f659bf85e3bd7127dc2a2885Pawin Vongmasa return NO_MEMORY; 1102f851e5a9f968c519f659bf85e3bd7127dc2a2885Pawin Vongmasa } 1103f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa return useBuffer_l(portIndex, NULL, hidlMemory, buffer); 11047d54e8f905784fddcc4c37fd094d4e18a73767bcWonsik Kim } 1105f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa default: 11067d54e8f905784fddcc4c37fd094d4e18a73767bcWonsik Kim return BAD_VALUE; 1107f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa break; 1108cc7cc67349b7a3f498882087aa42ffc05a2daf11Lajos Molnar } 1109318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 11107d54e8f905784fddcc4c37fd094d4e18a73767bcWonsik Kim ALOGE("b/77486542"); 11117d54e8f905784fddcc4c37fd094d4e18a73767bcWonsik Kim android_errorWriteLog(0x534e4554, "77486542"); 11127d54e8f905784fddcc4c37fd094d4e18a73767bcWonsik Kim return INVALID_OPERATION; 11133fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang} 11143fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang 11153fd200feb657c157125e45e30c2a7262e3c0244dChong Zhangstatus_t OMXNodeInstance::useBuffer_l( 1116f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa OMX_U32 portIndex, const sp<IMemory> ¶ms, 1117f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa const sp<IHidlMemory> &hParams, IOMX::buffer_id *buffer) { 1118d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar BufferMeta *buffer_meta; 111921b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang OMX_BUFFERHEADERTYPE *header; 112021b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang OMX_ERRORTYPE err = OMX_ErrorNone; 112121b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang bool isMetadata = mMetadataType[portIndex] != kMetadataBufferTypeInvalid; 1122d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang 112377d00ee0c03ab8043e2f422232b27f5852bb3bb5Dongwon Kang if (!isMetadata && mGraphicBufferEnabled[portIndex]) { 112477d00ee0c03ab8043e2f422232b27f5852bb3bb5Dongwon Kang ALOGE("b/62948670"); 112577d00ee0c03ab8043e2f422232b27f5852bb3bb5Dongwon Kang android_errorWriteLog(0x534e4554, "62948670"); 112677d00ee0c03ab8043e2f422232b27f5852bb3bb5Dongwon Kang return INVALID_OPERATION; 112777d00ee0c03ab8043e2f422232b27f5852bb3bb5Dongwon Kang } 112877d00ee0c03ab8043e2f422232b27f5852bb3bb5Dongwon Kang 1129f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa size_t paramsSize; 1130f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa void* paramsPointer; 1131f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa if (params != NULL && hParams != NULL) { 1132f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa return BAD_VALUE; 1133f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa } 1134f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa if (params != NULL) { 1135f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa paramsPointer = params->pointer(); 1136f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa paramsSize = params->size(); 1137f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa } else if (hParams != NULL) { 1138f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa paramsPointer = hParams->getPointer(); 1139f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa paramsSize = hParams->getSize(); 1140f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa } else { 1141f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa paramsPointer = nullptr; 1142f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa } 1143f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa 1144d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang OMX_U32 allottedSize; 1145d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang if (isMetadata) { 1146d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang if (mMetadataType[portIndex] == kMetadataBufferTypeGrallocSource) { 1147d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang allottedSize = sizeof(VideoGrallocMetadata); 1148d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang } else if (mMetadataType[portIndex] == kMetadataBufferTypeANWBuffer) { 1149d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang allottedSize = sizeof(VideoNativeMetadata); 1150d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang } else if (mMetadataType[portIndex] == kMetadataBufferTypeNativeHandleSource) { 1151d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang allottedSize = sizeof(VideoNativeHandleMetadata); 1152d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang } else { 1153d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang return BAD_VALUE; 1154d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang } 1155d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang } else { 1156d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang // NULL params is allowed only in metadata mode. 1157f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa if (paramsPointer == nullptr) { 1158d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang ALOGE("b/25884056"); 1159d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang return BAD_VALUE; 1160d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang } 1161f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa allottedSize = paramsSize; 1162d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang } 1163d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang 1164ecc97eb44a0675974fcf43b0c68edaaa539d2996Chong Zhang bool isOutputGraphicMetadata = (portIndex == kPortIndexOutput) && 1165ecc97eb44a0675974fcf43b0c68edaaa539d2996Chong Zhang (mMetadataType[portIndex] == kMetadataBufferTypeGrallocSource || 1166ecc97eb44a0675974fcf43b0c68edaaa539d2996Chong Zhang mMetadataType[portIndex] == kMetadataBufferTypeANWBuffer); 1167d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar 116821b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang uint32_t requiresAllocateBufferBit = 116921b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang (portIndex == kPortIndexInput) 117021b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang ? kRequiresAllocateBufferOnInputPorts 117121b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang : kRequiresAllocateBufferOnOutputPorts; 1172d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar 1173ecc97eb44a0675974fcf43b0c68edaaa539d2996Chong Zhang // we use useBuffer for output metadata regardless of quirks 1174ecc97eb44a0675974fcf43b0c68edaaa539d2996Chong Zhang if (!isOutputGraphicMetadata && (mQuirks & requiresAllocateBufferBit)) { 117521b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang // metadata buffers are not connected cross process; only copy if not meta. 1176d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar buffer_meta = new BufferMeta( 1177f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa params, hParams, portIndex, !isMetadata /* copy */, NULL /* data */); 117821b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang 117921b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang err = OMX_AllocateBuffer( 118021b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang mHandle, &header, portIndex, buffer_meta, allottedSize); 118121b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang 118221b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang if (err != OMX_ErrorNone) { 118321b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang CLOG_ERROR(allocateBuffer, err, 11843fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang SIMPLE_BUFFER(portIndex, (size_t)allottedSize, 1185f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa paramsPointer)); 118621b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang } 1187d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar } else { 11883fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang OMX_U8 *data = NULL; 118921b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang 119021b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang // metadata buffers are not connected cross process 119121b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang // use a backup buffer instead of the actual buffer 119221b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang if (isMetadata) { 119321b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang data = new (std::nothrow) OMX_U8[allottedSize]; 119421b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang if (data == NULL) { 119521b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang return NO_MEMORY; 119621b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang } 119721b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang memset(data, 0, allottedSize); 1198318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 119921b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang buffer_meta = new BufferMeta( 1200f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa params, hParams, portIndex, false /* copy */, data); 120121b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang } else { 12028a21c0191f974a0b9cbd5818052e2655e0aaa306Pawin Vongmasa data = static_cast<OMX_U8 *>(paramsPointer); 12033fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang 120421b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang buffer_meta = new BufferMeta( 1205f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa params, hParams, portIndex, false /* copy */, NULL); 120621b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang } 1207318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 120821b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang err = OMX_UseBuffer( 120921b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang mHandle, &header, portIndex, buffer_meta, 121021b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang allottedSize, data); 121121b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang 121221b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang if (err != OMX_ErrorNone) { 121321b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang CLOG_ERROR(useBuffer, err, SIMPLE_BUFFER( 121421b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang portIndex, (size_t)allottedSize, data)); 121521b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang } 121621b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang } 1217318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 121821b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang if (err != OMX_ErrorNone) { 1219318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber delete buffer_meta; 1220318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber buffer_meta = NULL; 1221318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 1222318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber *buffer = 0; 1223318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 1224f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar return StatusFromOMXError(err); 1225318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber } 1226318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 122703b268eac37ca2589bfff0bf58daf79d29cc14f4Andreas Huber CHECK_EQ(header->pAppPrivate, buffer_meta); 122803b268eac37ca2589bfff0bf58daf79d29cc14f4Andreas Huber 1229609b815a3131d22da38b2f452faa9f89daad4039Andy Hung *buffer = makeBufferID(header); 1230318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 1231d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber addActiveBuffer(portIndex, *buffer); 1232d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber 12336d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang sp<IOMXBufferSource> bufferSource(getBufferSource()); 1234f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden if (bufferSource != NULL && portIndex == kPortIndexInput) { 12356d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang bufferSource->onInputBufferAdded(*buffer); 1236f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden } 1237f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden 1238f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_BUFFER(useBuffer, NEW_BUFFER_FMT( 1239f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa *buffer, portIndex, "%u(%zu)@%p", allottedSize, paramsSize, paramsPointer)); 1240318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber return OK; 1241318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 1242318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 1243c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajanstatus_t OMXNodeInstance::useGraphicBuffer2_l( 1244c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan OMX_U32 portIndex, const sp<GraphicBuffer>& graphicBuffer, 1245d3ed3883c2d7bf3fb871be512055ed72cea964daPawin Vongmasa IOMX::buffer_id *buffer) { 1246298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia if (graphicBuffer == NULL || buffer == NULL) { 1247298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia ALOGE("b/25884056"); 1248298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia return BAD_VALUE; 1249298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia } 1250c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan 1251c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan // port definition 1252c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan OMX_PARAM_PORTDEFINITIONTYPE def; 1253f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar InitOMXParams(&def); 1254c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan def.nPortIndex = portIndex; 1255c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan OMX_ERRORTYPE err = OMX_GetParameter(mHandle, OMX_IndexParamPortDefinition, &def); 1256f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar if (err != OMX_ErrorNone) { 1257f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar OMX_INDEXTYPE index = OMX_IndexParamPortDefinition; 1258f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_ERROR(getParameter, err, "%s(%#x): %s:%u", 1259f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar asString(index), index, portString(portIndex), portIndex); 1260f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar return UNKNOWN_ERROR; 1261c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan } 1262c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan 126341eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim BufferMeta *bufferMeta = new BufferMeta(graphicBuffer, portIndex); 1264c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan 1265c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan OMX_BUFFERHEADERTYPE *header = NULL; 1266c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan OMX_U8* bufferHandle = const_cast<OMX_U8*>( 1267c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan reinterpret_cast<const OMX_U8*>(graphicBuffer->handle)); 1268c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan 1269c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan err = OMX_UseBuffer( 1270c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan mHandle, 1271c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan &header, 1272c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan portIndex, 1273c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan bufferMeta, 1274c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan def.nBufferSize, 1275c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan bufferHandle); 1276c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan 1277c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan if (err != OMX_ErrorNone) { 1278f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_ERROR(useBuffer, err, BUFFER_FMT(portIndex, "%u@%p", def.nBufferSize, bufferHandle)); 1279c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan delete bufferMeta; 1280c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan bufferMeta = NULL; 1281c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan *buffer = 0; 1282f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar return StatusFromOMXError(err); 1283c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan } 1284c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan 1285c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan CHECK_EQ(header->pBuffer, bufferHandle); 1286c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan CHECK_EQ(header->pAppPrivate, bufferMeta); 1287c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan 1288609b815a3131d22da38b2f452faa9f89daad4039Andy Hung *buffer = makeBufferID(header); 1289c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan 1290c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan addActiveBuffer(portIndex, *buffer); 1291f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_BUFFER(useGraphicBuffer2, NEW_BUFFER_FMT( 1292f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar *buffer, portIndex, "%u@%p", def.nBufferSize, bufferHandle)); 1293c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan return OK; 1294c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan} 1295c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan 1296c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan// XXX: This function is here for backwards compatibility. Once the OMX 1297c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan// implementations have been updated this can be removed and useGraphicBuffer2 1298c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan// can be renamed to useGraphicBuffer. 1299d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhangstatus_t OMXNodeInstance::useGraphicBuffer_l( 130083750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis OMX_U32 portIndex, const sp<GraphicBuffer>& graphicBuffer, 1301d3ed3883c2d7bf3fb871be512055ed72cea964daPawin Vongmasa IOMX::buffer_id *buffer) { 1302298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia if (graphicBuffer == NULL || buffer == NULL) { 1303298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia ALOGE("b/25884056"); 1304298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia return BAD_VALUE; 1305298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia } 130683750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis 13073fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang // First, see if we're in metadata mode. We could be running an experiment to simulate 13083fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang // legacy behavior (preallocated buffers) on devices that supports meta. 13093fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang if (mMetadataType[portIndex] != kMetadataBufferTypeInvalid) { 13103fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang return useGraphicBufferWithMetadata_l( 13113fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang portIndex, graphicBuffer, buffer); 13123fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang } 13133fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang 131477d00ee0c03ab8043e2f422232b27f5852bb3bb5Dongwon Kang if (!mGraphicBufferEnabled[portIndex]) { 131577d00ee0c03ab8043e2f422232b27f5852bb3bb5Dongwon Kang // Report error if this is not in graphic buffer mode. 131677d00ee0c03ab8043e2f422232b27f5852bb3bb5Dongwon Kang ALOGE("b/62948670"); 131777d00ee0c03ab8043e2f422232b27f5852bb3bb5Dongwon Kang android_errorWriteLog(0x534e4554, "62948670"); 131877d00ee0c03ab8043e2f422232b27f5852bb3bb5Dongwon Kang return INVALID_OPERATION; 131977d00ee0c03ab8043e2f422232b27f5852bb3bb5Dongwon Kang } 132077d00ee0c03ab8043e2f422232b27f5852bb3bb5Dongwon Kang 1321c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan // See if the newer version of the extension is present. 132283750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis OMX_INDEXTYPE index; 1323c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan if (OMX_GetExtensionIndex( 1324c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan mHandle, 1325c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan const_cast<OMX_STRING>("OMX.google.android.index.useAndroidNativeBuffer2"), 1326c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan &index) == OMX_ErrorNone) { 1327c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan return useGraphicBuffer2_l(portIndex, graphicBuffer, buffer); 1328c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan } 1329c5a57efb706ec79032fc09c43b16d11ed0876604Anu Sundararajan 1330ce18d7d85a78ac6642624fef1b5831eff4c72d56Jamie Gennis OMX_STRING name = const_cast<OMX_STRING>( 1331ce18d7d85a78ac6642624fef1b5831eff4c72d56Jamie Gennis "OMX.google.android.index.useAndroidNativeBuffer"); 1332ce18d7d85a78ac6642624fef1b5831eff4c72d56Jamie Gennis OMX_ERRORTYPE err = OMX_GetExtensionIndex(mHandle, name, &index); 133383750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis if (err != OMX_ErrorNone) { 1334f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_ERROR(getExtensionIndex, err, "%s", name); 133583750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis return StatusFromOMXError(err); 133683750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis } 133783750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis 133841eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim BufferMeta *bufferMeta = new BufferMeta(graphicBuffer, portIndex); 133983750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis 134083750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis OMX_BUFFERHEADERTYPE *header; 134183750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis 134283750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis OMX_VERSIONTYPE ver; 134383750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis ver.s.nVersionMajor = 1; 134483750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis ver.s.nVersionMinor = 0; 134583750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis ver.s.nRevision = 0; 134683750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis ver.s.nStep = 0; 134783750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis UseAndroidNativeBufferParams params = { 134883750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis sizeof(UseAndroidNativeBufferParams), ver, portIndex, bufferMeta, 134983750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis &header, graphicBuffer, 135083750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis }; 135183750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis 135283750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis err = OMX_SetParameter(mHandle, index, ¶ms); 135383750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis 135483750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis if (err != OMX_ErrorNone) { 1355f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_ERROR(setParameter, err, "%s(%#x): %s:%u meta=%p GB=%p", name, index, 1356f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar portString(portIndex), portIndex, bufferMeta, graphicBuffer->handle); 135783750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis 135883750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis delete bufferMeta; 135983750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis bufferMeta = NULL; 136083750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis 136183750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis *buffer = 0; 136283750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis 1363f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar return StatusFromOMXError(err); 136483750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis } 136583750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis 136683750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis CHECK_EQ(header->pAppPrivate, bufferMeta); 136783750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis 1368609b815a3131d22da38b2f452faa9f89daad4039Andy Hung *buffer = makeBufferID(header); 136983750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis 137083750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis addActiveBuffer(portIndex, *buffer); 1371f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_BUFFER(useGraphicBuffer, NEW_BUFFER_FMT( 1372f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar *buffer, portIndex, "GB=%p", graphicBuffer->handle)); 137383750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis return OK; 137483750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis} 137583750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis 13763fd200feb657c157125e45e30c2a7262e3c0244dChong Zhangstatus_t OMXNodeInstance::useGraphicBufferWithMetadata_l( 13773fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang OMX_U32 portIndex, const sp<GraphicBuffer> &graphicBuffer, 1378d3ed3883c2d7bf3fb871be512055ed72cea964daPawin Vongmasa IOMX::buffer_id *buffer) { 13793fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang if (portIndex != kPortIndexOutput) { 13803fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang return BAD_VALUE; 13813fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang } 13823fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang 1383d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang if (mMetadataType[portIndex] != kMetadataBufferTypeGrallocSource && 1384d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang mMetadataType[portIndex] != kMetadataBufferTypeANWBuffer) { 13853fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang return BAD_VALUE; 13863fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang } 13873fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang 1388f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa status_t err = useBuffer_l(portIndex, NULL, NULL, buffer); 13893fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang if (err != OK) { 13903fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang return err; 13913fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang } 13923fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang 13933fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang OMX_BUFFERHEADERTYPE *header = findBufferHeader(*buffer, portIndex); 13943fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang 13953fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang return updateGraphicBufferInMeta_l(portIndex, graphicBuffer, *buffer, header); 13963fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang 13973fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang} 13983fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang 1399054219874873b41f1c815552987c10465c34ba2bLajos Molnarstatus_t OMXNodeInstance::updateGraphicBufferInMeta_l( 1400f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar OMX_U32 portIndex, const sp<GraphicBuffer>& graphicBuffer, 1401d3ed3883c2d7bf3fb871be512055ed72cea964daPawin Vongmasa IOMX::buffer_id buffer, OMX_BUFFERHEADERTYPE *header) { 1402298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia // No need to check |graphicBuffer| since NULL is valid for it as below. 1403298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia if (header == NULL) { 1404298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia ALOGE("b/25884056"); 1405298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia return BAD_VALUE; 1406298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia } 1407298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia 1408054219874873b41f1c815552987c10465c34ba2bLajos Molnar if (portIndex != kPortIndexInput && portIndex != kPortIndexOutput) { 1409054219874873b41f1c815552987c10465c34ba2bLajos Molnar return BAD_VALUE; 1410054219874873b41f1c815552987c10465c34ba2bLajos Molnar } 1411d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar 1412d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar BufferMeta *bufferMeta = (BufferMeta *)(header->pAppPrivate); 141321b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang sp<ABuffer> data = bufferMeta->getBuffer(header, false /* limit */); 1414d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar bufferMeta->setGraphicBuffer(graphicBuffer); 1415e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar MetadataBufferType metaType = mMetadataType[portIndex]; 1416e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar if (metaType == kMetadataBufferTypeGrallocSource 1417e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar && data->capacity() >= sizeof(VideoGrallocMetadata)) { 1418e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar VideoGrallocMetadata &metadata = *(VideoGrallocMetadata *)(data->data()); 1419054219874873b41f1c815552987c10465c34ba2bLajos Molnar metadata.eType = kMetadataBufferTypeGrallocSource; 14209847fcefb183e1cb09eb48e17a09577392b0e8f4Lajos Molnar metadata.pHandle = graphicBuffer == NULL ? NULL : graphicBuffer->handle; 1421e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar } else if (metaType == kMetadataBufferTypeANWBuffer 1422e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar && data->capacity() >= sizeof(VideoNativeMetadata)) { 1423e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar VideoNativeMetadata &metadata = *(VideoNativeMetadata *)(data->data()); 1424054219874873b41f1c815552987c10465c34ba2bLajos Molnar metadata.eType = kMetadataBufferTypeANWBuffer; 1425054219874873b41f1c815552987c10465c34ba2bLajos Molnar metadata.pBuffer = graphicBuffer == NULL ? NULL : graphicBuffer->getNativeBuffer(); 1426054219874873b41f1c815552987c10465c34ba2bLajos Molnar metadata.nFenceFd = -1; 1427054219874873b41f1c815552987c10465c34ba2bLajos Molnar } else { 1428e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar CLOG_ERROR(updateGraphicBufferInMeta, BAD_VALUE, "%s:%u, %#x bad type (%d) or size (%u)", 1429054219874873b41f1c815552987c10465c34ba2bLajos Molnar portString(portIndex), portIndex, buffer, mMetadataType[portIndex], header->nAllocLen); 1430054219874873b41f1c815552987c10465c34ba2bLajos Molnar return BAD_VALUE; 1431054219874873b41f1c815552987c10465c34ba2bLajos Molnar } 1432054219874873b41f1c815552987c10465c34ba2bLajos Molnar 1433f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_BUFFER(updateGraphicBufferInMeta, "%s:%u, %#x := %p", 143449605e8ab171a2b1f474645d632d3982f5f7b8e6Lajos Molnar portString(portIndex), portIndex, buffer, 143549605e8ab171a2b1f474645d632d3982f5f7b8e6Lajos Molnar graphicBuffer == NULL ? NULL : graphicBuffer->handle); 1436d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar return OK; 1437d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar} 1438d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar 14393fd200feb657c157125e45e30c2a7262e3c0244dChong Zhangstatus_t OMXNodeInstance::updateNativeHandleInMeta_l( 14403fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang OMX_U32 portIndex, const sp<NativeHandle>& nativeHandle, 1441d3ed3883c2d7bf3fb871be512055ed72cea964daPawin Vongmasa IOMX::buffer_id buffer, OMX_BUFFERHEADERTYPE *header) { 14427e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar // No need to check |nativeHandle| since NULL is valid for it as below. 14437e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar if (header == NULL) { 14447e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar ALOGE("b/25884056"); 14457e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar return BAD_VALUE; 14467e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar } 14477e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar 14487e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar if (portIndex != kPortIndexInput && portIndex != kPortIndexOutput) { 14497e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar return BAD_VALUE; 14507e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar } 14517e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar 14527e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar BufferMeta *bufferMeta = (BufferMeta *)(header->pAppPrivate); 145321b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang sp<ABuffer> data = bufferMeta->getBuffer(header, false /* limit */); 14547e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar bufferMeta->setNativeHandle(nativeHandle); 14557e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar if (mMetadataType[portIndex] == kMetadataBufferTypeNativeHandleSource 14567e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar && data->capacity() >= sizeof(VideoNativeHandleMetadata)) { 14577e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar VideoNativeHandleMetadata &metadata = *(VideoNativeHandleMetadata *)(data->data()); 14587e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar metadata.eType = mMetadataType[portIndex]; 14597e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar metadata.pHandle = 14607e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar nativeHandle == NULL ? NULL : const_cast<native_handle*>(nativeHandle->handle()); 14617e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar } else { 14627e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar CLOG_ERROR(updateNativeHandleInMeta, BAD_VALUE, "%s:%u, %#x bad type (%d) or size (%zu)", 14637e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar portString(portIndex), portIndex, buffer, mMetadataType[portIndex], data->capacity()); 14647e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar return BAD_VALUE; 14657e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar } 14667e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar 14677e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar CLOG_BUFFER(updateNativeHandleInMeta, "%s:%u, %#x := %p", 14687e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar portString(portIndex), portIndex, buffer, 14697e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar nativeHandle == NULL ? NULL : nativeHandle->handle()); 14707e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar return OK; 14717e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar} 14727e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar 1473addf2cbb120346ae42e78fa739245a353db5edadChong Zhangstatus_t OMXNodeInstance::setInputSurface( 1474addf2cbb120346ae42e78fa739245a353db5edadChong Zhang const sp<IOMXBufferSource> &bufferSource) { 1475addf2cbb120346ae42e78fa739245a353db5edadChong Zhang Mutex::Autolock autolock(mLock); 1476addf2cbb120346ae42e78fa739245a353db5edadChong Zhang 1477f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden status_t err; 1478f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden 1479d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar // only allow graphic source on input port, when there are no allocated buffers yet 1480addf2cbb120346ae42e78fa739245a353db5edadChong Zhang if (mNumPortBuffers[kPortIndexInput] > 0) { 1481d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar android_errorWriteLog(0x534e4554, "29422020"); 1482d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar return INVALID_OPERATION; 1483d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar } 1484d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar 14856d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang if (getBufferSource() != NULL) { 1486f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden return ALREADY_EXISTS; 1487f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden } 1488f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden 1489addf2cbb120346ae42e78fa739245a353db5edadChong Zhang err = storeMetaDataInBuffers_l(kPortIndexInput, OMX_TRUE, NULL); 1490f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden if (err != OK) { 1491f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden return err; 1492f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden } 1493f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden 1494f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden // Retrieve the width and height of the graphic buffer, set when the 1495f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden // codec was configured. 1496f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden OMX_PARAM_PORTDEFINITIONTYPE def; 1497f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar InitOMXParams(&def); 1498addf2cbb120346ae42e78fa739245a353db5edadChong Zhang def.nPortIndex = kPortIndexInput; 1499f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden OMX_ERRORTYPE oerr = OMX_GetParameter( 1500f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden mHandle, OMX_IndexParamPortDefinition, &def); 1501f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar if (oerr != OMX_ErrorNone) { 1502f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar OMX_INDEXTYPE index = OMX_IndexParamPortDefinition; 1503addf2cbb120346ae42e78fa739245a353db5edadChong Zhang CLOG_ERROR(getParameter, oerr, "%s(%#x): %s:%u", asString(index), 1504addf2cbb120346ae42e78fa739245a353db5edadChong Zhang index, portString(kPortIndexInput), kPortIndexInput); 1505f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar return UNKNOWN_ERROR; 1506f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } 1507f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden 1508ba6218eae3dbcf3f962b3561b26374a214dbf5e2Andy McFadden if (def.format.video.eColorFormat != OMX_COLOR_FormatAndroidOpaque) { 1509f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOGW("createInputSurface requires COLOR_FormatSurface " 1510f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar "(AndroidOpaque) color format instead of %s(%#x)", 1511f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar asString(def.format.video.eColorFormat), def.format.video.eColorFormat); 1512ba6218eae3dbcf3f962b3561b26374a214dbf5e2Andy McFadden return INVALID_OPERATION; 1513ba6218eae3dbcf3f962b3561b26374a214dbf5e2Andy McFadden } 1514ba6218eae3dbcf3f962b3561b26374a214dbf5e2Andy McFadden 1515addf2cbb120346ae42e78fa739245a353db5edadChong Zhang if (def.format.video.nFrameWidth == 0 1516addf2cbb120346ae42e78fa739245a353db5edadChong Zhang || def.format.video.nFrameHeight == 0) { 1517addf2cbb120346ae42e78fa739245a353db5edadChong Zhang ALOGE("Invalid video dimension %ux%u", 1518addf2cbb120346ae42e78fa739245a353db5edadChong Zhang def.format.video.nFrameWidth, 1519addf2cbb120346ae42e78fa739245a353db5edadChong Zhang def.format.video.nFrameHeight); 1520298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia return BAD_VALUE; 1521298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia } 1522298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia 1523addf2cbb120346ae42e78fa739245a353db5edadChong Zhang setBufferSource(bufferSource); 1524d291c222357303b9611cab89d0c3b047584ef377Chong Zhang return OK; 1525d291c222357303b9611cab89d0c3b047584ef377Chong Zhang} 1526d291c222357303b9611cab89d0c3b047584ef377Chong Zhang 1527a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnarstatus_t OMXNodeInstance::allocateSecureBuffer( 1528d3ed3883c2d7bf3fb871be512055ed72cea964daPawin Vongmasa OMX_U32 portIndex, size_t size, IOMX::buffer_id *buffer, 15291b40f2804a27b695e9e53fb1699b64cb0dd387f9Lajos Molnar void **buffer_data, sp<NativeHandle> *native_handle) { 1530a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnar if (buffer == NULL || buffer_data == NULL || native_handle == NULL) { 1531298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia ALOGE("b/25884056"); 1532298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia return BAD_VALUE; 1533298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia } 1534298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia 1535f80a1f5075a7c6e1982d37c68bfed7c9a611bb20Wei Jia if (portIndex >= NELEM(mSecureBufferType)) { 1536f80a1f5075a7c6e1982d37c68bfed7c9a611bb20Wei Jia ALOGE("b/31385713, portIndex(%u)", portIndex); 1537f80a1f5075a7c6e1982d37c68bfed7c9a611bb20Wei Jia android_errorWriteLog(0x534e4554, "31385713"); 1538f80a1f5075a7c6e1982d37c68bfed7c9a611bb20Wei Jia return BAD_VALUE; 1539f80a1f5075a7c6e1982d37c68bfed7c9a611bb20Wei Jia } 1540f80a1f5075a7c6e1982d37c68bfed7c9a611bb20Wei Jia 1541318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber Mutex::Autolock autoLock(mLock); 1542318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 154381b554b04c93aebf3e74116330024272770d2967Marco Nelissen if (!mSailed) { 154481b554b04c93aebf3e74116330024272770d2967Marco Nelissen ALOGE("b/35467458"); 154581b554b04c93aebf3e74116330024272770d2967Marco Nelissen android_errorWriteLog(0x534e4554, "35467458"); 154681b554b04c93aebf3e74116330024272770d2967Marco Nelissen return BAD_VALUE; 154781b554b04c93aebf3e74116330024272770d2967Marco Nelissen } 15487d54e8f905784fddcc4c37fd094d4e18a73767bcWonsik Kim if (mPortMode[portIndex] != IOMX::kPortModePresetSecureBuffer) { 15497d54e8f905784fddcc4c37fd094d4e18a73767bcWonsik Kim ALOGE("b/77486542"); 15507d54e8f905784fddcc4c37fd094d4e18a73767bcWonsik Kim android_errorWriteLog(0x534e4554, "77486542"); 15517d54e8f905784fddcc4c37fd094d4e18a73767bcWonsik Kim return INVALID_OPERATION; 15527d54e8f905784fddcc4c37fd094d4e18a73767bcWonsik Kim } 155321b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang BufferMeta *buffer_meta = new BufferMeta(portIndex); 1554318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 1555318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_BUFFERHEADERTYPE *header; 1556318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 1557318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_ERRORTYPE err = OMX_AllocateBuffer( 1558318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber mHandle, &header, portIndex, buffer_meta, size); 1559318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 1560318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber if (err != OMX_ErrorNone) { 1561f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_ERROR(allocateBuffer, err, BUFFER_FMT(portIndex, "%zu@", size)); 1562318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber delete buffer_meta; 1563318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber buffer_meta = NULL; 1564318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 1565318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber *buffer = 0; 1566318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 1567f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar return StatusFromOMXError(err); 1568318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber } 1569318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 157003b268eac37ca2589bfff0bf58daf79d29cc14f4Andreas Huber CHECK_EQ(header->pAppPrivate, buffer_meta); 157103b268eac37ca2589bfff0bf58daf79d29cc14f4Andreas Huber 1572609b815a3131d22da38b2f452faa9f89daad4039Andy Hung *buffer = makeBufferID(header); 1573a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnar if (mSecureBufferType[portIndex] == kSecureBufferTypeNativeHandle) { 1574a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnar *buffer_data = NULL; 15751b40f2804a27b695e9e53fb1699b64cb0dd387f9Lajos Molnar *native_handle = NativeHandle::create( 15761b40f2804a27b695e9e53fb1699b64cb0dd387f9Lajos Molnar (native_handle_t *)header->pBuffer, false /* ownsHandle */); 1577a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnar } else { 1578a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnar *buffer_data = header->pBuffer; 1579a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnar *native_handle = NULL; 1580a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnar } 1581318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 1582d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber addActiveBuffer(portIndex, *buffer); 1583d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber 15846d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang sp<IOMXBufferSource> bufferSource(getBufferSource()); 1585f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden if (bufferSource != NULL && portIndex == kPortIndexInput) { 15866d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang bufferSource->onInputBufferAdded(*buffer); 1587f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden } 1588a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnar CLOG_BUFFER(allocateSecureBuffer, NEW_BUFFER_FMT( 15891b40f2804a27b695e9e53fb1699b64cb0dd387f9Lajos Molnar *buffer, portIndex, "%zu@%p:%p", size, *buffer_data, 15901b40f2804a27b695e9e53fb1699b64cb0dd387f9Lajos Molnar *native_handle == NULL ? NULL : (*native_handle)->handle())); 1591f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden 1592318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber return OK; 1593318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 1594318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 1595318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::freeBuffer( 1596d3ed3883c2d7bf3fb871be512055ed72cea964daPawin Vongmasa OMX_U32 portIndex, IOMX::buffer_id buffer) { 1597318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber Mutex::Autolock autoLock(mLock); 1598f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_BUFFER(freeBuffer, "%s:%u %#x", portString(portIndex), portIndex, buffer); 1599318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 1600d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber removeActiveBuffer(portIndex, buffer); 1601d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber 160241eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim OMX_BUFFERHEADERTYPE *header = findBufferHeader(buffer, portIndex); 1603298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia if (header == NULL) { 1604298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia ALOGE("b/25884056"); 1605298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia return BAD_VALUE; 1606298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia } 1607318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber BufferMeta *buffer_meta = static_cast<BufferMeta *>(header->pAppPrivate); 1608318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 1609318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_ERRORTYPE err = OMX_FreeBuffer(mHandle, portIndex, header); 1610f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_IF_ERROR(freeBuffer, err, "%s:%u %#x", portString(portIndex), portIndex, buffer); 1611318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 1612318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber delete buffer_meta; 1613318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber buffer_meta = NULL; 1614609b815a3131d22da38b2f452faa9f89daad4039Andy Hung invalidateBufferID(buffer); 1615318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 1616318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber return StatusFromOMXError(err); 1617318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 1618318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 16193fd200feb657c157125e45e30c2a7262e3c0244dChong Zhangstatus_t OMXNodeInstance::fillBuffer( 1620d3ed3883c2d7bf3fb871be512055ed72cea964daPawin Vongmasa IOMX::buffer_id buffer, const OMXBuffer &omxBuffer, int fenceFd) { 1621318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber Mutex::Autolock autoLock(mLock); 1622318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 162341eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim OMX_BUFFERHEADERTYPE *header = findBufferHeader(buffer, kPortIndexOutput); 1624298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia if (header == NULL) { 1625298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia ALOGE("b/25884056"); 1626298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia return BAD_VALUE; 1627298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia } 16283fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang 16293fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang if (omxBuffer.mBufferType == OMXBuffer::kBufferTypeANWBuffer) { 16303fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang status_t err = updateGraphicBufferInMeta_l( 16313fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang kPortIndexOutput, omxBuffer.mGraphicBuffer, buffer, header); 16323fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang 16333fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang if (err != OK) { 16343fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang CLOG_ERROR(fillBuffer, err, FULL_BUFFER( 16353fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang (intptr_t)header->pBuffer, header, fenceFd)); 16363fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang return err; 16373fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang } 16383fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang } else if (omxBuffer.mBufferType != OMXBuffer::kBufferTypePreset) { 16393fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang return BAD_VALUE; 16403fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang } 16413fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang 1642318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber header->nFilledLen = 0; 1643318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber header->nOffset = 0; 1644318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber header->nFlags = 0; 1645318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 164615ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar // meta now owns fenceFd 164715ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar status_t res = storeFenceInMeta_l(header, fenceFd, kPortIndexOutput); 164815ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar if (res != OK) { 164915ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar CLOG_ERROR(fillBuffer::storeFenceInMeta, res, EMPTY_BUFFER(buffer, header, fenceFd)); 165015ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar return res; 165115ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar } 165215ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar 1653f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar { 1654f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar Mutex::Autolock _l(mDebugLock); 1655f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar mOutputBuffersWithCodec.add(header); 165615ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar CLOG_BUMPED_BUFFER(fillBuffer, WITH_STATS(EMPTY_BUFFER(buffer, header, fenceFd))); 1657f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } 1658318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 1659f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar OMX_ERRORTYPE err = OMX_FillThisBuffer(mHandle, header); 1660f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar if (err != OMX_ErrorNone) { 166115ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar CLOG_ERROR(fillBuffer, err, EMPTY_BUFFER(buffer, header, fenceFd)); 1662f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar Mutex::Autolock _l(mDebugLock); 1663f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar mOutputBuffersWithCodec.remove(header); 1664f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } 1665318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber return StatusFromOMXError(err); 1666318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 1667318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 1668318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::emptyBuffer( 16693fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang buffer_id buffer, const OMXBuffer &omxBuffer, 16703fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang OMX_U32 flags, OMX_TICKS timestamp, int fenceFd) { 1671d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang Mutex::Autolock autoLock(mLock); 1672d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang 1673d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang switch (omxBuffer.mBufferType) { 1674d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang case OMXBuffer::kBufferTypePreset: 1675d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang return emptyBuffer_l( 167649b2b4d30a0f74314630a5ea5f0e59697d90443eChong Zhang buffer, omxBuffer.mRangeOffset, omxBuffer.mRangeLength, 167749b2b4d30a0f74314630a5ea5f0e59697d90443eChong Zhang flags, timestamp, fenceFd); 16783fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang 1679d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang case OMXBuffer::kBufferTypeANWBuffer: 1680d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang return emptyGraphicBuffer_l( 16813fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang buffer, omxBuffer.mGraphicBuffer, flags, timestamp, fenceFd); 16823fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang 1683d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang case OMXBuffer::kBufferTypeNativeHandle: 1684d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang return emptyNativeHandleBuffer_l( 16853fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang buffer, omxBuffer.mNativeHandle, flags, timestamp, fenceFd); 1686d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang 1687d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang default: 1688d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang break; 16893fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang } 16903fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang 16913fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang return BAD_VALUE; 16923fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang} 16933fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang 1694d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhangstatus_t OMXNodeInstance::emptyBuffer_l( 1695d3ed3883c2d7bf3fb871be512055ed72cea964daPawin Vongmasa IOMX::buffer_id buffer, 1696318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_U32 rangeOffset, OMX_U32 rangeLength, 169715ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar OMX_U32 flags, OMX_TICKS timestamp, int fenceFd) { 1698318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 1699d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar // no emptybuffer if using input surface 17006d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang if (getBufferSource() != NULL) { 1701d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar android_errorWriteLog(0x534e4554, "29422020"); 1702d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar return INVALID_OPERATION; 1703d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar } 1704d32d4030c3778b7947c08e9be7d38c229d8d555dLajos Molnar 170541eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim OMX_BUFFERHEADERTYPE *header = findBufferHeader(buffer, kPortIndexInput); 1706298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia if (header == NULL) { 1707298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia ALOGE("b/25884056"); 1708298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia return BAD_VALUE; 1709298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia } 1710318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber BufferMeta *buffer_meta = 1711318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber static_cast<BufferMeta *>(header->pAppPrivate); 1712534bb6132a6a664f90b42b3ef81298b42efb3dc2Lajos Molnar 1713534bb6132a6a664f90b42b3ef81298b42efb3dc2Lajos Molnar // set up proper filled length if component is configured for gralloc metadata mode 1714534bb6132a6a664f90b42b3ef81298b42efb3dc2Lajos Molnar // ignore rangeOffset in this case (as client may be assuming ANW meta buffers). 1715534bb6132a6a664f90b42b3ef81298b42efb3dc2Lajos Molnar if (mMetadataType[kPortIndexInput] == kMetadataBufferTypeGrallocSource) { 1716534bb6132a6a664f90b42b3ef81298b42efb3dc2Lajos Molnar header->nFilledLen = rangeLength ? sizeof(VideoGrallocMetadata) : 0; 17175fb8b2987ab96ad65dc4b046616607ece16d6fb3Lajos Molnar header->nOffset = 0; 1718054219874873b41f1c815552987c10465c34ba2bLajos Molnar } else { 17195fb8b2987ab96ad65dc4b046616607ece16d6fb3Lajos Molnar // rangeLength and rangeOffset must be a subset of the allocated data in the buffer. 17205fb8b2987ab96ad65dc4b046616607ece16d6fb3Lajos Molnar // corner case: we permit rangeOffset == end-of-buffer with rangeLength == 0. 17215fb8b2987ab96ad65dc4b046616607ece16d6fb3Lajos Molnar if (rangeOffset > header->nAllocLen 17225fb8b2987ab96ad65dc4b046616607ece16d6fb3Lajos Molnar || rangeLength > header->nAllocLen - rangeOffset) { 1723ec4ed7d541f48d1d0af8f93cd26ec291ca82061bLajos Molnar CLOG_ERROR(emptyBuffer, OMX_ErrorBadParameter, FULL_BUFFER(NULL, header, fenceFd)); 17245fb8b2987ab96ad65dc4b046616607ece16d6fb3Lajos Molnar if (fenceFd >= 0) { 17255fb8b2987ab96ad65dc4b046616607ece16d6fb3Lajos Molnar ::close(fenceFd); 17265fb8b2987ab96ad65dc4b046616607ece16d6fb3Lajos Molnar } 17275fb8b2987ab96ad65dc4b046616607ece16d6fb3Lajos Molnar return BAD_VALUE; 17285fb8b2987ab96ad65dc4b046616607ece16d6fb3Lajos Molnar } 17295fb8b2987ab96ad65dc4b046616607ece16d6fb3Lajos Molnar header->nFilledLen = rangeLength; 17305fb8b2987ab96ad65dc4b046616607ece16d6fb3Lajos Molnar header->nOffset = rangeOffset; 17315fb8b2987ab96ad65dc4b046616607ece16d6fb3Lajos Molnar 1732ef777c71a051f519e0b6998ad663fa5bd291d48aLajos Molnar buffer_meta->CopyToOMX(header); 1733054219874873b41f1c815552987c10465c34ba2bLajos Molnar } 1734318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 173515ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar return emptyBuffer_l(header, flags, timestamp, (intptr_t)buffer, fenceFd); 1736f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar} 1737f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 1738f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar// log queued buffer activity for the next few input and/or output frames 1739f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar// if logging at internal state level 1740f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnarvoid OMXNodeInstance::bumpDebugLevel_l(size_t numInputBuffers, size_t numOutputBuffers) { 1741f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar if (DEBUG == ADebug::kDebugInternalState) { 1742f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar DEBUG_BUMP = ADebug::kDebugAll; 1743f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar if (numInputBuffers > 0) { 1744f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar mDebugLevelBumpPendingBuffers[kPortIndexInput] = numInputBuffers; 1745f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } 1746f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar if (numOutputBuffers > 0) { 1747f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar mDebugLevelBumpPendingBuffers[kPortIndexOutput] = numOutputBuffers; 1748f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } 1749f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } 1750f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar} 1751f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 1752f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnarvoid OMXNodeInstance::unbumpDebugLevel_l(size_t portIndex) { 1753f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar if (mDebugLevelBumpPendingBuffers[portIndex]) { 1754f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar --mDebugLevelBumpPendingBuffers[portIndex]; 1755f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } 1756f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar if (!mDebugLevelBumpPendingBuffers[0] 1757f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar && !mDebugLevelBumpPendingBuffers[1]) { 1758f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar DEBUG_BUMP = DEBUG; 1759f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } 1760f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar} 1761f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 176215ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnarstatus_t OMXNodeInstance::storeFenceInMeta_l( 176315ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar OMX_BUFFERHEADERTYPE *header, int fenceFd, OMX_U32 portIndex) { 176415ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar // propagate fence if component supports it; wait for it otherwise 176515ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar OMX_U32 metaSize = portIndex == kPortIndexInput ? header->nFilledLen : header->nAllocLen; 176615ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar if (mMetadataType[portIndex] == kMetadataBufferTypeANWBuffer 176715ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar && metaSize >= sizeof(VideoNativeMetadata)) { 176815ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar VideoNativeMetadata &nativeMeta = *(VideoNativeMetadata *)(header->pBuffer); 176915ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar if (nativeMeta.nFenceFd >= 0) { 177015ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar ALOGE("fence (%d) already exists in meta", nativeMeta.nFenceFd); 177115ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar if (fenceFd >= 0) { 177215ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar ::close(fenceFd); 177315ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar } 177415ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar return ALREADY_EXISTS; 177515ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar } 177615ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar nativeMeta.nFenceFd = fenceFd; 177715ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar } else if (fenceFd >= 0) { 177815ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar CLOG_BUFFER(storeFenceInMeta, "waiting for fence %d", fenceFd); 177915ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar sp<Fence> fence = new Fence(fenceFd); 178015ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar return fence->wait(IOMX::kFenceTimeoutMs); 178115ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar } 178215ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar return OK; 178315ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar} 178415ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar 178515ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnarint OMXNodeInstance::retrieveFenceFromMeta_l( 178615ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar OMX_BUFFERHEADERTYPE *header, OMX_U32 portIndex) { 178715ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar OMX_U32 metaSize = portIndex == kPortIndexInput ? header->nAllocLen : header->nFilledLen; 178815ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar int fenceFd = -1; 178915ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar if (mMetadataType[portIndex] == kMetadataBufferTypeANWBuffer 179015ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar && header->nAllocLen >= sizeof(VideoNativeMetadata)) { 179115ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar VideoNativeMetadata &nativeMeta = *(VideoNativeMetadata *)(header->pBuffer); 179215ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar if (nativeMeta.eType == kMetadataBufferTypeANWBuffer) { 179315ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar fenceFd = nativeMeta.nFenceFd; 179415ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar nativeMeta.nFenceFd = -1; 179515ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar } 179615ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar if (metaSize < sizeof(nativeMeta) && fenceFd >= 0) { 179715ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar CLOG_ERROR(foundFenceInEmptyMeta, BAD_VALUE, FULL_BUFFER( 179815ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar NULL, header, nativeMeta.nFenceFd)); 179915ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar fenceFd = -1; 180015ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar } 180115ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar } 180215ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar return fenceFd; 180315ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar} 180415ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar 1805f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnarstatus_t OMXNodeInstance::emptyBuffer_l( 180615ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar OMX_BUFFERHEADERTYPE *header, OMX_U32 flags, OMX_TICKS timestamp, 180715ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar intptr_t debugAddr, int fenceFd) { 1808f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar header->nFlags = flags; 1809f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar header->nTimeStamp = timestamp; 1810f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 181115ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar status_t res = storeFenceInMeta_l(header, fenceFd, kPortIndexInput); 181215ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar if (res != OK) { 181315ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar CLOG_ERROR(emptyBuffer::storeFenceInMeta, res, WITH_STATS( 181415ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar FULL_BUFFER(debugAddr, header, fenceFd))); 181515ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar return res; 181615ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar } 181715ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar 1818f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar { 1819f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar Mutex::Autolock _l(mDebugLock); 1820f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar mInputBuffersWithCodec.add(header); 1821f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 1822f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar // bump internal-state debug level for 2 input frames past a buffer with CSD 1823f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar if ((flags & OMX_BUFFERFLAG_CODECCONFIG) != 0) { 1824f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar bumpDebugLevel_l(2 /* numInputBuffers */, 0 /* numOutputBuffers */); 1825f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } 1826f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 182715ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar CLOG_BUMPED_BUFFER(emptyBuffer, WITH_STATS(FULL_BUFFER(debugAddr, header, fenceFd))); 1828f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } 1829f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 1830318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_ERRORTYPE err = OMX_EmptyThisBuffer(mHandle, header); 183115ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar CLOG_IF_ERROR(emptyBuffer, err, FULL_BUFFER(debugAddr, header, fenceFd)); 1832f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 1833f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar { 1834f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar Mutex::Autolock _l(mDebugLock); 1835f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar if (err != OMX_ErrorNone) { 1836f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar mInputBuffersWithCodec.remove(header); 1837f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } else if (!(flags & OMX_BUFFERFLAG_CODECCONFIG)) { 1838f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar unbumpDebugLevel_l(kPortIndexInput); 1839f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } 1840f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } 1841318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 1842318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber return StatusFromOMXError(err); 1843318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 1844318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 1845f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden// like emptyBuffer, but the data is already in header->pBuffer 1846d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhangstatus_t OMXNodeInstance::emptyGraphicBuffer_l( 1847d3ed3883c2d7bf3fb871be512055ed72cea964daPawin Vongmasa IOMX::buffer_id buffer, const sp<GraphicBuffer> &graphicBuffer, 18483604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang OMX_U32 flags, OMX_TICKS timestamp, int fenceFd) { 18496cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang OMX_BUFFERHEADERTYPE *header = findBufferHeader(buffer, kPortIndexInput); 1850298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia if (header == NULL) { 1851298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia ALOGE("b/25884056"); 1852298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia return BAD_VALUE; 1853298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia } 1854298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia 1855e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar status_t err = updateGraphicBufferInMeta_l( 185621b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang kPortIndexInput, graphicBuffer, buffer, header); 1857054219874873b41f1c815552987c10465c34ba2bLajos Molnar if (err != OK) { 185815ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar CLOG_ERROR(emptyGraphicBuffer, err, FULL_BUFFER( 185915ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar (intptr_t)header->pBuffer, header, fenceFd)); 1860054219874873b41f1c815552987c10465c34ba2bLajos Molnar return err; 1861054219874873b41f1c815552987c10465c34ba2bLajos Molnar } 1862f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden 18633604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang int64_t codecTimeUs = getCodecTimestamp(timestamp); 18646d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang 1865054219874873b41f1c815552987c10465c34ba2bLajos Molnar header->nOffset = 0; 1866e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar if (graphicBuffer == NULL) { 1867e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar header->nFilledLen = 0; 1868e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar } else if (mMetadataType[kPortIndexInput] == kMetadataBufferTypeGrallocSource) { 1869e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar header->nFilledLen = sizeof(VideoGrallocMetadata); 1870e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar } else { 1871e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar header->nFilledLen = sizeof(VideoNativeMetadata); 1872e63de4c60116261b90bc93b608ccd4bd182f3484Lajos Molnar } 18733604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang return emptyBuffer_l(header, flags, codecTimeUs, (intptr_t)header->pBuffer, fenceFd); 18743604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang} 18753604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang 18763604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhangstatus_t OMXNodeInstance::setMaxPtsGapUs(const void *params, size_t size) { 18773604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang if (params == NULL || size != sizeof(OMX_PARAM_U32TYPE)) { 18783604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang CLOG_ERROR(setMaxPtsGapUs, BAD_VALUE, "invalid params (%p,%zu)", params, size); 18793604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang return BAD_VALUE; 18803604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang } 18813604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang 18826c2d0add22ee72566623834bbfeb6170b4c94588Chong Zhang // The incoming number is an int32_t contained in OMX_U32. 18836c2d0add22ee72566623834bbfeb6170b4c94588Chong Zhang // Cast to int32_t first then int64_t. 18846c2d0add22ee72566623834bbfeb6170b4c94588Chong Zhang mMaxTimestampGapUs = (int32_t)((OMX_PARAM_U32TYPE*)params)->nU32; 18853604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang 18863604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang return OK; 18873604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang} 18883604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang 18893604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhangint64_t OMXNodeInstance::getCodecTimestamp(OMX_TICKS timestamp) { 18903604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang int64_t originalTimeUs = timestamp; 18913604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang 18923604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang if (mMaxTimestampGapUs > 0ll) { 18933604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang /* Cap timestamp gap between adjacent frames to specified max 18943604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang * 18953604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang * In the scenario of cast mirroring, encoding could be suspended for 18963604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang * prolonged periods. Limiting the pts gap to workaround the problem 18973604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang * where encoder's rate control logic produces huge frames after a 18983604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang * long period of suspension. 18993604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang */ 19003604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang if (mPrevOriginalTimeUs >= 0ll) { 19013604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang int64_t timestampGapUs = originalTimeUs - mPrevOriginalTimeUs; 19023604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang timestamp = (timestampGapUs < mMaxTimestampGapUs ? 19033604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang timestampGapUs : mMaxTimestampGapUs) + mPrevModifiedTimeUs; 19043604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang } 19053604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang ALOGV("IN timestamp: %lld -> %lld", 19063604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang static_cast<long long>(originalTimeUs), 19073604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang static_cast<long long>(timestamp)); 19086c2d0add22ee72566623834bbfeb6170b4c94588Chong Zhang } else if (mMaxTimestampGapUs < 0ll) { 19096c2d0add22ee72566623834bbfeb6170b4c94588Chong Zhang /* 19106c2d0add22ee72566623834bbfeb6170b4c94588Chong Zhang * Apply a fixed timestamp gap between adjacent frames. 19116c2d0add22ee72566623834bbfeb6170b4c94588Chong Zhang * 19126c2d0add22ee72566623834bbfeb6170b4c94588Chong Zhang * This is used by scenarios like still image capture where timestamps 19136c2d0add22ee72566623834bbfeb6170b4c94588Chong Zhang * on frames could go forward or backward. Some encoders may silently 19146c2d0add22ee72566623834bbfeb6170b4c94588Chong Zhang * drop frames when it goes backward (or even stay unchanged). 19156c2d0add22ee72566623834bbfeb6170b4c94588Chong Zhang */ 19166c2d0add22ee72566623834bbfeb6170b4c94588Chong Zhang if (mPrevOriginalTimeUs >= 0ll) { 19176c2d0add22ee72566623834bbfeb6170b4c94588Chong Zhang timestamp = mPrevModifiedTimeUs - mMaxTimestampGapUs; 19186c2d0add22ee72566623834bbfeb6170b4c94588Chong Zhang } 19196c2d0add22ee72566623834bbfeb6170b4c94588Chong Zhang ALOGV("IN timestamp: %lld -> %lld", 19206c2d0add22ee72566623834bbfeb6170b4c94588Chong Zhang static_cast<long long>(originalTimeUs), 19216c2d0add22ee72566623834bbfeb6170b4c94588Chong Zhang static_cast<long long>(timestamp)); 19223604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang } 19233604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang 19243604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang mPrevOriginalTimeUs = originalTimeUs; 19253604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang mPrevModifiedTimeUs = timestamp; 19263604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang 19276c2d0add22ee72566623834bbfeb6170b4c94588Chong Zhang if (mMaxTimestampGapUs != 0ll && !mRestorePtsFailed) { 19283604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang mOriginalTimeUs.add(timestamp, originalTimeUs); 19293604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang } 19303604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang 19313604cb1a5548694393c7b7a87191eb517bebaa47Chong Zhang return timestamp; 1932f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden} 1933f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden 1934d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhangstatus_t OMXNodeInstance::emptyNativeHandleBuffer_l( 1935d3ed3883c2d7bf3fb871be512055ed72cea964daPawin Vongmasa IOMX::buffer_id buffer, const sp<NativeHandle> &nativeHandle, 19363fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang OMX_U32 flags, OMX_TICKS timestamp, int fenceFd) { 19373fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang OMX_BUFFERHEADERTYPE *header = findBufferHeader(buffer, kPortIndexInput); 19383fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang if (header == NULL) { 19393fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang ALOGE("b/25884056"); 19403fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang return BAD_VALUE; 19413fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang } 19423fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang 19433fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang status_t err = updateNativeHandleInMeta_l( 19443fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang kPortIndexInput, nativeHandle, buffer, header); 19453fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang if (err != OK) { 1946d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang CLOG_ERROR(emptyNativeHandleBuffer_l, err, FULL_BUFFER( 19473fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang (intptr_t)header->pBuffer, header, fenceFd)); 19483fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang return err; 19493fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang } 19503fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang 19513fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang header->nOffset = 0; 19523fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang header->nFilledLen = (nativeHandle == NULL) ? 0 : sizeof(VideoNativeMetadata); 19533fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang 19543fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang return emptyBuffer_l(header, flags, timestamp, (intptr_t)header->pBuffer, fenceFd); 19553fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang} 19563fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang 19576d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhangvoid OMXNodeInstance::codecBufferFilled(omx_message &msg) { 1958331207d51a620bf018081950da4b20133014657fChong Zhang Mutex::Autolock autoLock(mLock); 1959318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 19606c2d0add22ee72566623834bbfeb6170b4c94588Chong Zhang if (mMaxTimestampGapUs == 0ll || mRestorePtsFailed) { 19616d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang return; 1962f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } 1963f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 19646d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang OMX_U32 &flags = msg.u.extended_buffer_data.flags; 19656d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang OMX_TICKS ×tamp = msg.u.extended_buffer_data.timestamp; 19666d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang 19676d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang if (!(flags & OMX_BUFFERFLAG_CODECCONFIG)) { 19686d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang ssize_t index = mOriginalTimeUs.indexOfKey(timestamp); 19696d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang if (index >= 0) { 19706d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang ALOGV("OUT timestamp: %lld -> %lld", 19716d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang static_cast<long long>(timestamp), 19726d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang static_cast<long long>(mOriginalTimeUs[index])); 19736d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang timestamp = mOriginalTimeUs[index]; 19746d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang mOriginalTimeUs.removeItemsAt(index); 19756d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang } else { 19766d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang // giving up the effort as encoder doesn't appear to preserve pts 19776d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang ALOGW("giving up limiting timestamp gap (pts = %lld)", timestamp); 19786d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang mRestorePtsFailed = true; 19796d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang } 1980dd81af7ef969981748f35ec839869d34ed0cc768Lajos Molnar } 1981dd81af7ef969981748f35ec839869d34ed0cc768Lajos Molnar} 1982dd81af7ef969981748f35ec839869d34ed0cc768Lajos Molnar 19836d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhangstatus_t OMXNodeInstance::getExtensionIndex( 19846d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang const char *parameterName, OMX_INDEXTYPE *index) { 19856d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang Mutex::Autolock autoLock(mLock); 1986e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber 19876d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang OMX_ERRORTYPE err = OMX_GetExtensionIndex( 19886d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang mHandle, const_cast<char *>(parameterName), index); 1989e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber 19906d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang return StatusFromOMXError(err); 1991e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber} 1992e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber 1993d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhangstatus_t OMXNodeInstance::dispatchMessage(const omx_message &msg) { 1994d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang mDispatcher->post(msg, true /*realTime*/); 199521b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang return OK; 199621b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang} 199721b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang 199821b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhangstatus_t OMXNodeInstance::setQuirks(OMX_U32 quirks) { 199921b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang if (quirks & ~kQuirksMask) { 200021b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang return BAD_VALUE; 200121b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang } 200221b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang 200321b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang mQuirks = quirks; 200421b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang 200521b46588d022d0c22d7c7c08e919d7a9c5cd76e3Chong Zhang return OK; 2006d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang} 2007d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang 200826a48f304a8754d655e554178ffb6d7ba4c5aac3Lajos Molnarbool OMXNodeInstance::handleMessage(omx_message &msg) { 2009318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber if (msg.type == omx_message::FILL_BUFFER_DONE) { 2010318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_BUFFERHEADERTYPE *buffer = 201141eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim findBufferHeader(msg.u.extended_buffer_data.buffer, kPortIndexOutput); 2012298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia if (buffer == NULL) { 2013298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia ALOGE("b/25884056"); 201441eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim return false; 2015298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia } 2016318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 2017f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar { 2018f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar Mutex::Autolock _l(mDebugLock); 2019f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar mOutputBuffersWithCodec.remove(buffer); 2020f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 2021f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_BUMPED_BUFFER( 202215ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar FBD, WITH_STATS(FULL_BUFFER( 202315ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar msg.u.extended_buffer_data.buffer, buffer, msg.fenceFd))); 2024f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 2025f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar unbumpDebugLevel_l(kPortIndexOutput); 2026f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } 2027f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 2028318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber BufferMeta *buffer_meta = 2029318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber static_cast<BufferMeta *>(buffer->pAppPrivate); 2030318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 2031ec4ed7d541f48d1d0af8f93cd26ec291ca82061bLajos Molnar if (buffer->nOffset + buffer->nFilledLen < buffer->nOffset 2032ec4ed7d541f48d1d0af8f93cd26ec291ca82061bLajos Molnar || buffer->nOffset + buffer->nFilledLen > buffer->nAllocLen) { 2033ec4ed7d541f48d1d0af8f93cd26ec291ca82061bLajos Molnar CLOG_ERROR(onFillBufferDone, OMX_ErrorBadParameter, 2034ec4ed7d541f48d1d0af8f93cd26ec291ca82061bLajos Molnar FULL_BUFFER(NULL, buffer, msg.fenceFd)); 2035ec4ed7d541f48d1d0af8f93cd26ec291ca82061bLajos Molnar } 2036ef777c71a051f519e0b6998ad663fa5bd291d48aLajos Molnar buffer_meta->CopyFromOMX(buffer); 20371b4ca5cebd7f42a8f8842e45bfabe19001e9a435Andreas Huber 20386d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang // fix up the buffer info (especially timestamp) if needed 20396d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang codecBufferFilled(msg); 204094ee4b708acfa941581160b267afb79192b1d816Chong Zhang } else if (msg.type == omx_message::EMPTY_BUFFER_DONE) { 2041f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar OMX_BUFFERHEADERTYPE *buffer = 204241eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim findBufferHeader(msg.u.buffer_data.buffer, kPortIndexInput); 204341eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim if (buffer == NULL) { 204441eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim return false; 204541eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim } 2046f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 2047f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar { 2048f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar Mutex::Autolock _l(mDebugLock); 2049f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar mInputBuffersWithCodec.remove(buffer); 2050f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 2051f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOG_BUMPED_BUFFER( 205215ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar EBD, WITH_STATS(EMPTY_BUFFER(msg.u.buffer_data.buffer, buffer, msg.fenceFd))); 2053f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } 2054f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 20556d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang const sp<IOMXBufferSource> bufferSource(getBufferSource()); 20566d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang 205794ee4b708acfa941581160b267afb79192b1d816Chong Zhang if (bufferSource != NULL) { 20586d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang // This is one of the buffers used exclusively by IOMXBufferSource. 20591b4ca5cebd7f42a8f8842e45bfabe19001e9a435Andreas Huber // Don't dispatch a message back to ACodec, since it doesn't 20601b4ca5cebd7f42a8f8842e45bfabe19001e9a435Andreas Huber // know that anyone asked to have the buffer emptied and will 20611b4ca5cebd7f42a8f8842e45bfabe19001e9a435Andreas Huber // be very confused. 20626d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang bufferSource->onInputBufferEmptied( 20636d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang msg.u.buffer_data.buffer, OMXFenceParcelable(msg.fenceFd)); 206426a48f304a8754d655e554178ffb6d7ba4c5aac3Lajos Molnar return true; 206526a48f304a8754d655e554178ffb6d7ba4c5aac3Lajos Molnar } 20666cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang } else if (msg.type == omx_message::EVENT && 20676cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang msg.u.event_data.event == OMX_EventDataSpaceChanged) { 20686cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang handleDataSpaceChanged(msg); 206926a48f304a8754d655e554178ffb6d7ba4c5aac3Lajos Molnar } 207026a48f304a8754d655e554178ffb6d7ba4c5aac3Lajos Molnar 207126a48f304a8754d655e554178ffb6d7ba4c5aac3Lajos Molnar return false; 207226a48f304a8754d655e554178ffb6d7ba4c5aac3Lajos Molnar} 207326a48f304a8754d655e554178ffb6d7ba4c5aac3Lajos Molnar 20746cf9a1238986880536de705255f7c2c91c1ba719Chong Zhangbool OMXNodeInstance::handleDataSpaceChanged(omx_message &msg) { 20756cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang android_dataspace dataSpace = (android_dataspace) msg.u.event_data.data1; 20766cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang android_dataspace origDataSpace = dataSpace; 20776cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang 20786cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang if (!ColorUtils::convertDataSpaceToV0(dataSpace)) { 20796cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang // Do not process the data space change, don't notify client either 20806cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang return true; 20816cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang } 20826cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang 20836cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang android_pixel_format pixelFormat = (android_pixel_format)msg.u.event_data.data3; 20846cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang 20856cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang ColorAspects requestedAspects = ColorUtils::unpackToColorAspects(msg.u.event_data.data2); 20866cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang ColorAspects aspects = requestedAspects; // initially requested aspects 20876cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang 20886cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang // request color aspects to encode 20896cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang OMX_INDEXTYPE index; 20906cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang status_t err = getExtensionIndex( 20916cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang "OMX.google.android.index.describeColorAspects", &index); 20926cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang if (err == OK) { 20936cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang // V0 dataspace 20946cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang DescribeColorAspectsParams params; 20956cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang InitOMXParams(¶ms); 20966cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang params.nPortIndex = kPortIndexInput; 20976cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang params.nDataSpace = origDataSpace; 20986cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang params.nPixelFormat = pixelFormat; 20996cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang params.bDataSpaceChanged = OMX_TRUE; 21006cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang params.sAspects = requestedAspects; 21016cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang 21026cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang err = getConfig(index, ¶ms, sizeof(params)); 21036cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang if (err == OK) { 21046cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang aspects = params.sAspects; 21056cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang ALOGD("Codec resolved it to (R:%d(%s), P:%d(%s), M:%d(%s), T:%d(%s)) err=%d(%s)", 21066cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang params.sAspects.mRange, asString(params.sAspects.mRange), 21076cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang params.sAspects.mPrimaries, asString(params.sAspects.mPrimaries), 21086cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang params.sAspects.mMatrixCoeffs, asString(params.sAspects.mMatrixCoeffs), 21096cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang params.sAspects.mTransfer, asString(params.sAspects.mTransfer), 21106cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang err, asString(err)); 21116cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang } else { 21126cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang params.sAspects = aspects; 21136cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang err = OK; 21146cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang } 21156cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang params.bDataSpaceChanged = OMX_FALSE; 21166cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang for (int triesLeft = 2; --triesLeft >= 0; ) { 21176cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang status_t err = setConfig(index, ¶ms, sizeof(params)); 21186cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang if (err == OK) { 21196cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang err = getConfig(index, ¶ms, sizeof(params)); 21206cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang } 21216cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang if (err != OK || !ColorUtils::checkIfAspectsChangedAndUnspecifyThem( 21226cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang params.sAspects, aspects)) { 21236cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang // if we can't set or get color aspects, still communicate dataspace to client 21246cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang break; 21256cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang } 21266cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang 21276cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang ALOGW_IF(triesLeft == 0, "Codec repeatedly changed requested ColorAspects."); 21286cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang } 21296cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang } 21306cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang 21316cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang ALOGV("Set color aspects to (R:%d(%s), P:%d(%s), M:%d(%s), T:%d(%s)) err=%d(%s)", 21326cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang aspects.mRange, asString(aspects.mRange), 21336cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang aspects.mPrimaries, asString(aspects.mPrimaries), 21346cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang aspects.mMatrixCoeffs, asString(aspects.mMatrixCoeffs), 21356cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang aspects.mTransfer, asString(aspects.mTransfer), 21366cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang err, asString(err)); 21376cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang 21386cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang // signal client that the dataspace has changed; this will update the output format 21396cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang // TODO: we should tie this to an output buffer somehow, and signal the change 21406cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang // just before the output buffer is returned to the client, but there are many 21416cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang // ways this could fail (e.g. flushing), and we are not yet supporting this scenario. 21426cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang 21436cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang msg.u.event_data.data1 = (OMX_U32) dataSpace; 21446cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang msg.u.event_data.data2 = (OMX_U32) ColorUtils::packToU32(aspects); 21456cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang 21466cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang return false; 21476cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang} 21486cf9a1238986880536de705255f7c2c91c1ba719Chong Zhang 214926a48f304a8754d655e554178ffb6d7ba4c5aac3Lajos Molnarvoid OMXNodeInstance::onMessages(std::list<omx_message> &messages) { 215026a48f304a8754d655e554178ffb6d7ba4c5aac3Lajos Molnar for (std::list<omx_message>::iterator it = messages.begin(); it != messages.end(); ) { 215126a48f304a8754d655e554178ffb6d7ba4c5aac3Lajos Molnar if (handleMessage(*it)) { 215226a48f304a8754d655e554178ffb6d7ba4c5aac3Lajos Molnar messages.erase(it++); 215326a48f304a8754d655e554178ffb6d7ba4c5aac3Lajos Molnar } else { 215426a48f304a8754d655e554178ffb6d7ba4c5aac3Lajos Molnar ++it; 21551b4ca5cebd7f42a8f8842e45bfabe19001e9a435Andreas Huber } 2156318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber } 2157318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 2158984a54322f7c70bc75e862d91bdd975814872affLajos Molnar if (!messages.empty()) { 2159984a54322f7c70bc75e862d91bdd975814872affLajos Molnar mObserver->onMessages(messages); 2160984a54322f7c70bc75e862d91bdd975814872affLajos Molnar } 2161318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 2162318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 2163d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhangvoid OMXNodeInstance::onObserverDied() { 216429357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("!!! Observer died. Quickly, do something, ... anything..."); 2165318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 2166318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber // Try to force shutdown of the node and hope for the best. 2167d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang freeNode(); 2168318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 2169318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 2170f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden// OMXNodeInstance::OnEvent calls OMX::OnEvent, which then calls here. 2171f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden// Don't try to acquire mLock here -- in rare circumstances this will hang. 2172f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFaddenvoid OMXNodeInstance::onEvent( 2173f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden OMX_EVENTTYPE event, OMX_U32 arg1, OMX_U32 arg2) { 2174f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar const char *arg1String = "??"; 2175f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar const char *arg2String = "??"; 2176f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar ADebug::Level level = ADebug::kDebugInternalState; 2177f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 2178f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar switch (event) { 2179f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar case OMX_EventCmdComplete: 2180f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar arg1String = asString((OMX_COMMANDTYPE)arg1); 2181f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar switch (arg1) { 2182f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar case OMX_CommandStateSet: 2183f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar arg2String = asString((OMX_STATETYPE)arg2); 2184f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar level = ADebug::kDebugState; 2185f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar break; 2186f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar case OMX_CommandFlush: 2187f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar case OMX_CommandPortEnable: 2188f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar { 2189f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar // bump internal-state debug level for 2 input and output frames 2190f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar Mutex::Autolock _l(mDebugLock); 2191f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar bumpDebugLevel_l(2 /* numInputBuffers */, 2 /* numOutputBuffers */); 2192f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } 2193f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar // fall through 2194f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar default: 2195f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar arg2String = portString(arg2); 2196f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } 2197f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar break; 2198f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar case OMX_EventError: 2199f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar arg1String = asString((OMX_ERRORTYPE)arg1); 2200f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar level = ADebug::kDebugLifeCycle; 2201f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar break; 2202f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar case OMX_EventPortSettingsChanged: 2203f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar arg2String = asString((OMX_INDEXEXTTYPE)arg2); 2204f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar // fall through 2205f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar default: 2206f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar arg1String = portString(arg1); 2207f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } 2208f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 2209f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOGI_(level, onEvent, "%s(%x), %s(%x), %s(%x)", 2210f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar asString(event), event, arg1String, arg1, arg2String, arg2); 22116d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang const sp<IOMXBufferSource> bufferSource(getBufferSource()); 2212f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden 2213e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber if (bufferSource != NULL 2214e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber && event == OMX_EventCmdComplete 2215e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber && arg1 == OMX_CommandStateSet 2216e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber && arg2 == OMX_StateExecuting) { 22176d332d2cdf6e62c2c20ebff220868fe9e3ed7f44Chong Zhang bufferSource->onOmxExecuting(); 2218f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden } 22196392ae13cf6e15c706fce45396ec1e79af6171a9Lajos Molnar 22206392ae13cf6e15c706fce45396ec1e79af6171a9Lajos Molnar // allow configuration if we return to the loaded state 22216392ae13cf6e15c706fce45396ec1e79af6171a9Lajos Molnar if (event == OMX_EventCmdComplete 22226392ae13cf6e15c706fce45396ec1e79af6171a9Lajos Molnar && arg1 == OMX_CommandStateSet 22236392ae13cf6e15c706fce45396ec1e79af6171a9Lajos Molnar && arg2 == OMX_StateLoaded) { 22246392ae13cf6e15c706fce45396ec1e79af6171a9Lajos Molnar mSailed = false; 22256392ae13cf6e15c706fce45396ec1e79af6171a9Lajos Molnar } 2226f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden} 2227f779bb50d9746d9526541c3e6dcdf619cac941b7Andy McFadden 2228318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber// static 2229318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas HuberOMX_ERRORTYPE OMXNodeInstance::OnEvent( 223084333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber OMX_IN OMX_HANDLETYPE /* hComponent */, 2231318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_IN OMX_PTR pAppData, 2232318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_IN OMX_EVENTTYPE eEvent, 2233318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_IN OMX_U32 nData1, 2234318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_IN OMX_U32 nData2, 2235318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_IN OMX_PTR pEventData) { 2236298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia if (pAppData == NULL) { 2237298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia ALOGE("b/25884056"); 2238298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia return OMX_ErrorBadParameter; 2239298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia } 2240318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMXNodeInstance *instance = static_cast<OMXNodeInstance *>(pAppData); 2241134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber if (instance->mDying) { 2242134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber return OMX_ErrorNone; 2243134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber } 2244d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang 2245d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang instance->onEvent(eEvent, nData1, nData2); 2246d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang 2247d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang // output rendered events are not processed as regular events until they hit the observer 2248d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang if (eEvent == OMX_EventOutputRendered) { 2249d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang if (pEventData == NULL) { 2250d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang return OMX_ErrorBadParameter; 2251d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang } 2252d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang 2253d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang // process data from array 2254d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang OMX_VIDEO_RENDEREVENTTYPE *renderData = (OMX_VIDEO_RENDEREVENTTYPE *)pEventData; 2255d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang for (size_t i = 0; i < nData1; ++i) { 2256d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang omx_message msg; 2257d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang msg.type = omx_message::FRAME_RENDERED; 2258d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang msg.fenceFd = -1; 2259d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang msg.u.render_data.timestamp = renderData[i].nMediaTimeUs; 2260d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang msg.u.render_data.nanoTime = renderData[i].nSystemTimeNs; 226136f05c7f071e5c877e65943fe181d2b48c7bd6b0Lajos Molnar bool realTime = msg.u.render_data.timestamp == INT64_MAX; 226236f05c7f071e5c877e65943fe181d2b48c7bd6b0Lajos Molnar instance->mDispatcher->post(msg, realTime); 2263d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang } 2264d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang return OMX_ErrorNone; 2265d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang } 2266d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang 2267d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang omx_message msg; 2268d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang msg.type = omx_message::EVENT; 2269d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang msg.fenceFd = -1; 2270d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang msg.u.event_data.event = eEvent; 2271d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang msg.u.event_data.data1 = nData1; 2272d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang msg.u.event_data.data2 = nData2; 2273d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang 2274d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang instance->mDispatcher->post(msg, true /* realTime */); 2275d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang 2276d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang return OMX_ErrorNone; 2277318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 2278318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 2279318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber// static 2280318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas HuberOMX_ERRORTYPE OMXNodeInstance::OnEmptyBufferDone( 228184333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber OMX_IN OMX_HANDLETYPE /* hComponent */, 2282318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_IN OMX_PTR pAppData, 2283318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_IN OMX_BUFFERHEADERTYPE* pBuffer) { 2284298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia if (pAppData == NULL) { 2285298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia ALOGE("b/25884056"); 2286298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia return OMX_ErrorBadParameter; 2287298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia } 2288318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMXNodeInstance *instance = static_cast<OMXNodeInstance *>(pAppData); 2289134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber if (instance->mDying) { 2290134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber return OMX_ErrorNone; 2291134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber } 229215ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar int fenceFd = instance->retrieveFenceFromMeta_l(pBuffer, kPortIndexOutput); 2293d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang 2294d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang omx_message msg; 2295d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang msg.type = omx_message::EMPTY_BUFFER_DONE; 2296d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang msg.fenceFd = fenceFd; 2297d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang msg.u.buffer_data.buffer = instance->findBufferID(pBuffer); 2298d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang instance->mDispatcher->post(msg); 2299d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang 2300d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang return OMX_ErrorNone; 2301318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 2302318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 2303318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber// static 2304318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas HuberOMX_ERRORTYPE OMXNodeInstance::OnFillBufferDone( 230584333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber OMX_IN OMX_HANDLETYPE /* hComponent */, 2306318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_IN OMX_PTR pAppData, 2307318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_IN OMX_BUFFERHEADERTYPE* pBuffer) { 2308298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia if (pAppData == NULL) { 2309298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia ALOGE("b/25884056"); 2310298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia return OMX_ErrorBadParameter; 2311298f3c866c5cdb987d15e1e4fc12692fc971ad63Wei Jia } 2312318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMXNodeInstance *instance = static_cast<OMXNodeInstance *>(pAppData); 2313134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber if (instance->mDying) { 2314134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber return OMX_ErrorNone; 2315134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber } 231615ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar int fenceFd = instance->retrieveFenceFromMeta_l(pBuffer, kPortIndexOutput); 2317d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang 2318d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang omx_message msg; 2319d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang msg.type = omx_message::FILL_BUFFER_DONE; 2320d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang msg.fenceFd = fenceFd; 2321d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang msg.u.extended_buffer_data.buffer = instance->findBufferID(pBuffer); 2322d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang msg.u.extended_buffer_data.range_offset = pBuffer->nOffset; 2323d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang msg.u.extended_buffer_data.range_length = pBuffer->nFilledLen; 2324d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang msg.u.extended_buffer_data.flags = pBuffer->nFlags; 2325d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang msg.u.extended_buffer_data.timestamp = pBuffer->nTimeStamp; 2326d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang instance->mDispatcher->post(msg); 2327d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang 2328d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang return OMX_ErrorNone; 2329318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 2330318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 2331d3ed3883c2d7bf3fb871be512055ed72cea964daPawin Vongmasavoid OMXNodeInstance::addActiveBuffer(OMX_U32 portIndex, IOMX::buffer_id id) { 2332d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber ActiveBuffer active; 2333d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber active.mPortIndex = portIndex; 2334d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber active.mID = id; 2335d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber mActiveBuffers.push(active); 2336f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 2337f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar if (portIndex < NELEM(mNumPortBuffers)) { 2338f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar ++mNumPortBuffers[portIndex]; 2339f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } 2340d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber} 2341d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber 2342d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Hubervoid OMXNodeInstance::removeActiveBuffer( 2343d3ed3883c2d7bf3fb871be512055ed72cea964daPawin Vongmasa OMX_U32 portIndex, IOMX::buffer_id id) { 2344d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber for (size_t i = 0; i < mActiveBuffers.size(); ++i) { 2345d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber if (mActiveBuffers[i].mPortIndex == portIndex 2346f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar && mActiveBuffers[i].mID == id) { 2347d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber mActiveBuffers.removeItemsAt(i); 2348f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar 2349f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar if (portIndex < NELEM(mNumPortBuffers)) { 2350f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar --mNumPortBuffers[portIndex]; 2351f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar } 2352f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar return; 2353d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber } 2354d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber } 2355d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber 2356f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar CLOGW("Attempt to remove an active buffer [%#x] we know nothing about...", id); 2357d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber} 2358d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber 2359d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Hubervoid OMXNodeInstance::freeActiveBuffers() { 2360d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber // Make sure to count down here, as freeBuffer will in turn remove 2361d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber // the active buffer from the vector... 2362b92add32c22656dedfb82d26ccc168c43c92b8ebChad Brubaker for (size_t i = mActiveBuffers.size(); i > 0;) { 2363b92add32c22656dedfb82d26ccc168c43c92b8ebChad Brubaker i--; 2364d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber freeBuffer(mActiveBuffers[i].mPortIndex, mActiveBuffers[i].mID); 2365d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber } 2366d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber} 2367d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber 2368d3ed3883c2d7bf3fb871be512055ed72cea964daPawin VongmasaIOMX::buffer_id OMXNodeInstance::makeBufferID(OMX_BUFFERHEADERTYPE *bufferHeader) { 2369609b815a3131d22da38b2f452faa9f89daad4039Andy Hung if (bufferHeader == NULL) { 2370609b815a3131d22da38b2f452faa9f89daad4039Andy Hung return 0; 2371609b815a3131d22da38b2f452faa9f89daad4039Andy Hung } 2372609b815a3131d22da38b2f452faa9f89daad4039Andy Hung Mutex::Autolock autoLock(mBufferIDLock); 2373d3ed3883c2d7bf3fb871be512055ed72cea964daPawin Vongmasa IOMX::buffer_id buffer; 2374609b815a3131d22da38b2f452faa9f89daad4039Andy Hung do { // handle the very unlikely case of ID overflow 2375609b815a3131d22da38b2f452faa9f89daad4039Andy Hung if (++mBufferIDCount == 0) { 2376f296e2b262d2a8f7c570eaed454a28cca99eb976Lajos Molnar ++mBufferIDCount; 2377609b815a3131d22da38b2f452faa9f89daad4039Andy Hung } 2378d3ed3883c2d7bf3fb871be512055ed72cea964daPawin Vongmasa buffer = (IOMX::buffer_id)mBufferIDCount; 2379609b815a3131d22da38b2f452faa9f89daad4039Andy Hung } while (mBufferIDToBufferHeader.indexOfKey(buffer) >= 0); 2380609b815a3131d22da38b2f452faa9f89daad4039Andy Hung mBufferIDToBufferHeader.add(buffer, bufferHeader); 2381609b815a3131d22da38b2f452faa9f89daad4039Andy Hung mBufferHeaderToBufferID.add(bufferHeader, buffer); 2382609b815a3131d22da38b2f452faa9f89daad4039Andy Hung return buffer; 2383609b815a3131d22da38b2f452faa9f89daad4039Andy Hung} 2384609b815a3131d22da38b2f452faa9f89daad4039Andy Hung 238541eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik KimOMX_BUFFERHEADERTYPE *OMXNodeInstance::findBufferHeader( 2386d3ed3883c2d7bf3fb871be512055ed72cea964daPawin Vongmasa IOMX::buffer_id buffer, OMX_U32 portIndex) { 2387609b815a3131d22da38b2f452faa9f89daad4039Andy Hung if (buffer == 0) { 2388609b815a3131d22da38b2f452faa9f89daad4039Andy Hung return NULL; 2389609b815a3131d22da38b2f452faa9f89daad4039Andy Hung } 2390609b815a3131d22da38b2f452faa9f89daad4039Andy Hung Mutex::Autolock autoLock(mBufferIDLock); 23915419242328f33f4d126a22ef6296c99353f4dfb4Chong Zhang ssize_t index = mBufferIDToBufferHeader.indexOfKey(buffer); 23925419242328f33f4d126a22ef6296c99353f4dfb4Chong Zhang if (index < 0) { 23935419242328f33f4d126a22ef6296c99353f4dfb4Chong Zhang CLOGW("findBufferHeader: buffer %u not found", buffer); 23945419242328f33f4d126a22ef6296c99353f4dfb4Chong Zhang return NULL; 23955419242328f33f4d126a22ef6296c99353f4dfb4Chong Zhang } 239641eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim OMX_BUFFERHEADERTYPE *header = mBufferIDToBufferHeader.valueAt(index); 239741eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim BufferMeta *buffer_meta = 239841eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim static_cast<BufferMeta *>(header->pAppPrivate); 239941eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim if (buffer_meta->getPortIndex() != portIndex) { 240041eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim CLOGW("findBufferHeader: buffer %u found but with incorrect port index.", buffer); 240141eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim android_errorWriteLog(0x534e4554, "28816827"); 240241eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim return NULL; 240341eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim } 240441eca4f0ec697529fe8a47f34f43f5ba98a50162Wonsik Kim return header; 2405609b815a3131d22da38b2f452faa9f89daad4039Andy Hung} 2406609b815a3131d22da38b2f452faa9f89daad4039Andy Hung 2407d3ed3883c2d7bf3fb871be512055ed72cea964daPawin VongmasaIOMX::buffer_id OMXNodeInstance::findBufferID(OMX_BUFFERHEADERTYPE *bufferHeader) { 2408609b815a3131d22da38b2f452faa9f89daad4039Andy Hung if (bufferHeader == NULL) { 2409609b815a3131d22da38b2f452faa9f89daad4039Andy Hung return 0; 2410609b815a3131d22da38b2f452faa9f89daad4039Andy Hung } 2411609b815a3131d22da38b2f452faa9f89daad4039Andy Hung Mutex::Autolock autoLock(mBufferIDLock); 24125419242328f33f4d126a22ef6296c99353f4dfb4Chong Zhang ssize_t index = mBufferHeaderToBufferID.indexOfKey(bufferHeader); 24135419242328f33f4d126a22ef6296c99353f4dfb4Chong Zhang if (index < 0) { 24145419242328f33f4d126a22ef6296c99353f4dfb4Chong Zhang CLOGW("findBufferID: bufferHeader %p not found", bufferHeader); 24155419242328f33f4d126a22ef6296c99353f4dfb4Chong Zhang return 0; 24165419242328f33f4d126a22ef6296c99353f4dfb4Chong Zhang } 24175419242328f33f4d126a22ef6296c99353f4dfb4Chong Zhang return mBufferHeaderToBufferID.valueAt(index); 2418609b815a3131d22da38b2f452faa9f89daad4039Andy Hung} 2419609b815a3131d22da38b2f452faa9f89daad4039Andy Hung 2420d3ed3883c2d7bf3fb871be512055ed72cea964daPawin Vongmasavoid OMXNodeInstance::invalidateBufferID(IOMX::buffer_id buffer) { 2421609b815a3131d22da38b2f452faa9f89daad4039Andy Hung if (buffer == 0) { 2422609b815a3131d22da38b2f452faa9f89daad4039Andy Hung return; 2423609b815a3131d22da38b2f452faa9f89daad4039Andy Hung } 2424609b815a3131d22da38b2f452faa9f89daad4039Andy Hung Mutex::Autolock autoLock(mBufferIDLock); 24255419242328f33f4d126a22ef6296c99353f4dfb4Chong Zhang ssize_t index = mBufferIDToBufferHeader.indexOfKey(buffer); 24265419242328f33f4d126a22ef6296c99353f4dfb4Chong Zhang if (index < 0) { 24275419242328f33f4d126a22ef6296c99353f4dfb4Chong Zhang CLOGW("invalidateBufferID: buffer %u not found", buffer); 24285419242328f33f4d126a22ef6296c99353f4dfb4Chong Zhang return; 24295419242328f33f4d126a22ef6296c99353f4dfb4Chong Zhang } 24305419242328f33f4d126a22ef6296c99353f4dfb4Chong Zhang mBufferHeaderToBufferID.removeItem(mBufferIDToBufferHeader.valueAt(index)); 24315419242328f33f4d126a22ef6296c99353f4dfb4Chong Zhang mBufferIDToBufferHeader.removeItemsAt(index); 2432609b815a3131d22da38b2f452faa9f89daad4039Andy Hung} 2433609b815a3131d22da38b2f452faa9f89daad4039Andy Hung 2434318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} // namespace android 2435