19bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter/*
29bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter * Copyright 2018 The Android Open Source Project
39bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter *
49bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter * Licensed under the Apache License, Version 2.0 (the "License");
59bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter * you may not use this file except in compliance with the License.
69bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter * You may obtain a copy of the License at
79bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter *
89bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter *      http://www.apache.org/licenses/LICENSE-2.0
99bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter *
109bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter * Unless required by applicable law or agreed to in writing, software
119bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter * distributed under the License is distributed on an "AS IS" BASIS,
129bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter * See the License for the specific language governing permissions and
149bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter * limitations under the License.
159bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter */
169bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter
179bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter#include <gui/HdrMetadata.h>
189bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter
199bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchternamespace android {
209bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter
219bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchtersize_t HdrMetadata::getFlattenedSize() const {
229bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter    size_t size = sizeof(validTypes);
239bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter    if (validTypes & SMPTE2086) {
249bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter        size += sizeof(smpte2086);
259bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter    }
269bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter    if (validTypes & CTA861_3) {
279bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter        size += sizeof(cta8613);
289bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter    }
299bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter    return size;
309bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter}
319bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter
329bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchterstatus_t HdrMetadata::flatten(void* buffer, size_t size) const {
339bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter    if (size < getFlattenedSize()) {
349bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter        return NO_MEMORY;
359bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter    }
369bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter
379bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter    FlattenableUtils::write(buffer, size, validTypes);
389bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter    if (validTypes & SMPTE2086) {
399bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter        FlattenableUtils::write(buffer, size, smpte2086);
409bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter    }
419bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter    if (validTypes & CTA861_3) {
429bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter        FlattenableUtils::write(buffer, size, cta8613);
439bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter    }
449bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter
459bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter    return NO_ERROR;
469bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter}
479bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter
489bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchterstatus_t HdrMetadata::unflatten(void const* buffer, size_t size) {
499bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter    if (size < sizeof(validTypes)) {
509bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter        return NO_MEMORY;
519bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter    }
529bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter    FlattenableUtils::read(buffer, size, validTypes);
539bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter    if (validTypes & SMPTE2086) {
549bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter        if (size < sizeof(smpte2086)) {
559bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter            return NO_MEMORY;
569bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter        }
579bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter        FlattenableUtils::read(buffer, size, smpte2086);
589bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter    }
599bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter    if (validTypes & CTA861_3) {
609bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter        if (size < sizeof(cta8613)) {
619bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter            return NO_MEMORY;
629bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter        }
639bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter        FlattenableUtils::read(buffer, size, cta8613);
649bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter    }
659bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter
669bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter    return NO_ERROR;
679bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter}
689bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter
6939a0788cf6d728bd356700bb5b0a1d31cce10356Courtney Goeltzenleuchterbool HdrMetadata::operator==(const HdrMetadata& rhs) const {
7039a0788cf6d728bd356700bb5b0a1d31cce10356Courtney Goeltzenleuchter    if (validTypes != rhs.validTypes) return false;
7139a0788cf6d728bd356700bb5b0a1d31cce10356Courtney Goeltzenleuchter
7239a0788cf6d728bd356700bb5b0a1d31cce10356Courtney Goeltzenleuchter    if ((validTypes & SMPTE2086) == SMPTE2086) {
7339a0788cf6d728bd356700bb5b0a1d31cce10356Courtney Goeltzenleuchter        if (smpte2086.displayPrimaryRed.x != rhs.smpte2086.displayPrimaryRed.x ||
7439a0788cf6d728bd356700bb5b0a1d31cce10356Courtney Goeltzenleuchter            smpte2086.displayPrimaryRed.y != rhs.smpte2086.displayPrimaryRed.y ||
7539a0788cf6d728bd356700bb5b0a1d31cce10356Courtney Goeltzenleuchter            smpte2086.displayPrimaryGreen.x != rhs.smpte2086.displayPrimaryGreen.x ||
7639a0788cf6d728bd356700bb5b0a1d31cce10356Courtney Goeltzenleuchter            smpte2086.displayPrimaryGreen.y != rhs.smpte2086.displayPrimaryGreen.y ||
7739a0788cf6d728bd356700bb5b0a1d31cce10356Courtney Goeltzenleuchter            smpte2086.displayPrimaryBlue.x != rhs.smpte2086.displayPrimaryBlue.x ||
7839a0788cf6d728bd356700bb5b0a1d31cce10356Courtney Goeltzenleuchter            smpte2086.displayPrimaryBlue.y != rhs.smpte2086.displayPrimaryBlue.y ||
7939a0788cf6d728bd356700bb5b0a1d31cce10356Courtney Goeltzenleuchter            smpte2086.whitePoint.x != rhs.smpte2086.whitePoint.x ||
8039a0788cf6d728bd356700bb5b0a1d31cce10356Courtney Goeltzenleuchter            smpte2086.whitePoint.y != rhs.smpte2086.whitePoint.y ||
8139a0788cf6d728bd356700bb5b0a1d31cce10356Courtney Goeltzenleuchter            smpte2086.maxLuminance != rhs.smpte2086.maxLuminance ||
8239a0788cf6d728bd356700bb5b0a1d31cce10356Courtney Goeltzenleuchter            smpte2086.minLuminance != rhs.smpte2086.minLuminance) {
8339a0788cf6d728bd356700bb5b0a1d31cce10356Courtney Goeltzenleuchter            return false;
8439a0788cf6d728bd356700bb5b0a1d31cce10356Courtney Goeltzenleuchter        }
8539a0788cf6d728bd356700bb5b0a1d31cce10356Courtney Goeltzenleuchter    }
8639a0788cf6d728bd356700bb5b0a1d31cce10356Courtney Goeltzenleuchter
8739a0788cf6d728bd356700bb5b0a1d31cce10356Courtney Goeltzenleuchter    if ((validTypes & CTA861_3) == CTA861_3) {
8839a0788cf6d728bd356700bb5b0a1d31cce10356Courtney Goeltzenleuchter        if (cta8613.maxFrameAverageLightLevel != rhs.cta8613.maxFrameAverageLightLevel ||
8939a0788cf6d728bd356700bb5b0a1d31cce10356Courtney Goeltzenleuchter            cta8613.maxContentLightLevel != rhs.cta8613.maxContentLightLevel) {
9039a0788cf6d728bd356700bb5b0a1d31cce10356Courtney Goeltzenleuchter            return false;
9139a0788cf6d728bd356700bb5b0a1d31cce10356Courtney Goeltzenleuchter        }
9239a0788cf6d728bd356700bb5b0a1d31cce10356Courtney Goeltzenleuchter    }
9339a0788cf6d728bd356700bb5b0a1d31cce10356Courtney Goeltzenleuchter
9439a0788cf6d728bd356700bb5b0a1d31cce10356Courtney Goeltzenleuchter    return true;
9539a0788cf6d728bd356700bb5b0a1d31cce10356Courtney Goeltzenleuchter}
9639a0788cf6d728bd356700bb5b0a1d31cce10356Courtney Goeltzenleuchter
979bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter} // namespace android
98