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