1// Copyright (c) 2019-2022, The rav1e contributors. All rights reserved
2//
3// This source code is subject to the terms of the BSD 2 Clause License and
4// the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
5// was not distributed with this source code in the LICENSE file, you can
6// obtain it at www.aomedia.org/license/software. If the Alliance for Open
7// Media Patent License 1.0 was not distributed with this source code in the
8// PATENTS file, you can obtain it at www.aomedia.org/license/patent.
9
10use crate::serialize::*;
11use crate::wasm_bindgen::*;
12
13use arg_enum_proc_macro::ArgEnum;
14use num_derive::FromPrimitive;
15
16/// Sample position for subsampled chroma
17#[wasm_bindgen]
18#[derive(
19 Copy,
20 Clone,
21 Debug,
22 PartialEq,
23 Eq,
24 FromPrimitive,
25 Serialize,
26 Deserialize,
27 Default,
28)]
29#[repr(C)]
30pub enum ChromaSamplePosition {
31 /// The source video transfer function must be signaled
32 /// outside the AV1 bitstream.
33 #[default]
34 Unknown,
35 /// Horizontally co-located with (0, 0) luma sample, vertically positioned
36 /// in the middle between two luma samples.
37 Vertical,
38 /// Co-located with (0, 0) luma sample.
39 Colocated,
40}
41
42pub use v_frame::pixel::ChromaSampling;
43
44/// Supported Color Primaries
45///
46/// As defined by “Color primaries” section of ISO/IEC 23091-4/ITU-T H.273
47#[derive(
48 ArgEnum,
49 Debug,
50 Clone,
51 Copy,
52 PartialEq,
53 Eq,
54 FromPrimitive,
55 Serialize,
56 Deserialize,
57 Default,
58)]
59#[repr(C)]
60pub enum ColorPrimaries {
61 /// BT.709
62 BT709 = 1,
63 /// Unspecified, must be signaled or inferred outside of the bitstream
64 #[default]
65 Unspecified,
66 /// BT.470 System M (historical)
67 BT470M = 4,
68 /// BT.470 System B, G (historical)
69 BT470BG,
70 /// BT.601-7 525 (SMPTE 170 M)
71 BT601,
72 /// SMPTE 240M (historical)
73 SMPTE240,
74 /// Generic film
75 GenericFilm,
76 /// BT.2020, BT.2100
77 BT2020,
78 /// SMPTE 248 (CIE 1921 XYZ)
79 XYZ,
80 /// SMPTE RP 431-2
81 SMPTE431,
82 /// SMPTE EG 432-1
83 SMPTE432,
84 /// EBU Tech. 3213-E
85 EBU3213 = 22,
86}
87
88/// Supported Transfer Characteristics
89///
90/// As defined by “Transfer characteristics” section of ISO/IEC 23091-4/ITU-TH.273.
91#[derive(
92 ArgEnum,
93 Debug,
94 Clone,
95 Copy,
96 PartialEq,
97 Eq,
98 FromPrimitive,
99 Serialize,
100 Deserialize,
101 Default,
102)]
103#[repr(C)]
104pub enum TransferCharacteristics {
105 /// BT.709
106 BT709 = 1,
107 /// Unspecified, must be signaled or inferred outside of the bitstream
108 #[default]
109 Unspecified,
110 /// BT.470 System M (historical)
111 BT470M = 4,
112 /// BT.470 System B, G (historical)
113 BT470BG,
114 /// BT.601-7 525 (SMPTE 170 M)
115 BT601,
116 /// SMPTE 240 M
117 SMPTE240,
118 /// Linear
119 Linear,
120 /// Logarithmic (100:1 range)
121 Log100,
122 /// Logarithmic ((100 * √10):1 range)
123 Log100Sqrt10,
124 /// IEC 61966-2-4
125 IEC61966,
126 /// BT.1361 extended color gamut system (historical)
127 BT1361,
128 /// sRGB or sYCC
129 SRGB,
130 /// BT.2020 10-bit systems
131 BT2020_10Bit,
132 /// BT.2020 12-bit systems
133 BT2020_12Bit,
134 /// SMPTE ST 2084, ITU BT.2100 PQ
135 SMPTE2084,
136 /// SMPTE ST 428
137 SMPTE428,
138 /// BT.2100 HLG (Hybrid Log Gamma), ARIB STD-B67
139 HLG,
140}
141
142/// Matrix coefficients
143///
144/// As defined by the “Matrix coefficients” section of ISO/IEC 23091-4/ITU-TH.273.
145#[derive(
146 ArgEnum,
147 Debug,
148 Clone,
149 Copy,
150 PartialEq,
151 Eq,
152 FromPrimitive,
153 Serialize,
154 Deserialize,
155 Default,
156)]
157#[repr(C)]
158pub enum MatrixCoefficients {
159 /// Identity matrix
160 Identity = 0,
161 /// BT.709
162 BT709,
163 /// Unspecified, must be signaled or inferred outside of the bitstream.
164 #[default]
165 Unspecified,
166 /// US FCC 73.628
167 FCC = 4,
168 /// BT.470 System B, G (historical)
169 BT470BG,
170 /// BT.601-7 525 (SMPTE 170 M)
171 BT601,
172 /// SMPTE 240 M
173 SMPTE240,
174 /// YCgCo
175 YCgCo,
176 /// BT.2020 non-constant luminance, BT.2100 YCbCr
177 BT2020NCL,
178 /// BT.2020 constant luminance
179 BT2020CL,
180 /// SMPTE ST 2085 YDzDx
181 SMPTE2085,
182 /// Chromaticity-derived non-constant luminance
183 ChromatNCL,
184 /// Chromaticity-derived constant luminance
185 ChromatCL,
186 /// BT.2020 ICtCp
187 ICtCp,
188}
189
190/// Signal the content color description
191#[derive(Copy, Clone, Debug, Serialize, Deserialize)]
192pub struct ColorDescription {
193 /// Color primaries.
194 pub color_primaries: ColorPrimaries,
195 /// Transfer charasteristics.
196 pub transfer_characteristics: TransferCharacteristics,
197 /// Matrix coefficients.
198 pub matrix_coefficients: MatrixCoefficients,
199}
200
201impl ColorDescription {
202 pub(crate) fn is_srgb_triple(self) -> bool {
203 self.color_primaries == ColorPrimaries::BT709
204 && self.transfer_characteristics == TransferCharacteristics::SRGB
205 && self.matrix_coefficients == MatrixCoefficients::Identity
206 }
207}
208
209/// Allowed pixel value range
210///
211/// C.f. `VideoFullRangeFlag` variable specified in ISO/IEC 23091-4/ITU-T H.273
212#[wasm_bindgen]
213#[derive(
214 ArgEnum,
215 Debug,
216 Clone,
217 Copy,
218 PartialEq,
219 Eq,
220 FromPrimitive,
221 Serialize,
222 Deserialize,
223 Default,
224)]
225#[repr(C)]
226pub enum PixelRange {
227 /// Studio swing representation
228 #[default]
229 Limited,
230 /// Full swing representation
231 Full,
232}
233
234/// High dynamic range content light level
235///
236/// As defined by CEA-861.3, Appendix A.
237#[derive(Copy, Clone, Debug, Serialize, Deserialize)]
238pub struct ContentLight {
239 /// Maximum content light level
240 pub max_content_light_level: u16,
241 /// Maximum frame-average light level
242 pub max_frame_average_light_level: u16,
243}
244
245/// Chromaticity coordinates as defined by CIE 1931, expressed as 0.16
246/// fixed-point values.
247#[derive(Clone, Copy, Debug, Serialize, Deserialize)]
248#[repr(C)]
249pub struct ChromaticityPoint {
250 /// The X coordinate.
251 pub x: u16,
252 /// The Y coordinate.
253 pub y: u16,
254}
255
256/// High dynamic range mastering display color volume
257///
258/// As defined by CIE 1931
259#[derive(Copy, Clone, Debug, Serialize, Deserialize)]
260pub struct MasteringDisplay {
261 /// Chromaticity coordinates in Red, Green, Blue order
262 /// expressed as 0.16 fixed-point
263 pub primaries: [ChromaticityPoint; 3],
264 /// Chromaticity coordinates expressed as 0.16 fixed-point
265 pub white_point: ChromaticityPoint,
266 /// 24.8 fixed-point maximum luminance in candelas per square meter
267 pub max_luminance: u32,
268 /// 18.14 fixed-point minimum luminance in candelas per square meter
269 pub min_luminance: u32,
270}
271