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 #ifndef FRAMEWORKS_SURFACE_INCLUDE_METADATA_MANAGER_H
17 #define FRAMEWORKS_SURFACE_INCLUDE_METADATA_MANAGER_H
18 
19 #include <vector>
20 
21 #include <securec.h>
22 
23 #include "graphic_common.h"
24 #include "surface_buffer.h"
25 #include "v1_0/cm_color_space.h"
26 #include "v1_0/hdr_static_metadata.h"
27 
28 namespace OHOS {
29 class MetadataHelper {
30 public:
31     // GSERROR_OK for success, GSERROR_API_FAILED for fail
32     template <typename T>
ConvertMetadataToVec(const T & metadata,std::vector<uint8_t> & data)33     static GSError ConvertMetadataToVec(const T& metadata, std::vector<uint8_t>& data)
34     {
35         data.resize(sizeof(T));
36         if (memcpy_s(data.data(), data.size(), &metadata, sizeof(T)) != EOK) {
37             return GSERROR_API_FAILED;
38         }
39         return GSERROR_OK;
40     }
41 
42     template <typename T>
ConvertVecToMetadata(const std::vector<uint8_t> & data,T & metadata)43     static GSError ConvertVecToMetadata(const std::vector<uint8_t>& data, T& metadata)
44     {
45         if (data.size() != sizeof(T)) {
46             return GSERROR_NOT_SUPPORT;
47         }
48 
49         if (memcpy_s(&metadata, sizeof(T), data.data(), data.size()) != EOK) {
50             return GSERROR_API_FAILED;
51         }
52         return GSERROR_OK;
53     }
54 
55     static GSError ConvertColorSpaceTypeToInfo(
56         const HDI::Display::Graphic::Common::V1_0::CM_ColorSpaceType& colorSpaceType,
57         HDI::Display::Graphic::Common::V1_0::CM_ColorSpaceInfo& colorSpaceInfo);
58     static GSError ConvertColorSpaceInfoToType(
59         const HDI::Display::Graphic::Common::V1_0::CM_ColorSpaceInfo& colorSpaceInfo,
60         HDI::Display::Graphic::Common::V1_0::CM_ColorSpaceType& colorSpaceType);
61 
62     static GSError SetColorSpaceInfo(sptr<SurfaceBuffer>& buffer,
63         const HDI::Display::Graphic::Common::V1_0::CM_ColorSpaceInfo& colorSpaceInfo);
64     static GSError GetColorSpaceInfo(const sptr<SurfaceBuffer>& buffer,
65         HDI::Display::Graphic::Common::V1_0::CM_ColorSpaceInfo& colorSpaceInfo);
66 
67     static GSError SetColorSpaceType(sptr<SurfaceBuffer>& buffer,
68         const HDI::Display::Graphic::Common::V1_0::CM_ColorSpaceType& colorSpaceType);
69     static GSError GetColorSpaceType(const sptr<SurfaceBuffer>& buffer,
70         HDI::Display::Graphic::Common::V1_0::CM_ColorSpaceType& colorSpaceType);
71 
72     static GSError SetHDRMetadataType(sptr<SurfaceBuffer>& buffer,
73         const HDI::Display::Graphic::Common::V1_0::CM_HDR_Metadata_Type& hdrMetadataType);
74     static GSError GetHDRMetadataType(const sptr<SurfaceBuffer>& buffer,
75         HDI::Display::Graphic::Common::V1_0::CM_HDR_Metadata_Type& hdrMetadataType);
76 
77     static GSError SetHDRStaticMetadata(sptr<SurfaceBuffer>& buffer,
78         const HDI::Display::Graphic::Common::V1_0::HdrStaticMetadata& hdrStaticMetadata);
79     static GSError GetHDRStaticMetadata(const sptr<SurfaceBuffer>& buffer,
80         HDI::Display::Graphic::Common::V1_0::HdrStaticMetadata& hdrStaticMetadata);
81 
82     static GSError SetHDRDynamicMetadata(sptr<SurfaceBuffer>& buffer, const std::vector<uint8_t>& hdrDynamicMetadata);
83     static GSError GetHDRDynamicMetadata(const sptr<SurfaceBuffer>& buffer, std::vector<uint8_t>& hdrDynamicMetadata);
84 
85     static GSError SetHDRStaticMetadata(sptr<SurfaceBuffer>& buffer, const std::vector<uint8_t>& hdrStaticMetadata);
86     static GSError GetHDRStaticMetadata(const sptr<SurfaceBuffer>& buffer, std::vector<uint8_t>& hdrStaticMetadata);
87 
88 private:
89     static constexpr uint32_t PRIMARIES_MASK =
90         static_cast<uint32_t>(HDI::Display::Graphic::Common::V1_0::CM_PRIMARIES_MASK);
91     static constexpr uint32_t TRANSFUNC_MASK =
92         static_cast<uint32_t>(HDI::Display::Graphic::Common::V1_0::CM_TRANSFUNC_MASK);
93     static constexpr uint32_t MATRIX_MASK =
94         static_cast<uint32_t>(HDI::Display::Graphic::Common::V1_0::CM_MATRIX_MASK);
95     static constexpr uint32_t RANGE_MASK =
96         static_cast<uint32_t>(HDI::Display::Graphic::Common::V1_0::CM_RANGE_MASK);
97     static constexpr uint32_t TRANSFUNC_OFFSET = 8;
98     static constexpr uint32_t MATRIX_OFFSET = 16;
99     static constexpr uint32_t RANGE_OFFSET = 21;
100 };
101 } // namespace OHOS
102 
103 #endif // FRAMEWORKS_SURFACE_INCLUDE_METADATA_MANAGER_H