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