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 #include "buffer_log.h"
18
19 #include "v1_0/buffer_handle_meta_key_type.h"
20
21 using namespace OHOS::HDI::Display::Graphic::Common::V1_0;
22
23 namespace OHOS {
ConvertColorSpaceTypeToInfo(const CM_ColorSpaceType & colorSpaceType,CM_ColorSpaceInfo & colorSpaceInfo)24 GSError MetadataHelper::ConvertColorSpaceTypeToInfo(const CM_ColorSpaceType& colorSpaceType,
25 CM_ColorSpaceInfo& colorSpaceInfo)
26 {
27 uint32_t colorSpace = static_cast<uint32_t>(colorSpaceType);
28 colorSpaceInfo.primaries = static_cast<CM_ColorPrimaries>(colorSpace & PRIMARIES_MASK);
29 colorSpaceInfo.transfunc = static_cast<CM_TransFunc>((colorSpace & TRANSFUNC_MASK) >> TRANSFUNC_OFFSET);
30 colorSpaceInfo.matrix = static_cast<CM_Matrix>((colorSpace & MATRIX_MASK) >> MATRIX_OFFSET);
31 colorSpaceInfo.range = static_cast<CM_Range>((colorSpace & RANGE_MASK) >> RANGE_OFFSET);
32 return GSERROR_OK;
33 }
34
ConvertColorSpaceInfoToType(const CM_ColorSpaceInfo & colorSpaceInfo,CM_ColorSpaceType & colorSpaceType)35 GSError MetadataHelper::ConvertColorSpaceInfoToType(const CM_ColorSpaceInfo& colorSpaceInfo,
36 CM_ColorSpaceType& colorSpaceType)
37 {
38 uint32_t primaries = static_cast<uint32_t>(colorSpaceInfo.primaries);
39 uint32_t transfunc = static_cast<uint32_t>(colorSpaceInfo.transfunc);
40 uint32_t matrix = static_cast<uint32_t>(colorSpaceInfo.matrix);
41 uint32_t range = static_cast<uint32_t>(colorSpaceInfo.range);
42 colorSpaceType = static_cast<CM_ColorSpaceType>(primaries | (transfunc << TRANSFUNC_OFFSET) |
43 (matrix << MATRIX_OFFSET) | (range << RANGE_OFFSET));
44
45 return GSERROR_OK;
46 }
47
SetColorSpaceInfo(sptr<SurfaceBuffer> & buffer,const CM_ColorSpaceInfo & colorSpaceInfo)48 GSError MetadataHelper::SetColorSpaceInfo(sptr<SurfaceBuffer>& buffer, const CM_ColorSpaceInfo& colorSpaceInfo)
49 {
50 if (buffer == nullptr) {
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 return GSERROR_NO_BUFFER;
66 }
67
68 std::vector<uint8_t> colorSpaceInfoVec;
69 auto ret = buffer->GetMetadata(ATTRKEY_COLORSPACE_INFO, colorSpaceInfoVec);
70 if (ret != GSERROR_OK) {
71 return ret;
72 }
73 return ConvertVecToMetadata(colorSpaceInfoVec, colorSpaceInfo);
74 }
75
SetColorSpaceType(sptr<SurfaceBuffer> & buffer,const CM_ColorSpaceType & colorSpaceType)76 GSError MetadataHelper::SetColorSpaceType(sptr<SurfaceBuffer>& buffer, const CM_ColorSpaceType& colorSpaceType)
77 {
78 if (buffer == nullptr) {
79 return GSERROR_NO_BUFFER;
80 }
81
82 CM_ColorSpaceInfo colorSpaceInfo;
83 auto ret = ConvertColorSpaceTypeToInfo(colorSpaceType, colorSpaceInfo);
84 if (ret != GSERROR_OK) {
85 return ret;
86 }
87 return SetColorSpaceInfo(buffer, colorSpaceInfo);
88 }
89
GetColorSpaceType(const sptr<SurfaceBuffer> & buffer,CM_ColorSpaceType & colorSpaceType)90 GSError MetadataHelper::GetColorSpaceType(const sptr<SurfaceBuffer>& buffer, CM_ColorSpaceType& colorSpaceType)
91 {
92 if (buffer == nullptr) {
93 return GSERROR_NO_BUFFER;
94 }
95
96 CM_ColorSpaceInfo colorSpaceInfo;
97 auto ret = GetColorSpaceInfo(buffer, colorSpaceInfo);
98 if (ret != GSERROR_OK) {
99 return ret;
100 }
101 return ConvertColorSpaceInfoToType(colorSpaceInfo, colorSpaceType);
102 }
103
SetHDRMetadataType(sptr<SurfaceBuffer> & buffer,const CM_HDR_Metadata_Type & hdrMetadataType)104 GSError MetadataHelper::SetHDRMetadataType(sptr<SurfaceBuffer>& buffer, const CM_HDR_Metadata_Type& hdrMetadataType)
105 {
106 if (buffer == nullptr) {
107 return GSERROR_NO_BUFFER;
108 }
109
110 std::vector<uint8_t> hdrMetadataTypeVec;
111 auto ret = ConvertMetadataToVec(hdrMetadataType, hdrMetadataTypeVec);
112 if (ret != GSERROR_OK) {
113 return ret;
114 }
115 return buffer->SetMetadata(ATTRKEY_HDR_METADATA_TYPE, hdrMetadataTypeVec);
116 }
117
GetHDRMetadataType(const sptr<SurfaceBuffer> & buffer,CM_HDR_Metadata_Type & hdrMetadataType)118 GSError MetadataHelper::GetHDRMetadataType(const sptr<SurfaceBuffer>& buffer, CM_HDR_Metadata_Type& hdrMetadataType)
119 {
120 if (buffer == nullptr) {
121 return GSERROR_NO_BUFFER;
122 }
123
124 std::vector<uint8_t> hdrMetadataTypeVec;
125 auto ret = buffer->GetMetadata(ATTRKEY_HDR_METADATA_TYPE, hdrMetadataTypeVec);
126 if (ret != GSERROR_OK) {
127 return ret;
128 }
129 return ConvertVecToMetadata(hdrMetadataTypeVec, hdrMetadataType);
130 }
131
SetHDRStaticMetadata(sptr<SurfaceBuffer> & buffer,const HdrStaticMetadata & hdrStaticMetadata)132 GSError MetadataHelper::SetHDRStaticMetadata(sptr<SurfaceBuffer>& buffer,
133 const HdrStaticMetadata& hdrStaticMetadata)
134 {
135 if (buffer == nullptr) {
136 return GSERROR_NO_BUFFER;
137 }
138
139 std::vector<uint8_t> hdrStaticMetadataVec;
140 auto ret = ConvertMetadataToVec(hdrStaticMetadata, hdrStaticMetadataVec);
141 if (ret != GSERROR_OK) {
142 return ret;
143 }
144 return buffer->SetMetadata(ATTRKEY_HDR_STATIC_METADATA, hdrStaticMetadataVec);
145 }
146
GetHDRStaticMetadata(const sptr<SurfaceBuffer> & buffer,HdrStaticMetadata & hdrStaticMetadata)147 GSError MetadataHelper::GetHDRStaticMetadata(const sptr<SurfaceBuffer>& buffer,
148 HdrStaticMetadata& hdrStaticMetadata)
149 {
150 if (buffer == nullptr) {
151 return GSERROR_NO_BUFFER;
152 }
153
154 std::vector<uint8_t> hdrStaticMetadataVec;
155 auto ret = buffer->GetMetadata(ATTRKEY_HDR_STATIC_METADATA, hdrStaticMetadataVec);
156 if (ret != GSERROR_OK) {
157 return ret;
158 }
159 return ConvertVecToMetadata(hdrStaticMetadataVec, hdrStaticMetadata);
160 }
161
SetHDRDynamicMetadata(sptr<SurfaceBuffer> & buffer,const std::vector<uint8_t> & hdrDynamicMetadata)162 GSError MetadataHelper::SetHDRDynamicMetadata(sptr<SurfaceBuffer>& buffer,
163 const std::vector<uint8_t>& hdrDynamicMetadata)
164 {
165 if (buffer == nullptr) {
166 return GSERROR_NO_BUFFER;
167 }
168
169 return buffer->SetMetadata(ATTRKEY_HDR_DYNAMIC_METADATA, hdrDynamicMetadata);
170 }
171
GetHDRDynamicMetadata(const sptr<SurfaceBuffer> & buffer,std::vector<uint8_t> & hdrDynamicMetadata)172 GSError MetadataHelper::GetHDRDynamicMetadata(const sptr<SurfaceBuffer>& buffer,
173 std::vector<uint8_t>& hdrDynamicMetadata)
174 {
175 if (buffer == nullptr) {
176 return GSERROR_NO_BUFFER;
177 }
178
179 return buffer->GetMetadata(ATTRKEY_HDR_DYNAMIC_METADATA, hdrDynamicMetadata);
180 }
181
SetHDRStaticMetadata(sptr<SurfaceBuffer> & buffer,const std::vector<uint8_t> & hdrStaticMetadata)182 GSError MetadataHelper::SetHDRStaticMetadata(sptr<SurfaceBuffer>& buffer,
183 const std::vector<uint8_t>& hdrStaticMetadata)
184 {
185 if (buffer == nullptr) {
186 return GSERROR_NO_BUFFER;
187 }
188
189 return buffer->SetMetadata(ATTRKEY_HDR_STATIC_METADATA, hdrStaticMetadata);
190 }
191
GetHDRStaticMetadata(const sptr<SurfaceBuffer> & buffer,std::vector<uint8_t> & hdrStaticMetadata)192 GSError MetadataHelper::GetHDRStaticMetadata(const sptr<SurfaceBuffer>& buffer,
193 std::vector<uint8_t>& hdrStaticMetadata)
194 {
195 if (buffer == nullptr) {
196 return GSERROR_NO_BUFFER;
197 }
198
199 return buffer->GetMetadata(ATTRKEY_HDR_STATIC_METADATA, hdrStaticMetadata);
200 }
201 } // namespace OHOS