1 /* 2 * Copyright (c) 2018 The WebRTC project authors. All Rights Reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 #ifndef API_VIDEO_HDR_METADATA_H_ 12 #define API_VIDEO_HDR_METADATA_H_ 13 14 namespace webrtc { 15 16 // SMPTE ST 2086 mastering metadata, 17 // see https://ieeexplore.ieee.org/document/8353899. 18 struct HdrMasteringMetadata { 19 struct Chromaticity { 20 Chromaticity(); 21 22 bool operator==(const Chromaticity& rhs) const { 23 return x == rhs.x && y == rhs.y; 24 } 25 ValidateHdrMasteringMetadata::Chromaticity26 bool Validate() const { 27 return x >= 0.0 && x <= 1.0 && y >= 0.0 && y <= 1.0; 28 } 29 30 // xy chromaticity coordinates must be calculated as specified in ISO 31 // 11664-3:2012 Section 7, and must be specified with four decimal places. 32 // The x coordinate should be in the range [0.0001, 0.7400] and the y 33 // coordinate should be in the range [0.0001, 0.8400]. Valid range [0.0000, 34 // 1.0000]. 35 float x = 0.0f; 36 float y = 0.0f; 37 }; 38 39 HdrMasteringMetadata(); 40 41 bool operator==(const HdrMasteringMetadata& rhs) const { 42 return ((primary_r == rhs.primary_r) && (primary_g == rhs.primary_g) && 43 (primary_b == rhs.primary_b) && (white_point == rhs.white_point) && 44 (luminance_max == rhs.luminance_max) && 45 (luminance_min == rhs.luminance_min)); 46 } 47 ValidateHdrMasteringMetadata48 bool Validate() const { 49 return luminance_max >= 0.0 && luminance_max <= 20000.0 && 50 luminance_min >= 0.0 && luminance_min <= 5.0 && 51 primary_r.Validate() && primary_g.Validate() && 52 primary_b.Validate() && white_point.Validate(); 53 } 54 55 // The nominal primaries of the mastering display. 56 Chromaticity primary_r; 57 Chromaticity primary_g; 58 Chromaticity primary_b; 59 60 // The nominal chromaticity of the white point of the mastering display. 61 Chromaticity white_point; 62 63 // The nominal maximum display luminance of the mastering display. Specified 64 // in the unit candela/m2. The value should be in the range [5, 10000] with 65 // zero decimal places. Valid range [0, 20000]. 66 float luminance_max = 0.0f; 67 68 // The nominal minimum display luminance of the mastering display. Specified 69 // in the unit candela/m2. The value should be in the range [0.0001, 5.0000] 70 // with four decimal places. Valid range [0.0000, 5.0000]. 71 float luminance_min = 0.0f; 72 }; 73 74 // High dynamic range (HDR) metadata common for HDR10 and WebM/VP9-based HDR 75 // formats. This struct replicates the HDRMetadata struct defined in 76 // https://cs.chromium.org/chromium/src/media/base/hdr_metadata.h 77 struct HdrMetadata { 78 HdrMetadata(); 79 80 bool operator==(const HdrMetadata& rhs) const { 81 return ( 82 (max_content_light_level == rhs.max_content_light_level) && 83 (max_frame_average_light_level == rhs.max_frame_average_light_level) && 84 (mastering_metadata == rhs.mastering_metadata)); 85 } 86 ValidateHdrMetadata87 bool Validate() const { 88 return max_content_light_level >= 0 && max_content_light_level <= 20000 && 89 max_frame_average_light_level >= 0 && 90 max_frame_average_light_level <= 20000 && 91 mastering_metadata.Validate(); 92 } 93 94 HdrMasteringMetadata mastering_metadata; 95 // Max content light level (CLL), i.e. maximum brightness level present in the 96 // stream, in nits. 1 nit = 1 candela/m2. Valid range [0, 20000]. 97 int max_content_light_level = 0; 98 // Max frame-average light level (FALL), i.e. maximum average brightness of 99 // the brightest frame in the stream, in nits. Valid range [0, 20000]. 100 int max_frame_average_light_level = 0; 101 }; 102 103 } // namespace webrtc 104 105 #endif // API_VIDEO_HDR_METADATA_H_ 106