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.h"
17
18 #include <atomic>
19 #include <functional>
20
21 #include "vpe_log.h"
22 #include "image_processing_capi_capability.h"
23 #include "image_environment_native.h"
24 #include "image_processing_impl.h"
25
26 using namespace OHOS::Media::VideoProcessingEngine;
27
28 const int32_t IMAGE_PROCESSING_TYPE_COLOR_SPACE_CONVERSION = 0x1;
29 const int32_t IMAGE_PROCESSING_TYPE_COMPOSITION = 0x2;
30 const int32_t IMAGE_PROCESSING_TYPE_DECOMPOSITION = 0x4;
31 const int32_t IMAGE_PROCESSING_TYPE_METADATA_GENERATION = 0x8;
32 const int32_t IMAGE_PROCESSING_TYPE_DETAIL_ENHANCER = 0x10;
33 const char* IMAGE_DETAIL_ENHANCER_PARAMETER_KEY_QUALITY_LEVEL = "QualityLevel";
34
35 namespace {
CallImageProcessing(OH_ImageProcessing * imageProcessor,std::function<ImageProcessing_ErrorCode (std::shared_ptr<IImageProcessingNative> &)> && operation)36 ImageProcessing_ErrorCode CallImageProcessing(OH_ImageProcessing* imageProcessor,
37 std::function<ImageProcessing_ErrorCode(std::shared_ptr<IImageProcessingNative>&)>&& operation)
38 {
39 CHECK_AND_RETURN_RET_LOG(imageProcessor != nullptr, IMAGE_PROCESSING_ERROR_INVALID_INSTANCE,
40 "imageProcessor is null!");
41 auto imageProcessing = imageProcessor->GetImageProcessing();
42 CHECK_AND_RETURN_RET_LOG(imageProcessing != nullptr, IMAGE_PROCESSING_ERROR_INVALID_INSTANCE,
43 "imageProcessor is invalid!");
44 return operation(imageProcessing);
45 }
46 }
47
OH_ImageProcessing_InitializeEnvironment(void)48 ImageProcessing_ErrorCode OH_ImageProcessing_InitializeEnvironment(void)
49 {
50 CHECK_AND_RETURN_RET_LOG(ImageProcessingCapiCapability::Get().OpenCLInit() == IMAGE_PROCESSING_SUCCESS,
51 IMAGE_PROCESSING_ERROR_UNSUPPORTED_PROCESSING, "OpenCLInit failed!");
52 CHECK_AND_RETURN_RET_LOG(ImageProcessingCapiCapability::Get().OpenGLInit() == IMAGE_PROCESSING_SUCCESS,
53 IMAGE_PROCESSING_ERROR_UNSUPPORTED_PROCESSING, "OpenGLInit failed!");
54 return ImageEnvironmentNative::Get().Initialize();
55 }
56
OH_ImageProcessing_DeinitializeEnvironment(void)57 ImageProcessing_ErrorCode OH_ImageProcessing_DeinitializeEnvironment(void)
58 {
59 return ImageEnvironmentNative::Get().Deinitialize();
60 }
61
OH_ImageProcessing_IsColorSpaceConversionSupported(const ImageProcessing_ColorSpaceInfo * sourceImageInfo,const ImageProcessing_ColorSpaceInfo * destinationImageInfo)62 bool OH_ImageProcessing_IsColorSpaceConversionSupported(
63 const ImageProcessing_ColorSpaceInfo* sourceImageInfo,
64 const ImageProcessing_ColorSpaceInfo* destinationImageInfo)
65 {
66 ImageProcessingCapiCapability::Get().LoadLibrary();
67 auto flag = ImageProcessingCapiCapability::Get().CheckColorSpaceConversionSupport(sourceImageInfo,
68 destinationImageInfo);
69 ImageProcessingCapiCapability::Get().UnloadLibrary();
70 return flag;
71 }
72
OH_ImageProcessing_IsCompositionSupported(const ImageProcessing_ColorSpaceInfo * sourceImageInfo,const ImageProcessing_ColorSpaceInfo * sourceGainmapInfo,const ImageProcessing_ColorSpaceInfo * destinationImageInfo)73 bool OH_ImageProcessing_IsCompositionSupported(
74 const ImageProcessing_ColorSpaceInfo* sourceImageInfo,
75 const ImageProcessing_ColorSpaceInfo* sourceGainmapInfo,
76 const ImageProcessing_ColorSpaceInfo* destinationImageInfo)
77 {
78 ImageProcessingCapiCapability::Get().LoadLibrary();
79 auto flag = ImageProcessingCapiCapability::Get().CheckCompositionSupport(sourceImageInfo,
80 sourceGainmapInfo, destinationImageInfo);
81 ImageProcessingCapiCapability::Get().UnloadLibrary();
82 return flag;
83 }
84
OH_ImageProcessing_IsDecompositionSupported(const ImageProcessing_ColorSpaceInfo * sourceImageInfo,const ImageProcessing_ColorSpaceInfo * destinationImageInfo,const ImageProcessing_ColorSpaceInfo * destinationGainmapInfo)85 bool OH_ImageProcessing_IsDecompositionSupported(
86 const ImageProcessing_ColorSpaceInfo* sourceImageInfo,
87 const ImageProcessing_ColorSpaceInfo* destinationImageInfo,
88 const ImageProcessing_ColorSpaceInfo* destinationGainmapInfo)
89 {
90 ImageProcessingCapiCapability::Get().LoadLibrary();
91 auto flag = ImageProcessingCapiCapability::Get().CheckDecompositionSupport(sourceImageInfo,
92 destinationImageInfo, destinationGainmapInfo);
93 ImageProcessingCapiCapability::Get().UnloadLibrary();
94 return flag;
95 }
96
OH_ImageProcessing_IsMetadataGenerationSupported(const ImageProcessing_ColorSpaceInfo * sourceImageInfo)97 bool OH_ImageProcessing_IsMetadataGenerationSupported(const ImageProcessing_ColorSpaceInfo* sourceImageInfo)
98 {
99 ImageProcessingCapiCapability::Get().LoadLibrary();
100 auto flag = ImageProcessingCapiCapability::Get().CheckMetadataGenerationSupport(sourceImageInfo);
101 ImageProcessingCapiCapability::Get().UnloadLibrary();
102 return flag;
103 }
104
OH_ImageProcessing_Create(OH_ImageProcessing ** imageProcessor,int type)105 ImageProcessing_ErrorCode OH_ImageProcessing_Create(OH_ImageProcessing** imageProcessor, int type)
106 {
107 return OH_ImageProcessing::Create(imageProcessor, type, ImageProcessingCapiCapability::Get().GetOpenGLContext(),
108 ImageProcessingCapiCapability::Get().GetClContext());
109 }
110
OH_ImageProcessing_Destroy(OH_ImageProcessing * imageProcessor)111 ImageProcessing_ErrorCode OH_ImageProcessing_Destroy(OH_ImageProcessing* imageProcessor)
112 {
113 return OH_ImageProcessing::Destroy(imageProcessor);
114 }
115
OH_ImageProcessing_SetParameter(OH_ImageProcessing * imageProcessor,const OH_AVFormat * parameter)116 ImageProcessing_ErrorCode OH_ImageProcessing_SetParameter(OH_ImageProcessing* imageProcessor,
117 const OH_AVFormat* parameter)
118 {
119 return CallImageProcessing(imageProcessor, [¶meter](std::shared_ptr<IImageProcessingNative>& obj) {
120 return obj->SetParameter(parameter);
121 });
122 }
123
OH_ImageProcessing_GetParameter(OH_ImageProcessing * imageProcessor,OH_AVFormat * parameter)124 ImageProcessing_ErrorCode OH_ImageProcessing_GetParameter(OH_ImageProcessing* imageProcessor, OH_AVFormat* parameter)
125 {
126 return CallImageProcessing(imageProcessor, [¶meter](std::shared_ptr<IImageProcessingNative>& obj) {
127 return obj->GetParameter(parameter);
128 });
129 }
130
OH_ImageProcessing_ConvertColorSpace(OH_ImageProcessing * imageProcessor,OH_PixelmapNative * sourceImage,OH_PixelmapNative * destinationImage)131 ImageProcessing_ErrorCode OH_ImageProcessing_ConvertColorSpace(OH_ImageProcessing* imageProcessor,
132 OH_PixelmapNative* sourceImage, OH_PixelmapNative* destinationImage)
133 {
134 return CallImageProcessing(imageProcessor, [&sourceImage, &destinationImage](
135 std::shared_ptr<IImageProcessingNative>& obj) {
136 return obj->ConvertColorSpace(sourceImage, destinationImage);
137 });
138 }
139
OH_ImageProcessing_Compose(OH_ImageProcessing * imageProcessor,OH_PixelmapNative * sourceImage,OH_PixelmapNative * sourceGainmap,OH_PixelmapNative * destinationImage)140 ImageProcessing_ErrorCode OH_ImageProcessing_Compose(OH_ImageProcessing* imageProcessor,
141 OH_PixelmapNative* sourceImage, OH_PixelmapNative* sourceGainmap, OH_PixelmapNative* destinationImage)
142 {
143 return CallImageProcessing(imageProcessor, [&sourceImage, &sourceGainmap, &destinationImage](
144 std::shared_ptr<IImageProcessingNative>& obj) {
145 return obj->Compose(sourceImage, sourceGainmap, destinationImage);
146 });
147 }
148
OH_ImageProcessing_Decompose(OH_ImageProcessing * imageProcessor,OH_PixelmapNative * sourceImage,OH_PixelmapNative * destinationImage,OH_PixelmapNative * destinationGainmap)149 ImageProcessing_ErrorCode OH_ImageProcessing_Decompose(OH_ImageProcessing* imageProcessor,
150 OH_PixelmapNative* sourceImage, OH_PixelmapNative* destinationImage, OH_PixelmapNative* destinationGainmap)
151 {
152 return CallImageProcessing(imageProcessor, [&sourceImage, &destinationImage, &destinationGainmap](
153 std::shared_ptr<IImageProcessingNative>& obj) {
154 return obj->Decompose(sourceImage, destinationImage, destinationGainmap);
155 });
156 }
157
OH_ImageProcessing_GenerateMetadata(OH_ImageProcessing * imageProcessor,OH_PixelmapNative * sourceImage)158 ImageProcessing_ErrorCode OH_ImageProcessing_GenerateMetadata(OH_ImageProcessing* imageProcessor,
159 OH_PixelmapNative* sourceImage)
160 {
161 return CallImageProcessing(imageProcessor, [&sourceImage](
162 std::shared_ptr<IImageProcessingNative>& obj) {
163 return obj->GenerateMetadata(sourceImage);
164 });
165 }
166
OH_ImageProcessing_EnhanceDetail(OH_ImageProcessing * imageProcessor,OH_PixelmapNative * sourceImage,OH_PixelmapNative * destinationImage)167 ImageProcessing_ErrorCode OH_ImageProcessing_EnhanceDetail(OH_ImageProcessing* imageProcessor,
168 OH_PixelmapNative* sourceImage, OH_PixelmapNative* destinationImage)
169 {
170 return CallImageProcessing(imageProcessor, [&sourceImage, &destinationImage](
171 std::shared_ptr<IImageProcessingNative>& obj) {
172 return obj->Process(sourceImage, destinationImage);
173 });
174 }
175