1e5c4badcSopenharmony_ci/*
2e5c4badcSopenharmony_ci * Copyright (C) 2024 Huawei Device Co., Ltd.
3e5c4badcSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4e5c4badcSopenharmony_ci * you may not use this file except in compliance with the License.
5e5c4badcSopenharmony_ci * You may obtain a copy of the License at
6e5c4badcSopenharmony_ci *
7e5c4badcSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8e5c4badcSopenharmony_ci *
9e5c4badcSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10e5c4badcSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11e5c4badcSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12e5c4badcSopenharmony_ci * See the License for the specific language governing permissions and
13e5c4badcSopenharmony_ci * limitations under the License.
14e5c4badcSopenharmony_ci */
15e5c4badcSopenharmony_ci
16e5c4badcSopenharmony_ci#include <memory>
17e5c4badcSopenharmony_ci#include "exif_metadata.h"
18e5c4badcSopenharmony_ci#include "picture.h"
19e5c4badcSopenharmony_ci#include "pixel_yuv.h"
20e5c4badcSopenharmony_ci#include "pixel_yuv_ext.h"
21e5c4badcSopenharmony_ci#include "image_utils.h"
22e5c4badcSopenharmony_ci#include "image_log.h"
23e5c4badcSopenharmony_ci#include "image_source.h"
24e5c4badcSopenharmony_ci#include "media_errors.h"                                                // Operation success
25e5c4badcSopenharmony_ci#ifdef IMAGE_COLORSPACE_FLAG
26e5c4badcSopenharmony_ci#include "color_space.h"
27e5c4badcSopenharmony_ci#endif
28e5c4badcSopenharmony_ci#include "surface_buffer.h"
29e5c4badcSopenharmony_ci#include "securec.h"
30e5c4badcSopenharmony_ci#include "tiff_parser.h"
31e5c4badcSopenharmony_ci#include "metadata_helper.h"
32e5c4badcSopenharmony_ci#include "v1_0/cm_color_space.h"
33e5c4badcSopenharmony_ci#include "vpe_utils.h"
34e5c4badcSopenharmony_ci
35e5c4badcSopenharmony_cinamespace OHOS {
36e5c4badcSopenharmony_cinamespace Media {
37e5c4badcSopenharmony_ciusing namespace OHOS::HDI::Display::Graphic::Common::V1_0;
38e5c4badcSopenharmony_cinamespace {
39e5c4badcSopenharmony_ci    static const std::map<int32_t, PixelFormat> PIXEL_FORMAT_MAP = {
40e5c4badcSopenharmony_ci        { GRAPHIC_PIXEL_FMT_RGBA_8888, PixelFormat::RGBA_8888 },
41e5c4badcSopenharmony_ci        { GRAPHIC_PIXEL_FMT_YCBCR_420_SP, PixelFormat::NV12 },
42e5c4badcSopenharmony_ci        { GRAPHIC_PIXEL_FMT_YCRCB_420_SP, PixelFormat::NV21 },
43e5c4badcSopenharmony_ci        { GRAPHIC_PIXEL_FMT_RGBA_1010102, PixelFormat::RGBA_1010102 },
44e5c4badcSopenharmony_ci        { GRAPHIC_PIXEL_FMT_BGRA_8888, PixelFormat::BGRA_8888 },
45e5c4badcSopenharmony_ci        { GRAPHIC_PIXEL_FMT_RGB_888, PixelFormat::RGB_888 },
46e5c4badcSopenharmony_ci        { GRAPHIC_PIXEL_FMT_RGB_565, PixelFormat::RGB_565 },
47e5c4badcSopenharmony_ci        { GRAPHIC_PIXEL_FMT_RGBA16_FLOAT, PixelFormat::RGBA_F16 },
48e5c4badcSopenharmony_ci    };
49e5c4badcSopenharmony_ci
50e5c4badcSopenharmony_ci    static const std::map<CM_ColorSpaceType, ColorSpace> CM_COLORSPACE_MAP = {
51e5c4badcSopenharmony_ci        { CM_COLORSPACE_NONE, ColorSpace::UNKNOWN },
52e5c4badcSopenharmony_ci        { CM_BT709_FULL, ColorSpace::ITU_709 },
53e5c4badcSopenharmony_ci        { CM_BT2020_HLG_FULL, ColorSpace::ITU_2020 },
54e5c4badcSopenharmony_ci        { CM_BT2020_PQ_FULL, ColorSpace::ITU_2020 },
55e5c4badcSopenharmony_ci        { CM_BT709_LIMIT, ColorSpace::ITU_709 },
56e5c4badcSopenharmony_ci        { CM_BT2020_HLG_LIMIT, ColorSpace::ITU_2020 },
57e5c4badcSopenharmony_ci        { CM_BT2020_PQ_LIMIT, ColorSpace::ITU_2020 },
58e5c4badcSopenharmony_ci        { CM_SRGB_FULL, ColorSpace::SRGB },
59e5c4badcSopenharmony_ci        { CM_P3_FULL, ColorSpace::DCI_P3 },
60e5c4badcSopenharmony_ci        { CM_P3_HLG_FULL, ColorSpace::DCI_P3 },
61e5c4badcSopenharmony_ci        { CM_P3_PQ_FULL, ColorSpace::DCI_P3 },
62e5c4badcSopenharmony_ci        { CM_ADOBERGB_FULL, ColorSpace::ADOBE_RGB_1998 },
63e5c4badcSopenharmony_ci        { CM_SRGB_LIMIT, ColorSpace::SRGB },
64e5c4badcSopenharmony_ci        { CM_P3_LIMIT, ColorSpace::DCI_P3 },
65e5c4badcSopenharmony_ci        { CM_P3_HLG_LIMIT, ColorSpace::DCI_P3 },
66e5c4badcSopenharmony_ci        { CM_P3_PQ_LIMIT, ColorSpace::DCI_P3 },
67e5c4badcSopenharmony_ci        { CM_ADOBERGB_LIMIT, ColorSpace::ADOBE_RGB_1998 },
68e5c4badcSopenharmony_ci        { CM_LINEAR_SRGB, ColorSpace::LINEAR_SRGB },
69e5c4badcSopenharmony_ci        { CM_LINEAR_BT709, ColorSpace::ITU_709 },
70e5c4badcSopenharmony_ci        { CM_LINEAR_P3, ColorSpace::DISPLAY_P3 },
71e5c4badcSopenharmony_ci        { CM_LINEAR_BT2020, ColorSpace::ITU_2020 },
72e5c4badcSopenharmony_ci        { CM_DISPLAY_SRGB, ColorSpace::SRGB },
73e5c4badcSopenharmony_ci        { CM_DISPLAY_P3_SRGB, ColorSpace::DISPLAY_P3 },
74e5c4badcSopenharmony_ci        { CM_DISPLAY_P3_HLG, ColorSpace::DISPLAY_P3 },
75e5c4badcSopenharmony_ci        { CM_DISPLAY_P3_PQ, ColorSpace::DISPLAY_P3 },
76e5c4badcSopenharmony_ci        { CM_DISPLAY_BT2020_SRGB, ColorSpace::ITU_2020 },
77e5c4badcSopenharmony_ci        { CM_DISPLAY_BT2020_HLG, ColorSpace::ITU_2020 },
78e5c4badcSopenharmony_ci        { CM_DISPLAY_BT2020_PQ, ColorSpace::ITU_2020 },
79e5c4badcSopenharmony_ci    };
80e5c4badcSopenharmony_ci
81e5c4badcSopenharmony_ci#ifdef IMAGE_COLORSPACE_FLAG
82e5c4badcSopenharmony_ci    static const std::map<CM_ColorSpaceType, ColorManager::ColorSpaceName> CM_COLORSPACE_NAME_MAP = {
83e5c4badcSopenharmony_ci        { CM_COLORSPACE_NONE, ColorManager::NONE },
84e5c4badcSopenharmony_ci        { CM_BT601_EBU_FULL, ColorManager::BT601_EBU },
85e5c4badcSopenharmony_ci        { CM_BT601_SMPTE_C_FULL, ColorManager::BT601_SMPTE_C },
86e5c4badcSopenharmony_ci        { CM_BT709_FULL, ColorManager::BT709 },
87e5c4badcSopenharmony_ci        { CM_BT2020_HLG_FULL, ColorManager::BT2020_HLG },
88e5c4badcSopenharmony_ci        { CM_BT2020_PQ_FULL, ColorManager::BT2020_PQ },
89e5c4badcSopenharmony_ci        { CM_BT601_EBU_LIMIT, ColorManager::BT601_EBU_LIMIT },
90e5c4badcSopenharmony_ci        { CM_BT601_SMPTE_C_LIMIT, ColorManager::BT601_SMPTE_C_LIMIT },
91e5c4badcSopenharmony_ci        { CM_BT709_LIMIT, ColorManager::BT709_LIMIT },
92e5c4badcSopenharmony_ci        { CM_BT2020_HLG_LIMIT, ColorManager::BT2020_HLG_LIMIT },
93e5c4badcSopenharmony_ci        { CM_BT2020_PQ_LIMIT, ColorManager::BT2020_PQ_LIMIT },
94e5c4badcSopenharmony_ci        { CM_SRGB_FULL, ColorManager::SRGB },
95e5c4badcSopenharmony_ci        { CM_P3_FULL, ColorManager::DCI_P3 },
96e5c4badcSopenharmony_ci        { CM_P3_HLG_FULL, ColorManager::P3_HLG },
97e5c4badcSopenharmony_ci        { CM_P3_PQ_FULL, ColorManager::P3_PQ },
98e5c4badcSopenharmony_ci        { CM_ADOBERGB_FULL, ColorManager::ADOBE_RGB },
99e5c4badcSopenharmony_ci        { CM_SRGB_LIMIT, ColorManager::SRGB_LIMIT },
100e5c4badcSopenharmony_ci        { CM_P3_LIMIT, ColorManager::DISPLAY_P3_LIMIT },
101e5c4badcSopenharmony_ci        { CM_P3_HLG_LIMIT, ColorManager::P3_HLG_LIMIT },
102e5c4badcSopenharmony_ci        { CM_P3_PQ_LIMIT, ColorManager::P3_PQ_LIMIT },
103e5c4badcSopenharmony_ci        { CM_ADOBERGB_LIMIT, ColorManager::ADOBE_RGB_LIMIT },
104e5c4badcSopenharmony_ci        { CM_LINEAR_SRGB, ColorManager::LINEAR_SRGB },
105e5c4badcSopenharmony_ci        { CM_LINEAR_BT709, ColorManager::LINEAR_BT709 },
106e5c4badcSopenharmony_ci        { CM_LINEAR_P3, ColorManager::LINEAR_P3 },
107e5c4badcSopenharmony_ci        { CM_LINEAR_BT2020, ColorManager::LINEAR_BT2020 },
108e5c4badcSopenharmony_ci        { CM_DISPLAY_SRGB, ColorManager::DISPLAY_SRGB },
109e5c4badcSopenharmony_ci        { CM_DISPLAY_P3_SRGB, ColorManager::DISPLAY_P3_SRGB },
110e5c4badcSopenharmony_ci        { CM_DISPLAY_P3_HLG, ColorManager::DISPLAY_P3_HLG },
111e5c4badcSopenharmony_ci        { CM_DISPLAY_P3_PQ, ColorManager::DISPLAY_P3_PQ },
112e5c4badcSopenharmony_ci        { CM_DISPLAY_BT2020_SRGB, ColorManager::DISPLAY_BT2020_SRGB },
113e5c4badcSopenharmony_ci        { CM_DISPLAY_BT2020_HLG, ColorManager::DISPLAY_BT2020_HLG },
114e5c4badcSopenharmony_ci        { CM_DISPLAY_BT2020_PQ, ColorManager::DISPLAY_BT2020_PQ },
115e5c4badcSopenharmony_ci    };
116e5c4badcSopenharmony_ci#endif
117e5c4badcSopenharmony_ci}
118e5c4badcSopenharmony_ciconst static uint64_t MAX_AUXILIARY_PICTURE_COUNT = 32;
119e5c4badcSopenharmony_cistatic const uint8_t NUM_0 = 0;
120e5c4badcSopenharmony_cistatic const uint8_t NUM_1 = 1;
121e5c4badcSopenharmony_cistatic const uint8_t NUM_2 = 2;
122e5c4badcSopenharmony_cistatic const std::string EXIF_DATA_SIZE_TAG = "exifDataSize";
123e5c4badcSopenharmony_ci
124e5c4badcSopenharmony_cistatic bool IsYuvFormat(PixelFormat format)
125e5c4badcSopenharmony_ci{
126e5c4badcSopenharmony_ci    return format == PixelFormat::NV21 || format == PixelFormat::NV12;
127e5c4badcSopenharmony_ci}
128e5c4badcSopenharmony_ci
129e5c4badcSopenharmony_cistatic bool IsAlphaFormat(PixelFormat format)
130e5c4badcSopenharmony_ci{
131e5c4badcSopenharmony_ci    return format == PixelFormat::RGBA_8888 || format == PixelFormat::BGRA_8888 ||
132e5c4badcSopenharmony_ci        format == PixelFormat::RGBA_1010102 || format == PixelFormat::RGBA_F16;
133e5c4badcSopenharmony_ci}
134e5c4badcSopenharmony_ci
135e5c4badcSopenharmony_cistatic PixelFormat SbFormat2PixelFormat(int32_t sbFormat)
136e5c4badcSopenharmony_ci{
137e5c4badcSopenharmony_ci    auto iter = PIXEL_FORMAT_MAP.find(sbFormat);
138e5c4badcSopenharmony_ci    if (iter == PIXEL_FORMAT_MAP.end()) {
139e5c4badcSopenharmony_ci        return PixelFormat::UNKNOWN;
140e5c4badcSopenharmony_ci    }
141e5c4badcSopenharmony_ci    return iter->second;
142e5c4badcSopenharmony_ci}
143e5c4badcSopenharmony_ci
144e5c4badcSopenharmony_cistatic CM_ColorSpaceType GetCMColorSpaceType(sptr<SurfaceBuffer> buffer)
145e5c4badcSopenharmony_ci{
146e5c4badcSopenharmony_ci    if (buffer == nullptr) {
147e5c4badcSopenharmony_ci        return CM_ColorSpaceType::CM_COLORSPACE_NONE;
148e5c4badcSopenharmony_ci    }
149e5c4badcSopenharmony_ci    CM_ColorSpaceType type;
150e5c4badcSopenharmony_ci    MetadataHelper::GetColorSpaceType(buffer, type);
151e5c4badcSopenharmony_ci    return type;
152e5c4badcSopenharmony_ci}
153e5c4badcSopenharmony_ci
154e5c4badcSopenharmony_cistatic ColorSpace CMColorSpaceType2ColorSpace(CM_ColorSpaceType type)
155e5c4badcSopenharmony_ci{
156e5c4badcSopenharmony_ci    auto iter = CM_COLORSPACE_MAP.find(type);
157e5c4badcSopenharmony_ci    if (iter == CM_COLORSPACE_MAP.end()) {
158e5c4badcSopenharmony_ci        return ColorSpace::UNKNOWN;
159e5c4badcSopenharmony_ci    }
160e5c4badcSopenharmony_ci    return iter->second;
161e5c4badcSopenharmony_ci}
162e5c4badcSopenharmony_ci
163e5c4badcSopenharmony_ci#ifdef IMAGE_COLORSPACE_FLAG
164e5c4badcSopenharmony_cistatic ColorManager::ColorSpaceName CMColorSpaceType2ColorSpaceName(CM_ColorSpaceType type)
165e5c4badcSopenharmony_ci{
166e5c4badcSopenharmony_ci    auto iter = CM_COLORSPACE_NAME_MAP.find(type);
167e5c4badcSopenharmony_ci    if (iter == CM_COLORSPACE_NAME_MAP.end()) {
168e5c4badcSopenharmony_ci        return ColorManager::NONE;
169e5c4badcSopenharmony_ci    }
170e5c4badcSopenharmony_ci    return iter->second;
171e5c4badcSopenharmony_ci}
172e5c4badcSopenharmony_ci#endif
173e5c4badcSopenharmony_ci
174e5c4badcSopenharmony_cistatic ImageInfo MakeImageInfo(int width, int height, PixelFormat pf, AlphaType at, ColorSpace cs)
175e5c4badcSopenharmony_ci{
176e5c4badcSopenharmony_ci    ImageInfo info;
177e5c4badcSopenharmony_ci    info.size.width = width;
178e5c4badcSopenharmony_ci    info.size.height = height;
179e5c4badcSopenharmony_ci    info.pixelFormat = pf;
180e5c4badcSopenharmony_ci    info.alphaType = at;
181e5c4badcSopenharmony_ci    info.colorSpace = cs;
182e5c4badcSopenharmony_ci    return info;
183e5c4badcSopenharmony_ci}
184e5c4badcSopenharmony_ci
185e5c4badcSopenharmony_cistatic void SetYuvDataInfo(std::unique_ptr<PixelMap> &pixelMap, sptr<OHOS::SurfaceBuffer> &sBuffer)
186e5c4badcSopenharmony_ci{
187e5c4badcSopenharmony_ci    if (pixelMap == nullptr || sBuffer == nullptr) {
188e5c4badcSopenharmony_ci        return;
189e5c4badcSopenharmony_ci    }
190e5c4badcSopenharmony_ci    int32_t width = sBuffer->GetWidth();
191e5c4badcSopenharmony_ci    int32_t height = sBuffer->GetHeight();
192e5c4badcSopenharmony_ci    OH_NativeBuffer_Planes *planes = nullptr;
193e5c4badcSopenharmony_ci    GSError retVal = sBuffer->GetPlanesInfo(reinterpret_cast<void**>(&planes));
194e5c4badcSopenharmony_ci    YUVDataInfo info;
195e5c4badcSopenharmony_ci    info.imageSize = { width, height };
196e5c4badcSopenharmony_ci    if (retVal != OHOS::GSERROR_OK || planes == nullptr || planes->planeCount <= NUM_1) {
197e5c4badcSopenharmony_ci        IMAGE_LOGE("Get planesInfo failed, retVal:%{public}d", retVal);
198e5c4badcSopenharmony_ci        return;
199e5c4badcSopenharmony_ci    } else if (planes->planeCount >= NUM_2) {
200e5c4badcSopenharmony_ci        info.yStride = planes->planes[NUM_0].columnStride;
201e5c4badcSopenharmony_ci        info.uvStride = planes->planes[NUM_1].columnStride;
202e5c4badcSopenharmony_ci        info.yOffset = planes->planes[NUM_0].offset;
203e5c4badcSopenharmony_ci        info.uvOffset = planes->planes[NUM_1].offset - NUM_1;
204e5c4badcSopenharmony_ci    }
205e5c4badcSopenharmony_ci    pixelMap->SetImageYUVInfo(info);
206e5c4badcSopenharmony_ci}
207e5c4badcSopenharmony_ci
208e5c4badcSopenharmony_cistatic void SetImageInfoToHdr(std::shared_ptr<PixelMap> &mainPixelMap, std::unique_ptr<PixelMap> &hdrPixelMap)
209e5c4badcSopenharmony_ci{
210e5c4badcSopenharmony_ci    if (mainPixelMap != nullptr && hdrPixelMap != nullptr) {
211e5c4badcSopenharmony_ci        ImageInfo mainInfo;
212e5c4badcSopenharmony_ci        mainPixelMap->GetImageInfo(mainInfo);
213e5c4badcSopenharmony_ci        ImageInfo hdrInfo;
214e5c4badcSopenharmony_ci        hdrPixelMap->GetImageInfo(hdrInfo);
215e5c4badcSopenharmony_ci        hdrInfo.size = mainInfo.size;
216e5c4badcSopenharmony_ci        hdrInfo.encodedFormat = mainInfo.encodedFormat;
217e5c4badcSopenharmony_ci        hdrPixelMap->SetImageInfo(hdrInfo, true);
218e5c4badcSopenharmony_ci    }
219e5c4badcSopenharmony_ci}
220e5c4badcSopenharmony_ci
221e5c4badcSopenharmony_ciPicture::~Picture() {}
222e5c4badcSopenharmony_ci
223e5c4badcSopenharmony_cistd::unique_ptr<Picture> Picture::Create(std::shared_ptr<PixelMap> &pixelMap)
224e5c4badcSopenharmony_ci{
225e5c4badcSopenharmony_ci    if (pixelMap == nullptr) {
226e5c4badcSopenharmony_ci        return nullptr;
227e5c4badcSopenharmony_ci    }
228e5c4badcSopenharmony_ci    std::unique_ptr<Picture> dstPicture = std::make_unique<Picture>();
229e5c4badcSopenharmony_ci    if (pixelMap->GetExifMetadata() != nullptr) {
230e5c4badcSopenharmony_ci        dstPicture->SetExifMetadata(pixelMap->GetExifMetadata());
231e5c4badcSopenharmony_ci    }
232e5c4badcSopenharmony_ci    dstPicture->mainPixelMap_ = pixelMap;
233e5c4badcSopenharmony_ci    return dstPicture;
234e5c4badcSopenharmony_ci}
235e5c4badcSopenharmony_ci
236e5c4badcSopenharmony_cistd::unique_ptr<Picture> Picture::Create(sptr<SurfaceBuffer> &surfaceBuffer)
237e5c4badcSopenharmony_ci{
238e5c4badcSopenharmony_ci    std::shared_ptr<PixelMap> pixelmap = SurfaceBuffer2PixelMap(surfaceBuffer);
239e5c4badcSopenharmony_ci    return Create(pixelmap);
240e5c4badcSopenharmony_ci}
241e5c4badcSopenharmony_ci
242e5c4badcSopenharmony_cistd::unique_ptr<PixelMap> Picture::SurfaceBuffer2PixelMap(sptr<OHOS::SurfaceBuffer> &surfaceBuffer)
243e5c4badcSopenharmony_ci{
244e5c4badcSopenharmony_ci    if (surfaceBuffer == nullptr) {
245e5c4badcSopenharmony_ci        return nullptr;
246e5c4badcSopenharmony_ci    }
247e5c4badcSopenharmony_ci    PixelFormat pixelFormat = SbFormat2PixelFormat(surfaceBuffer->GetFormat());
248e5c4badcSopenharmony_ci    ColorSpace colorSpace = CMColorSpaceType2ColorSpace(GetCMColorSpaceType(surfaceBuffer));
249e5c4badcSopenharmony_ci    AlphaType alphaType = IsAlphaFormat(pixelFormat) ?
250e5c4badcSopenharmony_ci             AlphaType::IMAGE_ALPHA_TYPE_PREMUL : AlphaType::IMAGE_ALPHA_TYPE_OPAQUE;
251e5c4badcSopenharmony_ci    void* nativeBuffer = surfaceBuffer.GetRefPtr();
252e5c4badcSopenharmony_ci    int32_t err = ImageUtils::SurfaceBuffer_Reference(nativeBuffer);
253e5c4badcSopenharmony_ci    if (err != OHOS::GSERROR_OK) {
254e5c4badcSopenharmony_ci        IMAGE_LOGE("NativeBufferReference failed");
255e5c4badcSopenharmony_ci        return nullptr;
256e5c4badcSopenharmony_ci    }
257e5c4badcSopenharmony_ci
258e5c4badcSopenharmony_ci    std::unique_ptr<PixelMap> pixelMap;
259e5c4badcSopenharmony_ci    if (IsYuvFormat(pixelFormat)) {
260e5c4badcSopenharmony_ci#ifdef EXT_PIXEL
261e5c4badcSopenharmony_ci        pixelMap = std::make_unique<PixelYuvExt>();
262e5c4badcSopenharmony_ci#else
263e5c4badcSopenharmony_ci        pixelMap = std::make_unique<PixelYuv>();
264e5c4badcSopenharmony_ci#endif
265e5c4badcSopenharmony_ci    } else {
266e5c4badcSopenharmony_ci        pixelMap = std::make_unique<PixelMap>();
267e5c4badcSopenharmony_ci    }
268e5c4badcSopenharmony_ci    if (pixelMap == nullptr) {
269e5c4badcSopenharmony_ci        return nullptr;
270e5c4badcSopenharmony_ci    }
271e5c4badcSopenharmony_ci
272e5c4badcSopenharmony_ci    ImageInfo imageInfo = MakeImageInfo(surfaceBuffer->GetWidth(),
273e5c4badcSopenharmony_ci                                        surfaceBuffer->GetHeight(), pixelFormat, alphaType, colorSpace);
274e5c4badcSopenharmony_ci    pixelMap->SetImageInfo(imageInfo, true);
275e5c4badcSopenharmony_ci    pixelMap->SetPixelsAddr(surfaceBuffer->GetVirAddr(),
276e5c4badcSopenharmony_ci                            nativeBuffer, pixelMap->GetRowBytes() * pixelMap->GetHeight(),
277e5c4badcSopenharmony_ci                            AllocatorType::DMA_ALLOC, nullptr);
278e5c4badcSopenharmony_ci#ifdef IMAGE_COLORSPACE_FLAG
279e5c4badcSopenharmony_ci    ColorManager::ColorSpaceName colorSpaceName =
280e5c4badcSopenharmony_ci        CMColorSpaceType2ColorSpaceName(GetCMColorSpaceType(surfaceBuffer));
281e5c4badcSopenharmony_ci    pixelMap->InnerSetColorSpace(ColorManager::ColorSpace(colorSpaceName));
282e5c4badcSopenharmony_ci#endif
283e5c4badcSopenharmony_ci    if (IsYuvFormat(pixelFormat)) {
284e5c4badcSopenharmony_ci        SetYuvDataInfo(pixelMap, surfaceBuffer);
285e5c4badcSopenharmony_ci    }
286e5c4badcSopenharmony_ci    return pixelMap;
287e5c4badcSopenharmony_ci}
288e5c4badcSopenharmony_ci
289e5c4badcSopenharmony_cistd::shared_ptr<PixelMap> Picture::GetMainPixel()
290e5c4badcSopenharmony_ci{
291e5c4badcSopenharmony_ci    return mainPixelMap_;
292e5c4badcSopenharmony_ci}
293e5c4badcSopenharmony_ci
294e5c4badcSopenharmony_civoid Picture::SetMainPixel(std::shared_ptr<PixelMap> PixelMap)
295e5c4badcSopenharmony_ci{
296e5c4badcSopenharmony_ci    mainPixelMap_ = PixelMap;
297e5c4badcSopenharmony_ci}
298e5c4badcSopenharmony_ci
299e5c4badcSopenharmony_cistatic std::unique_ptr<PixelMap> ComposeHdrPixelMap(
300e5c4badcSopenharmony_ci    ImageHdrType hdrType, CM_ColorSpaceType hdrCmColor,
301e5c4badcSopenharmony_ci    std::shared_ptr<PixelMap> &mainPixelMap, sptr<SurfaceBuffer> &baseSptr, sptr<SurfaceBuffer> &gainmapSptr)
302e5c4badcSopenharmony_ci{
303e5c4badcSopenharmony_ci    sptr<SurfaceBuffer> hdrSptr = SurfaceBuffer::Create();
304e5c4badcSopenharmony_ci    ImageInfo imageInfo;
305e5c4badcSopenharmony_ci    mainPixelMap->GetImageInfo(imageInfo);
306e5c4badcSopenharmony_ci    BufferRequestConfig requestConfig = {
307e5c4badcSopenharmony_ci        .width = imageInfo.size.width,
308e5c4badcSopenharmony_ci        .height = imageInfo.size.height,
309e5c4badcSopenharmony_ci        .strideAlignment = imageInfo.size.width,
310e5c4badcSopenharmony_ci        .format = GRAPHIC_PIXEL_FMT_RGBA_1010102,
311e5c4badcSopenharmony_ci        .usage = BUFFER_USAGE_CPU_READ | BUFFER_USAGE_CPU_WRITE | BUFFER_USAGE_MEM_DMA | BUFFER_USAGE_MEM_MMZ_CACHE,
312e5c4badcSopenharmony_ci        .timeout = 0,
313e5c4badcSopenharmony_ci    };
314e5c4badcSopenharmony_ci
315e5c4badcSopenharmony_ci    GSError error = hdrSptr->Alloc(requestConfig);
316e5c4badcSopenharmony_ci    if (error != GSERROR_OK) {
317e5c4badcSopenharmony_ci        IMAGE_LOGE("HDR SurfaceBuffer Alloc failed, %{public}d", ERR_DMA_NOT_EXIST);
318e5c4badcSopenharmony_ci        return nullptr;
319e5c4badcSopenharmony_ci    }
320e5c4badcSopenharmony_ci    CM_HDR_Metadata_Type type;
321e5c4badcSopenharmony_ci    if (hdrType == ImageHdrType::HDR_VIVID_DUAL || hdrType == ImageHdrType::HDR_CUVA) {
322e5c4badcSopenharmony_ci        type = CM_IMAGE_HDR_VIVID_SINGLE;
323e5c4badcSopenharmony_ci    } else if (hdrType == ImageHdrType::HDR_ISO_DUAL) {
324e5c4badcSopenharmony_ci        type = CM_IMAGE_HDR_ISO_SINGLE;
325e5c4badcSopenharmony_ci    }
326e5c4badcSopenharmony_ci    VpeUtils::SetSbMetadataType(hdrSptr, type);
327e5c4badcSopenharmony_ci    VpeUtils::SetSbColorSpaceType(hdrSptr, hdrCmColor);
328e5c4badcSopenharmony_ci
329e5c4badcSopenharmony_ci    VpeSurfaceBuffers buffers = {
330e5c4badcSopenharmony_ci        .sdr = baseSptr,
331e5c4badcSopenharmony_ci        .gainmap = gainmapSptr,
332e5c4badcSopenharmony_ci        .hdr = hdrSptr,
333e5c4badcSopenharmony_ci    };
334e5c4badcSopenharmony_ci    auto res = VpeUtils().ColorSpaceConverterComposeImage(buffers, (hdrType == ImageHdrType::HDR_CUVA));
335e5c4badcSopenharmony_ci    if (res != VPE_ERROR_OK) {
336e5c4badcSopenharmony_ci        IMAGE_LOGE("Compose HDR image failed");
337e5c4badcSopenharmony_ci        return nullptr;
338e5c4badcSopenharmony_ci    } else {
339e5c4badcSopenharmony_ci        return Picture::SurfaceBuffer2PixelMap(hdrSptr);
340e5c4badcSopenharmony_ci    }
341e5c4badcSopenharmony_ci}
342e5c4badcSopenharmony_ci
343e5c4badcSopenharmony_cistd::unique_ptr<PixelMap> Picture::GetHdrComposedPixelMap()
344e5c4badcSopenharmony_ci{
345e5c4badcSopenharmony_ci    if (!HasAuxiliaryPicture(AuxiliaryPictureType::GAINMAP) ||
346e5c4badcSopenharmony_ci        mainPixelMap_->GetAllocatorType() != AllocatorType::DMA_ALLOC) {
347e5c4badcSopenharmony_ci        IMAGE_LOGE("Unsupport HDR compose.");
348e5c4badcSopenharmony_ci        return nullptr;
349e5c4badcSopenharmony_ci    }
350e5c4badcSopenharmony_ci    std::shared_ptr<PixelMap> gainmap = Picture::GetAuxiliaryPicture(AuxiliaryPictureType::GAINMAP)->GetContentPixel();
351e5c4badcSopenharmony_ci    ImageHdrType hdrType = gainmap->GetHdrType();
352e5c4badcSopenharmony_ci    std::shared_ptr<HdrMetadata> metadata = gainmap->GetHdrMetadata();
353e5c4badcSopenharmony_ci
354e5c4badcSopenharmony_ci    CM_ColorSpaceType baseCmColor =
355e5c4badcSopenharmony_ci        ImageSource::ConvertColorSpaceType(mainPixelMap_->InnerGetGrColorSpace().GetColorSpaceName(), true);
356e5c4badcSopenharmony_ci    sptr<SurfaceBuffer> baseSptr(reinterpret_cast<SurfaceBuffer*>(mainPixelMap_->GetFd()));
357e5c4badcSopenharmony_ci    VpeUtils::SetSurfaceBufferInfo(baseSptr, false, hdrType, baseCmColor, *metadata);
358e5c4badcSopenharmony_ci
359e5c4badcSopenharmony_ci    sptr<SurfaceBuffer> gainmapSptr(reinterpret_cast<SurfaceBuffer*>(gainmap->GetFd()));
360e5c4badcSopenharmony_ci    CM_ColorSpaceType hdrCmColor = CM_BT2020_HLG_FULL;
361e5c4badcSopenharmony_ci    CM_ColorSpaceType gainmapCmColor = metadata->extendMeta.metaISO.useBaseColorFlag == 0x01 ? baseCmColor : hdrCmColor;
362e5c4badcSopenharmony_ci    IMAGE_LOGD("ComposeHdrImage color flag = %{public}d, gainmapChannelNum = %{public}d",
363e5c4badcSopenharmony_ci        metadata->extendMeta.metaISO.useBaseColorFlag, metadata->extendMeta.metaISO.gainmapChannelNum);
364e5c4badcSopenharmony_ci    ImageSource::SetVividMetaColor(*metadata, baseCmColor, gainmapCmColor, hdrCmColor);
365e5c4badcSopenharmony_ci    VpeUtils::SetSurfaceBufferInfo(gainmapSptr, true, hdrType, gainmapCmColor, *metadata);
366e5c4badcSopenharmony_ci
367e5c4badcSopenharmony_ci    auto hdrPixelMap = ComposeHdrPixelMap(hdrType, hdrCmColor, mainPixelMap_, baseSptr, gainmapSptr);
368e5c4badcSopenharmony_ci    SetImageInfoToHdr(mainPixelMap_, hdrPixelMap);
369e5c4badcSopenharmony_ci    return hdrPixelMap;
370e5c4badcSopenharmony_ci}
371e5c4badcSopenharmony_ci
372e5c4badcSopenharmony_cistd::shared_ptr<PixelMap> Picture::GetGainmapPixelMap()
373e5c4badcSopenharmony_ci{
374e5c4badcSopenharmony_ci    if (!HasAuxiliaryPicture(AuxiliaryPictureType::GAINMAP)) {
375e5c4badcSopenharmony_ci        IMAGE_LOGE("Unsupport gain map.");
376e5c4badcSopenharmony_ci        return nullptr;
377e5c4badcSopenharmony_ci    } else {
378e5c4badcSopenharmony_ci        return GetAuxiliaryPicture(AuxiliaryPictureType::GAINMAP)->GetContentPixel();
379e5c4badcSopenharmony_ci    }
380e5c4badcSopenharmony_ci}
381e5c4badcSopenharmony_ci
382e5c4badcSopenharmony_cistd::shared_ptr<AuxiliaryPicture> Picture::GetAuxiliaryPicture(AuxiliaryPictureType type)
383e5c4badcSopenharmony_ci{
384e5c4badcSopenharmony_ci    auto iter = auxiliaryPictures_.find(type);
385e5c4badcSopenharmony_ci    if (iter == auxiliaryPictures_.end()) {
386e5c4badcSopenharmony_ci        return nullptr;
387e5c4badcSopenharmony_ci    }
388e5c4badcSopenharmony_ci    return iter->second;
389e5c4badcSopenharmony_ci}
390e5c4badcSopenharmony_ci
391e5c4badcSopenharmony_civoid Picture::SetAuxiliaryPicture(std::shared_ptr<AuxiliaryPicture> &picture)
392e5c4badcSopenharmony_ci{
393e5c4badcSopenharmony_ci    auxiliaryPictures_[picture->GetType()] = picture;
394e5c4badcSopenharmony_ci    if (picture != nullptr && picture->GetType() == AuxiliaryPictureType::GAINMAP) {
395e5c4badcSopenharmony_ci        std::shared_ptr<PixelMap> gainmapPixel = GetGainmapPixelMap();
396e5c4badcSopenharmony_ci        if (gainmapPixel != nullptr && mainPixelMap_ != nullptr) {
397e5c4badcSopenharmony_ci            mainPixelMap_->SetHdrMetadata(gainmapPixel->GetHdrMetadata());
398e5c4badcSopenharmony_ci            mainPixelMap_->SetHdrType(gainmapPixel->GetHdrType());
399e5c4badcSopenharmony_ci        }
400e5c4badcSopenharmony_ci    }
401e5c4badcSopenharmony_ci}
402e5c4badcSopenharmony_ci
403e5c4badcSopenharmony_cibool Picture::HasAuxiliaryPicture(AuxiliaryPictureType type)
404e5c4badcSopenharmony_ci{
405e5c4badcSopenharmony_ci    return auxiliaryPictures_.find(type) != auxiliaryPictures_.end();
406e5c4badcSopenharmony_ci}
407e5c4badcSopenharmony_ci
408e5c4badcSopenharmony_cibool Picture::Marshalling(Parcel &data) const
409e5c4badcSopenharmony_ci{
410e5c4badcSopenharmony_ci    if (!mainPixelMap_) {
411e5c4badcSopenharmony_ci        IMAGE_LOGE("Main PixelMap is null.");
412e5c4badcSopenharmony_ci        return false;
413e5c4badcSopenharmony_ci    }
414e5c4badcSopenharmony_ci    if (!mainPixelMap_->Marshalling(data)) {
415e5c4badcSopenharmony_ci        IMAGE_LOGE("Failed to marshal main PixelMap.");
416e5c4badcSopenharmony_ci        return false;
417e5c4badcSopenharmony_ci    }
418e5c4badcSopenharmony_ci
419e5c4badcSopenharmony_ci    size_t numAuxiliaryPictures = auxiliaryPictures_.size();
420e5c4badcSopenharmony_ci    if (!data.WriteUint64(numAuxiliaryPictures)) {
421e5c4badcSopenharmony_ci        IMAGE_LOGE("Failed to write number of auxiliary pictures.");
422e5c4badcSopenharmony_ci        return false;
423e5c4badcSopenharmony_ci    }
424e5c4badcSopenharmony_ci
425e5c4badcSopenharmony_ci    for (const auto &auxiliaryPicture : auxiliaryPictures_) {
426e5c4badcSopenharmony_ci        AuxiliaryPictureType type =  auxiliaryPicture.first;
427e5c4badcSopenharmony_ci
428e5c4badcSopenharmony_ci        if (!data.WriteInt32(static_cast<int32_t>(type))) {
429e5c4badcSopenharmony_ci            IMAGE_LOGE("Failed to write auxiliary picture type.");
430e5c4badcSopenharmony_ci            return false;
431e5c4badcSopenharmony_ci        }
432e5c4badcSopenharmony_ci
433e5c4badcSopenharmony_ci        if (!auxiliaryPicture.second || !auxiliaryPicture.second->Marshalling(data)) {
434e5c4badcSopenharmony_ci            IMAGE_LOGE("Failed to marshal auxiliary picture of type %d.", static_cast<int>(type));
435e5c4badcSopenharmony_ci            return false;
436e5c4badcSopenharmony_ci        }
437e5c4badcSopenharmony_ci    }
438e5c4badcSopenharmony_ci
439e5c4badcSopenharmony_ci    if (!data.WriteBool(maintenanceData_ != nullptr)) {
440e5c4badcSopenharmony_ci        IMAGE_LOGE("Failed to write maintenance data existence value.");
441e5c4badcSopenharmony_ci        return false;
442e5c4badcSopenharmony_ci    }
443e5c4badcSopenharmony_ci
444e5c4badcSopenharmony_ci    if (maintenanceData_ != nullptr) {
445e5c4badcSopenharmony_ci        if (maintenanceData_->WriteToMessageParcel(reinterpret_cast<MessageParcel&>(data)) != GSError::GSERROR_OK) {
446e5c4badcSopenharmony_ci            IMAGE_LOGE("Failed to write maintenance data content.");
447e5c4badcSopenharmony_ci            return false;
448e5c4badcSopenharmony_ci        }
449e5c4badcSopenharmony_ci    }
450e5c4badcSopenharmony_ci
451e5c4badcSopenharmony_ci    if (!data.WriteBool(exifMetadata_ != nullptr)) {
452e5c4badcSopenharmony_ci        IMAGE_LOGE("Failed to write exif data existence value.");
453e5c4badcSopenharmony_ci        return false;
454e5c4badcSopenharmony_ci    }
455e5c4badcSopenharmony_ci
456e5c4badcSopenharmony_ci    if (exifMetadata_ != nullptr) {
457e5c4badcSopenharmony_ci        if (!exifMetadata_->Marshalling(data)) {
458e5c4badcSopenharmony_ci            IMAGE_LOGE("Failed to marshal exif metadata.");
459e5c4badcSopenharmony_ci            return false;
460e5c4badcSopenharmony_ci        }
461e5c4badcSopenharmony_ci    }
462e5c4badcSopenharmony_ci
463e5c4badcSopenharmony_ci    return true;
464e5c4badcSopenharmony_ci}
465e5c4badcSopenharmony_ci
466e5c4badcSopenharmony_ciPicture *Picture::Unmarshalling(Parcel &data)
467e5c4badcSopenharmony_ci{
468e5c4badcSopenharmony_ci    PICTURE_ERR error;
469e5c4badcSopenharmony_ci    Picture* dstPicture = Picture::Unmarshalling(data, error);
470e5c4badcSopenharmony_ci    if (dstPicture == nullptr || error.errorCode != SUCCESS) {
471e5c4badcSopenharmony_ci        IMAGE_LOGE("unmarshalling failed errorCode:%{public}d, errorInfo:%{public}s",
472e5c4badcSopenharmony_ci            error.errorCode, error.errorInfo.c_str());
473e5c4badcSopenharmony_ci    }
474e5c4badcSopenharmony_ci    return dstPicture;
475e5c4badcSopenharmony_ci}
476e5c4badcSopenharmony_ci
477e5c4badcSopenharmony_ciPicture *Picture::Unmarshalling(Parcel &parcel, PICTURE_ERR &error)
478e5c4badcSopenharmony_ci{
479e5c4badcSopenharmony_ci    std::unique_ptr<Picture> picture = std::make_unique<Picture>();
480e5c4badcSopenharmony_ci    std::shared_ptr<PixelMap> pixelmapPtr(PixelMap::Unmarshalling(parcel));
481e5c4badcSopenharmony_ci
482e5c4badcSopenharmony_ci    if (!pixelmapPtr) {
483e5c4badcSopenharmony_ci        IMAGE_LOGE("Failed to unmarshal main PixelMap.");
484e5c4badcSopenharmony_ci        return nullptr;
485e5c4badcSopenharmony_ci    }
486e5c4badcSopenharmony_ci    picture->SetMainPixel(pixelmapPtr);
487e5c4badcSopenharmony_ci    uint64_t numAuxiliaryPictures = parcel.ReadUint64();
488e5c4badcSopenharmony_ci    if (numAuxiliaryPictures > MAX_AUXILIARY_PICTURE_COUNT) {
489e5c4badcSopenharmony_ci        return nullptr;
490e5c4badcSopenharmony_ci    }
491e5c4badcSopenharmony_ci
492e5c4badcSopenharmony_ci    for (size_t i = NUM_0; i < numAuxiliaryPictures; ++i) {
493e5c4badcSopenharmony_ci        int32_t type = parcel.ReadInt32();
494e5c4badcSopenharmony_ci        std::shared_ptr<AuxiliaryPicture> auxPtr(AuxiliaryPicture::Unmarshalling(parcel));
495e5c4badcSopenharmony_ci        if (!auxPtr) {
496e5c4badcSopenharmony_ci            IMAGE_LOGE("Failed to unmarshal auxiliary picture of type %d.", type);
497e5c4badcSopenharmony_ci            return nullptr;
498e5c4badcSopenharmony_ci        }
499e5c4badcSopenharmony_ci        picture->SetAuxiliaryPicture(auxPtr);
500e5c4badcSopenharmony_ci    }
501e5c4badcSopenharmony_ci
502e5c4badcSopenharmony_ci    bool hasMaintenanceData = parcel.ReadBool();
503e5c4badcSopenharmony_ci    if (hasMaintenanceData) {
504e5c4badcSopenharmony_ci        sptr<SurfaceBuffer> surfaceBuffer = SurfaceBuffer::Create();
505e5c4badcSopenharmony_ci        if (surfaceBuffer->ReadFromMessageParcel(reinterpret_cast<MessageParcel&>(parcel)) != GSError::GSERROR_OK) {
506e5c4badcSopenharmony_ci            IMAGE_LOGE("Failed to unmarshal maintenance data");
507e5c4badcSopenharmony_ci            return nullptr;
508e5c4badcSopenharmony_ci        }
509e5c4badcSopenharmony_ci        picture->maintenanceData_ = surfaceBuffer;
510e5c4badcSopenharmony_ci    }
511e5c4badcSopenharmony_ci
512e5c4badcSopenharmony_ci    bool hasExifData = parcel.ReadBool();
513e5c4badcSopenharmony_ci    if (hasExifData) {
514e5c4badcSopenharmony_ci        picture->exifMetadata_ = std::shared_ptr<ExifMetadata>(ExifMetadata::Unmarshalling(parcel));
515e5c4badcSopenharmony_ci    }
516e5c4badcSopenharmony_ci
517e5c4badcSopenharmony_ci    return picture.release();
518e5c4badcSopenharmony_ci}
519e5c4badcSopenharmony_ci
520e5c4badcSopenharmony_ciint32_t Picture::SetExifMetadata(sptr<SurfaceBuffer> &surfaceBuffer)
521e5c4badcSopenharmony_ci{
522e5c4badcSopenharmony_ci    if (surfaceBuffer == nullptr) {
523e5c4badcSopenharmony_ci        return ERR_IMAGE_INVALID_PARAMETER;
524e5c4badcSopenharmony_ci    }
525e5c4badcSopenharmony_ci
526e5c4badcSopenharmony_ci    auto extraData = surfaceBuffer->GetExtraData();
527e5c4badcSopenharmony_ci    if (extraData == nullptr) {
528e5c4badcSopenharmony_ci        return ERR_IMAGE_INVALID_PARAMETER;
529e5c4badcSopenharmony_ci    }
530e5c4badcSopenharmony_ci
531e5c4badcSopenharmony_ci    int32_t size = NUM_0;
532e5c4badcSopenharmony_ci    extraData->ExtraGet(EXIF_DATA_SIZE_TAG, size);
533e5c4badcSopenharmony_ci    if (size <= 0) {
534e5c4badcSopenharmony_ci        IMAGE_LOGE("Invalid buffer size: %d.", size);
535e5c4badcSopenharmony_ci        return ERR_IMAGE_INVALID_PARAMETER;
536e5c4badcSopenharmony_ci    }
537e5c4badcSopenharmony_ci
538e5c4badcSopenharmony_ci    size_t tiffHeaderPos = TiffParser::FindTiffPos(reinterpret_cast<const byte *>(surfaceBuffer->GetVirAddr()), size);
539e5c4badcSopenharmony_ci    if (tiffHeaderPos == std::numeric_limits<size_t>::max()) {
540e5c4badcSopenharmony_ci        IMAGE_LOGE("Input image stream is not tiff type.");
541e5c4badcSopenharmony_ci        return ERR_IMAGE_SOURCE_DATA;
542e5c4badcSopenharmony_ci    }
543e5c4badcSopenharmony_ci
544e5c4badcSopenharmony_ci    ExifData *exifData;
545e5c4badcSopenharmony_ci    TiffParser::Decode(static_cast<const unsigned char *>(surfaceBuffer->GetVirAddr()) + tiffHeaderPos,
546e5c4badcSopenharmony_ci        size - tiffHeaderPos, &exifData);
547e5c4badcSopenharmony_ci    if (exifData == nullptr) {
548e5c4badcSopenharmony_ci        IMAGE_LOGE("Failed to decode EXIF data from image stream.");
549e5c4badcSopenharmony_ci        return ERR_EXIF_DECODE_FAILED;
550e5c4badcSopenharmony_ci    }
551e5c4badcSopenharmony_ci
552e5c4badcSopenharmony_ci    exifMetadata_ = std::make_shared<OHOS::Media::ExifMetadata>(exifData);
553e5c4badcSopenharmony_ci    return SUCCESS;
554e5c4badcSopenharmony_ci}
555e5c4badcSopenharmony_ci
556e5c4badcSopenharmony_ciint32_t Picture::SetExifMetadata(std::shared_ptr<ExifMetadata> exifMetadata)
557e5c4badcSopenharmony_ci{
558e5c4badcSopenharmony_ci    if (exifMetadata == nullptr) {
559e5c4badcSopenharmony_ci        return ERR_IMAGE_INVALID_PARAMETER;
560e5c4badcSopenharmony_ci    }
561e5c4badcSopenharmony_ci    exifMetadata_ = exifMetadata;
562e5c4badcSopenharmony_ci    return SUCCESS;
563e5c4badcSopenharmony_ci}
564e5c4badcSopenharmony_ci
565e5c4badcSopenharmony_cistd::shared_ptr<ExifMetadata> Picture::GetExifMetadata()
566e5c4badcSopenharmony_ci{
567e5c4badcSopenharmony_ci    return exifMetadata_;
568e5c4badcSopenharmony_ci}
569e5c4badcSopenharmony_ci
570e5c4badcSopenharmony_cibool Picture::SetMaintenanceData(sptr<SurfaceBuffer> &surfaceBuffer)
571e5c4badcSopenharmony_ci{
572e5c4badcSopenharmony_ci    if (surfaceBuffer == nullptr) {
573e5c4badcSopenharmony_ci        return false;
574e5c4badcSopenharmony_ci    }
575e5c4badcSopenharmony_ci    maintenanceData_ = surfaceBuffer;
576e5c4badcSopenharmony_ci    return true;
577e5c4badcSopenharmony_ci}
578e5c4badcSopenharmony_ci
579e5c4badcSopenharmony_cisptr<SurfaceBuffer> Picture::GetMaintenanceData() const
580e5c4badcSopenharmony_ci{
581e5c4badcSopenharmony_ci    return maintenanceData_;
582e5c4badcSopenharmony_ci}
583e5c4badcSopenharmony_ci
584e5c4badcSopenharmony_ci} // namespace Media
585e5c4badcSopenharmony_ci} // namespace OHOS
586