1 /*
2 * Copyright (c) 2023 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "metadata_helper.h"
17
18 #include "v1_0/buffer_handle_meta_key_type.h"
19
20 using namespace OHOS::HDI::Display::Graphic::Common::V1_0;
21
22 namespace OHOS {
ConvertColorSpaceTypeToInfo(const CM_ColorSpaceType & colorSpaceType,CM_ColorSpaceInfo & colorSpaceInfo)23 GSError MetadataHelper::ConvertColorSpaceTypeToInfo(const CM_ColorSpaceType& colorSpaceType,
24 CM_ColorSpaceInfo& colorSpaceInfo)
25 {
26 uint32_t colorSpace = static_cast<uint32_t>(colorSpaceType);
27 colorSpaceInfo.primaries = static_cast<CM_ColorPrimaries>(colorSpace & PRIMARIES_MASK);
28 colorSpaceInfo.transfunc = static_cast<CM_TransFunc>((colorSpace & TRANSFUNC_MASK) >> TRANSFUNC_OFFSET);
29 colorSpaceInfo.matrix = static_cast<CM_Matrix>((colorSpace & MATRIX_MASK) >> MATRIX_OFFSET);
30 colorSpaceInfo.range = static_cast<CM_Range>((colorSpace & RANGE_MASK) >> RANGE_OFFSET);
31 return GSERROR_OK;
32 }
33
ConvertColorSpaceInfoToType(const CM_ColorSpaceInfo & colorSpaceInfo,CM_ColorSpaceType & colorSpaceType)34 GSError MetadataHelper::ConvertColorSpaceInfoToType(const CM_ColorSpaceInfo& colorSpaceInfo,
35 CM_ColorSpaceType& colorSpaceType)
36 {
37 uint32_t primaries = static_cast<uint32_t>(colorSpaceInfo.primaries);
38 uint32_t transfunc = static_cast<uint32_t>(colorSpaceInfo.transfunc);
39 uint32_t matrix = static_cast<uint32_t>(colorSpaceInfo.matrix);
40 uint32_t range = static_cast<uint32_t>(colorSpaceInfo.range);
41 colorSpaceType = static_cast<CM_ColorSpaceType>(primaries | (transfunc << TRANSFUNC_OFFSET) |
42 (matrix << MATRIX_OFFSET) | (range << RANGE_OFFSET));
43
44 return GSERROR_OK;
45 }
46
SetColorSpaceInfo(sptr<SurfaceBuffer> & buffer,const CM_ColorSpaceInfo & colorSpaceInfo)47 GSError MetadataHelper::SetColorSpaceInfo(sptr<SurfaceBuffer>& buffer, const CM_ColorSpaceInfo& colorSpaceInfo)
48 {
49 std::vector<uint8_t> colorSpaceInfoVec;
50 auto ret = ConvertMetadataToVec(colorSpaceInfo, colorSpaceInfoVec);
51 if (ret != GSERROR_OK) {
52 BLOGW("MetadataHelper::SetColorSpaceInfo ConvertMetadataToVec failed, return value is %{public}d", ret);
53 return ret;
54 }
55 return buffer->SetMetadata(ATTRKEY_COLORSPACE_INFO, colorSpaceInfoVec);
56 }
57
GetColorSpaceInfo(const sptr<SurfaceBuffer> & buffer,CM_ColorSpaceInfo & colorSpaceInfo)58 GSError MetadataHelper::GetColorSpaceInfo(const sptr<SurfaceBuffer>& buffer, CM_ColorSpaceInfo& colorSpaceInfo)
59 {
60 std::vector<uint8_t> colorSpaceInfoVec;
61 auto ret = buffer->GetMetadata(ATTRKEY_COLORSPACE_INFO, colorSpaceInfoVec);
62 if (ret != GSERROR_OK) {
63 BLOGW("MetadataHelper::GetColorSpaceInfo GetMetadata failed, return value is %{public}d", ret);
64 return ret;
65 }
66 return ConvertVecToMetadata(colorSpaceInfoVec, colorSpaceInfo);
67 }
68
SetColorSpaceType(sptr<SurfaceBuffer> & buffer,const CM_ColorSpaceType & colorSpaceType)69 GSError MetadataHelper::SetColorSpaceType(sptr<SurfaceBuffer>& buffer, const CM_ColorSpaceType& colorSpaceType)
70 {
71 CM_ColorSpaceInfo colorSpaceInfo;
72 auto ret = ConvertColorSpaceTypeToInfo(colorSpaceType, colorSpaceInfo);
73 if (ret != GSERROR_OK) {
74 BLOGW("MetadataHelper::SetColorSpaceType ConvertColorSpaceTypeToInfo failed, return value is %{public}d", ret);
75 return ret;
76 }
77 return SetColorSpaceInfo(buffer, colorSpaceInfo);
78 }
79
GetColorSpaceType(const sptr<SurfaceBuffer> & buffer,CM_ColorSpaceType & colorSpaceType)80 GSError MetadataHelper::GetColorSpaceType(const sptr<SurfaceBuffer>& buffer, CM_ColorSpaceType& colorSpaceType)
81 {
82 CM_ColorSpaceInfo colorSpaceInfo;
83 auto ret = GetColorSpaceInfo(buffer, colorSpaceInfo);
84 if (ret != GSERROR_OK) {
85 BLOGW("MetadataHelper::GetColorSpaceType GetColorSpaceInfo failed, return value is %{public}d", ret);
86 return ret;
87 }
88 return ConvertColorSpaceInfoToType(colorSpaceInfo, colorSpaceType);
89 }
90
SetHDRMetadataType(sptr<SurfaceBuffer> & buffer,const CM_HDR_Metadata_Type & hdrMetadataType)91 GSError MetadataHelper::SetHDRMetadataType(sptr<SurfaceBuffer>& buffer, const CM_HDR_Metadata_Type& hdrMetadataType)
92 {
93 std::vector<uint8_t> hdrMetadataTypeVec;
94 auto ret = ConvertMetadataToVec(hdrMetadataType, hdrMetadataTypeVec);
95 if (ret != GSERROR_OK) {
96 BLOGW("MetadataHelper::SetHDRMetadataType ConvertMetadataToVec failed, return value is %{public}d", ret);
97 return ret;
98 }
99 return buffer->SetMetadata(ATTRKEY_HDR_METADATA_TYPE, hdrMetadataTypeVec);
100 }
101
GetHDRMetadataType(const sptr<SurfaceBuffer> & buffer,CM_HDR_Metadata_Type & hdrMetadataType)102 GSError MetadataHelper::GetHDRMetadataType(const sptr<SurfaceBuffer>& buffer, CM_HDR_Metadata_Type& hdrMetadataType)
103 {
104 std::vector<uint8_t> hdrMetadataTypeVec;
105 auto ret = buffer->GetMetadata(ATTRKEY_HDR_METADATA_TYPE, hdrMetadataTypeVec);
106 if (ret != GSERROR_OK) {
107 BLOGW("MetadataHelper::GetHDRMetadataType GetMetadata failed, return value is %{public}d", ret);
108 return ret;
109 }
110 return ConvertVecToMetadata(hdrMetadataTypeVec, hdrMetadataType);
111 }
112
SetHDRStaticMetadata(sptr<SurfaceBuffer> & buffer,const HdrStaticMetadata & hdrStaticMetadata)113 GSError MetadataHelper::SetHDRStaticMetadata(sptr<SurfaceBuffer>& buffer,
114 const HdrStaticMetadata& hdrStaticMetadata)
115 {
116 std::vector<uint8_t> hdrStaticMetadataVec;
117 auto ret = ConvertMetadataToVec(hdrStaticMetadata, hdrStaticMetadataVec);
118 if (ret != GSERROR_OK) {
119 BLOGW("MetadataHelper::SetHDRStaticMetadata ConvertMetadataToVec failed, return value is %{public}d", ret);
120 return ret;
121 }
122 return buffer->SetMetadata(ATTRKEY_HDR_STATIC_METADATA, hdrStaticMetadataVec);
123 }
124
GetHDRStaticMetadata(const sptr<SurfaceBuffer> & buffer,HdrStaticMetadata & hdrStaticMetadata)125 GSError MetadataHelper::GetHDRStaticMetadata(const sptr<SurfaceBuffer>& buffer,
126 HdrStaticMetadata& hdrStaticMetadata)
127 {
128 std::vector<uint8_t> hdrStaticMetadataVec;
129 auto ret = buffer->GetMetadata(ATTRKEY_HDR_STATIC_METADATA, hdrStaticMetadataVec);
130 if (ret != GSERROR_OK) {
131 BLOGW("MetadataHelper::GetHDRStaticMetadata GetMetadata failed, return value is %{public}d", ret);
132 return ret;
133 }
134 return ConvertVecToMetadata(hdrStaticMetadataVec, hdrStaticMetadata);
135 }
136
SetHDRDynamicMetadata(sptr<SurfaceBuffer> & buffer,const std::vector<uint8_t> & hdrDynamicMetadata)137 GSError MetadataHelper::SetHDRDynamicMetadata(sptr<SurfaceBuffer>& buffer,
138 const std::vector<uint8_t>& hdrDynamicMetadata)
139 {
140 return buffer->SetMetadata(ATTRKEY_HDR_DYNAMIC_METADATA, hdrDynamicMetadata);
141 }
142
GetHDRDynamicMetadata(const sptr<SurfaceBuffer> & buffer,std::vector<uint8_t> & hdrDynamicMetadata)143 GSError MetadataHelper::GetHDRDynamicMetadata(const sptr<SurfaceBuffer>& buffer,
144 std::vector<uint8_t>& hdrDynamicMetadata)
145 {
146 return buffer->GetMetadata(ATTRKEY_HDR_DYNAMIC_METADATA, hdrDynamicMetadata);
147 }
148
SetHDRStaticMetadata(sptr<SurfaceBuffer> & buffer,const std::vector<uint8_t> & hdrStaticMetadata)149 GSError MetadataHelper::SetHDRStaticMetadata(sptr<SurfaceBuffer>& buffer,
150 const std::vector<uint8_t>& hdrStaticMetadata)
151 {
152 return buffer->SetMetadata(ATTRKEY_HDR_STATIC_METADATA, hdrStaticMetadata);
153 }
154
GetHDRStaticMetadata(const sptr<SurfaceBuffer> & buffer,std::vector<uint8_t> & hdrStaticMetadata)155 GSError MetadataHelper::GetHDRStaticMetadata(const sptr<SurfaceBuffer>& buffer,
156 std::vector<uint8_t>& hdrStaticMetadata)
157 {
158 return buffer->GetMetadata(ATTRKEY_HDR_STATIC_METADATA, hdrStaticMetadata);
159 }
160 } // namespace OHOS