• 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 "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 }