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 // Ensure that libwebm enum values match enums in gfx::ColorSpace. |
| 258 #define STATIC_ASSERT_ENUM(a, b) \ |
| 259 static_assert(static_cast<int>(a) == static_cast<int>(gfx::ColorSpace::b), \ |
| 260 "mismatching enums: " #a " and " #b) |
| 261 |
| 262 STATIC_ASSERT_ENUM(MatrixCoefficients::kRgb, MatrixID::RGB); |
| 263 STATIC_ASSERT_ENUM(MatrixCoefficients::kBt709, MatrixID::BT709); |
| 264 STATIC_ASSERT_ENUM(MatrixCoefficients::kUnspecified, MatrixID::UNSPECIFIED); |
| 265 STATIC_ASSERT_ENUM(MatrixCoefficients::kFcc, MatrixID::FCC); |
| 266 STATIC_ASSERT_ENUM(MatrixCoefficients::kBt470Bg, MatrixID::BT470BG); |
| 267 STATIC_ASSERT_ENUM(MatrixCoefficients::kSmpte170M, MatrixID::SMPTE170M); |
| 268 STATIC_ASSERT_ENUM(MatrixCoefficients::kSmpte240M, MatrixID::SMPTE240M); |
| 269 STATIC_ASSERT_ENUM(MatrixCoefficients::kYCgCo, MatrixID::YCOCG); |
| 270 STATIC_ASSERT_ENUM(MatrixCoefficients::kBt2020NonconstantLuminance, |
| 271 MatrixID::BT2020_NCL); |
| 272 STATIC_ASSERT_ENUM(MatrixCoefficients::kBt2020ConstantLuminance, |
| 273 MatrixID::BT2020_CL); |
| 274 |
| 275 gfx::ColorSpace::MatrixID FromWebMMatrixCoefficients(MatrixCoefficients c) { |
| 276 return static_cast<gfx::ColorSpace::MatrixID>(c); |
| 277 } |
| 278 |
| 279 STATIC_ASSERT_ENUM(Range::kUnspecified, RangeID::UNSPECIFIED); |
| 280 STATIC_ASSERT_ENUM(Range::kBroadcast, RangeID::LIMITED); |
| 281 STATIC_ASSERT_ENUM(Range::kFull, RangeID::FULL); |
| 282 STATIC_ASSERT_ENUM(Range::kDerived, RangeID::DERIVED); |
| 283 |
| 284 gfx::ColorSpace::RangeID FromWebMRange(Range range) { |
| 285 return static_cast<gfx::ColorSpace::RangeID>(range); |
| 286 } |
| 287 |
| 288 STATIC_ASSERT_ENUM(TransferCharacteristics::kBt709, TransferID::BT709); |
| 289 STATIC_ASSERT_ENUM(TransferCharacteristics::kUnspecified, |
| 290 TransferID::UNSPECIFIED); |
| 291 STATIC_ASSERT_ENUM(TransferCharacteristics::kGamma22curve, TransferID::GAMMA22); |
| 292 STATIC_ASSERT_ENUM(TransferCharacteristics::kGamma28curve, TransferID::GAMMA28); |
| 293 STATIC_ASSERT_ENUM(TransferCharacteristics::kSmpte170M, TransferID::SMPTE170M); |
| 294 STATIC_ASSERT_ENUM(TransferCharacteristics::kSmpte240M, TransferID::SMPTE240M); |
| 295 STATIC_ASSERT_ENUM(TransferCharacteristics::kLinear, TransferID::LINEAR); |
| 296 STATIC_ASSERT_ENUM(TransferCharacteristics::kLog, TransferID::LOG); |
| 297 STATIC_ASSERT_ENUM(TransferCharacteristics::kLogSqrt, TransferID::LOG_SQRT); |
| 298 STATIC_ASSERT_ENUM(TransferCharacteristics::kIec6196624, |
| 299 TransferID::IEC61966_2_4); |
| 300 STATIC_ASSERT_ENUM(TransferCharacteristics::kBt1361ExtendedColourGamut, |
| 301 TransferID::BT1361_ECG); |
| 302 STATIC_ASSERT_ENUM(TransferCharacteristics::kIec6196621, |
| 303 TransferID::IEC61966_2_1); |
| 304 STATIC_ASSERT_ENUM(TransferCharacteristics::k10BitBt2020, |
| 305 TransferID::BT2020_10); |
| 306 STATIC_ASSERT_ENUM(TransferCharacteristics::k12BitBt2020, |
| 307 TransferID::BT2020_12); |
| 308 STATIC_ASSERT_ENUM(TransferCharacteristics::kSmpteSt2084, |
| 309 TransferID::SMPTEST2084); |
| 310 STATIC_ASSERT_ENUM(TransferCharacteristics::kSmpteSt4281, |
| 311 TransferID::SMPTEST428_1); |
| 312 STATIC_ASSERT_ENUM(TransferCharacteristics::kAribStdB67Hlg, |
| 313 TransferID::ARIB_STD_B67); |
| 314 |
| 315 gfx::ColorSpace::TransferID FromWebMTransferCharacteristics( |
| 316 TransferCharacteristics tc) { |
| 317 return static_cast<gfx::ColorSpace::TransferID>(tc); |
| 318 } |
| 319 |
| 320 STATIC_ASSERT_ENUM(Primaries::kBt709, PrimaryID::BT709); |
| 321 STATIC_ASSERT_ENUM(Primaries::kUnspecified, PrimaryID::UNSPECIFIED); |
| 322 STATIC_ASSERT_ENUM(Primaries::kBt470M, PrimaryID::BT470M); |
| 323 STATIC_ASSERT_ENUM(Primaries::kBt470Bg, PrimaryID::BT470BG); |
| 324 STATIC_ASSERT_ENUM(Primaries::kSmpte170M, PrimaryID::SMPTE170M); |
| 325 STATIC_ASSERT_ENUM(Primaries::kSmpte240M, PrimaryID::SMPTE240M); |
| 326 STATIC_ASSERT_ENUM(Primaries::kFilm, PrimaryID::FILM); |
| 327 STATIC_ASSERT_ENUM(Primaries::kBt2020, PrimaryID::BT2020); |
| 328 STATIC_ASSERT_ENUM(Primaries::kSmpteSt4281, PrimaryID::SMPTEST428_1); |
| 329 |
| 330 gfx::ColorSpace::PrimaryID FromWebMPrimaries(Primaries primaries) { |
| 331 return static_cast<gfx::ColorSpace::PrimaryID>(primaries); |
| 332 } |
| 333 |
| 334 WebMColorMetadata::WebMColorMetadata() {} |
| 335 WebMColorMetadata::WebMColorMetadata(const WebMColorMetadata& rhs) = default; |
| 336 |
| 337 WebMMasteringMetadataParser::WebMMasteringMetadataParser() {} |
| 338 WebMMasteringMetadataParser::~WebMMasteringMetadataParser() {} |
| 339 |
| 340 bool WebMMasteringMetadataParser::OnFloat(int id, double val) { |
| 341 switch (id) { |
| 342 case kWebMIdPrimaryRChromaticityX: |
| 343 mastering_metadata_.primary_r_chromaticity_x = val; |
| 344 break; |
| 345 case kWebMIdPrimaryRChromaticityY: |
| 346 mastering_metadata_.primary_r_chromaticity_y = val; |
| 347 break; |
| 348 case kWebMIdPrimaryGChromaticityX: |
| 349 mastering_metadata_.primary_g_chromaticity_x = val; |
| 350 break; |
| 351 case kWebMIdPrimaryGChromaticityY: |
| 352 mastering_metadata_.primary_g_chromaticity_y = val; |
| 353 break; |
| 354 case kWebMIdPrimaryBChromaticityX: |
| 355 mastering_metadata_.primary_b_chromaticity_x = val; |
| 356 break; |
| 357 case kWebMIdPrimaryBChromaticityY: |
| 358 mastering_metadata_.primary_b_chromaticity_y = val; |
| 359 break; |
| 360 case kWebMIdWhitePointChromaticityX: |
| 361 mastering_metadata_.white_point_chromaticity_x = val; |
| 362 break; |
| 363 case kWebMIdWhitePointChromaticityY: |
| 364 mastering_metadata_.white_point_chromaticity_y = val; |
| 365 break; |
| 366 case kWebMIdLuminanceMax: |
| 367 mastering_metadata_.luminance_max = val; |
| 368 break; |
| 369 case kWebMIdLuminanceMin: |
| 370 mastering_metadata_.luminance_min = val; |
| 371 break; |
| 372 default: |
| 373 DVLOG(1) << "Unexpected id in MasteringMetadata: 0x" << std::hex << id; |
| 374 return false; |
| 375 } |
| 376 return true; |
| 377 } |
| 378 |
| 379 WebMColourParser::WebMColourParser() { |
| 380 Reset(); |
| 381 } |
| 382 |
| 383 WebMColourParser::~WebMColourParser() {} |
| 384 |
| 385 void WebMColourParser::Reset() { |
| 386 matrix_coefficients_ = -1; |
| 387 bits_per_channel_ = -1; |
| 388 chroma_subsampling_horz_ = -1; |
| 389 chroma_subsampling_vert_ = -1; |
| 390 cb_subsampling_horz_ = -1; |
| 391 cb_subsampling_vert_ = -1; |
| 392 chroma_siting_horz_ = -1; |
| 393 chroma_siting_vert_ = -1; |
| 394 range_ = -1; |
| 395 transfer_characteristics_ = -1; |
| 396 primaries_ = -1; |
| 397 max_cll_ = -1; |
| 398 max_fall_ = -1; |
| 399 } |
| 400 |
| 401 WebMParserClient* WebMColourParser::OnListStart(int id) { |
| 402 if (id == kWebMIdMasteringMetadata) { |
| 403 mastering_metadata_parsed_ = false; |
| 404 return &mastering_metadata_parser_; |
| 405 } |
| 406 |
| 407 return this; |
| 408 } |
| 409 |
| 410 bool WebMColourParser::OnListEnd(int id) { |
| 411 if (id == kWebMIdMasteringMetadata) |
| 412 mastering_metadata_parsed_ = true; |
| 413 return true; |
| 414 } |
| 415 |
| 416 bool WebMColourParser::OnUInt(int id, int64_t val) { |
| 417 int64_t* dst = nullptr; |
| 418 |
| 419 switch (id) { |
| 420 case kWebMIdMatrixCoefficients: |
| 421 dst = &matrix_coefficients_; |
| 422 break; |
| 423 case kWebMIdBitsPerChannel: |
| 424 dst = &bits_per_channel_; |
| 425 break; |
| 426 case kWebMIdChromaSubsamplingHorz: |
| 427 dst = &chroma_subsampling_horz_; |
| 428 break; |
| 429 case kWebMIdChromaSubsamplingVert: |
| 430 dst = &chroma_subsampling_vert_; |
| 431 break; |
| 432 case kWebMIdCbSubsamplingHorz: |
| 433 dst = &cb_subsampling_horz_; |
| 434 break; |
| 435 case kWebMIdCbSubsamplingVert: |
| 436 dst = &cb_subsampling_vert_; |
| 437 break; |
| 438 case kWebMIdChromaSitingHorz: |
| 439 dst = &chroma_siting_horz_; |
| 440 break; |
| 441 case kWebMIdChromaSitingVert: |
| 442 dst = &chroma_siting_vert_; |
| 443 break; |
| 444 case kWebMIdRange: |
| 445 dst = &range_; |
| 446 break; |
| 447 case kWebMIdTransferCharacteristics: |
| 448 dst = &transfer_characteristics_; |
| 449 break; |
| 450 case kWebMIdPrimaries: |
| 451 dst = &primaries_; |
| 452 break; |
| 453 case kWebMIdMaxCLL: |
| 454 dst = &max_cll_; |
| 455 break; |
| 456 case kWebMIdMaxFALL: |
| 457 dst = &max_fall_; |
| 458 break; |
| 459 default: |
| 460 return true; |
| 461 } |
| 462 |
| 463 DCHECK(dst); |
| 464 if (*dst != -1) { |
| 465 LOG(ERROR) << "Multiple values for id " << std::hex << id << " specified (" |
| 466 << *dst << " and " << val << ")"; |
| 467 return false; |
| 468 } |
| 469 |
| 470 *dst = val; |
| 471 return true; |
| 472 } |
| 473 |
| 474 WebMColorMetadata WebMColourParser::GetWebMColorMetadata() const { |
| 475 WebMColorMetadata color_metadata; |
| 476 |
| 477 if (bits_per_channel_ != -1) |
| 478 color_metadata.BitsPerChannel = bits_per_channel_; |
| 479 |
| 480 if (chroma_subsampling_horz_ != -1) |
| 481 color_metadata.ChromaSubsamplingHorz = chroma_subsampling_horz_; |
| 482 if (chroma_subsampling_vert_ != -1) |
| 483 color_metadata.ChromaSubsamplingVert = chroma_subsampling_vert_; |
| 484 if (cb_subsampling_horz_ != -1) |
| 485 color_metadata.CbSubsamplingHorz = cb_subsampling_horz_; |
| 486 if (cb_subsampling_vert_ != -1) |
| 487 color_metadata.CbSubsamplingVert = cb_subsampling_vert_; |
| 488 if (chroma_siting_horz_ != -1) |
| 489 color_metadata.ChromaSitingHorz = chroma_siting_horz_; |
| 490 if (chroma_siting_vert_ != -1) |
| 491 color_metadata.ChromaSitingVert = chroma_siting_vert_; |
| 492 |
| 493 gfx::ColorSpace::MatrixID matrix_id = gfx::ColorSpace::MatrixID::UNSPECIFIED; |
| 494 if (matrix_coefficients_ != -1) |
| 495 matrix_id = FromWebMMatrixCoefficients( |
| 496 static_cast<MatrixCoefficients>(matrix_coefficients_)); |
| 497 |
| 498 gfx::ColorSpace::RangeID range_id = gfx::ColorSpace::RangeID::UNSPECIFIED; |
| 499 if (range_ != -1) |
| 500 range_id = FromWebMRange(static_cast<Range>(range_)); |
| 501 |
| 502 gfx::ColorSpace::TransferID transfer_id = |
| 503 gfx::ColorSpace::TransferID::UNSPECIFIED; |
| 504 if (transfer_characteristics_ != -1) |
| 505 transfer_id = FromWebMTransferCharacteristics( |
| 506 static_cast<TransferCharacteristics>(transfer_characteristics_)); |
| 507 |
| 508 gfx::ColorSpace::PrimaryID primary_id = |
| 509 gfx::ColorSpace::PrimaryID::UNSPECIFIED; |
| 510 if (primaries_ != -1) |
| 511 primary_id = FromWebMPrimaries(static_cast<Primaries>(primaries_)); |
| 512 |
| 513 color_metadata.color_space = |
| 514 gfx::ColorSpace(primary_id, transfer_id, matrix_id, range_id); |
| 515 |
| 516 if (max_cll_ != -1) |
| 517 color_metadata.hdr_metadata.max_cll = max_cll_; |
| 518 |
| 519 if (max_fall_ != -1) |
| 520 color_metadata.hdr_metadata.max_fall = max_fall_; |
| 521 |
| 522 if (mastering_metadata_parsed_) |
| 523 color_metadata.hdr_metadata.mastering_metadata = |
| 524 mastering_metadata_parser_.GetMasteringMetadata(); |
| 525 |
| 526 return color_metadata; |
| 527 } |
| 528 |
| 529 } // namespace media |
OLD | NEW |