125 lines
3.8 KiB
C++
125 lines
3.8 KiB
C++
/*
|
|
* Copyright (C) 2022 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 <aidl/android/hardware/media/bufferpool2/BufferStatusMessage.h>
|
|
#include <bufferpool2/BufferPoolTypes.h>
|
|
|
|
#include <map>
|
|
#include <set>
|
|
|
|
namespace aidl::android::hardware::media::bufferpool2::implementation {
|
|
|
|
// Helper template methods for handling map of set.
|
|
template<class T, class U>
|
|
bool insert(std::map<T, std::set<U>> *mapOfSet, T key, U value) {
|
|
auto iter = mapOfSet->find(key);
|
|
if (iter == mapOfSet->end()) {
|
|
std::set<U> valueSet{value};
|
|
mapOfSet->insert(std::make_pair(key, valueSet));
|
|
return true;
|
|
} else if (iter->second.find(value) == iter->second.end()) {
|
|
iter->second.insert(value);
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
// Helper template methods for handling map of set.
|
|
template<class T, class U>
|
|
bool erase(std::map<T, std::set<U>> *mapOfSet, T key, U value) {
|
|
bool ret = false;
|
|
auto iter = mapOfSet->find(key);
|
|
if (iter != mapOfSet->end()) {
|
|
if (iter->second.erase(value) > 0) {
|
|
ret = true;
|
|
}
|
|
if (iter->second.size() == 0) {
|
|
mapOfSet->erase(iter);
|
|
}
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
// Helper template methods for handling map of set.
|
|
template<class T, class U>
|
|
bool contains(std::map<T, std::set<U>> *mapOfSet, T key, U value) {
|
|
auto iter = mapOfSet->find(key);
|
|
if (iter != mapOfSet->end()) {
|
|
auto setIter = iter->second.find(value);
|
|
return setIter != iter->second.end();
|
|
}
|
|
return false;
|
|
}
|
|
|
|
// Buffer data structure for internal BufferPool use.(storage/fetching)
|
|
struct InternalBuffer {
|
|
BufferId mId;
|
|
size_t mOwnerCount;
|
|
size_t mTransactionCount;
|
|
const std::shared_ptr<BufferPoolAllocation> mAllocation;
|
|
const size_t mAllocSize;
|
|
const std::vector<uint8_t> mConfig;
|
|
bool mInvalidated;
|
|
|
|
InternalBuffer(
|
|
BufferId id,
|
|
const std::shared_ptr<BufferPoolAllocation> &alloc,
|
|
const size_t allocSize,
|
|
const std::vector<uint8_t> &allocConfig)
|
|
: mId(id), mOwnerCount(0), mTransactionCount(0),
|
|
mAllocation(alloc), mAllocSize(allocSize), mConfig(allocConfig),
|
|
mInvalidated(false) {}
|
|
|
|
const native_handle_t *handle() {
|
|
return mAllocation->handle();
|
|
}
|
|
|
|
void invalidate() {
|
|
mInvalidated = true;
|
|
}
|
|
};
|
|
|
|
// Buffer transacion status/message data structure for internal BufferPool use.
|
|
struct TransactionStatus {
|
|
TransactionId mId;
|
|
BufferId mBufferId;
|
|
ConnectionId mSender;
|
|
ConnectionId mReceiver;
|
|
BufferStatus mStatus;
|
|
int64_t mTimestampMs;
|
|
bool mSenderValidated;
|
|
|
|
TransactionStatus(const BufferStatusMessage &message, int64_t timestampMs) {
|
|
mId = message.transactionId;
|
|
mBufferId = message.bufferId;
|
|
mStatus = message.status;
|
|
mTimestampMs = timestampMs;
|
|
if (mStatus == BufferStatus::TRANSFER_TO) {
|
|
mSender = message.connectionId;
|
|
mReceiver = message.targetConnectionId;
|
|
mSenderValidated = true;
|
|
} else {
|
|
mSender = -1LL;
|
|
mReceiver = message.connectionId;
|
|
mSenderValidated = false;
|
|
}
|
|
}
|
|
};
|
|
|
|
} // namespace aidl::android::hardware::media::bufferpool2::implementation
|