• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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