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(&notNull);
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