1094332d3Sopenharmony_ci/* 2094332d3Sopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd. 3094332d3Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4094332d3Sopenharmony_ci * you may not use this file except in compliance with the License. 5094332d3Sopenharmony_ci * You may obtain a copy of the License at 6094332d3Sopenharmony_ci * 7094332d3Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8094332d3Sopenharmony_ci * 9094332d3Sopenharmony_ci * Unless required by law or agreed to in writing, software 10094332d3Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11094332d3Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12094332d3Sopenharmony_ci * See the License for the specific language governing permissions and 13094332d3Sopenharmony_ci * limitations under the License. 14094332d3Sopenharmony_ci */ 15094332d3Sopenharmony_ci 16094332d3Sopenharmony_ci#include "codec_heif_helper.h" 17094332d3Sopenharmony_ci 18094332d3Sopenharmony_cinamespace OHOS::VDI::HEIF { 19094332d3Sopenharmony_ciusing namespace OHOS::HDI::Codec::Image::V2_0; 20094332d3Sopenharmony_ciusing namespace std; 21094332d3Sopenharmony_ci 22094332d3Sopenharmony_civoid HeifEncoderHelper::DoEncode() 23094332d3Sopenharmony_ci{ 24094332d3Sopenharmony_ci HDF_LOGI("start heif encode"); 25094332d3Sopenharmony_ci Reset(); 26094332d3Sopenharmony_ci bool flag = false; 27094332d3Sopenharmony_ci if (encodeOpt_.gainMapPath.length() > 0) { 28094332d3Sopenharmony_ci HDF_LOGI("AssembleParamForTmap"); 29094332d3Sopenharmony_ci flag = AssembleParamForTmap(); 30094332d3Sopenharmony_ci } else { 31094332d3Sopenharmony_ci HDF_LOGI("AssembleParamForPrimaryImg"); 32094332d3Sopenharmony_ci flag = AssembleParamForPrimaryImg(); 33094332d3Sopenharmony_ci } 34094332d3Sopenharmony_ci IF_TRUE_RETURN(!flag); 35094332d3Sopenharmony_ci HDF_LOGI("get ICodecImage"); 36094332d3Sopenharmony_ci sptr<ICodecImage> hdiHeifEncoder = ICodecImage::Get(); 37094332d3Sopenharmony_ci IF_TRUE_RETURN_WITH_MSG(hdiHeifEncoder == nullptr, "failed to get ICodecImage"); 38094332d3Sopenharmony_ci SharedBuffer output; 39094332d3Sopenharmony_ci IF_TRUE_RETURN(!AllocOutputBuffer(output)); 40094332d3Sopenharmony_ci uint32_t filledLen = 0; 41094332d3Sopenharmony_ci HDF_LOGI("DoHeifEncode"); 42094332d3Sopenharmony_ci int32_t ret = hdiHeifEncoder->DoHeifEncode(inputImgs_, inputMetas_, refs_, output, filledLen); 43094332d3Sopenharmony_ci if (ret == HDF_SUCCESS) { 44094332d3Sopenharmony_ci HDF_LOGI("heif encode succeed"); 45094332d3Sopenharmony_ci output.filledLen = filledLen; 46094332d3Sopenharmony_ci bufferHelper_.DumpBuffer(encodeOpt_.outputPath, output); 47094332d3Sopenharmony_ci } else { 48094332d3Sopenharmony_ci HDF_LOGE("heif encode failed"); 49094332d3Sopenharmony_ci } 50094332d3Sopenharmony_ci close(output.fd); 51094332d3Sopenharmony_ci} 52094332d3Sopenharmony_ci 53094332d3Sopenharmony_cibool HeifEncoderHelper::AllocOutputBuffer(SharedBuffer& output) 54094332d3Sopenharmony_ci{ 55094332d3Sopenharmony_ci static constexpr size_t EXTERNAL_BUFFER_SIZE = 18 * 1024 * 1024; 56094332d3Sopenharmony_ci int fd = AshmemCreate("ForHeifEditOut", EXTERNAL_BUFFER_SIZE); 57094332d3Sopenharmony_ci bool flag = true; 58094332d3Sopenharmony_ci if (fd >= 0) { 59094332d3Sopenharmony_ci output.fd = fd; 60094332d3Sopenharmony_ci output.capacity = static_cast<uint32_t>(AshmemGetSize(fd)); 61094332d3Sopenharmony_ci } else { 62094332d3Sopenharmony_ci flag = false; 63094332d3Sopenharmony_ci output.fd = -1; 64094332d3Sopenharmony_ci output.capacity = 0; 65094332d3Sopenharmony_ci HDF_LOGE("failed to create output buffer"); 66094332d3Sopenharmony_ci } 67094332d3Sopenharmony_ci output.filledLen = 0; 68094332d3Sopenharmony_ci return flag; 69094332d3Sopenharmony_ci} 70094332d3Sopenharmony_ci 71094332d3Sopenharmony_ci 72094332d3Sopenharmony_civoid HeifEncoderHelper::Reset() 73094332d3Sopenharmony_ci{ 74094332d3Sopenharmony_ci inputImgs_.clear(); 75094332d3Sopenharmony_ci inputMetas_.clear(); 76094332d3Sopenharmony_ci refs_.clear(); 77094332d3Sopenharmony_ci} 78094332d3Sopenharmony_ci 79094332d3Sopenharmony_cibool HeifEncoderHelper::AddPropOnlyForTmap(ByteWriter& bw) 80094332d3Sopenharmony_ci{ 81094332d3Sopenharmony_ci MasteringDisplayColourVolume clrVol = { 82094332d3Sopenharmony_ci .displayPrimariesRX = 1, 83094332d3Sopenharmony_ci .displayPrimariesRY = 2, 84094332d3Sopenharmony_ci .displayPrimariesGX = 3, 85094332d3Sopenharmony_ci .displayPrimariesGY = 4, 86094332d3Sopenharmony_ci .displayPrimariesBX = 5, 87094332d3Sopenharmony_ci .displayPrimariesBY = 6, 88094332d3Sopenharmony_ci .whitePointX = 0, 89094332d3Sopenharmony_ci .whitePointY = 0, 90094332d3Sopenharmony_ci .maxDisplayMasteringLuminance = 0, 91094332d3Sopenharmony_ci .minDisplayMasteringLuminance = 0 92094332d3Sopenharmony_ci }; 93094332d3Sopenharmony_ci IF_TRUE_RETURN_VAL_WITH_MSG(!bw.AddData<MasteringDisplayColourVolume>(MASTER_DISPLAY_COLOR_VOLUME, clrVol), false, 94094332d3Sopenharmony_ci "failed to add MASTER_DISPLAY_COLOR_VOLUME"); 95094332d3Sopenharmony_ci HDF_LOGI("add MASTER_DISPLAY_COLOR_VOLUME succeed"); 96094332d3Sopenharmony_ci 97094332d3Sopenharmony_ci ToneMapMetadata tmapMeta; 98094332d3Sopenharmony_ci static constexpr uint8_t MULTI_CHANNEL = 3; 99094332d3Sopenharmony_ci tmapMeta.channelCnt = MULTI_CHANNEL; 100094332d3Sopenharmony_ci tmapMeta.useBaseColorSpace = true; 101094332d3Sopenharmony_ci tmapMeta.baseHdrHeadroom = {12, 23}; 102094332d3Sopenharmony_ci tmapMeta.alternateHdrHeadroom = {36, 62}; 103094332d3Sopenharmony_ci tmapMeta.channels1 = { 104094332d3Sopenharmony_ci .gainMapMin = {5, 21}, 105094332d3Sopenharmony_ci .gainMapMax = {5, 7}, 106094332d3Sopenharmony_ci .gamma = {2, 7}, 107094332d3Sopenharmony_ci .baseOffset = {1, 3}, 108094332d3Sopenharmony_ci .alternateOffset = {1, 7} 109094332d3Sopenharmony_ci }; 110094332d3Sopenharmony_ci tmapMeta.channels2 = { 111094332d3Sopenharmony_ci .gainMapMin = {5, 21}, 112094332d3Sopenharmony_ci .gainMapMax = {5, 7}, 113094332d3Sopenharmony_ci .gamma = {2, 7}, 114094332d3Sopenharmony_ci .baseOffset = {1, 3}, 115094332d3Sopenharmony_ci .alternateOffset = {1, 7} 116094332d3Sopenharmony_ci }; 117094332d3Sopenharmony_ci tmapMeta.channels3 = { 118094332d3Sopenharmony_ci .gainMapMin = {5, 21}, 119094332d3Sopenharmony_ci .gainMapMax = {5, 7}, 120094332d3Sopenharmony_ci .gamma = {2, 7}, 121094332d3Sopenharmony_ci .baseOffset = {1, 3}, 122094332d3Sopenharmony_ci .alternateOffset = {1, 7} 123094332d3Sopenharmony_ci }; 124094332d3Sopenharmony_ci IF_TRUE_RETURN_VAL_WITH_MSG(!bw.AddData<ToneMapMetadata>(TONE_MAP_METADATA, tmapMeta), false, 125094332d3Sopenharmony_ci "failed to add TONE_MAP_METADATA"); 126094332d3Sopenharmony_ci HDF_LOGI("add TONE_MAP_METADATA succeed"); 127094332d3Sopenharmony_ci return true; 128094332d3Sopenharmony_ci} 129094332d3Sopenharmony_ci 130094332d3Sopenharmony_cibool HeifEncoderHelper::AddPropMirrorAndRotate(ByteWriter& bw) 131094332d3Sopenharmony_ci{ 132094332d3Sopenharmony_ci static map<ImageMirror, bool> mirrorMap = { 133094332d3Sopenharmony_ci { ImageMirror::HORIZONTAL, false }, 134094332d3Sopenharmony_ci { ImageMirror::VERTICAL, true }, 135094332d3Sopenharmony_ci }; 136094332d3Sopenharmony_ci auto iterMirror = mirrorMap.find(encodeOpt_.mirrorInfo); 137094332d3Sopenharmony_ci if (iterMirror != mirrorMap.end()) { 138094332d3Sopenharmony_ci bool isMirrorVertical = iterMirror->second; 139094332d3Sopenharmony_ci IF_TRUE_RETURN_VAL_WITH_MSG(!bw.AddData<bool>(MIRROR_INFO, isMirrorVertical), false, 140094332d3Sopenharmony_ci "failed to add MIRROR_INFO"); 141094332d3Sopenharmony_ci HDF_LOGI("add MIRROR_INFO succeed"); 142094332d3Sopenharmony_ci } 143094332d3Sopenharmony_ci 144094332d3Sopenharmony_ci static map<ImageRotation, uint32_t> rotateMap = { 145094332d3Sopenharmony_ci { ImageRotation::ANTI_CLOCKWISE_90, 90 }, 146094332d3Sopenharmony_ci { ImageRotation::ANTI_CLOCKWISE_180, 180 }, 147094332d3Sopenharmony_ci { ImageRotation::ANTI_CLOCKWISE_270, 270 }, 148094332d3Sopenharmony_ci }; 149094332d3Sopenharmony_ci auto iterRotate = rotateMap.find(encodeOpt_.rotateInfo); 150094332d3Sopenharmony_ci if (iterRotate != rotateMap.end()) { 151094332d3Sopenharmony_ci uint32_t rotateDegree = iterRotate->second; 152094332d3Sopenharmony_ci IF_TRUE_RETURN_VAL_WITH_MSG(!bw.AddData<uint32_t>(ROTATE_INFO, rotateDegree), false, 153094332d3Sopenharmony_ci "failed to add ROTATE_INFO"); 154094332d3Sopenharmony_ci HDF_LOGI("add ROTATE_INFO succeed"); 155094332d3Sopenharmony_ci } 156094332d3Sopenharmony_ci return true; 157094332d3Sopenharmony_ci} 158094332d3Sopenharmony_ci 159094332d3Sopenharmony_cibool HeifEncoderHelper::CreateImgParam(ImgType type, vector<uint8_t>& props) 160094332d3Sopenharmony_ci{ 161094332d3Sopenharmony_ci ByteWriter bw; 162094332d3Sopenharmony_ci 163094332d3Sopenharmony_ci if (type != T_MAP) { 164094332d3Sopenharmony_ci IF_TRUE_RETURN_VAL(!AddPropMirrorAndRotate(bw), false); 165094332d3Sopenharmony_ci } 166094332d3Sopenharmony_ci 167094332d3Sopenharmony_ci ColorType clrType = encodeOpt_.iccProfilePath.length() > 0 ? PROF : NCLX; 168094332d3Sopenharmony_ci IF_TRUE_RETURN_VAL_WITH_MSG(!bw.AddData<ColorType>(COLOR_TYPE, clrType), false, "failed to add COLOR_TYPE"); 169094332d3Sopenharmony_ci HDF_LOGI("add COLOR_TYPE succeed"); 170094332d3Sopenharmony_ci 171094332d3Sopenharmony_ci if (clrType == NCLX) { 172094332d3Sopenharmony_ci ColourInfo clrInfo = { 173094332d3Sopenharmony_ci .colourPrimaries = 2, 174094332d3Sopenharmony_ci .transferCharacteristics = 2, 175094332d3Sopenharmony_ci .matrixCoefficients = 2, 176094332d3Sopenharmony_ci .fullRangeFlag = false 177094332d3Sopenharmony_ci }; 178094332d3Sopenharmony_ci IF_TRUE_RETURN_VAL_WITH_MSG(!bw.AddData<ColourInfo>(COLOR_INFO, clrInfo), false, "failed to add COLOR_INFO"); 179094332d3Sopenharmony_ci HDF_LOGI("add COLOR_INFO succeed"); 180094332d3Sopenharmony_ci } 181094332d3Sopenharmony_ci 182094332d3Sopenharmony_ci if (type == T_MAP || type == PRIMARY_IMG) { 183094332d3Sopenharmony_ci ContentLightLevel level = { 184094332d3Sopenharmony_ci .maxContentLightLevel = 1, 185094332d3Sopenharmony_ci .maxPicAverageLightLevel = 2 186094332d3Sopenharmony_ci }; 187094332d3Sopenharmony_ci IF_TRUE_RETURN_VAL_WITH_MSG(!bw.AddData<ContentLightLevel>(CONTENT_LIGHT_LEVEL, level), false, 188094332d3Sopenharmony_ci "failed to add CONTENT_LIGHT_LEVEL"); 189094332d3Sopenharmony_ci HDF_LOGI("add CONTENT_LIGHT_LEVEL succeed"); 190094332d3Sopenharmony_ci } 191094332d3Sopenharmony_ci 192094332d3Sopenharmony_ci if (type == T_MAP) { 193094332d3Sopenharmony_ci IF_TRUE_RETURN_VAL(!AddPropOnlyForTmap(bw), false); 194094332d3Sopenharmony_ci } 195094332d3Sopenharmony_ci 196094332d3Sopenharmony_ci IF_TRUE_RETURN_VAL_WITH_MSG(!bw.Finalize(props), false, "failed to write img prop"); 197094332d3Sopenharmony_ci return true; 198094332d3Sopenharmony_ci} 199094332d3Sopenharmony_ci 200094332d3Sopenharmony_cibool HeifEncoderHelper::FillImageItem(ImgType type, ImageItem& item) 201094332d3Sopenharmony_ci{ 202094332d3Sopenharmony_ci map<ImgType, string> typeToFile = { 203094332d3Sopenharmony_ci { PRIMARY_IMG, encodeOpt_.primaryImgPath }, 204094332d3Sopenharmony_ci { AUXILIARY_IMG, encodeOpt_.auxiliaryImgPath }, 205094332d3Sopenharmony_ci { THUMBNAIL_IMG, encodeOpt_.thumbnailImgPath }, 206094332d3Sopenharmony_ci { GAIN_MAP, encodeOpt_.gainMapPath }, 207094332d3Sopenharmony_ci { T_MAP, "" }, 208094332d3Sopenharmony_ci }; 209094332d3Sopenharmony_ci item.itemName = ""; 210094332d3Sopenharmony_ci item.id = GetNextId(); 211094332d3Sopenharmony_ci item.sharedProperties = { 212094332d3Sopenharmony_ci .fd = -1, 213094332d3Sopenharmony_ci .filledLen = 0, 214094332d3Sopenharmony_ci .capacity = 0 215094332d3Sopenharmony_ci }; 216094332d3Sopenharmony_ci item.pixelBuffer = bufferHelper_.CreateImgBuffer(typeToFile[type]); 217094332d3Sopenharmony_ci IF_TRUE_RETURN_VAL((type != T_MAP && item.pixelBuffer == nullptr), false); 218094332d3Sopenharmony_ci item.isPrimary = (type == PRIMARY_IMG); 219094332d3Sopenharmony_ci item.isHidden = (type != PRIMARY_IMG); 220094332d3Sopenharmony_ci item.compressType = (type == T_MAP ? "none" : "hevc"); 221094332d3Sopenharmony_ci static constexpr uint32_t ENCODE_QUALITY = 85; 222094332d3Sopenharmony_ci item.quality = ENCODE_QUALITY; 223094332d3Sopenharmony_ci IF_TRUE_RETURN_VAL(!CreateImgParam(type, item.liteProperties), false); 224094332d3Sopenharmony_ci map<PropertyType, string> sharedProps; 225094332d3Sopenharmony_ci if (encodeOpt_.iccProfilePath.length() > 0) { 226094332d3Sopenharmony_ci HDF_LOGI("add ICC_PROFILE"); 227094332d3Sopenharmony_ci sharedProps[ICC_PROFILE] = encodeOpt_.iccProfilePath; 228094332d3Sopenharmony_ci } 229094332d3Sopenharmony_ci if (type == T_MAP && encodeOpt_.it35Path.length() > 0) { 230094332d3Sopenharmony_ci HDF_LOGI("add IT35_INFO"); 231094332d3Sopenharmony_ci sharedProps[IT35_INFO] = encodeOpt_.it35Path; 232094332d3Sopenharmony_ci } 233094332d3Sopenharmony_ci IF_TRUE_RETURN_VAL(sharedProps.empty(), true); 234094332d3Sopenharmony_ci item.sharedProperties = bufferHelper_.CreateSharedBuffer(sharedProps); 235094332d3Sopenharmony_ci return (item.sharedProperties.fd >= 0); 236094332d3Sopenharmony_ci} 237094332d3Sopenharmony_ci 238094332d3Sopenharmony_cibool HeifEncoderHelper::AssembleParamForOtherImg(uint32_t primaryImgId) 239094332d3Sopenharmony_ci{ 240094332d3Sopenharmony_ci if (encodeOpt_.auxiliaryImgPath.length() > 0) { 241094332d3Sopenharmony_ci ImageItem itemAuxlImg; 242094332d3Sopenharmony_ci IF_TRUE_RETURN_VAL(!FillImageItem(AUXILIARY_IMG, itemAuxlImg), false); 243094332d3Sopenharmony_ci inputImgs_.emplace_back(itemAuxlImg); 244094332d3Sopenharmony_ci refs_.emplace_back(ItemRef { 245094332d3Sopenharmony_ci .type = AUXL, 246094332d3Sopenharmony_ci .auxType = "", 247094332d3Sopenharmony_ci .from = itemAuxlImg.id, 248094332d3Sopenharmony_ci .to = {primaryImgId} 249094332d3Sopenharmony_ci }); 250094332d3Sopenharmony_ci } 251094332d3Sopenharmony_ci if (encodeOpt_.thumbnailImgPath.length() > 0) { 252094332d3Sopenharmony_ci ImageItem itemThmbImg; 253094332d3Sopenharmony_ci IF_TRUE_RETURN_VAL(!FillImageItem(THUMBNAIL_IMG, itemThmbImg), false); 254094332d3Sopenharmony_ci inputImgs_.emplace_back(itemThmbImg); 255094332d3Sopenharmony_ci refs_.emplace_back(ItemRef { 256094332d3Sopenharmony_ci .type = THMB, 257094332d3Sopenharmony_ci .auxType = "", 258094332d3Sopenharmony_ci .from = itemThmbImg.id, 259094332d3Sopenharmony_ci .to = {primaryImgId} 260094332d3Sopenharmony_ci }); 261094332d3Sopenharmony_ci } 262094332d3Sopenharmony_ci return true; 263094332d3Sopenharmony_ci} 264094332d3Sopenharmony_ci 265094332d3Sopenharmony_cibool HeifEncoderHelper::AssembleParamForTmap() 266094332d3Sopenharmony_ci{ 267094332d3Sopenharmony_ci ImageItem itemTmap; 268094332d3Sopenharmony_ci ImageItem itemPrimaryImg; 269094332d3Sopenharmony_ci ImageItem itemGainMap; 270094332d3Sopenharmony_ci IF_TRUE_RETURN_VAL(!FillImageItem(T_MAP, itemTmap), false); 271094332d3Sopenharmony_ci IF_TRUE_RETURN_VAL(!FillImageItem(PRIMARY_IMG, itemPrimaryImg), false); 272094332d3Sopenharmony_ci IF_TRUE_RETURN_VAL(!FillImageItem(GAIN_MAP, itemGainMap), false); 273094332d3Sopenharmony_ci inputImgs_.emplace_back(itemTmap); 274094332d3Sopenharmony_ci inputImgs_.emplace_back(itemPrimaryImg); 275094332d3Sopenharmony_ci inputImgs_.emplace_back(itemGainMap); 276094332d3Sopenharmony_ci refs_.emplace_back(ItemRef { 277094332d3Sopenharmony_ci .type = DIMG, 278094332d3Sopenharmony_ci .auxType = "", 279094332d3Sopenharmony_ci .from = itemTmap.id, 280094332d3Sopenharmony_ci .to = {itemPrimaryImg.id, itemGainMap.id} 281094332d3Sopenharmony_ci }); 282094332d3Sopenharmony_ci if (AssembleParamForOtherImg(itemPrimaryImg.id)) { 283094332d3Sopenharmony_ci return AssembleParamForMetaData(itemPrimaryImg.id); 284094332d3Sopenharmony_ci } 285094332d3Sopenharmony_ci return false; 286094332d3Sopenharmony_ci} 287094332d3Sopenharmony_ci 288094332d3Sopenharmony_cibool HeifEncoderHelper::AssembleParamForPrimaryImg() 289094332d3Sopenharmony_ci{ 290094332d3Sopenharmony_ci ImageItem itemPrimaryImg; 291094332d3Sopenharmony_ci IF_TRUE_RETURN_VAL(!FillImageItem(PRIMARY_IMG, itemPrimaryImg), false); 292094332d3Sopenharmony_ci inputImgs_.emplace_back(itemPrimaryImg); 293094332d3Sopenharmony_ci if (AssembleParamForOtherImg(itemPrimaryImg.id)) { 294094332d3Sopenharmony_ci return AssembleParamForMetaData(itemPrimaryImg.id); 295094332d3Sopenharmony_ci } 296094332d3Sopenharmony_ci return false; 297094332d3Sopenharmony_ci} 298094332d3Sopenharmony_ci 299094332d3Sopenharmony_cibool HeifEncoderHelper::FillMetaItem(const string& metaFile, MetaType type, MetaItem& item) 300094332d3Sopenharmony_ci{ 301094332d3Sopenharmony_ci item.itemName = ""; 302094332d3Sopenharmony_ci item.id = GetNextId(); 303094332d3Sopenharmony_ci item.properties = {}; 304094332d3Sopenharmony_ci if (type == USER_DATA) { 305094332d3Sopenharmony_ci static constexpr char USER_DATA_LABEL[] = "userdata"; 306094332d3Sopenharmony_ci item.itemName = USER_DATA_LABEL; 307094332d3Sopenharmony_ci bool useCompress = true; 308094332d3Sopenharmony_ci ByteWriter bw; 309094332d3Sopenharmony_ci IF_TRUE_RETURN_VAL_WITH_MSG(!bw.AddData<bool>(USER_DATA_DO_COMPRESS, useCompress), false, 310094332d3Sopenharmony_ci "failed to add USER_DATA_DO_COMPRESS"); 311094332d3Sopenharmony_ci IF_TRUE_RETURN_VAL_WITH_MSG(!bw.Finalize(item.properties), false, "failed to write USER_DATA_DO_COMPRESS"); 312094332d3Sopenharmony_ci } else if (type == EXIF_DATA) { 313094332d3Sopenharmony_ci static constexpr char EXIF_LABEL[] = "exif"; 314094332d3Sopenharmony_ci item.itemName = EXIF_LABEL; 315094332d3Sopenharmony_ci } 316094332d3Sopenharmony_ci item.data = bufferHelper_.CreateSharedBuffer(metaFile); 317094332d3Sopenharmony_ci return (item.data.fd >= 0); 318094332d3Sopenharmony_ci} 319094332d3Sopenharmony_ci 320094332d3Sopenharmony_cibool HeifEncoderHelper::AssembleParamForMetaData(uint32_t primaryImgId) 321094332d3Sopenharmony_ci{ 322094332d3Sopenharmony_ci HDF_LOGI("AssembleParamForMetaData"); 323094332d3Sopenharmony_ci if (encodeOpt_.exifDataPath.length() > 0) { 324094332d3Sopenharmony_ci HDF_LOGI("add exif: %{public}s", encodeOpt_.exifDataPath.c_str()); 325094332d3Sopenharmony_ci MetaItem metaExifData; 326094332d3Sopenharmony_ci IF_TRUE_RETURN_VAL(!FillMetaItem(encodeOpt_.exifDataPath, EXIF_DATA, metaExifData), false); 327094332d3Sopenharmony_ci inputMetas_.emplace_back(metaExifData); 328094332d3Sopenharmony_ci refs_.emplace_back(ItemRef { 329094332d3Sopenharmony_ci .type = CDSC, 330094332d3Sopenharmony_ci .auxType = "", 331094332d3Sopenharmony_ci .from = metaExifData.id, 332094332d3Sopenharmony_ci .to = {primaryImgId} 333094332d3Sopenharmony_ci }); 334094332d3Sopenharmony_ci } 335094332d3Sopenharmony_ci if (encodeOpt_.userDataPath.length() > 0) { 336094332d3Sopenharmony_ci HDF_LOGI("add userData: %{public}s", encodeOpt_.userDataPath.c_str()); 337094332d3Sopenharmony_ci MetaItem metaUserData; 338094332d3Sopenharmony_ci IF_TRUE_RETURN_VAL(!FillMetaItem(encodeOpt_.userDataPath, USER_DATA, metaUserData), false); 339094332d3Sopenharmony_ci inputMetas_.emplace_back(metaUserData); 340094332d3Sopenharmony_ci refs_.emplace_back(ItemRef { 341094332d3Sopenharmony_ci .type = CDSC, 342094332d3Sopenharmony_ci .auxType = "", 343094332d3Sopenharmony_ci .from = metaUserData.id, 344094332d3Sopenharmony_ci .to = {primaryImgId} 345094332d3Sopenharmony_ci }); 346094332d3Sopenharmony_ci } 347094332d3Sopenharmony_ci return true; 348094332d3Sopenharmony_ci} 349094332d3Sopenharmony_ci} 350