blob: 14990a9bc102773da6af1b74d7325ca08dd8cb8f [file] [log] [blame]
#pragma once
#include <android/hardware/graphics/mapper/4.0/IMapper.h>
#include <log/log.h>
#include "metadata.h"
#include "utils.h"
namespace pixel::graphics::mapper {
namespace {
using ::aidl::android::hardware::graphics::common::PlaneLayout;
using android::hardware::graphics::mapper::V4_0::Error;
using android::hardware::graphics::mapper::V4_0::IMapper;
using HidlPixelFormat = ::android::hardware::graphics::common::V1_2::PixelFormat;
using namespace ::pixel::graphics;
android::sp<IMapper> get_mapper() {
static android::sp<IMapper> mapper = []() {
auto mapper = IMapper::getService();
if (!mapper) {
ALOGE("Failed to get mapper service");
}
return mapper;
}();
return mapper;
}
} // namespace
template <MetadataType T>
struct always_false : std::false_type {};
template <MetadataType T>
struct ReturnType {
static_assert(always_false<T>::value, "Unspecialized ReturnType is not supported");
using type = void;
};
template <MetadataType T>
static std::optional<typename ReturnType<T>::type> get(buffer_handle_t /*handle*/) {
static_assert(always_false<T>::value, "Unspecialized get is not supported");
return {};
}
// TODO: Add support for stable-c mapper
#define GET(metadata, return_type) \
template <> \
struct ReturnType<MetadataType::metadata> { \
using type = return_type; \
}; \
\
template <> \
std::optional<typename ReturnType<MetadataType::metadata>::type> get<MetadataType::metadata>( \
buffer_handle_t handle) { \
auto mapper = get_mapper(); \
IMapper::MetadataType type = { \
.name = kPixelMetadataTypeName, \
.value = static_cast<int64_t>(MetadataType::metadata), \
}; \
\
android::hardware::hidl_vec<uint8_t> vec; \
Error error; \
auto ret = mapper->get(const_cast<native_handle_t*>(handle), type, \
[&](const auto& tmpError, \
const android::hardware::hidl_vec<uint8_t>& tmpVec) { \
error = tmpError; \
vec = tmpVec; \
}); \
if (!ret.isOk()) { \
return {}; \
} \
\
return utils::decode<return_type>(vec); \
}
GET(PLANE_DMA_BUFS, std::vector<int>);
GET(VIDEO_HDR, void*);
GET(VIDEO_ROI, void*);
#undef GET
} // namespace pixel::graphics::mapper