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 if (buffer == nullptr) {
50 BLOGW("MetadataHelper::SetColorSpaceInfo null buffer");
51 return GSERROR_NO_BUFFER;
52 }
53
54 std::vector<uint8_t> colorSpaceInfoVec;
55 auto ret = ConvertMetadataToVec(colorSpaceInfo, colorSpaceInfoVec);
56 if (ret != GSERROR_OK) {
57 return ret;
58 }
59 return buffer->SetMetadata(ATTRKEY_COLORSPACE_INFO, colorSpaceInfoVec);
60 }
61
GetColorSpaceInfo(const sptr<SurfaceBuffer> & buffer,CM_ColorSpaceInfo & colorSpaceInfo)62 GSError MetadataHelper::GetColorSpaceInfo(const sptr<SurfaceBuffer>& buffer, CM_ColorSpaceInfo& colorSpaceInfo)
63 {
64 if (buffer == nullptr) {
65 BLOGW("MetadataHelper::GetColorSpaceInfo null buffer");
66 return GSERROR_NO_BUFFER;
67 }
68
69 std::vector<uint8_t> colorSpaceInfoVec;
70 auto ret = buffer->GetMetadata(ATTRKEY_COLORSPACE_INFO, colorSpaceInfoVec);
71 if (ret != GSERROR_OK) {
72 return ret;
73 }
74 return ConvertVecToMetadata(colorSpaceInfoVec, colorSpaceInfo);
75 }
76
SetColorSpaceType(sptr<SurfaceBuffer> & buffer,const CM_ColorSpaceType & colorSpaceType)77 GSError MetadataHelper::SetColorSpaceType(sptr<SurfaceBuffer>& buffer, const CM_ColorSpaceType& colorSpaceType)
78 {
79 if (buffer == nullptr) {
80 BLOGW("MetadataHelper::SetColorSpaceType null buffer");
81 return GSERROR_NO_BUFFER;
82 }
83
84 CM_ColorSpaceInfo colorSpaceInfo;
85 auto ret = ConvertColorSpaceTypeToInfo(colorSpaceType, colorSpaceInfo);
86 if (ret != GSERROR_OK) {
87 return ret;
88 }
89 return SetColorSpaceInfo(buffer, colorSpaceInfo);
90 }
91
GetColorSpaceType(const sptr<SurfaceBuffer> & buffer,CM_ColorSpaceType & colorSpaceType)92 GSError MetadataHelper::GetColorSpaceType(const sptr<SurfaceBuffer>& buffer, CM_ColorSpaceType& colorSpaceType)
93 {
94 if (buffer == nullptr) {
95 BLOGW("MetadataHelper::GetColorSpaceType null buffer");
96 return GSERROR_NO_BUFFER;
97 }
98
99 CM_ColorSpaceInfo colorSpaceInfo;
100 auto ret = GetColorSpaceInfo(buffer, colorSpaceInfo);
101 if (ret != GSERROR_OK) {
102 return ret;
103 }
104 return ConvertColorSpaceInfoToType(colorSpaceInfo, colorSpaceType);
105 }
106
SetHDRMetadataType(sptr<SurfaceBuffer> & buffer,const CM_HDR_Metadata_Type & hdrMetadataType)107 GSError MetadataHelper::SetHDRMetadataType(sptr<SurfaceBuffer>& buffer, const CM_HDR_Metadata_Type& hdrMetadataType)
108 {
109 if (buffer == nullptr) {
110 BLOGW("MetadataHelper::SetHDRMetadataType null buffer");
111 return GSERROR_NO_BUFFER;
112 }
113
114 std::vector<uint8_t> hdrMetadataTypeVec;
115 auto ret = ConvertMetadataToVec(hdrMetadataType, hdrMetadataTypeVec);
116 if (ret != GSERROR_OK) {
117 return ret;
118 }
119 return buffer->SetMetadata(ATTRKEY_HDR_METADATA_TYPE, hdrMetadataTypeVec);
120 }
121
GetHDRMetadataType(const sptr<SurfaceBuffer> & buffer,CM_HDR_Metadata_Type & hdrMetadataType)122 GSError MetadataHelper::GetHDRMetadataType(const sptr<SurfaceBuffer>& buffer, CM_HDR_Metadata_Type& hdrMetadataType)
123 {
124 if (buffer == nullptr) {
125 BLOGW("MetadataHelper::GetHDRMetadataType null buffer");
126 return GSERROR_NO_BUFFER;
127 }
128
129 std::vector<uint8_t> hdrMetadataTypeVec;
130 auto ret = buffer->GetMetadata(ATTRKEY_HDR_METADATA_TYPE, hdrMetadataTypeVec);
131 if (ret != GSERROR_OK) {
132 return ret;
133 }
134 return ConvertVecToMetadata(hdrMetadataTypeVec, hdrMetadataType);
135 }
136
SetHDRStaticMetadata(sptr<SurfaceBuffer> & buffer,const HdrStaticMetadata & hdrStaticMetadata)137 GSError MetadataHelper::SetHDRStaticMetadata(sptr<SurfaceBuffer>& buffer,
138 const HdrStaticMetadata& hdrStaticMetadata)
139 {
140 if (buffer == nullptr) {
141 BLOGW("MetadataHelper::SetHDRStaticMetadata null buffer");
142 return GSERROR_NO_BUFFER;
143 }
144
145 std::vector<uint8_t> hdrStaticMetadataVec;
146 auto ret = ConvertMetadataToVec(hdrStaticMetadata, hdrStaticMetadataVec);
147 if (ret != GSERROR_OK) {
148 return ret;
149 }
150 return buffer->SetMetadata(ATTRKEY_HDR_STATIC_METADATA, hdrStaticMetadataVec);
151 }
152
GetHDRStaticMetadata(const sptr<SurfaceBuffer> & buffer,HdrStaticMetadata & hdrStaticMetadata)153 GSError MetadataHelper::GetHDRStaticMetadata(const sptr<SurfaceBuffer>& buffer,
154 HdrStaticMetadata& hdrStaticMetadata)
155 {
156 if (buffer == nullptr) {
157 BLOGW("MetadataHelper::GetHDRStaticMetadata null buffer");
158 return GSERROR_NO_BUFFER;
159 }
160
161 std::vector<uint8_t> hdrStaticMetadataVec;
162 auto ret = buffer->GetMetadata(ATTRKEY_HDR_STATIC_METADATA, hdrStaticMetadataVec);
163 if (ret != GSERROR_OK) {
164 return ret;
165 }
166 return ConvertVecToMetadata(hdrStaticMetadataVec, hdrStaticMetadata);
167 }
168
SetHDRDynamicMetadata(sptr<SurfaceBuffer> & buffer,const std::vector<uint8_t> & hdrDynamicMetadata)169 GSError MetadataHelper::SetHDRDynamicMetadata(sptr<SurfaceBuffer>& buffer,
170 const std::vector<uint8_t>& hdrDynamicMetadata)
171 {
172 if (buffer == nullptr) {
173 BLOGW("MetadataHelper::SetHDRDynamicMetadata null buffer");
174 return GSERROR_NO_BUFFER;
175 }
176
177 return buffer->SetMetadata(ATTRKEY_HDR_DYNAMIC_METADATA, hdrDynamicMetadata);
178 }
179
GetHDRDynamicMetadata(const sptr<SurfaceBuffer> & buffer,std::vector<uint8_t> & hdrDynamicMetadata)180 GSError MetadataHelper::GetHDRDynamicMetadata(const sptr<SurfaceBuffer>& buffer,
181 std::vector<uint8_t>& hdrDynamicMetadata)
182 {
183 if (buffer == nullptr) {
184 BLOGW("MetadataHelper::GetHDRDynamicMetadata null buffer");
185 return GSERROR_NO_BUFFER;
186 }
187
188 return buffer->GetMetadata(ATTRKEY_HDR_DYNAMIC_METADATA, hdrDynamicMetadata);
189 }
190
SetHDRStaticMetadata(sptr<SurfaceBuffer> & buffer,const std::vector<uint8_t> & hdrStaticMetadata)191 GSError MetadataHelper::SetHDRStaticMetadata(sptr<SurfaceBuffer>& buffer,
192 const std::vector<uint8_t>& hdrStaticMetadata)
193 {
194 if (buffer == nullptr) {
195 BLOGW("MetadataHelper::SetHDRStaticMetadata null buffer");
196 return GSERROR_NO_BUFFER;
197 }
198
199 return buffer->SetMetadata(ATTRKEY_HDR_STATIC_METADATA, hdrStaticMetadata);
200 }
201
GetHDRStaticMetadata(const sptr<SurfaceBuffer> & buffer,std::vector<uint8_t> & hdrStaticMetadata)202 GSError MetadataHelper::GetHDRStaticMetadata(const sptr<SurfaceBuffer>& buffer,
203 std::vector<uint8_t>& hdrStaticMetadata)
204 {
205 if (buffer == nullptr) {
206 BLOGW("MetadataHelper::GetHDRStaticMetadata null buffer");
207 return GSERROR_NO_BUFFER;
208 }
209
210 return buffer->GetMetadata(ATTRKEY_HDR_STATIC_METADATA, hdrStaticMetadata);
211 }
212 } // namespace OHOS