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