• 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 "common_utils.h"
17 
18 #include <charconv>
19 
20 #include "effect_log.h"
21 #include "effect_buffer.h"
22 #include "uri.h"
23 #include "string_helper.h"
24 #include "memcpy_helper.h"
25 #include "colorspace_helper.h"
26 #include "render_environment.h"
27 #include "format_helper.h"
28 #include "exif_metadata.h"
29 #include "v1_1/buffer_handle_meta_key_type.h"
30 
31 namespace OHOS {
32 namespace Media {
33 namespace Effect {
34 namespace {
35     const std::string IMAGE_LENGTH = "ImageLength";
36     const std::string IMAGE_WIDTH = "ImageWidth";
37     const std::string DATE_TIME = "DateTime";
38     const std::string PIXEL_X_DIMENSION = "PixelXDimension";
39     const std::string PIXEL_Y_DIMENSION = "PixelYDimension";
40     const int32_t TIME_MAX = 64;
41     const int32_t YUV_PLANE_COUNT = 2;
42     const int32_t YUV_HALF_HEIGHT = 2;
43     const int32_t P010_BYTES_PIXEL = 2;
44 }
45 
46 using namespace OHOS::ColorManager;
47 using namespace OHOS::HDI::Display::Graphic::Common::V1_0;
48 
49 const std::unordered_map<PixelFormat, IEffectFormat> CommonUtils::pixelFmtToEffectFmt_ = {
50     { PixelFormat::RGBA_8888, IEffectFormat::RGBA8888 },
51     { PixelFormat::NV21, IEffectFormat::YUVNV21 },
52     { PixelFormat::NV12, IEffectFormat::YUVNV12 },
53     { PixelFormat::RGBA_1010102, IEffectFormat::RGBA_1010102 },
54 };
55 
56 const std::unordered_map<GraphicPixelFormat, IEffectFormat> CommonUtils::surfaceBufferFmtToEffectFmt_ = {
57     { GraphicPixelFormat::GRAPHIC_PIXEL_FMT_RGBA_8888, IEffectFormat::RGBA8888},
58     { GraphicPixelFormat::GRAPHIC_PIXEL_FMT_YCBCR_420_SP, IEffectFormat::YUVNV12 },
59     { GraphicPixelFormat::GRAPHIC_PIXEL_FMT_YCRCB_420_SP, IEffectFormat::YUVNV21 },
60     { GraphicPixelFormat::GRAPHIC_PIXEL_FMT_RGBA_1010102, IEffectFormat::RGBA_1010102 },
61     { GraphicPixelFormat::GRAPHIC_PIXEL_FMT_YCBCR_P010, IEffectFormat::YCBCR_P010 },
62     { GraphicPixelFormat::GRAPHIC_PIXEL_FMT_YCRCB_P010, IEffectFormat::YCRCB_P010 },
63 };
64 
65 const std::unordered_map<AllocatorType, BufferType> CommonUtils::allocatorTypeToEffectBuffType_ = {
66     { AllocatorType::HEAP_ALLOC, BufferType::HEAP_MEMORY },
67     { AllocatorType::DMA_ALLOC, BufferType::DMA_BUFFER },
68     { AllocatorType::SHARE_MEM_ALLOC, BufferType::SHARED_MEMORY },
69 };
70 
71 std::vector<std::string> FILE_TYPE_SUPPORT_TABLE = {"image/heic", "image/heif", "image/jpeg"};
72 
73 template <class ValueType>
ParseJson(const std::string & key,Plugin::Any & any,EffectJsonPtr & json)74 ErrorCode ParseJson(const std::string &key, Plugin::Any &any, EffectJsonPtr &json)
75 {
76     auto result = Plugin::AnyCast<ValueType>(&any);
77     if (result == nullptr) {
78         return ErrorCode::ERR_ANY_CAST_TYPE_NOT_MATCH;
79     }
80 
81     json->Put(key, *result);
82     return ErrorCode::SUCCESS;
83 }
84 
CreateExtraInfo(PixelMap * pixelMap)85 std::shared_ptr<ExtraInfo> CreateExtraInfo(PixelMap * pixelMap)
86 {
87     BufferType bufferType = CommonUtils::SwitchToEffectBuffType(pixelMap->GetAllocatorType());
88     std::shared_ptr<ExtraInfo> extraInfo = std::make_unique<ExtraInfo>();
89     extraInfo->dataType = DataType::PIXEL_MAP;
90     extraInfo->bufferType = bufferType;
91     extraInfo->pixelMap = pixelMap;
92     extraInfo->surfaceBuffer = nullptr;
93     if (extraInfo->bufferType == BufferType::DMA_BUFFER && pixelMap->GetFd() != nullptr) {
94         extraInfo->surfaceBuffer = reinterpret_cast<SurfaceBuffer*>(pixelMap->GetFd());
95     }
96     if (extraInfo->bufferType == BufferType::SHARED_MEMORY && pixelMap->GetFd() != nullptr) {
97         extraInfo->fd = reinterpret_cast<int *>(pixelMap->GetFd());
98     }
99     EFFECT_LOGI("pixelMap extraInfos: dataType=%{public}d, bufferType=%{public}d",
100         extraInfo->dataType, extraInfo->bufferType);
101     return extraInfo;
102 }
103 
LockPixelMap(PixelMap * pixelMap,std::shared_ptr<EffectBuffer> & effectBuffer)104 ErrorCode CommonUtils::LockPixelMap(PixelMap *pixelMap, std::shared_ptr<EffectBuffer> &effectBuffer)
105 {
106     CHECK_AND_RETURN_RET_LOG(pixelMap != nullptr, ErrorCode::ERR_INPUT_NULL, "pixelMap is null!");
107     ColorSpaceName colorSpaceName = pixelMap->InnerGetGrColorSpacePtr() == nullptr ? ColorSpaceName::NONE :
108         pixelMap->InnerGetGrColorSpacePtr()->GetColorSpaceName();
109     EFFECT_LOGD("pixelMapInfos: width=%{public}d, height=%{public}d, formatType=%{public}d " \
110         "rowStride=%{public}d, byteCount=%{public}d, addr=%{private}p, colorSpaceName=%{public}d",
111         pixelMap->GetWidth(), pixelMap->GetHeight(), pixelMap->GetPixelFormat(), pixelMap->GetRowStride(),
112         pixelMap->GetByteCount(), pixelMap->GetPixels(), colorSpaceName);
113 
114     IEffectFormat formatType = SwitchToEffectFormat(pixelMap->GetPixelFormat());
115     CHECK_AND_RETURN_RET_LOG(formatType != IEffectFormat::DEFAULT, ErrorCode::ERR_UNSUPPORTED_PIXEL_FORMAT,
116         "pixelFormat not support! pixelFormat=%{public}d", pixelMap->GetPixelFormat());
117 
118     std::shared_ptr<BufferInfo> bufferInfo = std::make_unique<BufferInfo>();
119     bufferInfo->width_ = static_cast<uint32_t>(pixelMap->GetWidth());
120     bufferInfo->height_ = static_cast<uint32_t>(pixelMap->GetHeight());
121     if (pixelMap->GetPixelFormat() == PixelFormat::NV21 ||
122         pixelMap->GetPixelFormat() == PixelFormat::NV12) {
123         YUVDataInfo info;
124         pixelMap->GetImageYUVInfo(info);
125         bufferInfo->rowStride_ = info.yStride;
126     } else if (pixelMap->GetPixelFormat() == PixelFormat::YCRCB_P010 ||
127         pixelMap->GetPixelFormat() == PixelFormat::YCBCR_P010) {
128         YUVDataInfo info;
129         pixelMap->GetImageYUVInfo(info);
130         bufferInfo->rowStride_ = info.yStride * P010_BYTES_PIXEL;
131     } else {
132         bufferInfo->rowStride_ = static_cast<uint32_t>(pixelMap->GetRowStride());
133     }
134     bufferInfo->len_ = formatType == IEffectFormat::RGBA8888 ? bufferInfo->height_ * bufferInfo->rowStride_ :
135         FormatHelper::CalculateSize(bufferInfo->width_, bufferInfo->height_, formatType);
136     bufferInfo->formatType_ = formatType;
137     bufferInfo->colorSpace_ = ColorSpaceHelper::ConvertToEffectColorSpace(colorSpaceName);
138 
139     uint8_t *pixels = const_cast<uint8_t *>(pixelMap->GetPixels());
140     void *srcData = static_cast<void *>(pixels);
141     CHECK_AND_RETURN_RET_LOG(srcData != nullptr, ErrorCode::ERR_PIXELMAP_ACCESSPIXELS_FAIL, "fail exec GetPixels!");
142 
143     EFFECT_LOGI("pixelMap bufferInfos: width=%{public}d, height=%{public}d, formatType=%{public}d, " \
144         "rowStride_=%{public}d, len=%{public}d, colorspace=%{public}d, addr=%{private}p",
145         bufferInfo->width_, bufferInfo->height_, bufferInfo->formatType_, bufferInfo->rowStride_,
146         bufferInfo->len_, bufferInfo->colorSpace_, pixels);
147 
148     std::shared_ptr<ExtraInfo> extraInfo = CreateExtraInfo(pixelMap);
149 
150     if (extraInfo->surfaceBuffer != nullptr) {
151         SurfaceBuffer *sb = extraInfo->surfaceBuffer;
152         EFFECT_LOGD("pixelMap surfaceBufferInfo: width=%{public}d, height=%{public}d, format=%{public}d, "
153             "rowStride=%{public}d, size=%{public}d, addr=%{private}p", sb->GetWidth(),
154             sb->GetHeight(), sb->GetFormat(), sb->GetStride(), sb->GetSize(), sb->GetVirAddr());
155     }
156 
157     effectBuffer = std::make_unique<EffectBuffer>(bufferInfo, srcData, extraInfo);
158     return ErrorCode::SUCCESS;
159 }
160 
ParseNativeWindowData(std::shared_ptr<EffectBuffer> & effectBuffer,const DataType & dataType)161 ErrorCode CommonUtils::ParseNativeWindowData(std::shared_ptr<EffectBuffer> &effectBuffer, const DataType &dataType)
162 {
163     std::shared_ptr<BufferInfo> bufferInfo = std::make_unique<BufferInfo>();
164     bufferInfo->width_ = 0;
165     bufferInfo->height_ = 0;
166     bufferInfo->rowStride_ = 0;
167     bufferInfo->len_ = 0;
168     bufferInfo->formatType_ = IEffectFormat::DEFAULT;
169     std::shared_ptr<ExtraInfo> extraInfo = std::make_unique<ExtraInfo>();
170     extraInfo->dataType = dataType;
171     extraInfo->bufferType = BufferType::DMA_BUFFER;
172     extraInfo->pixelMap = nullptr;
173     extraInfo->surfaceBuffer = nullptr;
174     effectBuffer = std::make_unique<EffectBuffer>(bufferInfo, nullptr, extraInfo);
175     return ErrorCode::SUCCESS;
176 }
177 
ParseSurfaceData(OHOS::SurfaceBuffer * surfaceBuffer,std::shared_ptr<EffectBuffer> & effectBuffer,const DataType & dataType,int64_t timestamp)178 ErrorCode CommonUtils::ParseSurfaceData(OHOS::SurfaceBuffer *surfaceBuffer,
179     std::shared_ptr<EffectBuffer> &effectBuffer, const DataType &dataType, int64_t timestamp)
180 {
181     CHECK_AND_RETURN_RET_LOG(surfaceBuffer != nullptr, ErrorCode::ERR_INPUT_NULL, "surfaceBuffer is null!");
182 
183     std::shared_ptr<BufferInfo> bufferInfo = std::make_unique<BufferInfo>();
184     bufferInfo->width_ = static_cast<uint32_t>(surfaceBuffer->GetWidth());
185     bufferInfo->height_ = static_cast<uint32_t>(surfaceBuffer->GetHeight());
186     bufferInfo->rowStride_ = static_cast<uint32_t>(surfaceBuffer->GetStride());
187     bufferInfo->len_ = surfaceBuffer->GetSize();
188     bufferInfo->formatType_ = SwitchToEffectFormat((GraphicPixelFormat)surfaceBuffer->GetFormat());
189     CM_ColorSpaceType colorSpaceType = CM_ColorSpaceType::CM_COLORSPACE_NONE;
190     ColorSpaceHelper::GetSurfaceBufferColorSpaceType(surfaceBuffer, colorSpaceType);
191     bufferInfo->colorSpace_ = ColorSpaceHelper::ConvertToEffectColorSpace(colorSpaceType);
192 
193     std::shared_ptr<ExtraInfo> extraInfo = std::make_unique<ExtraInfo>();
194     extraInfo->dataType = dataType;
195     extraInfo->bufferType = BufferType::DMA_BUFFER;
196     extraInfo->pixelMap = nullptr;
197     extraInfo->surfaceBuffer = surfaceBuffer;
198     extraInfo->timestamp = timestamp;
199 
200     effectBuffer = std::make_unique<EffectBuffer>(bufferInfo, surfaceBuffer->GetVirAddr(), extraInfo);
201     EFFECT_LOGI("surfaceBuffer width=%{public}d, height=%{public}d, stride=%{public}d, format=%{public}d, "
202         "size=%{public}d, usage = %{public}llu, addr=%{private}p, colorSpace=%{public}d",
203         surfaceBuffer->GetWidth(), surfaceBuffer->GetHeight(), surfaceBuffer->GetStride(), surfaceBuffer->GetFormat(),
204         surfaceBuffer->GetSize(), static_cast<unsigned long long>(surfaceBuffer->GetUsage()),
205         surfaceBuffer->GetVirAddr(), colorSpaceType);
206     return ErrorCode::SUCCESS;
207 }
208 
UrlToPath(const std::string & url)209 std::string CommonUtils::UrlToPath(const std::string &url)
210 {
211     OHOS::Uri uri = OHOS::Uri(url);
212     return uri.GetPath();
213 }
214 
ParseUri(std::string & uri,std::shared_ptr<EffectBuffer> & effectBuffer,bool isOutputData,IEffectFormat format)215 ErrorCode CommonUtils::ParseUri(std::string &uri, std::shared_ptr<EffectBuffer> &effectBuffer, bool isOutputData,
216     IEffectFormat format)
217 {
218     if (isOutputData) {
219         std::shared_ptr<BufferInfo> bufferInfo = std::make_unique<BufferInfo>();
220         std::shared_ptr<ExtraInfo> extraInfo = std::make_unique<ExtraInfo>();
221         extraInfo->dataType = DataType::URI;
222         extraInfo->uri = std::move(uri);
223         effectBuffer = std::make_unique<EffectBuffer>(bufferInfo, nullptr, extraInfo);
224         return ErrorCode::SUCCESS;
225     }
226 
227     auto path = UrlToPath(uri);
228     ErrorCode res = ParsePath(path, effectBuffer, isOutputData, format);
229     CHECK_AND_RETURN_RET_LOG(res == ErrorCode::SUCCESS, res,
230         "ParseUri: path name fail! uri=%{public}s, res=%{public}d", uri.c_str(), res);
231 
232     CHECK_AND_RETURN_RET_LOG(effectBuffer->extraInfo_ != nullptr, ErrorCode::ERR_EXTRA_INFO_NULL,
233         "ParseUri: extra info is null! uri=%{public}s", uri.c_str());
234     effectBuffer->extraInfo_->dataType = DataType::URI;
235     effectBuffer->extraInfo_->uri = std::move(uri);
236 
237     return ErrorCode::SUCCESS;
238 }
239 
ParsePath(std::string & path,std::shared_ptr<EffectBuffer> & effectBuffer,bool isOutputData,IEffectFormat format)240 ErrorCode CommonUtils::ParsePath(std::string &path, std::shared_ptr<EffectBuffer> &effectBuffer,
241     bool isOutputData, IEffectFormat format)
242 {
243     if (isOutputData) {
244         std::shared_ptr<BufferInfo> bufferInfo = std::make_unique<BufferInfo>();
245         std::shared_ptr<ExtraInfo> extraInfo = std::make_unique<ExtraInfo>();
246         extraInfo->dataType = DataType::PATH;
247         extraInfo->path = std::move(path);
248         effectBuffer = std::make_unique<EffectBuffer>(bufferInfo, nullptr, extraInfo);
249         return ErrorCode::SUCCESS;
250     }
251 
252     SourceOptions opts;
253     uint32_t errorCode = 0;
254     std::unique_ptr<ImageSource> imageSource = ImageSource::CreateImageSource(path, opts, errorCode);
255     CHECK_AND_RETURN_RET_LOG(imageSource != nullptr, ErrorCode::ERR_CREATE_IMAGESOURCE_FAIL,
256         "ImageSource::CreateImageSource fail! path=%{public}s, errorCode=%{public}d", path.c_str(), errorCode);
257 
258     ImageInfo info;
259     uint32_t ret = imageSource->GetImageInfo(info);
260     CHECK_AND_RETURN_RET_LOG(ret == 0, ErrorCode::ERR_FILE_TYPE_NOT_SUPPORT, "imageSource get image info fail!");
261     std::string encodedFormat = info.encodedFormat;
262     if (std::find(FILE_TYPE_SUPPORT_TABLE.begin(), FILE_TYPE_SUPPORT_TABLE.end(), encodedFormat) ==
263         FILE_TYPE_SUPPORT_TABLE.end()) {
264         EFFECT_LOGE("ParsePath: encodedFormat not support! encodedFormat=%{public}s", encodedFormat.c_str());
265         return ErrorCode::ERR_FILE_TYPE_NOT_SUPPORT;
266     }
267 
268     DecodingOptionsForPicture options;
269     options.desiredPixelFormat = CommonUtils::SwitchToPixelFormat(format);
270     EFFECT_LOGD("CommonUtils::ParsePath. PixelFormat=%{public}d, encodedFormat=%{public}s", options.desiredPixelFormat,
271         encodedFormat.c_str());
272     std::unique_ptr<Picture> picture = imageSource->CreatePicture(options, errorCode);
273     CHECK_AND_RETURN_RET_LOG(picture != nullptr, ErrorCode::ERR_CREATE_PICTURE_FAIL,
274         "CreatePicture fail! path=%{public}s, errorCode=%{public}d", path.c_str(), errorCode);
275 
276     ErrorCode res = ParsePicture(picture.get(), effectBuffer);
277     CHECK_AND_RETURN_RET_LOG(res == ErrorCode::SUCCESS, res,
278         "ParsePath: parse picture fail! path=%{public}s, res=%{public}d", path.c_str(), res);
279 
280     CHECK_AND_RETURN_RET_LOG(effectBuffer->extraInfo_ != nullptr, ErrorCode::ERR_EXTRA_INFO_NULL,
281         "ParsePath: extra info is null! uri=%{public}s", path.c_str());
282     effectBuffer->extraInfo_->dataType = DataType::PATH;
283     effectBuffer->extraInfo_->path = std::move(path);
284     effectBuffer->extraInfo_->picture = nullptr;
285     effectBuffer->extraInfo_->innerPicture = std::move(picture);
286 
287     return ErrorCode::SUCCESS;
288 }
289 
SwitchToEffectFormat(GraphicPixelFormat pixelFormat)290 IEffectFormat CommonUtils::SwitchToEffectFormat(GraphicPixelFormat pixelFormat)
291 {
292     IEffectFormat formatType = IEffectFormat::DEFAULT;
293 
294     auto itr = surfaceBufferFmtToEffectFmt_.find(pixelFormat);
295     if (itr != surfaceBufferFmtToEffectFmt_.end()) {
296         formatType = itr->second;
297     }
298 
299     return formatType;
300 }
301 
SwitchToEffectFormat(PixelFormat pixelFormat)302 IEffectFormat CommonUtils::SwitchToEffectFormat(PixelFormat pixelFormat)
303 {
304     IEffectFormat formatType = IEffectFormat::DEFAULT;
305 
306     auto itr = pixelFmtToEffectFmt_.find(pixelFormat);
307     if (itr != pixelFmtToEffectFmt_.end()) {
308         formatType = itr->second;
309     }
310 
311     return formatType;
312 }
313 
SwitchToGraphicPixelFormat(IEffectFormat formatType)314 GraphicPixelFormat CommonUtils::SwitchToGraphicPixelFormat(IEffectFormat formatType)
315 {
316     GraphicPixelFormat pixelFormat = GraphicPixelFormat::GRAPHIC_PIXEL_FMT_BUTT;
317 
318     for (const auto &itr : surfaceBufferFmtToEffectFmt_) {
319         if (itr.second == formatType) {
320             pixelFormat = itr.first;
321             break;
322         }
323     }
324 
325     return pixelFormat;
326 }
327 
SwitchToPixelFormat(IEffectFormat formatType)328 PixelFormat CommonUtils::SwitchToPixelFormat(IEffectFormat formatType)
329 {
330     PixelFormat pixelFormat = PixelFormat::UNKNOWN;
331 
332     for (const auto &itr : pixelFmtToEffectFmt_) {
333         if (itr.second == formatType) {
334             pixelFormat = itr.first;
335             break;
336         }
337     }
338 
339     return pixelFormat;
340 }
341 
SwitchToEffectBuffType(AllocatorType allocatorType)342 BufferType CommonUtils::SwitchToEffectBuffType(AllocatorType allocatorType)
343 {
344     BufferType bufferType = BufferType::DEFAULT;
345 
346     auto itr = allocatorTypeToEffectBuffType_.find(allocatorType);
347     if (itr != allocatorTypeToEffectBuffType_.end()) {
348         bufferType = itr->second;
349     }
350 
351     return bufferType;
352 }
353 
UnlockPixelMap(const PixelMap * pixelMap)354 void CommonUtils::UnlockPixelMap(const PixelMap *pixelMap)
355 {
356     EFFECT_LOGI("UnlockPixelMap!");
357 }
358 
ParseAnyAndAddToJson(const std::string & key,Plugin::Any & any,EffectJsonPtr & result)359 ErrorCode CommonUtils::ParseAnyAndAddToJson(const std::string &key, Plugin::Any &any, EffectJsonPtr &result)
360 {
361     CHECK_AND_RETURN_RET(ParseJson<float>(key, any, result) != ErrorCode::SUCCESS, ErrorCode::SUCCESS);
362     CHECK_AND_RETURN_RET(ParseJson<int32_t>(key, any, result) != ErrorCode::SUCCESS, ErrorCode::SUCCESS);
363     CHECK_AND_RETURN_RET(ParseJson<uint32_t>(key, any, result) != ErrorCode::SUCCESS, ErrorCode::SUCCESS);
364 #ifndef HST_ANY_WITH_NO_RTTI
365     EFFECT_LOGE("inner any type not support switch to json! type:%{public}s", any.Type().name());
366 #else
367     EFFECT_LOGE("inner any type not support switch to json! type:%{public}s", std::string(any.TypeName()).c_str());
368 #endif
369     return ErrorCode::ERR_ANY_CAST_TYPE_NOT_MATCH;
370 }
371 
EndsWithJPG(const std::string & input)372 bool CommonUtils::EndsWithJPG(const std::string &input)
373 {
374     return StringHelp::EndsWithIgnoreCase(input, "jpg") || StringHelp::EndsWithIgnoreCase(input, "jpeg");
375 }
376 
EndsWithHEIF(const std::string & input)377 bool CommonUtils::EndsWithHEIF(const std::string &input)
378 {
379     return StringHelp::EndsWithIgnoreCase(input, "heic");
380 }
381 
GetPixelsContext(std::shared_ptr<MemoryData> & memoryData,BufferType bufferType,void ** context)382 ErrorCode GetPixelsContext(std::shared_ptr<MemoryData> &memoryData, BufferType bufferType, void **context)
383 {
384     switch (bufferType) {
385         case BufferType::HEAP_MEMORY:
386             *context = nullptr;
387             break;
388         case BufferType::DMA_BUFFER: {
389             void *extra = memoryData->memoryInfo.extra;
390             auto surfaceBuffer = reinterpret_cast<SurfaceBuffer *>(extra);
391             CHECK_AND_RETURN_RET_LOG(surfaceBuffer != nullptr, ErrorCode::ERR_INVALID_SURFACE_BUFFER,
392                 "DMA_BUFFER: extra info error!");
393             *context = surfaceBuffer;
394             break;
395         }
396         case BufferType::SHARED_MEMORY: {
397             void *extra = memoryData->memoryInfo.extra;
398             auto fd = static_cast<int *>(extra);
399             CHECK_AND_RETURN_RET_LOG(fd != nullptr, ErrorCode::ERR_INVALID_FD, "SHARED_MEMORY: extra info error!");
400             *context = fd;
401             break;
402         }
403         default:
404             EFFECT_LOGE("bufferType not support! bufferType=%{public}d", bufferType);
405             return ErrorCode::ERR_UNSUPPORTED_BUFFER_TYPE;
406     }
407     return ErrorCode::SUCCESS;
408 }
409 
GetImagePropertyInt(const std::shared_ptr<ExifMetadata> & exifMetadata,const std::string & key,int32_t & value)410 int32_t GetImagePropertyInt(const std::shared_ptr<ExifMetadata> &exifMetadata, const std::string &key, int32_t &value)
411 {
412     std::string strValue;
413     int ret = exifMetadata->GetValue(key, strValue);
414     if (ret != 0) {
415         return ret;
416     }
417 
418     std::from_chars_result res = std::from_chars(strValue.data(), strValue.data() + strValue.size(), value);
419     if (res.ec != std::errc()) {
420         return static_cast<int32_t>(ErrorCode::ERR_IMAGE_DATA);
421     }
422 
423     return 0;
424 }
425 
PrintImageExifInfo(const std::shared_ptr<ExifMetadata> & exifMetadata,const std::string & tag)426 void PrintImageExifInfo(const std::shared_ptr<ExifMetadata> &exifMetadata, const std::string &tag)
427 {
428     if (exifMetadata == nullptr) {
429         return;
430     }
431 
432     int32_t width = 0;
433     GetImagePropertyInt(exifMetadata, IMAGE_WIDTH, width);
434     int32_t length = 0;
435     GetImagePropertyInt(exifMetadata, IMAGE_LENGTH, length);
436     std::string dateTime;
437     exifMetadata->GetValue(DATE_TIME, dateTime);
438     int32_t xDimension = 0;
439     GetImagePropertyInt(exifMetadata, PIXEL_X_DIMENSION, xDimension);
440     int32_t yDimension = 0;
441     GetImagePropertyInt(exifMetadata, PIXEL_Y_DIMENSION, yDimension);
442 
443     EFFECT_LOGD("%{public}s: width=%{public}d, length=%{public}d, dateTime=%{public}s, xDimension=%{public}d, "
444         "yDimension=%{public}d", tag.c_str(), width, length, dateTime.c_str(), xDimension, yDimension);
445 }
446 
UpdateExifDataTime(const std::shared_ptr<ExifMetadata> & exifMetadata)447 void UpdateExifDataTime(const std::shared_ptr<ExifMetadata> &exifMetadata)
448 {
449     CHECK_AND_RETURN_LOG(exifMetadata != nullptr, "UpdateExifDataTime: exifMetadata is null!");
450 
451     std::string dateTime;
452     if (exifMetadata->GetValue(DATE_TIME, dateTime) != 0 || dateTime.empty()) {
453         return;
454     }
455 
456     time_t now = time(nullptr);
457     CHECK_AND_RETURN_LOG(now > 0, "UpdateExifDateTime: time fail!");
458 
459     struct tm *locTime = localtime(&now);
460     CHECK_AND_RETURN_LOG(locTime != nullptr, "UpdateExifDateTime: localtime fail!");
461 
462     char tempTime[TIME_MAX];
463     auto size = strftime(tempTime, sizeof(tempTime), "%Y:%m:%d %H:%M:%S", locTime);
464     CHECK_AND_RETURN_LOG(size > 0, "UpdateExifDateTime: strftime fail!");
465 
466     std::string currentTime = std::string(tempTime, size);
467     bool res = exifMetadata->SetValue(DATE_TIME, currentTime);
468     CHECK_AND_RETURN_LOG(res, "UpdateExifDataTime: setValue fail!");
469 }
470 
UpdateImageExifDateTime(PixelMap * pixelMap)471 void CommonUtils::UpdateImageExifDateTime(PixelMap *pixelMap)
472 {
473     CHECK_AND_RETURN_LOG(pixelMap != nullptr, "UpdateImageExifDateTime: pixelMap is null!");
474 
475     UpdateExifDataTime(pixelMap->GetExifMetadata());
476 }
477 
UpdateImageExifDateTime(Picture * picture)478 void CommonUtils::UpdateImageExifDateTime(Picture *picture)
479 {
480     CHECK_AND_RETURN_LOG(picture != nullptr, "UpdateImageExifDateTime: picture is null!");
481 
482     UpdateExifDataTime(picture->GetExifMetadata());
483 }
484 
UpdateExifMetadata(const std::shared_ptr<ExifMetadata> & exifMetadata,PixelMap * pixelMap)485 void UpdateExifMetadata(const std::shared_ptr<ExifMetadata> &exifMetadata, PixelMap *pixelMap)
486 {
487     if (exifMetadata == nullptr) {
488         EFFECT_LOGI("UpdateExifMetadata: no exif info.");
489         return;
490     }
491 
492     CHECK_AND_RETURN_LOG(pixelMap != nullptr, "UpdateExifMetadata: pixelMap is null");
493     PrintImageExifInfo(exifMetadata, "UpdateImageExifInfo::update before");
494 
495     // Set Width
496     int32_t width = 0;
497     if (GetImagePropertyInt(exifMetadata, IMAGE_WIDTH, width) == 0 && pixelMap->GetWidth() != width) {
498         exifMetadata->SetValue(IMAGE_WIDTH, std::to_string(pixelMap->GetWidth()));
499     }
500 
501     // Set Length
502     int32_t length = 0;
503     if (GetImagePropertyInt(exifMetadata, IMAGE_LENGTH, length) == 0 && pixelMap->GetHeight() != length) {
504         exifMetadata->SetValue(IMAGE_LENGTH, std::to_string(pixelMap->GetHeight()));
505     }
506 
507     // Set DateTime
508     UpdateExifDataTime(exifMetadata);
509 
510     // Set PixelXDimension
511     int32_t xDimension = 0;
512     if (GetImagePropertyInt(exifMetadata, PIXEL_X_DIMENSION, xDimension) == 0 && pixelMap->GetWidth() != xDimension) {
513         exifMetadata->SetValue(PIXEL_X_DIMENSION, std::to_string(pixelMap->GetWidth()));
514     }
515 
516     // Set PixelYDimension
517     int32_t yDimension = 0;
518     if (GetImagePropertyInt(exifMetadata, PIXEL_Y_DIMENSION, yDimension) == 0 && pixelMap->GetHeight() != yDimension) {
519         exifMetadata->SetValue(PIXEL_Y_DIMENSION, std::to_string(pixelMap->GetHeight()));
520     }
521 
522     PrintImageExifInfo(exifMetadata, "UpdateImageExifInfo::update after");
523 }
524 
UpdateImageExifInfo(PixelMap * pixelMap)525 void CommonUtils::UpdateImageExifInfo(PixelMap *pixelMap)
526 {
527     CHECK_AND_RETURN_LOG(pixelMap != nullptr, "UpdateImageExifInfo: pixelMap is null!");
528 
529     UpdateExifMetadata(pixelMap->GetExifMetadata(), pixelMap);
530 }
531 
UpdateImageExifInfo(Picture * picture)532 void CommonUtils::UpdateImageExifInfo(Picture *picture)
533 {
534     CHECK_AND_RETURN_LOG(picture != nullptr, "UpdateImageExifInfo: picture is null!");
535 
536     UpdateExifMetadata(picture->GetExifMetadata(), picture->GetMainPixel().get());
537 }
538 
ParsePicture(Picture * picture,std::shared_ptr<EffectBuffer> & effectBuffer)539 ErrorCode CommonUtils::ParsePicture(Picture *picture, std::shared_ptr<EffectBuffer> &effectBuffer)
540 {
541     EFFECT_LOGI("CommonUtils::ParsePicture enter.");
542     CHECK_AND_RETURN_RET_LOG(picture != nullptr, ErrorCode::ERR_INPUT_NULL, "ParsePicture: picture is null!");
543 
544     std::shared_ptr<PixelMap> pixelMap = picture->GetMainPixel();
545     CHECK_AND_RETURN_RET_LOG(pixelMap != nullptr, ErrorCode::ERR_INPUT_NULL, "ParsePicture: main pixel is null!");
546     ErrorCode errorCode = CommonUtils::LockPixelMap(pixelMap.get(), effectBuffer);
547     CHECK_AND_RETURN_RET_LOG(errorCode == ErrorCode::SUCCESS, errorCode,
548         "ParsePicture: parse main pixel fail! errorCode=%{public}d", errorCode);
549 
550     effectBuffer->bufferInfo_->pixelmapType_ = EffectPixelmapType::PRIMARY;
551     effectBuffer->bufferInfo_->bufferType_ = effectBuffer->extraInfo_->bufferType;
552     effectBuffer->bufferInfo_->addr_ = effectBuffer->buffer_;
553     effectBuffer->extraInfo_->dataType = DataType::PICTURE;
554     effectBuffer->extraInfo_->picture = picture;
555 
556     std::shared_ptr<PixelMap> gainMap = picture->GetGainmapPixelMap();
557     if (gainMap == nullptr) {
558         EFFECT_LOGD("CommonUtils::ParsePicture not contain gainmap!");
559         return ErrorCode::SUCCESS;
560     }
561 
562     EFFECT_LOGD("CommonUtils::ParsePicture contain gainmap!");
563     std::shared_ptr<EffectBuffer> gainMapEffectBuffer;
564     errorCode = CommonUtils::LockPixelMap(gainMap.get(), gainMapEffectBuffer);
565     CHECK_AND_RETURN_RET_LOG(errorCode == ErrorCode::SUCCESS, errorCode,
566         "ParsePicture: parse gainmap fail! errorCode=%{public}d", errorCode);
567 
568     gainMapEffectBuffer->bufferInfo_->pixelmapType_ = EffectPixelmapType::GAINMAP;
569     gainMapEffectBuffer->bufferInfo_->bufferType_ = gainMapEffectBuffer->extraInfo_->bufferType;
570     gainMapEffectBuffer->bufferInfo_->addr_ = gainMapEffectBuffer->buffer_;
571 
572     effectBuffer->auxiliaryBufferInfos =
573         std::make_shared<std::unordered_map<EffectPixelmapType, std::shared_ptr<BufferInfo>>>();
574     effectBuffer->auxiliaryBufferInfos->emplace(EffectPixelmapType::GAINMAP, gainMapEffectBuffer->bufferInfo_);
575 
576     return ErrorCode::SUCCESS;
577 }
578 
ProcessYUVInfo(PixelMap * pixelMap,const SurfaceBuffer * sBuffer,const OH_NativeBuffer_Planes * planes)579 void ProcessYUVInfo(PixelMap *pixelMap, const SurfaceBuffer *sBuffer, const OH_NativeBuffer_Planes *planes)
580 {
581     int32_t width = sBuffer->GetWidth();
582     int32_t height = sBuffer->GetHeight();
583     YUVDataInfo info;
584     info.imageSize = { width, height };
585     info.yWidth = static_cast<uint32_t>(width);
586     info.uvWidth = static_cast<uint32_t>(width);
587     info.yHeight = static_cast<uint32_t>(height);
588     info.uvHeight = static_cast<uint32_t>(height);
589     if (planes->planeCount >= YUV_PLANE_COUNT) {
590         int32_t pixelFmt = sBuffer->GetFormat();
591         int uvPlaneOffset = (pixelFmt == GRAPHIC_PIXEL_FMT_YCBCR_420_SP ||
592             pixelFmt == GRAPHIC_PIXEL_FMT_YCBCR_P010) ? 1 : 2;
593         info.yStride = planes->planes[0].columnStride;
594         info.uvStride = planes->planes[uvPlaneOffset].columnStride;
595         info.yOffset = planes->planes[0].offset;
596         info.uvOffset = planes->planes[uvPlaneOffset].offset;
597         pixelMap->SetImageYUVInfo(info);
598     }
599 }
600 
SetSbDynamicMetadata(sptr<SurfaceBuffer> & buffer,const std::vector<uint8_t> & dynamicMetadata)601 bool SetSbDynamicMetadata(sptr<SurfaceBuffer> &buffer, const std::vector<uint8_t> &dynamicMetadata)
602 {
603     return buffer->SetMetadata(ATTRKEY_HDR_DYNAMIC_METADATA, dynamicMetadata) == 0;
604 }
605 
GetSbDynamicMetadata(const sptr<SurfaceBuffer> & buffer,std::vector<uint8_t> & dynamicMetadata)606 bool GetSbDynamicMetadata(const sptr<SurfaceBuffer> &buffer, std::vector<uint8_t> &dynamicMetadata)
607 {
608     return buffer->GetMetadata(ATTRKEY_HDR_DYNAMIC_METADATA, dynamicMetadata) == 0;
609 }
610 
SetSbStaticMetadata(sptr<SurfaceBuffer> & buffer,const std::vector<uint8_t> & staticMetadata)611 bool SetSbStaticMetadata(sptr<SurfaceBuffer> &buffer, const std::vector<uint8_t> &staticMetadata)
612 {
613     return buffer->SetMetadata(ATTRKEY_HDR_STATIC_METADATA, staticMetadata) == 0;
614 }
615 
GetSbStaticMetadata(const sptr<SurfaceBuffer> & buffer,std::vector<uint8_t> & staticMetadata)616 bool GetSbStaticMetadata(const sptr<SurfaceBuffer> &buffer, std::vector<uint8_t> &staticMetadata)
617 {
618     return buffer->GetMetadata(ATTRKEY_HDR_STATIC_METADATA, staticMetadata) == 0;
619 }
620 
CopySurfaceBufferInfo(sptr<SurfaceBuffer> & source,sptr<SurfaceBuffer> & dst)621 void CopySurfaceBufferInfo(sptr<SurfaceBuffer> &source, sptr<SurfaceBuffer> &dst)
622 {
623     if (source == nullptr || dst == nullptr) {
624         EFFECT_LOGI("VpeUtils CopySurfaceBufferInfo failed, source or dst is nullptr");
625         return;
626     }
627     std::vector<uint8_t> hdrMetadataTypeVec;
628     std::vector<uint8_t> colorSpaceInfoVec;
629     std::vector<uint8_t> staticData;
630     std::vector<uint8_t> dynamicData;
631 
632     if (source->GetMetadata(ATTRKEY_HDR_METADATA_TYPE, hdrMetadataTypeVec) == 0) {
633         std::string str(hdrMetadataTypeVec.begin(), hdrMetadataTypeVec.end());
634         EFFECT_LOGI("ATTRKEY_HDR_METADATA_TYPE: length :%{public}zu, %{public}s",
635             hdrMetadataTypeVec.size(), str.c_str());
636         dst->SetMetadata(ATTRKEY_HDR_METADATA_TYPE, hdrMetadataTypeVec);
637     } else {
638         EFFECT_LOGE("get attrkey hdr metadata type failed");
639     }
640     if (source->GetMetadata(ATTRKEY_COLORSPACE_INFO, colorSpaceInfoVec) == 0) {
641         std::string str(colorSpaceInfoVec.begin(), colorSpaceInfoVec.end());
642         EFFECT_LOGI("ATTRKEY_COLORSPACE_INFO: length :%{public}zu, %{public}s", colorSpaceInfoVec.size(), str.c_str());
643         dst->SetMetadata(ATTRKEY_COLORSPACE_INFO, colorSpaceInfoVec);
644     } else {
645         EFFECT_LOGE("get attrkey colorspace info failed");
646     }
647     if (GetSbStaticMetadata(source, staticData) && (staticData.size() > 0)) {
648         std::string str(staticData.begin(), staticData.end());
649         EFFECT_LOGI("GetSbStaticMetadata val: length:%{public}zu, %{public}s", staticData.size(), str.c_str());
650         SetSbStaticMetadata(dst, staticData);
651     } else {
652         EFFECT_LOGE("get sb static metadata failed");
653     }
654     if (GetSbDynamicMetadata(source, dynamicData) && (dynamicData.size()) > 0) {
655         std::string str(dynamicData.begin(), dynamicData.end());
656         EFFECT_LOGI("GetSbDynamicMetadata val: length:%{public}zu, %{public}s", dynamicData.size(), str.c_str());
657         SetSbDynamicMetadata(dst, dynamicData);
658     } else {
659         EFFECT_LOGE("get sb dynamic metadata failed");
660     }
661 }
662 
ModifyYUVInfo(PixelMap * pixelMap,void * context,const MemoryInfo & memoryInfo)663 ErrorCode ModifyYUVInfo(PixelMap *pixelMap, void *context, const MemoryInfo &memoryInfo)
664 {
665     CHECK_AND_RETURN_RET_LOG(context != nullptr, ErrorCode::ERR_INPUT_NULL, "handle yuv info, context is null.");
666     SurfaceBuffer *sBuffer = reinterpret_cast<SurfaceBuffer *>(context);
667     if (memoryInfo.bufferType == BufferType::SHARED_MEMORY) {
668         int32_t width = memoryInfo.bufferInfo.width_;
669         int32_t height = memoryInfo.bufferInfo.height_;
670         YUVDataInfo info;
671         info.imageSize = { width, height};
672         info.yWidth = static_cast<uint32_t>(width);
673         info.uvWidth = static_cast<uint32_t>(width);
674         info.yHeight = static_cast<uint32_t>(height);
675         info.uvHeight = static_cast<uint32_t>(height / YUV_HALF_HEIGHT);
676 
677         info.yStride = info.yWidth;
678         info.uvStride = info.uvWidth;
679         info.yOffset = 0;
680         info.uvOffset = info.yStride * info.yHeight;
681         pixelMap->SetImageYUVInfo(info);
682     } else {
683         if (sBuffer == nullptr) {
684             return ErrorCode::SUCCESS;
685         }
686         OH_NativeBuffer_Planes *planes = nullptr;
687         GSError retVal = sBuffer->GetPlanesInfo(reinterpret_cast<void **>(&planes));
688         if (retVal != OHOS::GSERROR_OK || planes == nullptr || planes->planeCount <= 1) {
689             return ErrorCode::SUCCESS;
690         }
691         ProcessYUVInfo(pixelMap, sBuffer, planes);
692     }
693     return ErrorCode::SUCCESS;
694 }
695 
ModifyPixelMapPropertyInner(std::shared_ptr<MemoryData> & memoryData,PixelMap * pixelMap,AllocatorType & allocatorType,bool isUpdateExif)696 ErrorCode ModifyPixelMapPropertyInner(std::shared_ptr<MemoryData> &memoryData, PixelMap *pixelMap,
697     AllocatorType &allocatorType, bool isUpdateExif)
698 {
699     void *context = nullptr;
700     const MemoryInfo &memoryInfo = memoryData->memoryInfo;
701 
702     if (memoryInfo.bufferType == BufferType::DMA_BUFFER) {
703         sptr<SurfaceBuffer> baseSptr(reinterpret_cast<SurfaceBuffer*>(pixelMap->GetFd()));
704         void *extra = memoryData->memoryInfo.extra;
705         sptr<SurfaceBuffer> dstBuffer(reinterpret_cast<SurfaceBuffer*>(extra));
706         CopySurfaceBufferInfo(baseSptr, dstBuffer);
707     }
708 
709     ErrorCode res = GetPixelsContext(memoryData, memoryInfo.bufferType, &context);
710     CHECK_AND_RETURN_RET_LOG(res == ErrorCode::SUCCESS, res, "get pixels context fail! res=%{public}d", res);
711 
712     // not need to release the origin buffer in pixelMap, SetPixelsAddr will release it.
713     pixelMap->SetPixelsAddr(memoryData->data, context, memoryInfo.bufferInfo.len_, allocatorType, nullptr);
714 
715     ImageInfo imageInfo;
716     pixelMap->GetImageInfo(imageInfo);
717     imageInfo.size.width = static_cast<int32_t>(memoryInfo.bufferInfo.width_);
718     imageInfo.size.height = static_cast<int32_t>(memoryInfo.bufferInfo.height_);
719     imageInfo.pixelFormat = CommonUtils::SwitchToPixelFormat(memoryInfo.bufferInfo.formatType_);
720     uint32_t result = pixelMap->SetImageInfo(imageInfo, true);
721     if (imageInfo.pixelFormat == PixelFormat::NV12 || imageInfo.pixelFormat == PixelFormat::NV21 ||
722         imageInfo.pixelFormat == PixelFormat::YCBCR_P010 || imageInfo.pixelFormat == PixelFormat::YCRCB_P010) {
723         res = ModifyYUVInfo(pixelMap, context, memoryInfo);
724         CHECK_AND_RETURN_RET_LOG(res == ErrorCode::SUCCESS, res, "HandleYUVInfo fail! res=%{public}d", res);
725     }
726     EFFECT_LOGI("ModifyPixelMapPropertyInner: SetImageInfo width=%{public}d, height=%{public}d, result: %{public}d",
727         imageInfo.size.width, imageInfo.size.height, result);
728     CHECK_AND_RETURN_RET_LOG(result == 0, ErrorCode::ERR_SET_IMAGE_INFO_FAIL,
729         "ModifyPixelMapPropertyInner: exec SetImageInfo fail! result=%{public}d", result);
730 
731     // update rowStride
732     pixelMap->SetRowStride(memoryInfo.bufferInfo.rowStride_);
733 
734     if (isUpdateExif) {
735         // update exif
736         CommonUtils::UpdateImageExifInfo(pixelMap);
737     }
738 
739     EffectColorSpace colorSpace = memoryInfo.bufferInfo.colorSpace_;
740     if (colorSpace != EffectColorSpace::DEFAULT) {
741         OHOS::ColorManager::ColorSpace grColorSpace(ColorSpaceHelper::ConvertToColorSpaceName(colorSpace));
742         pixelMap->InnerSetColorSpace(grColorSpace);
743     }
744 
745     // update colorspace if need
746     if (memoryInfo.bufferType == BufferType::DMA_BUFFER) {
747         res = ColorSpaceHelper::UpdateMetadata(static_cast<SurfaceBuffer *>(memoryInfo.extra),
748             memoryInfo.bufferInfo.colorSpace_);
749         CHECK_AND_RETURN_RET_LOG(res == ErrorCode::SUCCESS, res,
750             "ModifyPixelMapPropertyInner: UpdateMetadata fail! res=%{public}d", res);
751     }
752 
753     return ErrorCode::SUCCESS;
754 }
755 
ModifyPixelMapProperty(PixelMap * pixelMap,const std::shared_ptr<EffectBuffer> & buffer,const std::shared_ptr<EffectMemoryManager> & memoryManager,bool isUpdateExif)756 ErrorCode CommonUtils::ModifyPixelMapProperty(PixelMap *pixelMap, const std::shared_ptr<EffectBuffer> &buffer,
757     const std::shared_ptr<EffectMemoryManager> &memoryManager, bool isUpdateExif)
758 {
759     EFFECT_LOGI("ModifyPixelMapProperty enter!");
760     CHECK_AND_RETURN_RET_LOG(pixelMap != nullptr, ErrorCode::ERR_INPUT_NULL, "pixel map is null");
761     AllocatorType allocatorType = pixelMap->GetAllocatorType();
762     BufferType bufferType = SwitchToEffectBuffType(allocatorType);
763     EFFECT_LOGD("ModifyPixelMapProperty: allocatorType=%{public}d, bufferType=%{public}d", allocatorType, bufferType);
764     std::shared_ptr<Memory> allocMemory = memoryManager->GetAllocMemoryByAddr(buffer->buffer_);
765     std::shared_ptr<MemoryData> memoryData;
766     if (allocMemory != nullptr && allocMemory->memoryData_->memoryInfo.bufferType == bufferType) {
767         EFFECT_LOGD("ModifyPixelMapProperty reuse allocated memory. addr=%{public}p", buffer->buffer_);
768         allocMemory->memoryData_->memoryInfo.isAutoRelease = false;
769         memoryData = allocMemory->memoryData_;
770     } else {
771         EFFECT_LOGD("ModifyPixelMapProperty alloc memory.");
772         std::unique_ptr<AbsMemory> memory = EffectMemory::CreateMemory(bufferType);
773         CHECK_AND_RETURN_RET_LOG(memory != nullptr, ErrorCode::ERR_CREATE_MEMORY_FAIL,
774             "memory create fail! allocatorType=%{public}d", allocatorType);
775 
776         MemoryInfo memoryInfo = {
777             .isAutoRelease = false,
778             .bufferInfo = *buffer->bufferInfo_,
779             .extra = pixelMap->GetFd()
780         };
781         if (bufferType != BufferType::DMA_BUFFER) {
782             memoryInfo.bufferInfo.len_ = FormatHelper::CalculateSize(buffer->bufferInfo_->width_,
783                 buffer->bufferInfo_->height_, buffer->bufferInfo_->formatType_);
784         }
785         memoryData = memory->Alloc(memoryInfo);
786         CHECK_AND_RETURN_RET_LOG(memoryData != nullptr, ErrorCode::ERR_ALLOC_MEMORY_FAIL, "Alloc fail!");
787         MemcpyHelper::CopyData(buffer.get(), memoryData.get());
788     }
789 
790     return ModifyPixelMapPropertyInner(memoryData, pixelMap, allocatorType, isUpdateExif);
791 }
792 
ModifyPixelMapPropertyForTexture(PixelMap * pixelMap,const std::shared_ptr<EffectBuffer> & buffer,const std::shared_ptr<EffectContext> & context,bool isUpdateExif)793 ErrorCode CommonUtils::ModifyPixelMapPropertyForTexture(PixelMap *pixelMap, const std::shared_ptr<EffectBuffer> &buffer,
794     const std::shared_ptr<EffectContext> &context, bool isUpdateExif)
795 {
796     EFFECT_LOGI("ModifyPixelMapPropertyForTexture enter!");
797     CHECK_AND_RETURN_RET_LOG(pixelMap != nullptr, ErrorCode::ERR_INPUT_NULL, "pixel map is null");
798     AllocatorType allocatorType = pixelMap->GetAllocatorType();
799     BufferType bufferType = SwitchToEffectBuffType(allocatorType);
800     EFFECT_LOGD("ModifyPixelMapProperty: allocatorType=%{public}d, bufferType=%{public}d", allocatorType, bufferType);
801     std::unique_ptr<AbsMemory> memory = EffectMemory::CreateMemory(bufferType);
802     CHECK_AND_RETURN_RET_LOG(memory != nullptr, ErrorCode::ERR_CREATE_MEMORY_FAIL,
803         "memory create fail! allocatorType=%{public}d", allocatorType);
804 
805     MemoryInfo memoryInfo = {
806         .isAutoRelease = false,
807         .bufferInfo = *buffer->bufferInfo_,
808         .extra = pixelMap->GetFd()
809     };
810     std::shared_ptr<MemoryData> memoryData = memory->Alloc(memoryInfo);
811     CHECK_AND_RETURN_RET_LOG(memoryData != nullptr, ErrorCode::ERR_ALLOC_MEMORY_FAIL, "Alloc fail!");
812     context->renderEnvironment_->ReadPixelsFromTex(buffer->tex, memoryData->data, buffer->bufferInfo_->width_,
813         buffer->bufferInfo_->height_, memoryData->memoryInfo.bufferInfo.rowStride_ / RGBA_BYTES_PER_PIXEL);
814 
815     return ModifyPixelMapPropertyInner(memoryData, pixelMap, allocatorType, isUpdateExif);
816 }
817 
GetImageSourceFromPath(const std::string path)818 std::shared_ptr<ImageSource> CommonUtils::GetImageSourceFromPath(const std::string path)
819 {
820     std::shared_ptr<ImageSource> imageSource;
821     uint32_t errorCode = 0;
822     SourceOptions opts;
823     imageSource = ImageSource::CreateImageSource(path, opts, errorCode);
824     CHECK_AND_RETURN_RET_LOG(imageSource != nullptr, imageSource,
825         "ImageSource::CreateImageSource fail! path=%{public}s errorCode=%{public}d", path.c_str(), errorCode);
826     return imageSource;
827 }
828 } // namespace Effect
829 } // namespace Media
830 } // namespace OHOS