132a6e48fSopenharmony_ci/* 232a6e48fSopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd. 332a6e48fSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 432a6e48fSopenharmony_ci * you may not use this file except in compliance with the License. 532a6e48fSopenharmony_ci * You may obtain a copy of the License at 632a6e48fSopenharmony_ci * 732a6e48fSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 832a6e48fSopenharmony_ci * 932a6e48fSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 1032a6e48fSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 1132a6e48fSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1232a6e48fSopenharmony_ci * See the License for the specific language governing permissions and 1332a6e48fSopenharmony_ci * limitations under the License. 1432a6e48fSopenharmony_ci */ 1532a6e48fSopenharmony_ci 1632a6e48fSopenharmony_ci#include "metadata_helper.h" 1732a6e48fSopenharmony_ci#include "buffer_log.h" 1832a6e48fSopenharmony_ci 1932a6e48fSopenharmony_ci#include "v1_0/buffer_handle_meta_key_type.h" 2032a6e48fSopenharmony_ci 2132a6e48fSopenharmony_ciusing namespace OHOS::HDI::Display::Graphic::Common::V1_0; 2232a6e48fSopenharmony_ci 2332a6e48fSopenharmony_cinamespace OHOS { 2432a6e48fSopenharmony_ciGSError MetadataHelper::ConvertColorSpaceTypeToInfo(const CM_ColorSpaceType& colorSpaceType, 2532a6e48fSopenharmony_ci CM_ColorSpaceInfo& colorSpaceInfo) 2632a6e48fSopenharmony_ci{ 2732a6e48fSopenharmony_ci uint32_t colorSpace = static_cast<uint32_t>(colorSpaceType); 2832a6e48fSopenharmony_ci colorSpaceInfo.primaries = static_cast<CM_ColorPrimaries>(colorSpace & PRIMARIES_MASK); 2932a6e48fSopenharmony_ci colorSpaceInfo.transfunc = static_cast<CM_TransFunc>((colorSpace & TRANSFUNC_MASK) >> TRANSFUNC_OFFSET); 3032a6e48fSopenharmony_ci colorSpaceInfo.matrix = static_cast<CM_Matrix>((colorSpace & MATRIX_MASK) >> MATRIX_OFFSET); 3132a6e48fSopenharmony_ci colorSpaceInfo.range = static_cast<CM_Range>((colorSpace & RANGE_MASK) >> RANGE_OFFSET); 3232a6e48fSopenharmony_ci return GSERROR_OK; 3332a6e48fSopenharmony_ci} 3432a6e48fSopenharmony_ci 3532a6e48fSopenharmony_ciGSError MetadataHelper::ConvertColorSpaceInfoToType(const CM_ColorSpaceInfo& colorSpaceInfo, 3632a6e48fSopenharmony_ci CM_ColorSpaceType& colorSpaceType) 3732a6e48fSopenharmony_ci{ 3832a6e48fSopenharmony_ci uint32_t primaries = static_cast<uint32_t>(colorSpaceInfo.primaries); 3932a6e48fSopenharmony_ci uint32_t transfunc = static_cast<uint32_t>(colorSpaceInfo.transfunc); 4032a6e48fSopenharmony_ci uint32_t matrix = static_cast<uint32_t>(colorSpaceInfo.matrix); 4132a6e48fSopenharmony_ci uint32_t range = static_cast<uint32_t>(colorSpaceInfo.range); 4232a6e48fSopenharmony_ci colorSpaceType = static_cast<CM_ColorSpaceType>(primaries | (transfunc << TRANSFUNC_OFFSET) | 4332a6e48fSopenharmony_ci (matrix << MATRIX_OFFSET) | (range << RANGE_OFFSET)); 4432a6e48fSopenharmony_ci 4532a6e48fSopenharmony_ci return GSERROR_OK; 4632a6e48fSopenharmony_ci} 4732a6e48fSopenharmony_ci 4832a6e48fSopenharmony_ciGSError MetadataHelper::SetColorSpaceInfo(sptr<SurfaceBuffer>& buffer, const CM_ColorSpaceInfo& colorSpaceInfo) 4932a6e48fSopenharmony_ci{ 5032a6e48fSopenharmony_ci if (buffer == nullptr) { 5132a6e48fSopenharmony_ci return GSERROR_NO_BUFFER; 5232a6e48fSopenharmony_ci } 5332a6e48fSopenharmony_ci 5432a6e48fSopenharmony_ci std::vector<uint8_t> colorSpaceInfoVec; 5532a6e48fSopenharmony_ci auto ret = ConvertMetadataToVec(colorSpaceInfo, colorSpaceInfoVec); 5632a6e48fSopenharmony_ci if (ret != GSERROR_OK) { 5732a6e48fSopenharmony_ci return ret; 5832a6e48fSopenharmony_ci } 5932a6e48fSopenharmony_ci return buffer->SetMetadata(ATTRKEY_COLORSPACE_INFO, colorSpaceInfoVec); 6032a6e48fSopenharmony_ci} 6132a6e48fSopenharmony_ci 6232a6e48fSopenharmony_ciGSError MetadataHelper::GetColorSpaceInfo(const sptr<SurfaceBuffer>& buffer, CM_ColorSpaceInfo& colorSpaceInfo) 6332a6e48fSopenharmony_ci{ 6432a6e48fSopenharmony_ci if (buffer == nullptr) { 6532a6e48fSopenharmony_ci return GSERROR_NO_BUFFER; 6632a6e48fSopenharmony_ci } 6732a6e48fSopenharmony_ci 6832a6e48fSopenharmony_ci std::vector<uint8_t> colorSpaceInfoVec; 6932a6e48fSopenharmony_ci auto ret = buffer->GetMetadata(ATTRKEY_COLORSPACE_INFO, colorSpaceInfoVec); 7032a6e48fSopenharmony_ci if (ret != GSERROR_OK) { 7132a6e48fSopenharmony_ci return ret; 7232a6e48fSopenharmony_ci } 7332a6e48fSopenharmony_ci return ConvertVecToMetadata(colorSpaceInfoVec, colorSpaceInfo); 7432a6e48fSopenharmony_ci} 7532a6e48fSopenharmony_ci 7632a6e48fSopenharmony_ciGSError MetadataHelper::SetColorSpaceType(sptr<SurfaceBuffer>& buffer, const CM_ColorSpaceType& colorSpaceType) 7732a6e48fSopenharmony_ci{ 7832a6e48fSopenharmony_ci if (buffer == nullptr) { 7932a6e48fSopenharmony_ci return GSERROR_NO_BUFFER; 8032a6e48fSopenharmony_ci } 8132a6e48fSopenharmony_ci 8232a6e48fSopenharmony_ci CM_ColorSpaceInfo colorSpaceInfo; 8332a6e48fSopenharmony_ci auto ret = ConvertColorSpaceTypeToInfo(colorSpaceType, colorSpaceInfo); 8432a6e48fSopenharmony_ci if (ret != GSERROR_OK) { 8532a6e48fSopenharmony_ci return ret; 8632a6e48fSopenharmony_ci } 8732a6e48fSopenharmony_ci return SetColorSpaceInfo(buffer, colorSpaceInfo); 8832a6e48fSopenharmony_ci} 8932a6e48fSopenharmony_ci 9032a6e48fSopenharmony_ciGSError MetadataHelper::GetColorSpaceType(const sptr<SurfaceBuffer>& buffer, CM_ColorSpaceType& colorSpaceType) 9132a6e48fSopenharmony_ci{ 9232a6e48fSopenharmony_ci if (buffer == nullptr) { 9332a6e48fSopenharmony_ci return GSERROR_NO_BUFFER; 9432a6e48fSopenharmony_ci } 9532a6e48fSopenharmony_ci 9632a6e48fSopenharmony_ci CM_ColorSpaceInfo colorSpaceInfo; 9732a6e48fSopenharmony_ci auto ret = GetColorSpaceInfo(buffer, colorSpaceInfo); 9832a6e48fSopenharmony_ci if (ret != GSERROR_OK) { 9932a6e48fSopenharmony_ci return ret; 10032a6e48fSopenharmony_ci } 10132a6e48fSopenharmony_ci return ConvertColorSpaceInfoToType(colorSpaceInfo, colorSpaceType); 10232a6e48fSopenharmony_ci} 10332a6e48fSopenharmony_ci 10432a6e48fSopenharmony_ciGSError MetadataHelper::SetHDRMetadataType(sptr<SurfaceBuffer>& buffer, const CM_HDR_Metadata_Type& hdrMetadataType) 10532a6e48fSopenharmony_ci{ 10632a6e48fSopenharmony_ci if (buffer == nullptr) { 10732a6e48fSopenharmony_ci return GSERROR_NO_BUFFER; 10832a6e48fSopenharmony_ci } 10932a6e48fSopenharmony_ci 11032a6e48fSopenharmony_ci std::vector<uint8_t> hdrMetadataTypeVec; 11132a6e48fSopenharmony_ci auto ret = ConvertMetadataToVec(hdrMetadataType, hdrMetadataTypeVec); 11232a6e48fSopenharmony_ci if (ret != GSERROR_OK) { 11332a6e48fSopenharmony_ci return ret; 11432a6e48fSopenharmony_ci } 11532a6e48fSopenharmony_ci return buffer->SetMetadata(ATTRKEY_HDR_METADATA_TYPE, hdrMetadataTypeVec); 11632a6e48fSopenharmony_ci} 11732a6e48fSopenharmony_ci 11832a6e48fSopenharmony_ciGSError MetadataHelper::GetHDRMetadataType(const sptr<SurfaceBuffer>& buffer, CM_HDR_Metadata_Type& hdrMetadataType) 11932a6e48fSopenharmony_ci{ 12032a6e48fSopenharmony_ci if (buffer == nullptr) { 12132a6e48fSopenharmony_ci return GSERROR_NO_BUFFER; 12232a6e48fSopenharmony_ci } 12332a6e48fSopenharmony_ci 12432a6e48fSopenharmony_ci std::vector<uint8_t> hdrMetadataTypeVec; 12532a6e48fSopenharmony_ci auto ret = buffer->GetMetadata(ATTRKEY_HDR_METADATA_TYPE, hdrMetadataTypeVec); 12632a6e48fSopenharmony_ci if (ret != GSERROR_OK) { 12732a6e48fSopenharmony_ci return ret; 12832a6e48fSopenharmony_ci } 12932a6e48fSopenharmony_ci return ConvertVecToMetadata(hdrMetadataTypeVec, hdrMetadataType); 13032a6e48fSopenharmony_ci} 13132a6e48fSopenharmony_ci 13232a6e48fSopenharmony_ciGSError MetadataHelper::SetHDRStaticMetadata(sptr<SurfaceBuffer>& buffer, 13332a6e48fSopenharmony_ci const HdrStaticMetadata& hdrStaticMetadata) 13432a6e48fSopenharmony_ci{ 13532a6e48fSopenharmony_ci if (buffer == nullptr) { 13632a6e48fSopenharmony_ci return GSERROR_NO_BUFFER; 13732a6e48fSopenharmony_ci } 13832a6e48fSopenharmony_ci 13932a6e48fSopenharmony_ci std::vector<uint8_t> hdrStaticMetadataVec; 14032a6e48fSopenharmony_ci auto ret = ConvertMetadataToVec(hdrStaticMetadata, hdrStaticMetadataVec); 14132a6e48fSopenharmony_ci if (ret != GSERROR_OK) { 14232a6e48fSopenharmony_ci return ret; 14332a6e48fSopenharmony_ci } 14432a6e48fSopenharmony_ci return buffer->SetMetadata(ATTRKEY_HDR_STATIC_METADATA, hdrStaticMetadataVec); 14532a6e48fSopenharmony_ci} 14632a6e48fSopenharmony_ci 14732a6e48fSopenharmony_ciGSError MetadataHelper::GetHDRStaticMetadata(const sptr<SurfaceBuffer>& buffer, 14832a6e48fSopenharmony_ci HdrStaticMetadata& hdrStaticMetadata) 14932a6e48fSopenharmony_ci{ 15032a6e48fSopenharmony_ci if (buffer == nullptr) { 15132a6e48fSopenharmony_ci return GSERROR_NO_BUFFER; 15232a6e48fSopenharmony_ci } 15332a6e48fSopenharmony_ci 15432a6e48fSopenharmony_ci std::vector<uint8_t> hdrStaticMetadataVec; 15532a6e48fSopenharmony_ci auto ret = buffer->GetMetadata(ATTRKEY_HDR_STATIC_METADATA, hdrStaticMetadataVec); 15632a6e48fSopenharmony_ci if (ret != GSERROR_OK) { 15732a6e48fSopenharmony_ci return ret; 15832a6e48fSopenharmony_ci } 15932a6e48fSopenharmony_ci return ConvertVecToMetadata(hdrStaticMetadataVec, hdrStaticMetadata); 16032a6e48fSopenharmony_ci} 16132a6e48fSopenharmony_ci 16232a6e48fSopenharmony_ciGSError MetadataHelper::SetHDRDynamicMetadata(sptr<SurfaceBuffer>& buffer, 16332a6e48fSopenharmony_ci const std::vector<uint8_t>& hdrDynamicMetadata) 16432a6e48fSopenharmony_ci{ 16532a6e48fSopenharmony_ci if (buffer == nullptr) { 16632a6e48fSopenharmony_ci return GSERROR_NO_BUFFER; 16732a6e48fSopenharmony_ci } 16832a6e48fSopenharmony_ci 16932a6e48fSopenharmony_ci return buffer->SetMetadata(ATTRKEY_HDR_DYNAMIC_METADATA, hdrDynamicMetadata); 17032a6e48fSopenharmony_ci} 17132a6e48fSopenharmony_ci 17232a6e48fSopenharmony_ciGSError MetadataHelper::GetHDRDynamicMetadata(const sptr<SurfaceBuffer>& buffer, 17332a6e48fSopenharmony_ci std::vector<uint8_t>& hdrDynamicMetadata) 17432a6e48fSopenharmony_ci{ 17532a6e48fSopenharmony_ci if (buffer == nullptr) { 17632a6e48fSopenharmony_ci return GSERROR_NO_BUFFER; 17732a6e48fSopenharmony_ci } 17832a6e48fSopenharmony_ci 17932a6e48fSopenharmony_ci return buffer->GetMetadata(ATTRKEY_HDR_DYNAMIC_METADATA, hdrDynamicMetadata); 18032a6e48fSopenharmony_ci} 18132a6e48fSopenharmony_ci 18232a6e48fSopenharmony_ciGSError MetadataHelper::SetHDRStaticMetadata(sptr<SurfaceBuffer>& buffer, 18332a6e48fSopenharmony_ci const std::vector<uint8_t>& hdrStaticMetadata) 18432a6e48fSopenharmony_ci{ 18532a6e48fSopenharmony_ci if (buffer == nullptr) { 18632a6e48fSopenharmony_ci return GSERROR_NO_BUFFER; 18732a6e48fSopenharmony_ci } 18832a6e48fSopenharmony_ci 18932a6e48fSopenharmony_ci return buffer->SetMetadata(ATTRKEY_HDR_STATIC_METADATA, hdrStaticMetadata); 19032a6e48fSopenharmony_ci} 19132a6e48fSopenharmony_ci 19232a6e48fSopenharmony_ciGSError MetadataHelper::GetHDRStaticMetadata(const sptr<SurfaceBuffer>& buffer, 19332a6e48fSopenharmony_ci std::vector<uint8_t>& hdrStaticMetadata) 19432a6e48fSopenharmony_ci{ 19532a6e48fSopenharmony_ci if (buffer == nullptr) { 19632a6e48fSopenharmony_ci return GSERROR_NO_BUFFER; 19732a6e48fSopenharmony_ci } 19832a6e48fSopenharmony_ci 19932a6e48fSopenharmony_ci return buffer->GetMetadata(ATTRKEY_HDR_STATIC_METADATA, hdrStaticMetadata); 20032a6e48fSopenharmony_ci} 20132a6e48fSopenharmony_ci} // namespace OHOS