1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173
|
/*
* Copyright 2025 Google LLC
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef SkHdrMetadata_DEFINED
#define SkHdrMetadata_DEFINED
#include "include/core/SkColorSpace.h"
#include "include/core/SkRefCnt.h"
#include "include/private/base/SkAPI.h"
#include <optional>
class SkData;
class SkString;
namespace skhdr {
/**
* Content light level metadata.
* The semantics of this metadata is defined in:
* ANSI/CTA-861-H A DTV Profile for Uncompressed High Speed Digital Interfaces
* Annex P Calculation of MaxCLL and MaxFALL
* Slightly different semantics for this metadata are defined in:
* Portable Network Graphics (PNG) Specification (Third Edition)
* 11.3.2.8 cLLI Content Light Level Information
* https://www.w3.org/TR/png-3/#cLLI-chunk
* This metadata should only be used in ways that work with both semantics.
*/
struct SK_API ContentLightLevelInformation {
float fMaxCLL = 0.f;
float fMaxFALL = 0.f;
/**
* Decode from the binary encoding listed at:
* AV1 Bitstream & Decoding Process Specification Version 1.0.0 Errata 1
* https://aomediacodec.github.io/av1-spec/av1-spec.pdf
* 5.8.3 Metadata high dynamic range content light level syntax
* This encoding is equivalent to:
* ITU-T H.265 (V10) (07/2024)
* D.2.35 Content light level information SEI message syntax
* Return false if parsing fails.
*/
bool parse(const SkData* data);
/**
* Serialize to the encoding used by parse().
*/
sk_sp<SkData> serialize() const;
/**
* Decode from the binary encoding listed at:
* Portable Network Graphics (PNG) Specification (Third Edition)
* 11.3.2.8 cLLI Content Light Level Information
* https://www.w3.org/TR/png-3/#cLLI-chunk
* This encoding is not equivalent to the encoding used by parse().
* Return false if parsing fails.
*/
bool parsePngChunk(const SkData* data);
/**
* Serialize to the encoding used by parsePngChunk().
*/
sk_sp<SkData> serializePngChunk() const;
/**
* Return a human-readable description.
*/
SkString toString() const;
bool operator==(const ContentLightLevelInformation& other) const;
bool operator!=(const ContentLightLevelInformation& other) const {
return !(*this == other);
}
};
/**
* Mastering display color volume metadata.
* The semantics of this metadata is defined in:
* SMPTE ST 2086:2018 Mastering Display Color Volume Metadata Supporting
* High Luminance and Wide Color Gamut Images
*/
struct SK_API MasteringDisplayColorVolume {
SkColorSpacePrimaries fDisplayPrimaries = {0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f};
float fMaximumDisplayMasteringLuminance = 0.f;
float fMinimumDisplayMasteringLuminance = 0.f;
/**
* The encoding as defined in:
* AV1 Bitstream & Decoding Process Specification Version 1.0.0 Errata 1
* https://aomediacodec.github.io/av1-spec/av1-spec.pdf
* 5.8.4 Metadata high dynamic range mastering display color volume syntax
* This encoding is equivalent to:
* ITU-T H.265 (V10) (07/2024)
* D.2.35 Content light level information SEI message syntax
* This encoding is also equivalent to:
* Portable Network Graphics (PNG) Specification (Third Edition)
* 11.3.2.7 mDCV Mastering Display Color Volume
* https://www.w3.org/TR/png-3/#mDCV-chunk
* Return false if parsing fails.
*/
bool parse(const SkData* data);
/**
* Serialize to the encoding used by parse().
*/
sk_sp<SkData> serialize() const;
/**
* Return a human-readable description.
*/
SkString toString() const;
bool operator==(const MasteringDisplayColorVolume& other) const;
bool operator!=(const MasteringDisplayColorVolume& other) const {
return !(*this == other);
}
};
/**
* Structure containing all HDR metadata that can be attached to an image or video frame.
*/
class SK_API Metadata {
public:
/**
* Return a container with no metadata.
*/
static Metadata MakeEmpty();
/**
* If there does not exists Content Light Level Information metadata, then return false.
* Otherwise return true and if `clli` is non-nullptr then write the metadata to `clli`.
*/
bool getContentLightLevelInformation(ContentLightLevelInformation* clli) const;
/**
* Set the Content Light Level Information metadata.
*/
void setContentLightLevelInformation(const ContentLightLevelInformation& clli);
/**
* If there does not exists Mastering Display Color Volume metadata, then return false.
* Otherwise return true and if `mdcv` is non-nullptr then write the metadata to `mdcv`.
*/
bool getMasteringDisplayColorVolume(MasteringDisplayColorVolume* mdcv) const;
/**
* Set the Mastering Display Color Volume metadata.
*/
void setMasteringDisplayColorVolume(const MasteringDisplayColorVolume& mdcv);
/**
* Return a human-readable description.
*/
SkString toString() const;
bool operator==(const Metadata& other) const;
bool operator!=(const Metadata& other) const {
return !(*this == other);
}
private:
std::optional<ContentLightLevelInformation> fContentLightLevelInformation;
std::optional<MasteringDisplayColorVolume> fMasteringDisplayColorVolume;
};
} // namespace skhdr
#endif
|