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