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 "vpe_utils.h"
17
18 #include <dlfcn.h>
19
20 #include "hilog/log.h"
21 #include "log_tags.h"
22 #include "image_log.h"
23 #if !defined(_WIN32) && !defined(_APPLE) && !defined(IOS_PLATFORM) && !defined(ANDROID_PLATFORM)
24 #include "v1_0/buffer_handle_meta_key_type.h"
25 #include "metadata_convertor.h"
26 #include "external_window.h"
27 #include "native_window.h"
28 #endif
29
30 #undef LOG_DOMAIN
31 #define LOG_DOMAIN LOG_TAG_DOMAIN_ID_PLUGIN
32
33 #undef LOG_TAG
34 #define LOG_TAG "VpeUtils"
35
36 namespace OHOS {
37 namespace Media {
38 #if !defined(_WIN32) && !defined(_APPLE) && !defined(IOS_PLATFORM) && !defined(ANDROID_PLATFORM)
39 using namespace OHOS::HDI::Display::Graphic::Common::V1_0;
40 static constexpr uint32_t TRANSFUNC_OFFSET = 8;
41 static constexpr uint32_t MATRIX_OFFSET = 16;
42 static constexpr uint32_t RANGE_OFFSET = 21;
43 constexpr uint8_t INDEX_ZERO = 0;
44 constexpr uint8_t INDEX_ONE = 1;
45 constexpr uint8_t INDEX_TWO = 2;
46 #endif
47 const static char* VPE_SO_NAME = "libvideoprocessingengine.z.so";
48 void* VpeUtils::dlHandler_ = nullptr;
VpeUtilsDeinitLibVpe()49 __attribute__((destructor)) void VpeUtilsDeinitLibVpe()
50 {
51 VpeUtils::UnloadLibVpe();
52 }
53
54 using CreateT = int32_t (*)(int32_t*);
55 using DestoryT = int32_t (*)(int32_t*);
56
57 #if !defined(_WIN32) && !defined(_APPLE) && !defined(IOS_PLATFORM) && !defined(ANDROID_PLATFORM)
58 using ComposeImageT =
59 int32_t (*)(int32_t, OHNativeWindowBuffer*, OHNativeWindowBuffer*, OHNativeWindowBuffer*, bool);
60 using DecomposeImageT =
61 int32_t (*)(int32_t, OHNativeWindowBuffer*, OHNativeWindowBuffer*, OHNativeWindowBuffer*);
62 using HdrProcessImageT =
63 int32_t (*)(int32_t, OHNativeWindowBuffer*, OHNativeWindowBuffer*);
64 using SrProcessImageT =
65 int32_t (*)(int32_t, OHNativeWindowBuffer*, OHNativeWindowBuffer*, int32_t);
66 #endif
67
68
VpeUtils()69 VpeUtils::VpeUtils()
70 {
71 static std::once_flag flag;
72 std::function<void()> func = []() {
73 VpeUtils::LoadLibVpe();
74 };
75 std::call_once(flag, func);
76 }
77
LoadLibVpe()78 bool VpeUtils::LoadLibVpe()
79 {
80 dlHandler_ = dlopen(VPE_SO_NAME, RTLD_LAZY);
81 if (dlHandler_ == nullptr) {
82 IMAGE_LOGE("VpeUtils LoadLibVpe, failed");
83 return false;
84 }
85 IMAGE_LOGD("VpeUtils LoadLibVpe, success");
86 return true;
87 }
88
UnloadLibVpe()89 void VpeUtils::UnloadLibVpe()
90 {
91 if (dlHandler_) {
92 dlclose(dlHandler_);
93 dlHandler_ = nullptr;
94 }
95 }
96
~VpeUtils()97 VpeUtils::~VpeUtils()
98 {
99 }
100
ColorSpaceConverterCreate(void * handle,int32_t * instanceId)101 int32_t VpeUtils::ColorSpaceConverterCreate(void* handle, int32_t* instanceId)
102 {
103 if (handle == nullptr) {
104 return VPE_ERROR_FAILED;
105 }
106 CreateT create = (CreateT)dlsym(handle, "ColorSpaceConverterCreate");
107 if (!create) {
108 return VPE_ERROR_FAILED;
109 }
110 return create(instanceId);
111 }
112
ColorSpaceConverterDestory(void * handle,int32_t * instanceId)113 int32_t VpeUtils::ColorSpaceConverterDestory(void* handle, int32_t* instanceId)
114 {
115 if (*instanceId == VPE_ERROR_FAILED || handle == nullptr) {
116 return VPE_ERROR_FAILED;
117 }
118 DestoryT destory = (DestoryT)dlsym(handle, "ColorSpaceConverterDestroy");
119 if (!destory) {
120 return VPE_ERROR_FAILED;
121 }
122 return destory(instanceId);
123 }
124
DetailEnhancerCreate(void * handle,int32_t * instanceId)125 int32_t VpeUtils::DetailEnhancerCreate(void* handle, int32_t* instanceId)
126 {
127 if (handle == nullptr) {
128 return VPE_ERROR_FAILED;
129 }
130 CreateT create = (CreateT)dlsym(handle, "DetailEnhancerCreate");
131 if (!create) {
132 return VPE_ERROR_FAILED;
133 }
134 return create(instanceId);
135 }
136
DetailEnhancerDestory(void * handle,int32_t * instanceId)137 int32_t VpeUtils::DetailEnhancerDestory(void* handle, int32_t* instanceId)
138 {
139 if (*instanceId == VPE_ERROR_FAILED || handle == nullptr) {
140 return VPE_ERROR_FAILED;
141 }
142 DestoryT destory = (DestoryT)dlsym(handle, "DetailEnhancerDestroy");
143 if (!destory) {
144 return VPE_ERROR_FAILED;
145 }
146 return destory(instanceId);
147 }
148
149 #if !defined(_WIN32) && !defined(_APPLE) && !defined(IOS_PLATFORM) && !defined(ANDROID_PLATFORM)
ColorSpaceConverterComposeImage(VpeSurfaceBuffers & sb,bool legacy)150 int32_t VpeUtils::ColorSpaceConverterComposeImage(VpeSurfaceBuffers& sb, bool legacy)
151 {
152 std::lock_guard<std::mutex> lock(vpeMtx_);
153 if (dlHandler_ == nullptr) {
154 return VPE_ERROR_FAILED;
155 }
156
157 int32_t res;
158 int32_t instanceId = VPE_ERROR_FAILED;
159 res = ColorSpaceConverterCreate(dlHandler_, &instanceId);
160 if (instanceId == VPE_ERROR_FAILED || res != VPE_ERROR_OK) {
161 return VPE_ERROR_FAILED;
162 }
163
164 ComposeImageT composeImage = (ComposeImageT)dlsym(dlHandler_, "ColorSpaceConverterComposeImage");
165 if (!composeImage) {
166 return VPE_ERROR_FAILED;
167 }
168 if (sb.sdr == nullptr || sb.gainmap == nullptr || sb.hdr == nullptr) {
169 return VPE_ERROR_FAILED;
170 }
171 OHNativeWindowBuffer* sdr = OH_NativeWindow_CreateNativeWindowBufferFromSurfaceBuffer(&sb.sdr);
172 OHNativeWindowBuffer* gainmap = OH_NativeWindow_CreateNativeWindowBufferFromSurfaceBuffer(&sb.gainmap);
173 OHNativeWindowBuffer* hdr = OH_NativeWindow_CreateNativeWindowBufferFromSurfaceBuffer(&sb.hdr);
174 res = composeImage(instanceId, sdr, gainmap, hdr, legacy);
175 OH_NativeWindow_DestroyNativeWindowBuffer(sdr);
176 OH_NativeWindow_DestroyNativeWindowBuffer(gainmap);
177 OH_NativeWindow_DestroyNativeWindowBuffer(hdr);
178 ColorSpaceConverterDestory(dlHandler_, &instanceId);
179 return res;
180 }
181
ColorSpaceConverterDecomposeImage(VpeSurfaceBuffers & sb)182 int32_t VpeUtils::ColorSpaceConverterDecomposeImage(VpeSurfaceBuffers& sb)
183 {
184 std::lock_guard<std::mutex> lock(vpeMtx_);
185 if (dlHandler_ == nullptr) {
186 return VPE_ERROR_FAILED;
187 }
188
189 int32_t res;
190 int32_t instanceId = VPE_ERROR_FAILED;
191 res = ColorSpaceConverterCreate(dlHandler_, &instanceId);
192 if (instanceId == VPE_ERROR_FAILED || res != VPE_ERROR_OK) {
193 return VPE_ERROR_FAILED;
194 }
195
196 DecomposeImageT decomposeImage = (DecomposeImageT)dlsym(dlHandler_, "ColorSpaceConverterDecomposeImage");
197 if (!decomposeImage) {
198 return VPE_ERROR_FAILED;
199 }
200 if (sb.sdr == nullptr || sb.gainmap == nullptr || sb.hdr == nullptr) {
201 return VPE_ERROR_FAILED;
202 }
203 OHNativeWindowBuffer* sdr = OH_NativeWindow_CreateNativeWindowBufferFromSurfaceBuffer(&sb.sdr);
204 OHNativeWindowBuffer* gainmap = OH_NativeWindow_CreateNativeWindowBufferFromSurfaceBuffer(&sb.gainmap);
205 OHNativeWindowBuffer* hdr = OH_NativeWindow_CreateNativeWindowBufferFromSurfaceBuffer(&sb.hdr);
206 res = decomposeImage(instanceId, hdr, sdr, gainmap);
207 OH_NativeWindow_DestroyNativeWindowBuffer(sdr);
208 OH_NativeWindow_DestroyNativeWindowBuffer(gainmap);
209 OH_NativeWindow_DestroyNativeWindowBuffer(hdr);
210 ColorSpaceConverterDestory(dlHandler_, &instanceId);
211 return res;
212 }
213
214 // surfacebuffer metadata
SetColorSpaceInfo(sptr<SurfaceBuffer> & buffer,const CM_ColorSpaceInfo & colorSpaceInfo)215 static GSError SetColorSpaceInfo(sptr<SurfaceBuffer>& buffer, const CM_ColorSpaceInfo& colorSpaceInfo)
216 {
217 std::vector<uint8_t> colorSpaceInfoVec;
218 auto ret = MetadataManager::ConvertMetadataToVec(colorSpaceInfo, colorSpaceInfoVec);
219 if (ret != GSERROR_OK) {
220 return ret;
221 }
222 return buffer->SetMetadata(ATTRKEY_COLORSPACE_INFO, colorSpaceInfoVec);
223 }
224
GetColorSpaceInfo(const sptr<SurfaceBuffer> & buffer,CM_ColorSpaceInfo & colorSpaceInfo)225 static bool GetColorSpaceInfo(const sptr<SurfaceBuffer>& buffer, CM_ColorSpaceInfo& colorSpaceInfo)
226 {
227 std::vector<uint8_t> colorSpaceInfoVec;
228 auto ret = buffer->GetMetadata(ATTRKEY_COLORSPACE_INFO, colorSpaceInfoVec);
229 if (ret != GSERROR_OK) {
230 IMAGE_LOGE("GetColorSpaceInfo GetMetadata failed, return value is %{public}d", ret);
231 return false;
232 }
233 return MetadataManager::ConvertVecToMetadata(colorSpaceInfoVec, colorSpaceInfo) == GSERROR_OK;
234 }
235
SetSbColorSpaceType(sptr<SurfaceBuffer> & buffer,const CM_ColorSpaceType & colorSpaceType)236 bool VpeUtils::SetSbColorSpaceType(sptr<SurfaceBuffer>& buffer, const CM_ColorSpaceType& colorSpaceType)
237 {
238 CM_ColorSpaceInfo colorSpaceInfo;
239 uint32_t colorSpace = static_cast<uint32_t>(colorSpaceType);
240 colorSpaceInfo.primaries = static_cast<CM_ColorPrimaries>(colorSpace & CM_PRIMARIES_MASK);
241 colorSpaceInfo.transfunc = static_cast<CM_TransFunc>((colorSpace & CM_TRANSFUNC_MASK) >> TRANSFUNC_OFFSET);
242 colorSpaceInfo.matrix = static_cast<CM_Matrix>((colorSpace & CM_MATRIX_MASK) >> MATRIX_OFFSET);
243 colorSpaceInfo.range = static_cast<CM_Range>((colorSpace & CM_RANGE_MASK) >> RANGE_OFFSET);
244 auto ret = SetColorSpaceInfo(buffer, colorSpaceInfo);
245 if (ret != GSERROR_OK) {
246 IMAGE_LOGE("SetColorSpaceInfo GetMetadata failed, return value is %{public}d", ret);
247 return false;
248 }
249 return true;
250 }
251
GetSbColorSpaceType(const sptr<SurfaceBuffer> & buffer,CM_ColorSpaceType & colorSpaceType)252 bool VpeUtils::GetSbColorSpaceType(const sptr<SurfaceBuffer>& buffer, CM_ColorSpaceType& colorSpaceType)
253 {
254 CM_ColorSpaceInfo colorSpaceInfo;
255 if (!GetColorSpaceInfo(buffer, colorSpaceInfo)) {
256 return false;
257 }
258 uint32_t primaries = static_cast<uint32_t>(colorSpaceInfo.primaries);
259 uint32_t transfunc = static_cast<uint32_t>(colorSpaceInfo.transfunc);
260 uint32_t matrix = static_cast<uint32_t>(colorSpaceInfo.matrix);
261 uint32_t range = static_cast<uint32_t>(colorSpaceInfo.range);
262 colorSpaceType = static_cast<CM_ColorSpaceType>(primaries | (transfunc << TRANSFUNC_OFFSET) |
263 (matrix << MATRIX_OFFSET) | (range << RANGE_OFFSET));
264 return true;
265 }
266
SetSbMetadataType(sptr<SurfaceBuffer> & buffer,const CM_HDR_Metadata_Type & metadataType)267 bool VpeUtils::SetSbMetadataType(sptr<SurfaceBuffer>& buffer, const CM_HDR_Metadata_Type& metadataType)
268 {
269 if (buffer == nullptr) {
270 IMAGE_LOGE("%{public}s failed, buffer is nullptr", __func__);
271 return false;
272 }
273 std::vector<uint8_t> hdrMetadataTypeVec;
274 auto ret = MetadataManager::ConvertMetadataToVec(metadataType, hdrMetadataTypeVec);
275 if (ret != GSERROR_OK) {
276 return false;
277 }
278 ret = buffer->SetMetadata(ATTRKEY_HDR_METADATA_TYPE, hdrMetadataTypeVec);
279 if (ret != GSERROR_OK) {
280 return false;
281 }
282 return true;
283 }
284
GetSbMetadataType(const sptr<SurfaceBuffer> & buffer,CM_HDR_Metadata_Type & metadataType)285 bool VpeUtils::GetSbMetadataType(const sptr<SurfaceBuffer>& buffer, CM_HDR_Metadata_Type& metadataType)
286 {
287 std::vector<uint8_t> hdrMetadataTypeVec;
288 auto ret = buffer->GetMetadata(ATTRKEY_HDR_METADATA_TYPE, hdrMetadataTypeVec);
289 if (ret != GSERROR_OK) {
290 IMAGE_LOGE("HdrUtils::GetHDRMetadataType GetMetadata failed, return value is %{public}d", ret);
291 return false;
292 }
293 return MetadataManager::ConvertVecToMetadata(hdrMetadataTypeVec, metadataType) == GSERROR_OK;
294 }
295
SetSbDynamicMetadata(sptr<SurfaceBuffer> & buffer,const std::vector<uint8_t> & dynamicMetadata)296 bool VpeUtils::SetSbDynamicMetadata(sptr<SurfaceBuffer>& buffer, const std::vector<uint8_t>& dynamicMetadata)
297 {
298 return buffer->SetMetadata(ATTRKEY_HDR_DYNAMIC_METADATA, dynamicMetadata) == GSERROR_OK;
299 }
300
GetSbDynamicMetadata(const sptr<SurfaceBuffer> & buffer,std::vector<uint8_t> & dynamicMetadata)301 bool VpeUtils::GetSbDynamicMetadata(const sptr<SurfaceBuffer>& buffer, std::vector<uint8_t>& dynamicMetadata)
302 {
303 return buffer->GetMetadata(ATTRKEY_HDR_DYNAMIC_METADATA, dynamicMetadata) == GSERROR_OK;
304 }
305
SetSbStaticMetadata(sptr<SurfaceBuffer> & buffer,const std::vector<uint8_t> & staticMetadata)306 bool VpeUtils::SetSbStaticMetadata(sptr<SurfaceBuffer>& buffer, const std::vector<uint8_t>& staticMetadata)
307 {
308 return buffer->SetMetadata(ATTRKEY_HDR_STATIC_METADATA, staticMetadata) == GSERROR_OK;
309 }
310
GetSbStaticMetadata(const sptr<SurfaceBuffer> & buffer,std::vector<uint8_t> & staticMetadata)311 bool VpeUtils::GetSbStaticMetadata(const sptr<SurfaceBuffer>& buffer, std::vector<uint8_t>& staticMetadata)
312 {
313 return buffer->GetMetadata(ATTRKEY_HDR_STATIC_METADATA, staticMetadata) == GSERROR_OK;
314 }
315
GetDefaultGainmapMetadata()316 static HDRVividExtendMetadata GetDefaultGainmapMetadata()
317 {
318 const float gainmapMax = 1.0f;
319 const float gainmapMin = 0.0f;
320 const float gamma = 1.0f;
321 const float offsetDenominator = 64.0;
322 const float baseOffset = 1.0 / offsetDenominator;
323 const float alternateOffset = 1.0 / offsetDenominator;
324 HDRVividExtendMetadata extendMetadata;
325 extendMetadata.metaISO.enhanceClippedThreholdMaxGainmap[INDEX_ZERO] = gainmapMax;
326 extendMetadata.metaISO.enhanceClippedThreholdMaxGainmap[INDEX_ONE] = gainmapMax;
327 extendMetadata.metaISO.enhanceClippedThreholdMaxGainmap[INDEX_TWO] = gainmapMax;
328 extendMetadata.metaISO.enhanceClippedThreholdMinGainmap[INDEX_ZERO] = gainmapMin;
329 extendMetadata.metaISO.enhanceClippedThreholdMinGainmap[INDEX_ONE] = gainmapMin;
330 extendMetadata.metaISO.enhanceClippedThreholdMinGainmap[INDEX_TWO] = gainmapMin;
331 extendMetadata.metaISO.enhanceMappingGamma[INDEX_ZERO] = gamma;
332 extendMetadata.metaISO.enhanceMappingGamma[INDEX_ONE] = gamma;
333 extendMetadata.metaISO.enhanceMappingGamma[INDEX_TWO] = gamma;
334 extendMetadata.metaISO.enhanceMappingBaselineOffset[INDEX_ZERO] = baseOffset;
335 extendMetadata.metaISO.enhanceMappingBaselineOffset[INDEX_ONE] = baseOffset;
336 extendMetadata.metaISO.enhanceMappingBaselineOffset[INDEX_TWO] = baseOffset;
337 extendMetadata.metaISO.enhanceMappingAlternateOffset[INDEX_ZERO] = alternateOffset;
338 extendMetadata.metaISO.enhanceMappingAlternateOffset[INDEX_ONE] = alternateOffset;
339 extendMetadata.metaISO.enhanceMappingAlternateOffset[INDEX_TWO] = alternateOffset;
340 extendMetadata.metaISO.gainmapChannelNum = 0x01;
341 extendMetadata.metaISO.useBaseColorFlag = 0x00;
342 extendMetadata.baseColorMeta.baseColorPrimary = COLORPRIMARIES_SRGB;
343 extendMetadata.gainmapColorMeta.combineColorPrimary = COLORPRIMARIES_BT2020;
344 extendMetadata.gainmapColorMeta.enhanceDataColorModel = COLORPRIMARIES_BT2020;
345 extendMetadata.gainmapColorMeta.alternateColorPrimary = COLORPRIMARIES_BT2020;
346 return extendMetadata;
347 }
348
ConvertHdrType(ImageHdrType hdrType,bool isGainmap)349 static CM_HDR_Metadata_Type ConvertHdrType(ImageHdrType hdrType, bool isGainmap)
350 {
351 switch (hdrType) {
352 case ImageHdrType::HDR_VIVID_DUAL :
353 case ImageHdrType::HDR_CUVA :
354 return CM_IMAGE_HDR_VIVID_DUAL;
355 case ImageHdrType::HDR_ISO_DUAL :
356 return CM_IMAGE_HDR_ISO_DUAL;
357 default:
358 return CM_METADATA_NONE;
359 }
360 return CM_METADATA_NONE;
361 }
362
SetSurfaceBufferInfo(sptr<SurfaceBuffer> & buffer,bool isGainmap,ImageHdrType type,CM_ColorSpaceType color,HdrMetadata & metadata)363 void VpeUtils::SetSurfaceBufferInfo(sptr<SurfaceBuffer>& buffer, bool isGainmap, ImageHdrType type,
364 CM_ColorSpaceType color, HdrMetadata& metadata)
365 {
366 CM_HDR_Metadata_Type cmHdrType = ConvertHdrType(type, isGainmap);
367 VpeUtils::SetSbMetadataType(buffer, cmHdrType);
368 VpeUtils::SetSbColorSpaceType(buffer, color);
369 if (type == ImageHdrType::HDR_CUVA) {
370 return;
371 }
372 if (!isGainmap) {
373 VpeUtils::SetSbDynamicMetadata(buffer, metadata.dynamicMetadata);
374 VpeUtils::SetSbStaticMetadata(buffer, metadata.staticMetadata);
375 return;
376 }
377 std::vector<uint8_t> extendMetadataVec(sizeof(HDRVividExtendMetadata));
378 int memCpyRes = 0;
379 if (metadata.extendMetaFlag) {
380 memCpyRes = memcpy_s(extendMetadataVec.data(), extendMetadataVec.size(),
381 &metadata.extendMeta, sizeof(HDRVividExtendMetadata));
382 } else {
383 HDRVividExtendMetadata defaultExtendMetadata = GetDefaultGainmapMetadata();
384 memCpyRes = memcpy_s(extendMetadataVec.data(), extendMetadataVec.size(),
385 &defaultExtendMetadata, sizeof(HDRVividExtendMetadata));
386 }
387 if (memCpyRes != EOK) {
388 IMAGE_LOGE("SetSurfaceBufferInfo failed, memcpy_s error:%{public}d", memCpyRes);
389 return;
390 }
391 VpeUtils::SetSbDynamicMetadata(buffer, extendMetadataVec);
392 }
393
ColorSpaceConverterImageProcess(sptr<SurfaceBuffer> & input,sptr<SurfaceBuffer> & output)394 int32_t VpeUtils::ColorSpaceConverterImageProcess(sptr<SurfaceBuffer> &input, sptr<SurfaceBuffer> &output)
395 {
396 std::lock_guard<std::mutex> lock(vpeMtx_);
397 if (dlHandler_ == nullptr) {
398 return VPE_ERROR_FAILED;
399 }
400
401 int32_t res;
402 int32_t instanceId = VPE_ERROR_FAILED;
403 res = ColorSpaceConverterCreate(dlHandler_, &instanceId);
404 if (instanceId == VPE_ERROR_FAILED || res != VPE_ERROR_OK) {
405 return VPE_ERROR_FAILED;
406 }
407
408 HdrProcessImageT hdrProcessImage = (HdrProcessImageT)dlsym(dlHandler_, "ColorSpaceConverterProcessImage");
409 if (!hdrProcessImage) {
410 return VPE_ERROR_FAILED;
411 }
412 if (input == nullptr || output == nullptr) {
413 return VPE_ERROR_FAILED;
414 }
415 OHNativeWindowBuffer* sdr = OH_NativeWindow_CreateNativeWindowBufferFromSurfaceBuffer(&input);
416 OHNativeWindowBuffer* hdr = OH_NativeWindow_CreateNativeWindowBufferFromSurfaceBuffer(&output);
417 res = hdrProcessImage(instanceId, sdr, hdr);
418 OH_NativeWindow_DestroyNativeWindowBuffer(sdr);
419 OH_NativeWindow_DestroyNativeWindowBuffer(hdr);
420 ColorSpaceConverterDestory(dlHandler_, &instanceId);
421 return res;
422 }
423
DetailEnhancerImageProcess(sptr<SurfaceBuffer> & input,sptr<SurfaceBuffer> & output,int32_t level)424 int32_t VpeUtils::DetailEnhancerImageProcess(sptr<SurfaceBuffer> &input, sptr<SurfaceBuffer> &output, int32_t level)
425 {
426 std::lock_guard<std::mutex> lock(vpeMtx_);
427 if (dlHandler_ == nullptr) {
428 return VPE_ERROR_FAILED;
429 }
430
431 int32_t res;
432 int32_t instanceId = VPE_ERROR_FAILED;
433 res = DetailEnhancerCreate(dlHandler_, &instanceId);
434 if (instanceId == VPE_ERROR_FAILED || res != VPE_ERROR_OK) {
435 return VPE_ERROR_FAILED;
436 }
437
438 SrProcessImageT srProcessImage = (SrProcessImageT)dlsym(dlHandler_, "DetailEnhancerProcessImage");
439 if (!srProcessImage) {
440 return VPE_ERROR_FAILED;
441 }
442 if (input == nullptr || output == nullptr) {
443 return VPE_ERROR_FAILED;
444 }
445 OHNativeWindowBuffer* inBuffer = OH_NativeWindow_CreateNativeWindowBufferFromSurfaceBuffer(&input);
446 OHNativeWindowBuffer* outBuffer = OH_NativeWindow_CreateNativeWindowBufferFromSurfaceBuffer(&output);
447 res = srProcessImage(instanceId, inBuffer, outBuffer, level);
448 OH_NativeWindow_DestroyNativeWindowBuffer(inBuffer);
449 OH_NativeWindow_DestroyNativeWindowBuffer(outBuffer);
450 DetailEnhancerDestory(dlHandler_, &instanceId);
451 return res;
452 }
453
SetSbColorSpaceDefault(sptr<SurfaceBuffer> & buffer)454 bool VpeUtils::SetSbColorSpaceDefault(sptr<SurfaceBuffer>& buffer)
455 {
456 constexpr CM_ColorSpaceInfo outputColorSpaceInfo = {
457 COLORPRIMARIES_BT2020, TRANSFUNC_HLG, MATRIX_BT2020, RANGE_FULL
458 };
459 auto ret = SetColorSpaceInfo(buffer, outputColorSpaceInfo);
460 if (ret != GSERROR_OK) {
461 IMAGE_LOGE("SetSbColorSpaceDefault GetMetadata failed, return value is %{public}d", ret);
462 return false;
463 }
464 return true;
465 }
466
SetSurfaceBufferInfo(sptr<SurfaceBuffer> & buffer,CM_ColorSpaceType color)467 void VpeUtils::SetSurfaceBufferInfo(sptr<SurfaceBuffer>& buffer, CM_ColorSpaceType color)
468 {
469 VpeUtils::SetSbColorSpaceType(buffer, color);
470 }
471
CopySurfaceBufferInfo(sptr<SurfaceBuffer> & source,sptr<SurfaceBuffer> & dst)472 void VpeUtils::CopySurfaceBufferInfo(sptr<SurfaceBuffer>& source, sptr<SurfaceBuffer>& dst)
473 {
474 if (source == nullptr || dst == nullptr) {
475 IMAGE_LOGI("VpeUtils CopySurfaceBufferInfo failed, source or dst is nullptr");
476 return;
477 }
478 std::vector<uint8_t> hdrMetadataTypeVec;
479 std::vector<uint8_t> colorSpaceInfoVec;
480 std::vector<uint8_t> staticData;
481 std::vector<uint8_t> dynamicData;
482
483 if (source->GetMetadata(ATTRKEY_HDR_METADATA_TYPE, hdrMetadataTypeVec) == GSERROR_OK) {
484 dst->SetMetadata(ATTRKEY_HDR_METADATA_TYPE, hdrMetadataTypeVec);
485 }
486 if (source->GetMetadata(ATTRKEY_COLORSPACE_INFO, colorSpaceInfoVec) == GSERROR_OK) {
487 dst->SetMetadata(ATTRKEY_COLORSPACE_INFO, colorSpaceInfoVec);
488 }
489 if (GetSbStaticMetadata(source, staticData) && (staticData.size() > 0)) {
490 SetSbStaticMetadata(dst, staticData);
491 }
492 if (GetSbDynamicMetadata(source, dynamicData) && (dynamicData.size()) > 0) {
493 SetSbDynamicMetadata(dst, dynamicData);
494 }
495 }
496 #endif
497 }
498 }