• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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