xref: /aosp_15_r20/frameworks/native/libs/gui/HdrMetadata.cpp (revision 38e8c45f13ce32b0dcecb25141ffecaf386fa17f)
1*38e8c45fSAndroid Build Coastguard Worker /*
2*38e8c45fSAndroid Build Coastguard Worker  * Copyright 2018 The Android Open Source Project
3*38e8c45fSAndroid Build Coastguard Worker  *
4*38e8c45fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*38e8c45fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*38e8c45fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*38e8c45fSAndroid Build Coastguard Worker  *
8*38e8c45fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*38e8c45fSAndroid Build Coastguard Worker  *
10*38e8c45fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*38e8c45fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*38e8c45fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*38e8c45fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*38e8c45fSAndroid Build Coastguard Worker  * limitations under the License.
15*38e8c45fSAndroid Build Coastguard Worker  */
16*38e8c45fSAndroid Build Coastguard Worker 
17*38e8c45fSAndroid Build Coastguard Worker #include <gui/HdrMetadata.h>
18*38e8c45fSAndroid Build Coastguard Worker #include <limits>
19*38e8c45fSAndroid Build Coastguard Worker 
20*38e8c45fSAndroid Build Coastguard Worker namespace android {
21*38e8c45fSAndroid Build Coastguard Worker 
getFlattenedSize() const22*38e8c45fSAndroid Build Coastguard Worker size_t HdrMetadata::getFlattenedSize() const {
23*38e8c45fSAndroid Build Coastguard Worker     size_t size = sizeof(validTypes);
24*38e8c45fSAndroid Build Coastguard Worker     if (validTypes & SMPTE2086) {
25*38e8c45fSAndroid Build Coastguard Worker         size += sizeof(smpte2086);
26*38e8c45fSAndroid Build Coastguard Worker     }
27*38e8c45fSAndroid Build Coastguard Worker     if (validTypes & CTA861_3) {
28*38e8c45fSAndroid Build Coastguard Worker         size += sizeof(cta8613);
29*38e8c45fSAndroid Build Coastguard Worker     }
30*38e8c45fSAndroid Build Coastguard Worker     if (validTypes & HDR10PLUS) {
31*38e8c45fSAndroid Build Coastguard Worker         size += sizeof(uint32_t);
32*38e8c45fSAndroid Build Coastguard Worker         size += hdr10plus.size() * sizeof(hdr10plus[0]);
33*38e8c45fSAndroid Build Coastguard Worker     }
34*38e8c45fSAndroid Build Coastguard Worker     return size;
35*38e8c45fSAndroid Build Coastguard Worker }
36*38e8c45fSAndroid Build Coastguard Worker 
flatten(void * buffer,size_t size) const37*38e8c45fSAndroid Build Coastguard Worker status_t HdrMetadata::flatten(void* buffer, size_t size) const {
38*38e8c45fSAndroid Build Coastguard Worker     if (size < getFlattenedSize()) {
39*38e8c45fSAndroid Build Coastguard Worker         return NO_MEMORY;
40*38e8c45fSAndroid Build Coastguard Worker     }
41*38e8c45fSAndroid Build Coastguard Worker 
42*38e8c45fSAndroid Build Coastguard Worker     FlattenableUtils::write(buffer, size, validTypes);
43*38e8c45fSAndroid Build Coastguard Worker     if (validTypes & SMPTE2086) {
44*38e8c45fSAndroid Build Coastguard Worker         FlattenableUtils::write(buffer, size, smpte2086);
45*38e8c45fSAndroid Build Coastguard Worker     }
46*38e8c45fSAndroid Build Coastguard Worker     if (validTypes & CTA861_3) {
47*38e8c45fSAndroid Build Coastguard Worker         FlattenableUtils::write(buffer, size, cta8613);
48*38e8c45fSAndroid Build Coastguard Worker     }
49*38e8c45fSAndroid Build Coastguard Worker     if (validTypes & HDR10PLUS) {
50*38e8c45fSAndroid Build Coastguard Worker         uint32_t metadataSize = hdr10plus.size();
51*38e8c45fSAndroid Build Coastguard Worker         FlattenableUtils::write(buffer, size, metadataSize);
52*38e8c45fSAndroid Build Coastguard Worker         size_t metadataSizeinByte = metadataSize * sizeof(hdr10plus[0]);
53*38e8c45fSAndroid Build Coastguard Worker         memcpy(buffer, hdr10plus.data(), metadataSizeinByte);
54*38e8c45fSAndroid Build Coastguard Worker         FlattenableUtils::advance(buffer, size, metadataSizeinByte);
55*38e8c45fSAndroid Build Coastguard Worker     }
56*38e8c45fSAndroid Build Coastguard Worker 
57*38e8c45fSAndroid Build Coastguard Worker     return NO_ERROR;
58*38e8c45fSAndroid Build Coastguard Worker }
59*38e8c45fSAndroid Build Coastguard Worker 
unflatten(void const * buffer,size_t size)60*38e8c45fSAndroid Build Coastguard Worker status_t HdrMetadata::unflatten(void const* buffer, size_t size) {
61*38e8c45fSAndroid Build Coastguard Worker     if (size < sizeof(validTypes)) {
62*38e8c45fSAndroid Build Coastguard Worker         return NO_MEMORY;
63*38e8c45fSAndroid Build Coastguard Worker     }
64*38e8c45fSAndroid Build Coastguard Worker     FlattenableUtils::read(buffer, size, validTypes);
65*38e8c45fSAndroid Build Coastguard Worker     if (validTypes & SMPTE2086) {
66*38e8c45fSAndroid Build Coastguard Worker         if (size < sizeof(smpte2086)) {
67*38e8c45fSAndroid Build Coastguard Worker             return NO_MEMORY;
68*38e8c45fSAndroid Build Coastguard Worker         }
69*38e8c45fSAndroid Build Coastguard Worker         FlattenableUtils::read(buffer, size, smpte2086);
70*38e8c45fSAndroid Build Coastguard Worker     }
71*38e8c45fSAndroid Build Coastguard Worker     if (validTypes & CTA861_3) {
72*38e8c45fSAndroid Build Coastguard Worker         if (size < sizeof(cta8613)) {
73*38e8c45fSAndroid Build Coastguard Worker             return NO_MEMORY;
74*38e8c45fSAndroid Build Coastguard Worker         }
75*38e8c45fSAndroid Build Coastguard Worker         FlattenableUtils::read(buffer, size, cta8613);
76*38e8c45fSAndroid Build Coastguard Worker     }
77*38e8c45fSAndroid Build Coastguard Worker     if (validTypes & HDR10PLUS) {
78*38e8c45fSAndroid Build Coastguard Worker         if (size < sizeof(uint32_t)) {
79*38e8c45fSAndroid Build Coastguard Worker             return NO_MEMORY;
80*38e8c45fSAndroid Build Coastguard Worker         }
81*38e8c45fSAndroid Build Coastguard Worker 
82*38e8c45fSAndroid Build Coastguard Worker         uint32_t metadataSize;
83*38e8c45fSAndroid Build Coastguard Worker         FlattenableUtils::read(buffer, size, metadataSize);
84*38e8c45fSAndroid Build Coastguard Worker 
85*38e8c45fSAndroid Build Coastguard Worker         size_t metadataSizeinByte = metadataSize * sizeof(hdr10plus[0]);
86*38e8c45fSAndroid Build Coastguard Worker         if (size < metadataSizeinByte) {
87*38e8c45fSAndroid Build Coastguard Worker             return NO_MEMORY;
88*38e8c45fSAndroid Build Coastguard Worker         }
89*38e8c45fSAndroid Build Coastguard Worker 
90*38e8c45fSAndroid Build Coastguard Worker         hdr10plus.resize(metadataSize);
91*38e8c45fSAndroid Build Coastguard Worker         memcpy(hdr10plus.data(), buffer, metadataSizeinByte);
92*38e8c45fSAndroid Build Coastguard Worker         FlattenableUtils::advance(buffer, size, metadataSizeinByte);
93*38e8c45fSAndroid Build Coastguard Worker     }
94*38e8c45fSAndroid Build Coastguard Worker 
95*38e8c45fSAndroid Build Coastguard Worker     return NO_ERROR;
96*38e8c45fSAndroid Build Coastguard Worker }
97*38e8c45fSAndroid Build Coastguard Worker 
operator ==(const HdrMetadata & rhs) const98*38e8c45fSAndroid Build Coastguard Worker bool HdrMetadata::operator==(const HdrMetadata& rhs) const {
99*38e8c45fSAndroid Build Coastguard Worker     if (validTypes != rhs.validTypes) return false;
100*38e8c45fSAndroid Build Coastguard Worker 
101*38e8c45fSAndroid Build Coastguard Worker     if ((validTypes & SMPTE2086) == SMPTE2086) {
102*38e8c45fSAndroid Build Coastguard Worker         if (smpte2086.displayPrimaryRed.x != rhs.smpte2086.displayPrimaryRed.x ||
103*38e8c45fSAndroid Build Coastguard Worker             smpte2086.displayPrimaryRed.y != rhs.smpte2086.displayPrimaryRed.y ||
104*38e8c45fSAndroid Build Coastguard Worker             smpte2086.displayPrimaryGreen.x != rhs.smpte2086.displayPrimaryGreen.x ||
105*38e8c45fSAndroid Build Coastguard Worker             smpte2086.displayPrimaryGreen.y != rhs.smpte2086.displayPrimaryGreen.y ||
106*38e8c45fSAndroid Build Coastguard Worker             smpte2086.displayPrimaryBlue.x != rhs.smpte2086.displayPrimaryBlue.x ||
107*38e8c45fSAndroid Build Coastguard Worker             smpte2086.displayPrimaryBlue.y != rhs.smpte2086.displayPrimaryBlue.y ||
108*38e8c45fSAndroid Build Coastguard Worker             smpte2086.whitePoint.x != rhs.smpte2086.whitePoint.x ||
109*38e8c45fSAndroid Build Coastguard Worker             smpte2086.whitePoint.y != rhs.smpte2086.whitePoint.y ||
110*38e8c45fSAndroid Build Coastguard Worker             smpte2086.maxLuminance != rhs.smpte2086.maxLuminance ||
111*38e8c45fSAndroid Build Coastguard Worker             smpte2086.minLuminance != rhs.smpte2086.minLuminance) {
112*38e8c45fSAndroid Build Coastguard Worker             return false;
113*38e8c45fSAndroid Build Coastguard Worker         }
114*38e8c45fSAndroid Build Coastguard Worker     }
115*38e8c45fSAndroid Build Coastguard Worker 
116*38e8c45fSAndroid Build Coastguard Worker     if ((validTypes & CTA861_3) == CTA861_3) {
117*38e8c45fSAndroid Build Coastguard Worker         if (cta8613.maxFrameAverageLightLevel != rhs.cta8613.maxFrameAverageLightLevel ||
118*38e8c45fSAndroid Build Coastguard Worker             cta8613.maxContentLightLevel != rhs.cta8613.maxContentLightLevel) {
119*38e8c45fSAndroid Build Coastguard Worker             return false;
120*38e8c45fSAndroid Build Coastguard Worker         }
121*38e8c45fSAndroid Build Coastguard Worker     }
122*38e8c45fSAndroid Build Coastguard Worker 
123*38e8c45fSAndroid Build Coastguard Worker     if ((validTypes & HDR10PLUS) == HDR10PLUS) {
124*38e8c45fSAndroid Build Coastguard Worker         if (hdr10plus != rhs.hdr10plus) return false;
125*38e8c45fSAndroid Build Coastguard Worker     }
126*38e8c45fSAndroid Build Coastguard Worker 
127*38e8c45fSAndroid Build Coastguard Worker     return true;
128*38e8c45fSAndroid Build Coastguard Worker }
129*38e8c45fSAndroid Build Coastguard Worker 
130*38e8c45fSAndroid Build Coastguard Worker } // namespace android
131