1 #pragma once
2 
3 #include <log/log.h>
4 
5 #include <android/hardware/graphics/mapper/IMapper.h>
6 #include <android/hardware/graphics/mapper/utils/IMapperMetadataTypes.h>
7 #include <android/hardware/graphics/mapper/utils/IMapperProvider.h>
8 #include <dlfcn.h>
9 #include <vndksupport/linker.h>
10 
11 #include "metadata.h"
12 #include "utils-internal.h"
13 
14 namespace pixel::graphics::mapper {
15 
16 namespace {
17 
18 using namespace ::pixel::graphics;
19 
get_mapper()20 AIMapper* get_mapper() {
21     static AIMapper* mMapper = []() {
22         AIMapper* mapper = nullptr;
23         std::string_view so_name = "mapper.pixel.so";
24         void* so_lib = android_load_sphal_library(so_name.data(), RTLD_LOCAL | RTLD_NOW);
25         if (so_lib == nullptr) return mapper;
26         auto load_fn = reinterpret_cast<decltype(AIMapper_loadIMapper)*>(
27                 dlsym(so_lib, "AIMapper_loadIMapper"));
28         if (load_fn == nullptr) return mapper;
29         load_fn(&mapper);
30         return mapper;
31     }();
32     if (!mMapper) {
33         ALOGI("Mapper5 unavailable");
34         return {};
35     } else {
36         return mMapper;
37     }
38 }
39 
40 } // namespace
41 
42 template <MetadataType meta>
get(buffer_handle_t handle)43 std::optional<typename metadata::ReturnType<meta>::type> get(buffer_handle_t handle) {
44     AIMapper_MetadataType type = {
45             .name = kPixelMetadataTypeName,
46             .value = static_cast<int64_t>(meta),
47     };
48 
49     auto mapper = get_mapper();
50     android::hardware::hidl_vec<uint8_t> vec;
51     std::vector<uint8_t> metabuf;
52     auto ret = mapper->v5.getMetadata(handle, type, metabuf.data(), 0);
53     if (ret < 0) {
54         return {};
55     }
56 
57     metabuf.resize(ret);
58     ret = mapper->v5.getMetadata(handle, type, metabuf.data(), metabuf.size());
59 
60     if (ret < 0) {
61         return {};
62     }
63     return utils::decode<typename metadata::ReturnType<meta>::type>(metabuf);
64 }
65 
66 template <MetadataType meta>
set(buffer_handle_t handle,typename metadata::ReturnType<meta>::type data)67 int64_t set(buffer_handle_t handle, typename metadata::ReturnType<meta>::type data) {
68     auto encoded_data = utils::encode<typename metadata::ReturnType<meta>::type>(data);
69     auto mapper = get_mapper();
70     AIMapper_MetadataType type = {
71             .name = kPixelMetadataTypeName,
72             .value = static_cast<int64_t>(meta),
73     };
74 
75     auto ret = mapper->v5.setMetadata(handle, type, encoded_data.data(), encoded_data.size());
76 
77     return ret;
78 }
79 
80 } // namespace pixel::graphics::mapper
81