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