1 #pragma once
2
3 #include <android/hardware/graphics/mapper/4.0/IMapper.h>
4 #include <log/log.h>
5
6 #include "metadata.h"
7 #include "utils-internal.h"
8
9 namespace pixel::graphics::mapper {
10
11 namespace {
12
13 using android::hardware::graphics::mapper::V4_0::Error;
14 using android::hardware::graphics::mapper::V4_0::IMapper;
15 using namespace ::pixel::graphics;
16
get_mapper()17 static inline android::sp<IMapper> get_mapper() {
18 static android::sp<IMapper> mapper = []() {
19 auto mapper = IMapper::getService();
20 if (!mapper) {
21 ALOGE("Failed to get mapper service");
22 }
23 return mapper;
24 }();
25
26 return mapper;
27 }
28
29 } // namespace
30
31 template <MetadataType meta>
get(buffer_handle_t handle)32 std::optional<typename metadata::ReturnType<meta>::type> get(buffer_handle_t handle) {
33 auto mapper = get_mapper();
34 IMapper::MetadataType type = {
35 .name = kPixelMetadataTypeName,
36 .value = static_cast<int64_t>(meta),
37 };
38
39 android::hardware::hidl_vec<uint8_t> vec;
40 Error error;
41 auto ret = mapper->get(const_cast<native_handle_t*>(handle), type,
42 [&](const auto& tmpError,
43 const android::hardware::hidl_vec<uint8_t>& tmpVec) {
44 error = tmpError;
45 vec = tmpVec;
46 });
47 if (!ret.isOk()) {
48 return {};
49 }
50
51 return utils::decode<typename metadata::ReturnType<meta>::type>(vec);
52 }
53
54 template <MetadataType meta>
set(buffer_handle_t handle,typename metadata::ReturnType<meta>::type data)55 int32_t set(buffer_handle_t handle, typename metadata::ReturnType<meta>::type data) {
56 android::sp<IMapper> mapper = get_mapper();
57 auto encoded_data = utils::encode<typename metadata::ReturnType<meta>::type>(data);
58 IMapper::MetadataType type = {
59 .name = kPixelMetadataTypeName,
60 .value = static_cast<int64_t>(meta),
61 };
62
63 Error err = mapper->set(const_cast<native_handle_t*>(handle), type, encoded_data);
64
65 return static_cast<int32_t>(err);
66 }
67
68 } // namespace pixel::graphics::mapper
69