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