Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(67)

Side by Side Diff: media/formats/webm/webm_colour_parser.cc

Issue 2333663003: Add color metadata info to VideoDecoderConfig. (Closed)
Patch Set: Remove resolution-based init for color_space_info_ Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « media/formats/webm/webm_colour_parser.h ('k') | media/formats/webm/webm_constants.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(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
OLDNEW
« no previous file with comments | « media/formats/webm/webm_colour_parser.h ('k') | media/formats/webm/webm_constants.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698