OLD | NEW |
---|---|
(Empty) | |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #include "media/formats/webm/webm_colour_parser.h" | |
6 | |
7 #include "base/logging.h" | |
8 #include "media/formats/webm/webm_constants.h" | |
9 | |
10 namespace media { | |
11 | |
12 // The definitions below are copied from the current libwebm top-of-tree. | |
13 // Chromium's third_party/libwebm doesn't have these yet. We can probably just | |
14 // include libwebm header directly in the future. | |
15 // ---- Begin copy/paste from libwebm/webm_parser/include/webm/dom_types.h ---- | |
16 | |
17 /** | |
18 A parsed \WebMID{MatrixCoefficients} element. | |
19 | |
20 Matroska/WebM adopted these values from Table 4 of ISO/IEC 23001-8:2013/DCOR1. | |
21 See that document for further details. | |
22 */ | |
23 enum class MatrixCoefficients : std::uint64_t { | |
24 /** | |
25 The identity matrix. | |
26 | |
27 Typically used for GBR (often referred to as RGB); however, may also be used | |
28 for YZX (often referred to as XYZ). | |
29 */ | |
30 kRgb = 0, | |
31 | |
32 /** | |
33 Rec. ITU-R BT.709-5. | |
34 */ | |
35 kBt709 = 1, | |
36 | |
37 /** | |
38 Image characteristics are unknown or are determined by the application. | |
39 */ | |
40 kUnspecified = 2, | |
41 | |
42 /** | |
43 United States Federal Communications Commission Title 47 Code of Federal | |
44 Regulations (2003) 73.682 (a) (20). | |
45 */ | |
46 kFcc = 4, | |
47 | |
48 /** | |
49 Rec. ITU-R BT.470‑6 System B, G (historical). | |
50 */ | |
51 kBt470Bg = 5, | |
52 | |
53 /** | |
54 Society of Motion Picture and Television Engineers 170M (2004). | |
55 */ | |
56 kSmpte170M = 6, | |
57 | |
58 /** | |
59 Society of Motion Picture and Television Engineers 240M (1999). | |
60 */ | |
61 kSmpte240M = 7, | |
62 | |
63 /** | |
64 YCgCo. | |
65 */ | |
66 kYCgCo = 8, | |
67 | |
68 /** | |
69 Rec. ITU-R BT.2020 (non-constant luminance). | |
70 */ | |
71 kBt2020NonconstantLuminance = 9, | |
72 | |
73 /** | |
74 Rec. ITU-R BT.2020 (constant luminance). | |
75 */ | |
76 kBt2020ConstantLuminance = 10, | |
77 }; | |
78 | |
79 /** | |
80 A parsed \WebMID{Range} element. | |
81 */ | |
82 enum class Range : std::uint64_t { | |
83 /** | |
84 Unspecified. | |
85 */ | |
86 kUnspecified = 0, | |
87 | |
88 /** | |
89 Broadcast range. | |
90 */ | |
91 kBroadcast = 1, | |
92 | |
93 /** | |
94 Full range (no clipping). | |
95 */ | |
96 kFull = 2, | |
97 | |
98 /** | |
99 Defined by MatrixCoefficients/TransferCharacteristics. | |
100 */ | |
101 kDerived = 3, | |
102 }; | |
103 | |
104 /** | |
105 A parsed \WebMID{TransferCharacteristics} element. | |
106 | |
107 Matroska/WebM adopted these values from Table 3 of ISO/IEC 23001-8:2013/DCOR1. | |
108 See that document for further details. | |
109 */ | |
110 enum class TransferCharacteristics : std::uint64_t { | |
111 /** | |
112 Rec. ITU-R BT.709-6. | |
113 */ | |
114 kBt709 = 1, | |
115 | |
116 /** | |
117 Image characteristics are unknown or are determined by the application. | |
118 */ | |
119 kUnspecified = 2, | |
120 | |
121 /** | |
122 Rec. ITU‑R BT.470‑6 System M (historical) with assumed display gamma 2.2. | |
123 */ | |
124 kGamma22curve = 4, | |
125 | |
126 /** | |
127 Rec. ITU‑R BT.470-6 System B, G (historical) with assumed display gamma 2.8. | |
128 */ | |
129 kGamma28curve = 5, | |
130 | |
131 /** | |
132 Society of Motion Picture and Television Engineers 170M (2004). | |
133 */ | |
134 kSmpte170M = 6, | |
135 | |
136 /** | |
137 Society of Motion Picture and Television Engineers 240M (1999). | |
138 */ | |
139 kSmpte240M = 7, | |
140 | |
141 /** | |
142 Linear transfer characteristics. | |
143 */ | |
144 kLinear = 8, | |
145 | |
146 /** | |
147 Logarithmic transfer characteristic (100:1 range). | |
148 */ | |
149 kLog = 9, | |
150 | |
151 /** | |
152 Logarithmic transfer characteristic (100 * Sqrt(10) : 1 range). | |
153 */ | |
154 kLogSqrt = 10, | |
155 | |
156 /** | |
157 IEC 61966-2-4. | |
158 */ | |
159 kIec6196624 = 11, | |
160 | |
161 /** | |
162 Rec. ITU‑R BT.1361-0 extended colour gamut system (historical). | |
163 */ | |
164 kBt1361ExtendedColourGamut = 12, | |
165 | |
166 /** | |
167 IEC 61966-2-1 sRGB or sYCC. | |
168 */ | |
169 kIec6196621 = 13, | |
170 | |
171 /** | |
172 Rec. ITU-R BT.2020-2 (10-bit system). | |
173 */ | |
174 k10BitBt2020 = 14, | |
175 | |
176 /** | |
177 Rec. ITU-R BT.2020-2 (12-bit system). | |
178 */ | |
179 k12BitBt2020 = 15, | |
180 | |
181 /** | |
182 Society of Motion Picture and Television Engineers ST 2084. | |
183 */ | |
184 kSmpteSt2084 = 16, | |
185 | |
186 /** | |
187 Society of Motion Picture and Television Engineers ST 428-1. | |
188 */ | |
189 kSmpteSt4281 = 17, | |
190 | |
191 /** | |
192 Association of Radio Industries and Businesses (ARIB) STD-B67. | |
193 */ | |
194 kAribStdB67Hlg = 18, | |
195 }; | |
196 | |
197 /** | |
198 A parsed \WebMID{Primaries} element. | |
199 | |
200 Matroska/WebM adopted these values from Table 2 of ISO/IEC 23001-8:2013/DCOR1. | |
201 See that document for further details. | |
202 */ | |
203 enum class Primaries : std::uint64_t { | |
204 /** | |
205 Rec. ITU‑R BT.709-6. | |
206 */ | |
207 kBt709 = 1, | |
208 | |
209 /** | |
210 Image characteristics are unknown or are determined by the application. | |
211 */ | |
212 kUnspecified = 2, | |
213 | |
214 /** | |
215 Rec. ITU‑R BT.470‑6 System M (historical). | |
216 */ | |
217 kBt470M = 4, | |
218 | |
219 /** | |
220 Rec. ITU‑R BT.470‑6 System B, G (historical). | |
221 */ | |
222 kBt470Bg = 5, | |
223 | |
224 /** | |
225 Society of Motion Picture and Television Engineers 170M (2004). | |
226 */ | |
227 kSmpte170M = 6, | |
228 | |
229 /** | |
230 Society of Motion Picture and Television Engineers 240M (1999). | |
231 */ | |
232 kSmpte240M = 7, | |
233 | |
234 /** | |
235 Generic film. | |
236 */ | |
237 kFilm = 8, | |
238 | |
239 /** | |
240 Rec. ITU-R BT.2020-2. | |
241 */ | |
242 kBt2020 = 9, | |
243 | |
244 /** | |
245 Society of Motion Picture and Television Engineers ST 428-1. | |
246 */ | |
247 kSmpteSt4281 = 10, | |
248 | |
249 /** | |
250 JEDEC P22 phosphors/EBU Tech. 3213-E (1975). | |
251 */ | |
252 kJedecP22Phosphors = 22, | |
253 }; | |
254 | |
255 // ---- End copy/paste from libwebm/webm_parser/include/webm/dom_types.h ---- | |
256 | |
257 gfx::ColorSpace::MatrixID FromWebMMatrixCoefficients(MatrixCoefficients c) { | |
258 switch (c) { | |
259 case MatrixCoefficients::kRgb: | |
260 return gfx::ColorSpace::MatrixID::RGB; | |
261 case MatrixCoefficients::kBt709: | |
262 return gfx::ColorSpace::MatrixID::BT709; | |
263 case MatrixCoefficients::kUnspecified: | |
264 return gfx::ColorSpace::MatrixID::UNSPECIFIED; | |
265 case MatrixCoefficients::kFcc: | |
266 return gfx::ColorSpace::MatrixID::FCC; | |
267 case MatrixCoefficients::kBt470Bg: | |
268 return gfx::ColorSpace::MatrixID::BT470BG; | |
269 case MatrixCoefficients::kSmpte170M: | |
270 return gfx::ColorSpace::MatrixID::SMPTE170M; | |
271 case MatrixCoefficients::kSmpte240M: | |
272 return gfx::ColorSpace::MatrixID::SMPTE240M; | |
273 case MatrixCoefficients::kYCgCo: | |
274 return gfx::ColorSpace::MatrixID::YCOCG; | |
275 case MatrixCoefficients::kBt2020NonconstantLuminance: | |
276 return gfx::ColorSpace::MatrixID::BT2020_NCL; | |
277 case MatrixCoefficients::kBt2020ConstantLuminance: | |
278 return gfx::ColorSpace::MatrixID::BT2020_CL; | |
279 } | |
280 NOTREACHED(); | |
281 return gfx::ColorSpace::MatrixID::UNSPECIFIED; | |
282 } | |
283 | |
284 gfx::ColorSpace::RangeID FromWebMRange(Range range) { | |
285 switch (range) { | |
286 case Range::kUnspecified: | |
287 return gfx::ColorSpace::RangeID::UNSPECIFIED; | |
288 case Range::kBroadcast: | |
289 return gfx::ColorSpace::RangeID::LIMITED; | |
290 case Range::kFull: | |
291 return gfx::ColorSpace::RangeID::FULL; | |
292 case Range::kDerived: | |
293 return gfx::ColorSpace::RangeID::DERIVED; | |
294 } | |
295 NOTREACHED(); | |
296 return gfx::ColorSpace::RangeID::UNSPECIFIED; | |
297 } | |
298 | |
hubbe
2016/09/21 20:25:44
Since these should line up exactly in all cases, i
servolk
2016/09/21 20:53:22
Yeah, I was thinking about whether it's better to
servolk
2016/09/21 21:11:27
Yup, sorry, I meant static_assert. I'll convert th
servolk
2016/09/21 22:05:06
Done.
| |
299 gfx::ColorSpace::TransferID FromWebMTransferCharacteristics( | |
300 TransferCharacteristics tc) { | |
301 switch (tc) { | |
302 case TransferCharacteristics::kBt709: | |
303 return gfx::ColorSpace::TransferID::BT709; | |
304 case TransferCharacteristics::kUnspecified: | |
305 return gfx::ColorSpace::TransferID::UNSPECIFIED; | |
306 case TransferCharacteristics::kGamma22curve: | |
307 return gfx::ColorSpace::TransferID::GAMMA22; | |
308 case TransferCharacteristics::kGamma28curve: | |
309 return gfx::ColorSpace::TransferID::GAMMA28; | |
310 case TransferCharacteristics::kSmpte170M: | |
311 return gfx::ColorSpace::TransferID::SMPTE170M; | |
312 case TransferCharacteristics::kSmpte240M: | |
313 return gfx::ColorSpace::TransferID::SMPTE240M; | |
314 case TransferCharacteristics::kLinear: | |
315 return gfx::ColorSpace::TransferID::LINEAR; | |
316 case TransferCharacteristics::kLog: | |
317 return gfx::ColorSpace::TransferID::LOG; | |
318 case TransferCharacteristics::kLogSqrt: | |
319 return gfx::ColorSpace::TransferID::LOG_SQRT; | |
320 case TransferCharacteristics::kIec6196624: | |
321 return gfx::ColorSpace::TransferID::IEC61966_2_4; | |
322 case TransferCharacteristics::kBt1361ExtendedColourGamut: | |
323 return gfx::ColorSpace::TransferID::BT1361_ECG; | |
324 case TransferCharacteristics::kIec6196621: | |
325 return gfx::ColorSpace::TransferID::IEC61966_2_1; | |
326 case TransferCharacteristics::k10BitBt2020: | |
327 return gfx::ColorSpace::TransferID::BT2020_10; | |
328 case TransferCharacteristics::k12BitBt2020: | |
329 return gfx::ColorSpace::TransferID::BT2020_12; | |
330 case TransferCharacteristics::kSmpteSt2084: | |
331 return gfx::ColorSpace::TransferID::SMPTEST2084; | |
332 case TransferCharacteristics::kSmpteSt4281: | |
333 return gfx::ColorSpace::TransferID::SMPTEST428_1; | |
334 case TransferCharacteristics::kAribStdB67Hlg: | |
335 return gfx::ColorSpace::TransferID::ARIB_STD_B67; | |
336 } | |
337 NOTREACHED(); | |
338 return gfx::ColorSpace::TransferID::UNSPECIFIED; | |
339 } | |
340 | |
341 gfx::ColorSpace::PrimaryID FromWebMPrimaries(Primaries primaries) { | |
342 switch (primaries) { | |
343 case Primaries::kBt709: | |
344 return gfx::ColorSpace::PrimaryID::BT709; | |
345 case Primaries::kUnspecified: | |
346 return gfx::ColorSpace::PrimaryID::UNSPECIFIED; | |
347 case Primaries::kBt470M: | |
348 return gfx::ColorSpace::PrimaryID::BT470M; | |
349 case Primaries::kBt470Bg: | |
350 return gfx::ColorSpace::PrimaryID::BT470BG; | |
351 case Primaries::kSmpte170M: | |
352 return gfx::ColorSpace::PrimaryID::SMPTE170M; | |
353 case Primaries::kSmpte240M: | |
354 return gfx::ColorSpace::PrimaryID::SMPTE240M; | |
355 case Primaries::kFilm: | |
356 return gfx::ColorSpace::PrimaryID::FILM; | |
357 case Primaries::kBt2020: | |
358 return gfx::ColorSpace::PrimaryID::BT2020; | |
359 case Primaries::kSmpteSt4281: | |
360 return gfx::ColorSpace::PrimaryID::SMPTEST428_1; | |
361 case Primaries::kJedecP22Phosphors: | |
362 return gfx::ColorSpace::PrimaryID::UNSPECIFIED; | |
363 } | |
364 NOTREACHED(); | |
365 return gfx::ColorSpace::PrimaryID::UNSPECIFIED; | |
366 } | |
367 | |
368 WebMColorMetadata::WebMColorMetadata() {} | |
369 WebMColorMetadata::WebMColorMetadata(const WebMColorMetadata& rhs) = default; | |
370 | |
371 WebMMasteringMetadataParser::WebMMasteringMetadataParser() {} | |
372 WebMMasteringMetadataParser::~WebMMasteringMetadataParser() {} | |
373 | |
374 bool WebMMasteringMetadataParser::OnFloat(int id, double val) { | |
375 switch (id) { | |
376 case kWebMIdPrimaryRChromaticityX: | |
377 mastering_metadata_.primary_r_chromaticity_x = val; | |
378 break; | |
379 case kWebMIdPrimaryRChromaticityY: | |
380 mastering_metadata_.primary_r_chromaticity_y = val; | |
381 break; | |
382 case kWebMIdPrimaryGChromaticityX: | |
383 mastering_metadata_.primary_g_chromaticity_x = val; | |
384 break; | |
385 case kWebMIdPrimaryGChromaticityY: | |
386 mastering_metadata_.primary_g_chromaticity_y = val; | |
387 break; | |
388 case kWebMIdPrimaryBChromaticityX: | |
389 mastering_metadata_.primary_b_chromaticity_x = val; | |
390 break; | |
391 case kWebMIdPrimaryBChromaticityY: | |
392 mastering_metadata_.primary_b_chromaticity_y = val; | |
393 break; | |
394 case kWebMIdWhitePointChromaticityX: | |
395 mastering_metadata_.white_point_chromaticity_x = val; | |
396 break; | |
397 case kWebMIdWhitePointChromaticityY: | |
398 mastering_metadata_.white_point_chromaticity_y = val; | |
399 break; | |
400 case kWebMIdLuminanceMax: | |
401 mastering_metadata_.luminance_max = val; | |
402 break; | |
403 case kWebMIdLuminanceMin: | |
404 mastering_metadata_.luminance_min = val; | |
405 break; | |
406 default: | |
407 DVLOG(1) << "Unexpected id in MasteringMetadata: 0x" << std::hex << id; | |
408 return false; | |
409 } | |
410 return true; | |
411 } | |
412 | |
413 WebMColourParser::WebMColourParser() { | |
414 Reset(); | |
415 } | |
416 | |
417 WebMColourParser::~WebMColourParser() {} | |
418 | |
419 void WebMColourParser::Reset() { | |
420 matrix_coefficients_ = -1; | |
421 bits_per_channel_ = -1; | |
422 chroma_subsampling_horz_ = -1; | |
423 chroma_subsampling_vert_ = -1; | |
424 cb_subsampling_horz_ = -1; | |
425 cb_subsampling_vert_ = -1; | |
426 chroma_siting_horz_ = -1; | |
427 chroma_siting_vert_ = -1; | |
428 range_ = -1; | |
429 transfer_characteristics_ = -1; | |
430 primaries_ = -1; | |
431 max_cll_ = -1; | |
432 max_fall_ = -1; | |
433 } | |
434 | |
435 WebMParserClient* WebMColourParser::OnListStart(int id) { | |
436 if (id == kWebMIdMasteringMetadata) { | |
437 mastering_metadata_parsed_ = false; | |
438 return &mastering_metadata_parser_; | |
439 } | |
440 | |
441 return this; | |
442 } | |
443 | |
444 bool WebMColourParser::OnListEnd(int id) { | |
445 if (id == kWebMIdMasteringMetadata) | |
446 mastering_metadata_parsed_ = true; | |
447 return true; | |
448 } | |
449 | |
450 bool WebMColourParser::OnUInt(int id, int64_t val) { | |
451 int64_t* dst = nullptr; | |
452 | |
453 switch (id) { | |
454 case kWebMIdMatrixCoefficients: | |
455 dst = &matrix_coefficients_; | |
456 break; | |
457 case kWebMIdBitsPerChannel: | |
458 dst = &bits_per_channel_; | |
459 break; | |
460 case kWebMIdChromaSubsamplingHorz: | |
461 dst = &chroma_subsampling_horz_; | |
462 break; | |
463 case kWebMIdChromaSubsamplingVert: | |
464 dst = &chroma_subsampling_vert_; | |
465 break; | |
466 case kWebMIdCbSubsamplingHorz: | |
467 dst = &cb_subsampling_horz_; | |
468 break; | |
469 case kWebMIdCbSubsamplingVert: | |
470 dst = &cb_subsampling_vert_; | |
471 break; | |
472 case kWebMIdChromaSitingHorz: | |
473 dst = &chroma_siting_horz_; | |
474 break; | |
475 case kWebMIdChromaSitingVert: | |
476 dst = &chroma_siting_vert_; | |
477 break; | |
478 case kWebMIdRange: | |
479 dst = &range_; | |
480 break; | |
481 case kWebMIdTransferCharacteristics: | |
482 dst = &transfer_characteristics_; | |
483 break; | |
484 case kWebMIdPrimaries: | |
485 dst = &primaries_; | |
486 break; | |
487 case kWebMIdMaxCLL: | |
488 dst = &max_cll_; | |
489 break; | |
490 case kWebMIdMaxFALL: | |
491 dst = &max_fall_; | |
492 break; | |
493 default: | |
494 return true; | |
495 } | |
496 | |
497 DCHECK(dst); | |
498 if (*dst != -1) { | |
499 LOG(ERROR) << "Multiple values for id " << std::hex << id << " specified (" | |
500 << *dst << " and " << val << ")"; | |
501 return false; | |
502 } | |
503 | |
504 *dst = val; | |
505 return true; | |
506 } | |
507 | |
508 WebMColorMetadata WebMColourParser::GetWebMColorMetadata() const { | |
509 WebMColorMetadata color_metadata; | |
510 | |
511 if (bits_per_channel_ != -1) | |
512 color_metadata.BitsPerChannel = bits_per_channel_; | |
513 | |
514 if (chroma_subsampling_horz_ != -1) | |
515 color_metadata.ChromaSubsamplingHorz = chroma_subsampling_horz_; | |
516 if (chroma_subsampling_vert_ != -1) | |
517 color_metadata.ChromaSubsamplingVert = chroma_subsampling_vert_; | |
518 if (cb_subsampling_horz_ != -1) | |
519 color_metadata.CbSubsamplingHorz = cb_subsampling_horz_; | |
520 if (cb_subsampling_vert_ != -1) | |
521 color_metadata.CbSubsamplingVert = cb_subsampling_vert_; | |
522 if (chroma_siting_horz_ != -1) | |
523 color_metadata.ChromaSitingHorz = chroma_siting_horz_; | |
524 if (chroma_siting_vert_ != -1) | |
525 color_metadata.ChromaSitingVert = chroma_siting_vert_; | |
526 | |
527 gfx::ColorSpace::MatrixID matrix_id = gfx::ColorSpace::MatrixID::UNSPECIFIED; | |
528 if (matrix_coefficients_ != -1) | |
529 matrix_id = FromWebMMatrixCoefficients( | |
530 static_cast<MatrixCoefficients>(matrix_coefficients_)); | |
531 | |
532 gfx::ColorSpace::RangeID range_id = gfx::ColorSpace::RangeID::UNSPECIFIED; | |
533 if (range_ != -1) | |
534 range_id = FromWebMRange(static_cast<Range>(range_)); | |
535 | |
536 gfx::ColorSpace::TransferID transfer_id = | |
537 gfx::ColorSpace::TransferID::UNSPECIFIED; | |
538 if (transfer_characteristics_ != -1) | |
539 transfer_id = FromWebMTransferCharacteristics( | |
540 static_cast<TransferCharacteristics>(transfer_characteristics_)); | |
541 | |
542 gfx::ColorSpace::PrimaryID primary_id = | |
543 gfx::ColorSpace::PrimaryID::UNSPECIFIED; | |
544 if (primaries_ != -1) | |
545 primary_id = FromWebMPrimaries(static_cast<Primaries>(primaries_)); | |
546 | |
547 color_metadata.color_space = | |
548 gfx::ColorSpace(primary_id, transfer_id, matrix_id, range_id); | |
549 | |
550 if (max_cll_ != -1) | |
551 color_metadata.hdr_metadata.max_cll = max_cll_; | |
552 | |
553 if (max_fall_ != -1) | |
554 color_metadata.hdr_metadata.max_fall = max_fall_; | |
555 | |
556 if (mastering_metadata_parsed_) | |
557 color_metadata.hdr_metadata.mastering_metadata = | |
558 mastering_metadata_parser_.GetMasteringMetadata(); | |
559 | |
560 return color_metadata; | |
561 } | |
562 | |
563 } // namespace media | |
OLD | NEW |