1 /*
2 * algo_loader.cpp - The dynamic loads algorithm library
3 *
4 * Copyright (c) 2021 Rockchip Electronics Co., Ltd.
5 *
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
17 *
18 * Author: Cody Xie <cody.xie@rock-chips.com>
19 */
20 #include "eis_loader.h"
21
22 #include <dlfcn.h>
23
24 #include <string>
25
26 #include "dvs_app.h"
27 #include "rk_aiq_mems_sensor.h"
28 #include "xcam_log.h"
29
30 namespace RkCam {
31
32 const static std::string DvsLibraryName = "libdvs_gyro.so";
33
~DvsLibrary()34 DvsLibrary::~DvsLibrary() {
35 if (handle_ != nullptr) {
36 ::dlclose(handle_);
37 }
38 }
39
Init()40 bool DvsLibrary::Init() {
41 handle_ = ::dlopen(DvsLibraryName.c_str(), RTLD_LAZY);
42 if (handle_ == nullptr) {
43 return false;
44 }
45 return true;
46 }
47
LoadSymbols()48 bool DvsLibrary::LoadSymbols() {
49 char* error;
50
51 ops_.RegisterRemap = (dvsRegisterRemap)dlsym(handle_, "dvsRegisterRemap");
52 error = dlerror();
53 if (error != NULL) {
54 LOGE("Failed to resolve symbol dvsRegisterRemap: %s", error);
55 goto error_out;
56 }
57
58 ops_.Prepare = (dvsPrepare)dlsym(handle_, "dvsPrepare");
59 error = dlerror();
60 if (error != NULL) {
61 LOGE("Failed to resolve symbol dvsPrepare: %s", error);
62 goto error_out;
63 }
64
65 ops_.GetMeshSize = (getMeshSize)dlsym(handle_, "getMeshSize");
66 error = dlerror();
67 if (error != NULL) {
68 LOGE("Failed to resolve symbol getMeshSize: %s", error);
69 goto error_out;
70 }
71
72 ops_.GetOriginalMeshXY = (getOriginalMeshXY)dlsym(handle_, "getOriginalMeshXY");
73 error = dlerror();
74 if (error != NULL) {
75 LOGE("Failed to resolve symbol getOriginalMeshXY: %s", error);
76 goto error_out;
77 }
78
79 ops_.PutImageFrame = (dvsPutImageFrame)dlsym(handle_, "dvsPutImageFrame");
80 error = dlerror();
81 if (error != NULL) {
82 LOGE("Failed to resolve symbol dvsPutImageFrame: %s", error);
83 goto error_out;
84 }
85
86 ops_.PutMesh = (dvsPutMesh)dlsym(handle_, "dvsPutMesh");
87 error = dlerror();
88 if (error != NULL) {
89 LOGE("Failed to resolve symbol dvsPutMesh: %s", error);
90 goto error_out;
91 }
92
93 ops_.PutImuFrame = (dvsPutImuFrame)dlsym(handle_, "dvsPutImuFrame");
94 error = dlerror();
95 if (error != NULL) {
96 LOGE("Failed to resolve symbol dvsPutImuFrame: %s", error);
97 goto error_out;
98 }
99
100 ops_.InitFromXmlFile = (dvsInitFromXmlFile)dlsym(handle_, "dvsInitFromXmlFile");
101 error = dlerror();
102 if (error != NULL) {
103 LOGE("Failed to resolve symbol dvsInitFromXmlFile: %s", error);
104 goto error_out;
105 }
106
107 ops_.InitParams = (dvsInitParams)dlsym(handle_, "dvsInitParams");
108 error = dlerror();
109 if (error != NULL) {
110 LOGE("Failed to resolve symbol dvsInitParams: %s", error);
111 goto error_out;
112 }
113
114 ops_.Start = (dvsStart)dlsym(handle_, "dvsStart");
115 error = dlerror();
116 if (error != NULL) {
117 LOGE("Failed to resolve symbol dvsStart: %s", error);
118 goto error_out;
119 }
120
121 ops_.RequestStop = (dvsRequestStop)dlsym(handle_, "dvsRequestStop");
122 error = dlerror();
123 if (error != NULL) {
124 LOGE("Failed to resolve symbol dvsRequestStop: %s", error);
125 goto error_out;
126 }
127
128 ops_.DeInit = (dvsDeinit)dlsym(handle_, "dvsDeinit");
129 error = dlerror();
130 if (error != NULL) {
131 LOGE("Failed to resolve symbol dvsDeinit: %s", error);
132 goto error_out;
133 }
134
135 return true;
136 error_out:
137 dlclose(handle_);
138 handle_ = nullptr;
139 return false;
140 }
141
GetOps()142 DvsOps* DvsLibrary::GetOps() { return &ops_; }
143
144 } // namespace RkCam
145
146