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