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