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