1 /*
2 * Copyright (c) 2024 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "image_processing_capi_capability.h"
17
18 using namespace OHOS::Media::VideoProcessingEngine;
19
Get()20 ImageProcessingCapiCapability& ImageProcessingCapiCapability::Get()
21 {
22 static ImageProcessingCapiCapability instance{};
23 return instance;
24 }
25
OpenCLInit()26 ImageProcessing_ErrorCode ImageProcessingCapiCapability::OpenCLInit()
27 {
28 void *OpenclFoundationHandle = nullptr;
29 std::string path = "/sys_prod/lib64/VideoProcessingEngine/libaihdr_engine.so";
30 auto ret = access(path.c_str(), F_OK);
31 if (ret != 0) {
32 VPE_LOGW("access = %d path = %s", ret, path.c_str());
33 } else {
34 constexpr int DEVICE_NAME_LENGTH = 32; // 32 max name length
35 char deviceName[DEVICE_NAME_LENGTH];
36 auto status = SetupOpencl(&OpenclFoundationHandle, "HUA", deviceName);
37 CHECK_AND_RETURN_RET_LOG(status == static_cast<int>(IMAGE_PROCESSING_SUCCESS),
38 IMAGE_PROCESSING_ERROR_UNSUPPORTED_PROCESSING,
39 "GetOpenCLContext SetupOpencl fail!");
40 }
41 openclContext_ = reinterpret_cast<ClContext *>(OpenclFoundationHandle);
42 return IMAGE_PROCESSING_SUCCESS;
43 }
44
OpenGLInit()45 ImageProcessing_ErrorCode ImageProcessingCapiCapability::OpenGLInit()
46 {
47 auto status = SetupOpengl(openglContext_);
48 CHECK_AND_RETURN_RET_LOG(status == static_cast<int>(IMAGE_PROCESSING_SUCCESS),
49 IMAGE_PROCESSING_ERROR_UNSUPPORTED_PROCESSING,
50 "OpenGLInit SetupOpengl fail!");
51 return IMAGE_PROCESSING_SUCCESS;
52 }
53
GetClContext()54 ClContext* ImageProcessingCapiCapability::GetClContext()
55 {
56 return openclContext_;
57 }
58
GetOpenGLContext()59 std::shared_ptr<OpenGLContext> ImageProcessingCapiCapability::GetOpenGLContext()
60 {
61 return openglContext_;
62 }
63
LoadLibrary()64 void ImageProcessingCapiCapability::LoadLibrary()
65 {
66 std::lock_guard<std::mutex> lock(lock_);
67 if (usedInstance_ == 0 && mLibHandle == nullptr) {
68 std::string path = "libvideoprocessingengine.z.so";
69 mLibHandle = dlopen(path.c_str(), RTLD_NOW);
70 }
71 usedInstance_++;
72 }
73
UnloadLibrary()74 void ImageProcessingCapiCapability::UnloadLibrary()
75 {
76 std::lock_guard<std::mutex> lock(lock_);
77 usedInstance_--;
78 if ((usedInstance_ == 0) && (mLibHandle != nullptr)) {
79 dlclose(mLibHandle);
80 mLibHandle = nullptr;
81 }
82 }
83
CheckColorSpaceConversionSupport(const ImageProcessing_ColorSpaceInfo * sourceImageInfo,const ImageProcessing_ColorSpaceInfo * destinationImageInfo)84 bool ImageProcessingCapiCapability::CheckColorSpaceConversionSupport(
85 const ImageProcessing_ColorSpaceInfo* sourceImageInfo,
86 const ImageProcessing_ColorSpaceInfo* destinationImageInfo)
87 {
88 CHECK_AND_RETURN_RET_LOG(sourceImageInfo != nullptr, false, "sourceImageInfo is nullptr!");
89 CHECK_AND_RETURN_RET_LOG(destinationImageInfo != nullptr, false, "destinationImageInfo is nullptr!");
90 auto status = LoadAlgo();
91 CHECK_AND_RETURN_RET_LOG(status == IMAGE_PROCESSING_SUCCESS, false, "LoadAlgo faild");
92 OHOS::Media::VideoProcessingEngine::ColorSpaceInfo inputInfo;
93 OHOS::Media::VideoProcessingEngine::ColorSpaceInfo outputInfo;
94 auto iterPixelFormat = IMAGE_FORMAT_MAP.find(static_cast<OHOS::Media::PixelFormat>(sourceImageInfo->pixelFormat));
95 CHECK_AND_RETURN_RET_LOG(iterPixelFormat != IMAGE_FORMAT_MAP.end(), false, "src IMAGE_FORMAT_MAP find failed!");
96 inputInfo.pixelFormat = iterPixelFormat->second;
97 iterPixelFormat = IMAGE_FORMAT_MAP.find(static_cast<OHOS::Media::PixelFormat>(destinationImageInfo->pixelFormat));
98 CHECK_AND_RETURN_RET_LOG(iterPixelFormat != IMAGE_FORMAT_MAP.end(), false, "dst IMAGE_FORMAT_MAP find failed!");
99 outputInfo.pixelFormat = iterPixelFormat->second;
100 auto iterMetadataType = HDR_METADATA_TYPE_MAP.find(static_cast<ImagePixelmapHdrMetadataType>(
101 sourceImageInfo->metadataType));
102 CHECK_AND_RETURN_RET_LOG(iterMetadataType != HDR_METADATA_TYPE_MAP.end(), false,
103 "src HDR_METADATA_TYPE_MAP find failed!");
104 inputInfo.metadataType = iterMetadataType->second;
105 iterMetadataType = HDR_METADATA_TYPE_MAP.find(static_cast<ImagePixelmapHdrMetadataType>(
106 destinationImageInfo->metadataType));
107 CHECK_AND_RETURN_RET_LOG(iterMetadataType != HDR_METADATA_TYPE_MAP.end(), false,
108 "dst HDR_METADATA_TYPE_MAP find failed!");
109 outputInfo.metadataType = iterMetadataType->second;
110 auto iterColorSpace = COLORSPACE_MAP.find(static_cast<ImagePixelmapColorspace>(sourceImageInfo->colorSpace));
111 CHECK_AND_RETURN_RET_LOG(iterColorSpace != COLORSPACE_MAP.end(), false, "dst colorSpace find failed!");
112 inputInfo.colorSpace = iterColorSpace->second;
113 iterColorSpace = COLORSPACE_MAP.find(static_cast<ImagePixelmapColorspace>(destinationImageInfo->colorSpace));
114 CHECK_AND_RETURN_RET_LOG(iterColorSpace != COLORSPACE_MAP.end(), false, "dst colorSpace find failed!");
115 outputInfo.colorSpace = iterColorSpace->second;
116 return isColorSpaceConversionSupported_(inputInfo, outputInfo);
117 }
118
CheckCompositionSupport(const ImageProcessing_ColorSpaceInfo * sourceImageInfo,const ImageProcessing_ColorSpaceInfo * sourceGainmapInfo,const ImageProcessing_ColorSpaceInfo * destinationImageInfo)119 bool ImageProcessingCapiCapability::CheckCompositionSupport(
120 const ImageProcessing_ColorSpaceInfo* sourceImageInfo,
121 const ImageProcessing_ColorSpaceInfo* sourceGainmapInfo,
122 const ImageProcessing_ColorSpaceInfo* destinationImageInfo)
123 {
124 CHECK_AND_RETURN_RET_LOG(sourceImageInfo != nullptr, false, "sourceImageInfo is nullptr!");
125 CHECK_AND_RETURN_RET_LOG(destinationImageInfo != nullptr, false, "destinationImageInfo is nullptr!");
126 CHECK_AND_RETURN_RET_LOG(sourceGainmapInfo != nullptr, false, "sourceGainmapInfo is nullptr!");
127 auto status = LoadAlgo();
128 CHECK_AND_RETURN_RET_LOG(status == IMAGE_PROCESSING_SUCCESS, false, "LoadAlgo faild");
129 OHOS::Media::VideoProcessingEngine::ColorSpaceInfo inputInfo;
130 OHOS::Media::VideoProcessingEngine::ColorSpaceInfo outputInfo;
131 auto iterPixelFormat = IMAGE_FORMAT_MAP.find(static_cast<OHOS::Media::PixelFormat>(sourceImageInfo->pixelFormat));
132 CHECK_AND_RETURN_RET_LOG(iterPixelFormat != IMAGE_FORMAT_MAP.end(), false, "src IMAGE_FORMAT_MAP find failed!");
133 inputInfo.pixelFormat = iterPixelFormat->second;
134 iterPixelFormat = IMAGE_FORMAT_MAP.find(static_cast<OHOS::Media::PixelFormat>(destinationImageInfo->pixelFormat));
135 CHECK_AND_RETURN_RET_LOG(iterPixelFormat != IMAGE_FORMAT_MAP.end(), false, "dst IMAGE_FORMAT_MAP find failed!");
136 outputInfo.pixelFormat = iterPixelFormat->second;
137 auto iterMetadataType = HDR_METADATA_TYPE_MAP.find(static_cast<ImagePixelmapHdrMetadataType>(
138 sourceImageInfo->metadataType));
139 CHECK_AND_RETURN_RET_LOG(iterMetadataType != HDR_METADATA_TYPE_MAP.end(), false,
140 "src HDR_METADATA_TYPE_MAP find failed!");
141 inputInfo.metadataType = iterMetadataType->second;
142 iterMetadataType = HDR_METADATA_TYPE_MAP.find(static_cast<ImagePixelmapHdrMetadataType>(
143 destinationImageInfo->metadataType));
144 CHECK_AND_RETURN_RET_LOG(iterMetadataType != HDR_METADATA_TYPE_MAP.end(), false,
145 "dst HDR_METADATA_TYPE_MAP find failed!");
146 outputInfo.metadataType = iterMetadataType->second;
147 auto iterColorSpace = COLORSPACE_MAP.find(static_cast<ImagePixelmapColorspace>(sourceImageInfo->colorSpace));
148 CHECK_AND_RETURN_RET_LOG(iterColorSpace != COLORSPACE_MAP.end(), false, "dst colorSpace find failed!");
149 inputInfo.colorSpace = iterColorSpace->second;
150 iterColorSpace = COLORSPACE_MAP.find(static_cast<ImagePixelmapColorspace>(destinationImageInfo->colorSpace));
151 CHECK_AND_RETURN_RET_LOG(iterColorSpace != COLORSPACE_MAP.end(), false, "dst colorSpace find failed!");
152 outputInfo.colorSpace = iterColorSpace->second;
153 return isCompositionSupported_(inputInfo, outputInfo);
154 }
155
CheckDecompositionSupport(const ImageProcessing_ColorSpaceInfo * sourceImageInfo,const ImageProcessing_ColorSpaceInfo * destinationImageInfo,const ImageProcessing_ColorSpaceInfo * destinationGainmapInfo)156 bool ImageProcessingCapiCapability::CheckDecompositionSupport(
157 const ImageProcessing_ColorSpaceInfo* sourceImageInfo,
158 const ImageProcessing_ColorSpaceInfo* destinationImageInfo,
159 const ImageProcessing_ColorSpaceInfo* destinationGainmapInfo)
160 {
161 CHECK_AND_RETURN_RET_LOG(sourceImageInfo != nullptr, false, "sourceImageInfo is nullptr!");
162 CHECK_AND_RETURN_RET_LOG(destinationImageInfo != nullptr, false, "destinationImageInfo is nullptr!");
163 CHECK_AND_RETURN_RET_LOG(destinationGainmapInfo != nullptr, false, "destinationGainmapInfo is nullptr!");
164 auto status = LoadAlgo();
165 CHECK_AND_RETURN_RET_LOG(status == IMAGE_PROCESSING_SUCCESS, false, "LoadAlgo faild");
166 OHOS::Media::VideoProcessingEngine::ColorSpaceInfo inputInfo;
167 OHOS::Media::VideoProcessingEngine::ColorSpaceInfo outputInfo;
168 auto iterPixelFormat = IMAGE_FORMAT_MAP.find(static_cast<OHOS::Media::PixelFormat>(sourceImageInfo->pixelFormat));
169 CHECK_AND_RETURN_RET_LOG(iterPixelFormat != IMAGE_FORMAT_MAP.end(), false, "src IMAGE_FORMAT_MAP find failed!");
170 inputInfo.pixelFormat = iterPixelFormat->second;
171 iterPixelFormat = IMAGE_FORMAT_MAP.find(static_cast<OHOS::Media::PixelFormat>(destinationImageInfo->pixelFormat));
172 CHECK_AND_RETURN_RET_LOG(iterPixelFormat != IMAGE_FORMAT_MAP.end(), false, "dst IMAGE_FORMAT_MAP find failed!");
173 outputInfo.pixelFormat = iterPixelFormat->second;
174 auto iterMetadataType = HDR_METADATA_TYPE_MAP.find(static_cast<ImagePixelmapHdrMetadataType>(
175 sourceImageInfo->metadataType));
176 CHECK_AND_RETURN_RET_LOG(iterMetadataType != HDR_METADATA_TYPE_MAP.end(), false,
177 "src HDR_METADATA_TYPE_MAP find failed!");
178 inputInfo.metadataType = iterMetadataType->second;
179 iterMetadataType = HDR_METADATA_TYPE_MAP.find(static_cast<ImagePixelmapHdrMetadataType>(
180 destinationImageInfo->metadataType));
181 CHECK_AND_RETURN_RET_LOG(iterMetadataType != HDR_METADATA_TYPE_MAP.end(), false,
182 "dst HDR_METADATA_TYPE_MAP find failed!");
183 outputInfo.metadataType = iterMetadataType->second;
184 auto iterColorSpace = COLORSPACE_MAP.find(static_cast<ImagePixelmapColorspace>(sourceImageInfo->colorSpace));
185 CHECK_AND_RETURN_RET_LOG(iterColorSpace != COLORSPACE_MAP.end(), false, "src colorSpace find failed!");
186 inputInfo.colorSpace = iterColorSpace->second;
187 iterColorSpace = COLORSPACE_MAP.find(static_cast<ImagePixelmapColorspace>(destinationImageInfo->colorSpace));
188 CHECK_AND_RETURN_RET_LOG(iterColorSpace != COLORSPACE_MAP.end(), false, "dst colorSpace find failed!");
189 outputInfo.colorSpace = iterColorSpace->second;
190 return isDecompositionSupported_(inputInfo, outputInfo);
191 }
192
CheckMetadataGenerationSupport(const ImageProcessing_ColorSpaceInfo * sourceImageInfo)193 bool ImageProcessingCapiCapability::CheckMetadataGenerationSupport(
194 const ImageProcessing_ColorSpaceInfo* sourceImageInfo)
195 {
196 CHECK_AND_RETURN_RET_LOG(sourceImageInfo != nullptr, false, "sourceImageInfo is nullptr!");
197 auto status = LoadAlgo();
198 CHECK_AND_RETURN_RET_LOG(status == IMAGE_PROCESSING_SUCCESS, false, "LoadAlgo faild");
199 OHOS::Media::VideoProcessingEngine::ColorSpaceInfo inputInfo;
200 auto iterPixelFormat = IMAGE_FORMAT_MAP.find(static_cast<OHOS::Media::PixelFormat>(sourceImageInfo->pixelFormat));
201 CHECK_AND_RETURN_RET_LOG(iterPixelFormat != IMAGE_FORMAT_MAP.end(), false, "src IMAGE_FORMAT_MAP find failed!");
202 inputInfo.pixelFormat = iterPixelFormat->second;
203
204 auto iterMetadataType = HDR_METADATA_TYPE_MAP.find(static_cast<ImagePixelmapHdrMetadataType>(
205 sourceImageInfo->metadataType));
206 CHECK_AND_RETURN_RET_LOG(iterMetadataType != HDR_METADATA_TYPE_MAP.end(), false,
207 "src HDR_METADATA_TYPE_MAP find failed!");
208 inputInfo.metadataType = iterMetadataType->second;
209
210 auto iterColorSpace = COLORSPACE_MAP.find(static_cast<ImagePixelmapColorspace>(sourceImageInfo->colorSpace));
211 CHECK_AND_RETURN_RET_LOG(iterColorSpace != COLORSPACE_MAP.end(), false, "dst colorSpace find failed!");
212 inputInfo.colorSpace = iterColorSpace->second;
213 return isMetadataGenSupported_(inputInfo);
214 }
215
LoadAlgo()216 ImageProcessing_ErrorCode ImageProcessingCapiCapability::LoadAlgo()
217 {
218 CHECK_AND_RETURN_RET_LOG(mLibHandle != nullptr, IMAGE_PROCESSING_ERROR_UNSUPPORTED_PROCESSING,
219 "Library is nullptr!");
220 std::pair<std::string, LibFunction&> funcs[] = {
221 { "ImageProcessing_IsColorSpaceConversionSupported", isColorSpaceConversionSupported_},
222 { "ImageProcessing_IsCompositionSupported", isCompositionSupported_ },
223 { "ImageProcessing_IsDecompositionSupported", isDecompositionSupported_ },
224 };
225 for (auto& func : funcs) {
226 func.second = reinterpret_cast<LibFunction>(dlsym(mLibHandle, func.first.c_str()));
227 CHECK_AND_RETURN_RET_LOG(func.second != nullptr, IMAGE_PROCESSING_ERROR_UNSUPPORTED_PROCESSING,
228 "Failed to locate %s in - %s", func.first.c_str(), dlerror());
229 }
230 isMetadataGenSupported_ = reinterpret_cast<LibMetaFunction>(dlsym(mLibHandle,
231 "ImageProcessing_IsMetadataGenerationSupported"));
232 CHECK_AND_RETURN_RET_LOG(isMetadataGenSupported_ != nullptr, IMAGE_PROCESSING_ERROR_UNSUPPORTED_PROCESSING,
233 "Failed to locate %s in - %s", "ImageProcessing_IsMetadataGenerationSupported",
234 dlerror());
235 return IMAGE_PROCESSING_SUCCESS;
236 }
237
238