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