blob: 587926327a40db155273a380667d2c7290d0a595 [file] [log] [blame]
/*
* Copyright (C) 2023 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.
*/
#pragma once
#include <C2Buffer.h>
#include <android-base/unique_fd.h>
#include <memory>
namespace aidl::android::hardware::media::c2 {
class IGraphicBufferAllocator;
}
/**
* Codec2-AIDL IGraphicBufferAllocator backed C2BlockPool
*
* Graphic Blocks are created using IGraphicBufferAllocator C2AIDL interface.
*/
class C2IgbaBlockPool : public C2BlockPool {
public:
explicit C2IgbaBlockPool(
const std::shared_ptr<C2Allocator> &allocator,
const std::shared_ptr<::aidl::android::hardware::media::c2::IGraphicBufferAllocator>
&igba,
::android::base::unique_fd &&ufd,
const local_id_t localId);
virtual ~C2IgbaBlockPool() = default;
virtual C2Allocator::id_t getAllocatorId() const override {
return mAllocator->getId();
}
virtual local_id_t getLocalId() const override {
return mLocalId;
}
/* Note: this is blocking due to H/W fence waiting */
virtual c2_status_t fetchGraphicBlock(
uint32_t width,
uint32_t height,
uint32_t format,
C2MemoryUsage usage,
std::shared_ptr<C2GraphicBlock> *block /* nonnull */) override;
virtual c2_status_t fetchGraphicBlock(
uint32_t width,
uint32_t height,
uint32_t format,
C2MemoryUsage usage,
std::shared_ptr<C2GraphicBlock> *block /* nonnull */,
C2Fence *fence /* nonnull */) override;
// Do we need this?
void invalidate();
private:
c2_status_t _fetchGraphicBlock(
uint32_t width,
uint32_t height,
uint32_t format,
C2MemoryUsage usage,
c2_nsecs_t timeoutNs,
uint64_t *origId /* nonnull */,
std::shared_ptr<C2GraphicBlock> *block /* nonnull */,
C2Fence *fence /* nonnull */);
const std::shared_ptr<C2Allocator> mAllocator;
const std::shared_ptr<::aidl::android::hardware::media::c2::IGraphicBufferAllocator> mIgba;
const local_id_t mLocalId;
std::atomic<bool> mValid;
C2Fence mWaitFence;
};
typedef struct AHardwareBuffer AHardwareBuffer;
struct C2IgbaBlockPoolData : public _C2BlockPoolData {
C2IgbaBlockPoolData(
const AHardwareBuffer *buffer,
std::shared_ptr<::aidl::android::hardware::media::c2::IGraphicBufferAllocator> &igba);
virtual ~C2IgbaBlockPoolData() override;
virtual type_t getType() const override;
private:
friend struct _C2BlockFactory;
void getAHardwareBuffer(AHardwareBuffer **pBuf) const;
void disown();
void registerIgba(std::shared_ptr<
::aidl::android::hardware::media::c2::IGraphicBufferAllocator> &igba);
bool mOwned;
const AHardwareBuffer *mBuffer;
std::weak_ptr<::aidl::android::hardware::media::c2::IGraphicBufferAllocator> mIgba;
};