13fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang/* 23fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang * Copyright 2016, The Android Open Source Project 33fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang * 43fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang * Licensed under the Apache License, Version 2.0 (the "License"); 53fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang * you may not use this file except in compliance with the License. 63fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang * You may obtain a copy of the License at 73fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang * 83fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang * http://www.apache.org/licenses/LICENSE-2.0 93fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang * 103fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang * Unless required by applicable law or agreed to in writing, software 113fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang * distributed under the License is distributed on an "AS IS" BASIS, 123fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 133fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang * See the License for the specific language governing permissions and 143fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang * limitations under the License. 153fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang */ 163fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang 173fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang//#define LOG_NDEBUG 0 183fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang#define LOG_TAG "OMXBuffer" 193fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang 20f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa#include <media/stagefright/foundation/ADebug.h> 213fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang#include <media/MediaCodecBuffer.h> 223fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang#include <media/OMXBuffer.h> 233fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang#include <binder/IMemory.h> 243fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang#include <binder/Parcel.h> 253fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang#include <ui/GraphicBuffer.h> 263fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang#include <utils/NativeHandle.h> 273fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang 283fd200feb657c157125e45e30c2a7262e3c0244dChong Zhangnamespace android { 293fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang 303fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang//static 313fd200feb657c157125e45e30c2a7262e3c0244dChong ZhangOMXBuffer OMXBuffer::sPreset(static_cast<sp<MediaCodecBuffer> >(NULL)); 323fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang 333fd200feb657c157125e45e30c2a7262e3c0244dChong ZhangOMXBuffer::OMXBuffer() 343fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang : mBufferType(kBufferTypeInvalid) { 353fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang} 363fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang 373fd200feb657c157125e45e30c2a7262e3c0244dChong ZhangOMXBuffer::OMXBuffer(const sp<MediaCodecBuffer>& codecBuffer) 383fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang : mBufferType(kBufferTypePreset), 3949b2b4d30a0f74314630a5ea5f0e59697d90443eChong Zhang mRangeOffset(codecBuffer != NULL ? codecBuffer->offset() : 0), 403fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang mRangeLength(codecBuffer != NULL ? codecBuffer->size() : 0) { 413fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang} 423fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang 43f62ea8018813951e8f6a182880cadb3217e4ce37Pawin VongmasaOMXBuffer::OMXBuffer(OMX_U32 rangeOffset, OMX_U32 rangeLength) 44f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa : mBufferType(kBufferTypePreset), 45f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa mRangeOffset(rangeOffset), 46f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa mRangeLength(rangeLength) { 47f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa} 48f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa 49d02c08671d666e12a94bcadd943787a9ab2ceea8Chong ZhangOMXBuffer::OMXBuffer(const sp<IMemory> &mem) 503fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang : mBufferType(kBufferTypeSharedMem), 51d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang mMem(mem) { 523fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang} 533fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang 543fd200feb657c157125e45e30c2a7262e3c0244dChong ZhangOMXBuffer::OMXBuffer(const sp<GraphicBuffer> &gbuf) 553fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang : mBufferType(kBufferTypeANWBuffer), 563fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang mGraphicBuffer(gbuf) { 573fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang} 583fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang 593fd200feb657c157125e45e30c2a7262e3c0244dChong ZhangOMXBuffer::OMXBuffer(const sp<NativeHandle> &handle) 603fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang : mBufferType(kBufferTypeNativeHandle), 613fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang mNativeHandle(handle) { 623fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang} 633fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang 64f62ea8018813951e8f6a182880cadb3217e4ce37Pawin VongmasaOMXBuffer::OMXBuffer(const hidl_memory &hidlMemory) 65f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa : mBufferType(kBufferTypeHidlMemory), 66f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa mHidlMemory(hidlMemory) { 67f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa} 68f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa 693fd200feb657c157125e45e30c2a7262e3c0244dChong ZhangOMXBuffer::~OMXBuffer() { 703fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang} 713fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang 723fd200feb657c157125e45e30c2a7262e3c0244dChong Zhangstatus_t OMXBuffer::writeToParcel(Parcel *parcel) const { 73f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa CHECK(mBufferType != kBufferTypeHidlMemory); 743fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang parcel->writeInt32(mBufferType); 753fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang 763fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang switch(mBufferType) { 773fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang case kBufferTypePreset: 783fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang { 7949b2b4d30a0f74314630a5ea5f0e59697d90443eChong Zhang status_t err = parcel->writeUint32(mRangeOffset); 8049b2b4d30a0f74314630a5ea5f0e59697d90443eChong Zhang if (err != OK) { 8149b2b4d30a0f74314630a5ea5f0e59697d90443eChong Zhang return err; 8249b2b4d30a0f74314630a5ea5f0e59697d90443eChong Zhang } 833fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang return parcel->writeUint32(mRangeLength); 843fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang } 853fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang 863fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang case kBufferTypeSharedMem: 873fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang { 88d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang return parcel->writeStrongBinder(IInterface::asBinder(mMem)); 893fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang } 903fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang 913fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang case kBufferTypeANWBuffer: 923fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang { 938ff40189817e95c7a56e347398d20e60d7534ee6Pawin Vongmasa if (mGraphicBuffer == NULL) { 948ff40189817e95c7a56e347398d20e60d7534ee6Pawin Vongmasa return parcel->writeBool(false); 958ff40189817e95c7a56e347398d20e60d7534ee6Pawin Vongmasa } 968ff40189817e95c7a56e347398d20e60d7534ee6Pawin Vongmasa status_t err = parcel->writeBool(true); 978ff40189817e95c7a56e347398d20e60d7534ee6Pawin Vongmasa if (err != OK) { 988ff40189817e95c7a56e347398d20e60d7534ee6Pawin Vongmasa return err; 998ff40189817e95c7a56e347398d20e60d7534ee6Pawin Vongmasa } 1003fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang return parcel->write(*mGraphicBuffer); 1013fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang } 1023fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang 1033fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang case kBufferTypeNativeHandle: 1043fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang { 1053fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang return parcel->writeNativeHandle(mNativeHandle->handle()); 1063fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang } 1073fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang 1083fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang default: 1093fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang return BAD_VALUE; 1103fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang } 1113fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang return BAD_VALUE; 1123fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang} 1133fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang 1143fd200feb657c157125e45e30c2a7262e3c0244dChong Zhangstatus_t OMXBuffer::readFromParcel(const Parcel *parcel) { 1153fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang BufferType bufferType = (BufferType) parcel->readInt32(); 116f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa CHECK(bufferType != kBufferTypeHidlMemory); 1173fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang 1183fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang switch(bufferType) { 1193fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang case kBufferTypePreset: 1203fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang { 12149b2b4d30a0f74314630a5ea5f0e59697d90443eChong Zhang status_t err = parcel->readUint32(&mRangeOffset); 12249b2b4d30a0f74314630a5ea5f0e59697d90443eChong Zhang if (err != OK) { 12349b2b4d30a0f74314630a5ea5f0e59697d90443eChong Zhang return err; 12449b2b4d30a0f74314630a5ea5f0e59697d90443eChong Zhang } 12549b2b4d30a0f74314630a5ea5f0e59697d90443eChong Zhang err = parcel->readUint32(&mRangeLength); 12649b2b4d30a0f74314630a5ea5f0e59697d90443eChong Zhang if (err != OK) { 12749b2b4d30a0f74314630a5ea5f0e59697d90443eChong Zhang return err; 12849b2b4d30a0f74314630a5ea5f0e59697d90443eChong Zhang } 1293fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang break; 1303fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang } 1313fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang 1323fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang case kBufferTypeSharedMem: 1333fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang { 134d02c08671d666e12a94bcadd943787a9ab2ceea8Chong Zhang mMem = interface_cast<IMemory>(parcel->readStrongBinder()); 1353fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang break; 1363fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang } 1373fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang 1383fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang case kBufferTypeANWBuffer: 1393fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang { 1408ff40189817e95c7a56e347398d20e60d7534ee6Pawin Vongmasa bool notNull; 1418ff40189817e95c7a56e347398d20e60d7534ee6Pawin Vongmasa status_t err = parcel->readBool(¬Null); 1423fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang if (err != OK) { 1433fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang return err; 1443fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang } 1458ff40189817e95c7a56e347398d20e60d7534ee6Pawin Vongmasa if (notNull) { 1468ff40189817e95c7a56e347398d20e60d7534ee6Pawin Vongmasa sp<GraphicBuffer> buffer = new GraphicBuffer(); 1478ff40189817e95c7a56e347398d20e60d7534ee6Pawin Vongmasa status_t err = parcel->read(*buffer); 1488ff40189817e95c7a56e347398d20e60d7534ee6Pawin Vongmasa if (err != OK) { 1498ff40189817e95c7a56e347398d20e60d7534ee6Pawin Vongmasa return err; 1508ff40189817e95c7a56e347398d20e60d7534ee6Pawin Vongmasa } 1518ff40189817e95c7a56e347398d20e60d7534ee6Pawin Vongmasa mGraphicBuffer = buffer; 1528ff40189817e95c7a56e347398d20e60d7534ee6Pawin Vongmasa } else { 1538ff40189817e95c7a56e347398d20e60d7534ee6Pawin Vongmasa mGraphicBuffer = nullptr; 1548ff40189817e95c7a56e347398d20e60d7534ee6Pawin Vongmasa } 1553fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang break; 1563fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang } 1573fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang 1583fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang case kBufferTypeNativeHandle: 1593fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang { 1603fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang sp<NativeHandle> handle = NativeHandle::create( 1613fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang parcel->readNativeHandle(), true /* ownsHandle */); 1623fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang 1633fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang mNativeHandle = handle; 1643fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang break; 1653fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang } 1663fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang 1673fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang default: 1683fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang return BAD_VALUE; 1693fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang } 1703fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang 1713fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang mBufferType = bufferType; 1723fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang return OK; 1733fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang} 1743fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang 175517b0e090680e378f056677201426ed9dc325c65Pawin VongmasaOMXBuffer& OMXBuffer::operator=(OMXBuffer&& source) { 176517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa mBufferType = std::move(source.mBufferType); 177f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa mRangeOffset = std::move(source.mRangeOffset); 178517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa mRangeLength = std::move(source.mRangeLength); 179517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa mMem = std::move(source.mMem); 180517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa mGraphicBuffer = std::move(source.mGraphicBuffer); 181517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa mNativeHandle = std::move(source.mNativeHandle); 1828a21c0191f974a0b9cbd5818052e2655e0aaa306Pawin Vongmasa mHidlMemory = std::move(source.mHidlMemory); 183517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa return *this; 184517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa} 185517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa 1863fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang} // namespace android 1873fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang 1883fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang 1893fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang 1903fd200feb657c157125e45e30c2a7262e3c0244dChong Zhang 191