/* * Copyright 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef _ANDROID_MEDIA_MEDIACODECLINEARBLOCK_H_ #define _ANDROID_MEDIA_MEDIACODECLINEARBLOCK_H_ #include #include #include #include namespace android { struct JMediaCodecLinearBlock { std::shared_ptr mBuffer; std::shared_ptr mReadonlyMapping; std::shared_ptr mBlock; std::shared_ptr mReadWriteMapping; sp mMemory; sp mHidlMemory; ssize_t mHidlMemoryOffset; size_t mHidlMemorySize; sp mLegacyBuffer; std::once_flag mCopyWarningFlag; std::shared_ptr toC2Buffer(size_t offset, size_t size) { if (mBuffer) { if (mBuffer->data().type() != C2BufferData::LINEAR) { return nullptr; } C2ConstLinearBlock block = mBuffer->data().linearBlocks().front(); if (offset == 0 && size == block.capacity()) { return mBuffer; } std::shared_ptr buffer = C2Buffer::CreateLinearBuffer(block.subBlock(offset, size)); for (const std::shared_ptr &info : mBuffer->info()) { std::shared_ptr param = std::move(C2Param::Copy(*info)); buffer->setInfo(std::static_pointer_cast(param)); } return buffer; } if (mBlock) { return C2Buffer::CreateLinearBuffer(mBlock->share(offset, size, C2Fence{})); } return nullptr; } sp toHidlMemory() { if (mHidlMemory) { return mHidlMemory; } return nullptr; } }; } // namespace android #endif // _ANDROID_MEDIA_MEDIACODECLINEARBLOCK_H_