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