| Index: media/formats/webm/webm_colour_parser.cc
|
| diff --git a/media/formats/webm/webm_colour_parser.cc b/media/formats/webm/webm_colour_parser.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..c058b55d04e6e7a3980be64b7ddb413006532399
|
| --- /dev/null
|
| +++ b/media/formats/webm/webm_colour_parser.cc
|
| @@ -0,0 +1,563 @@
|
| +// Copyright 2016 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "media/formats/webm/webm_colour_parser.h"
|
| +
|
| +#include "base/logging.h"
|
| +#include "media/formats/webm/webm_constants.h"
|
| +
|
| +namespace media {
|
| +
|
| +// The definitions below are copied from the current libwebm top-of-tree.
|
| +// Chromium's third_party/libwebm doesn't have these yet. We can probably just
|
| +// include libwebm header directly in the future.
|
| +// ---- Begin copy/paste from libwebm/webm_parser/include/webm/dom_types.h ----
|
| +
|
| +/**
|
| + A parsed \WebMID{MatrixCoefficients} element.
|
| +
|
| + Matroska/WebM adopted these values from Table 4 of ISO/IEC 23001-8:2013/DCOR1.
|
| + See that document for further details.
|
| + */
|
| +enum class MatrixCoefficients : std::uint64_t {
|
| + /**
|
| + The identity matrix.
|
| +
|
| + Typically used for GBR (often referred to as RGB); however, may also be used
|
| + for YZX (often referred to as XYZ).
|
| + */
|
| + kRgb = 0,
|
| +
|
| + /**
|
| + Rec. ITU-R BT.709-5.
|
| + */
|
| + kBt709 = 1,
|
| +
|
| + /**
|
| + Image characteristics are unknown or are determined by the application.
|
| + */
|
| + kUnspecified = 2,
|
| +
|
| + /**
|
| + United States Federal Communications Commission Title 47 Code of Federal
|
| + Regulations (2003) 73.682 (a) (20).
|
| + */
|
| + kFcc = 4,
|
| +
|
| + /**
|
| + Rec. ITU-R BT.470‑6 System B, G (historical).
|
| + */
|
| + kBt470Bg = 5,
|
| +
|
| + /**
|
| + Society of Motion Picture and Television Engineers 170M (2004).
|
| + */
|
| + kSmpte170M = 6,
|
| +
|
| + /**
|
| + Society of Motion Picture and Television Engineers 240M (1999).
|
| + */
|
| + kSmpte240M = 7,
|
| +
|
| + /**
|
| + YCgCo.
|
| + */
|
| + kYCgCo = 8,
|
| +
|
| + /**
|
| + Rec. ITU-R BT.2020 (non-constant luminance).
|
| + */
|
| + kBt2020NonconstantLuminance = 9,
|
| +
|
| + /**
|
| + Rec. ITU-R BT.2020 (constant luminance).
|
| + */
|
| + kBt2020ConstantLuminance = 10,
|
| +};
|
| +
|
| +/**
|
| + A parsed \WebMID{Range} element.
|
| + */
|
| +enum class Range : std::uint64_t {
|
| + /**
|
| + Unspecified.
|
| + */
|
| + kUnspecified = 0,
|
| +
|
| + /**
|
| + Broadcast range.
|
| + */
|
| + kBroadcast = 1,
|
| +
|
| + /**
|
| + Full range (no clipping).
|
| + */
|
| + kFull = 2,
|
| +
|
| + /**
|
| + Defined by MatrixCoefficients/TransferCharacteristics.
|
| + */
|
| + kDerived = 3,
|
| +};
|
| +
|
| +/**
|
| + A parsed \WebMID{TransferCharacteristics} element.
|
| +
|
| + Matroska/WebM adopted these values from Table 3 of ISO/IEC 23001-8:2013/DCOR1.
|
| + See that document for further details.
|
| + */
|
| +enum class TransferCharacteristics : std::uint64_t {
|
| + /**
|
| + Rec. ITU-R BT.709-6.
|
| + */
|
| + kBt709 = 1,
|
| +
|
| + /**
|
| + Image characteristics are unknown or are determined by the application.
|
| + */
|
| + kUnspecified = 2,
|
| +
|
| + /**
|
| + Rec. ITU‑R BT.470‑6 System M (historical) with assumed display gamma 2.2.
|
| + */
|
| + kGamma22curve = 4,
|
| +
|
| + /**
|
| + Rec. ITU‑R BT.470-6 System B, G (historical) with assumed display gamma 2.8.
|
| + */
|
| + kGamma28curve = 5,
|
| +
|
| + /**
|
| + Society of Motion Picture and Television Engineers 170M (2004).
|
| + */
|
| + kSmpte170M = 6,
|
| +
|
| + /**
|
| + Society of Motion Picture and Television Engineers 240M (1999).
|
| + */
|
| + kSmpte240M = 7,
|
| +
|
| + /**
|
| + Linear transfer characteristics.
|
| + */
|
| + kLinear = 8,
|
| +
|
| + /**
|
| + Logarithmic transfer characteristic (100:1 range).
|
| + */
|
| + kLog = 9,
|
| +
|
| + /**
|
| + Logarithmic transfer characteristic (100 * Sqrt(10) : 1 range).
|
| + */
|
| + kLogSqrt = 10,
|
| +
|
| + /**
|
| + IEC 61966-2-4.
|
| + */
|
| + kIec6196624 = 11,
|
| +
|
| + /**
|
| + Rec. ITU‑R BT.1361-0 extended colour gamut system (historical).
|
| + */
|
| + kBt1361ExtendedColourGamut = 12,
|
| +
|
| + /**
|
| + IEC 61966-2-1 sRGB or sYCC.
|
| + */
|
| + kIec6196621 = 13,
|
| +
|
| + /**
|
| + Rec. ITU-R BT.2020-2 (10-bit system).
|
| + */
|
| + k10BitBt2020 = 14,
|
| +
|
| + /**
|
| + Rec. ITU-R BT.2020-2 (12-bit system).
|
| + */
|
| + k12BitBt2020 = 15,
|
| +
|
| + /**
|
| + Society of Motion Picture and Television Engineers ST 2084.
|
| + */
|
| + kSmpteSt2084 = 16,
|
| +
|
| + /**
|
| + Society of Motion Picture and Television Engineers ST 428-1.
|
| + */
|
| + kSmpteSt4281 = 17,
|
| +
|
| + /**
|
| + Association of Radio Industries and Businesses (ARIB) STD-B67.
|
| + */
|
| + kAribStdB67Hlg = 18,
|
| +};
|
| +
|
| +/**
|
| + A parsed \WebMID{Primaries} element.
|
| +
|
| + Matroska/WebM adopted these values from Table 2 of ISO/IEC 23001-8:2013/DCOR1.
|
| + See that document for further details.
|
| + */
|
| +enum class Primaries : std::uint64_t {
|
| + /**
|
| + Rec. ITU‑R BT.709-6.
|
| + */
|
| + kBt709 = 1,
|
| +
|
| + /**
|
| + Image characteristics are unknown or are determined by the application.
|
| + */
|
| + kUnspecified = 2,
|
| +
|
| + /**
|
| + Rec. ITU‑R BT.470‑6 System M (historical).
|
| + */
|
| + kBt470M = 4,
|
| +
|
| + /**
|
| + Rec. ITU‑R BT.470‑6 System B, G (historical).
|
| + */
|
| + kBt470Bg = 5,
|
| +
|
| + /**
|
| + Society of Motion Picture and Television Engineers 170M (2004).
|
| + */
|
| + kSmpte170M = 6,
|
| +
|
| + /**
|
| + Society of Motion Picture and Television Engineers 240M (1999).
|
| + */
|
| + kSmpte240M = 7,
|
| +
|
| + /**
|
| + Generic film.
|
| + */
|
| + kFilm = 8,
|
| +
|
| + /**
|
| + Rec. ITU-R BT.2020-2.
|
| + */
|
| + kBt2020 = 9,
|
| +
|
| + /**
|
| + Society of Motion Picture and Television Engineers ST 428-1.
|
| + */
|
| + kSmpteSt4281 = 10,
|
| +
|
| + /**
|
| + JEDEC P22 phosphors/EBU Tech. 3213-E (1975).
|
| + */
|
| + kJedecP22Phosphors = 22,
|
| +};
|
| +
|
| +// ---- End copy/paste from libwebm/webm_parser/include/webm/dom_types.h ----
|
| +
|
| +gfx::ColorSpace::MatrixID FromWebMMatrixCoefficients(MatrixCoefficients c) {
|
| + switch (c) {
|
| + case MatrixCoefficients::kRgb:
|
| + return gfx::ColorSpace::MatrixID::RGB;
|
| + case MatrixCoefficients::kBt709:
|
| + return gfx::ColorSpace::MatrixID::BT709;
|
| + case MatrixCoefficients::kUnspecified:
|
| + return gfx::ColorSpace::MatrixID::UNSPECIFIED;
|
| + case MatrixCoefficients::kFcc:
|
| + return gfx::ColorSpace::MatrixID::FCC;
|
| + case MatrixCoefficients::kBt470Bg:
|
| + return gfx::ColorSpace::MatrixID::BT470BG;
|
| + case MatrixCoefficients::kSmpte170M:
|
| + return gfx::ColorSpace::MatrixID::SMPTE170M;
|
| + case MatrixCoefficients::kSmpte240M:
|
| + return gfx::ColorSpace::MatrixID::SMPTE240M;
|
| + case MatrixCoefficients::kYCgCo:
|
| + return gfx::ColorSpace::MatrixID::YCOCG;
|
| + case MatrixCoefficients::kBt2020NonconstantLuminance:
|
| + return gfx::ColorSpace::MatrixID::BT2020_NCL;
|
| + case MatrixCoefficients::kBt2020ConstantLuminance:
|
| + return gfx::ColorSpace::MatrixID::BT2020_CL;
|
| + }
|
| + NOTREACHED();
|
| + return gfx::ColorSpace::MatrixID::UNSPECIFIED;
|
| +}
|
| +
|
| +gfx::ColorSpace::RangeID FromWebMRange(Range range) {
|
| + switch (range) {
|
| + case Range::kUnspecified:
|
| + return gfx::ColorSpace::RangeID::UNSPECIFIED;
|
| + case Range::kBroadcast:
|
| + return gfx::ColorSpace::RangeID::LIMITED;
|
| + case Range::kFull:
|
| + return gfx::ColorSpace::RangeID::FULL;
|
| + case Range::kDerived:
|
| + return gfx::ColorSpace::RangeID::DERIVED;
|
| + }
|
| + NOTREACHED();
|
| + return gfx::ColorSpace::RangeID::UNSPECIFIED;
|
| +}
|
| +
|
| +gfx::ColorSpace::TransferID FromWebMTransferCharacteristics(
|
| + TransferCharacteristics tc) {
|
| + switch (tc) {
|
| + case TransferCharacteristics::kBt709:
|
| + return gfx::ColorSpace::TransferID::BT709;
|
| + case TransferCharacteristics::kUnspecified:
|
| + return gfx::ColorSpace::TransferID::UNSPECIFIED;
|
| + case TransferCharacteristics::kGamma22curve:
|
| + return gfx::ColorSpace::TransferID::GAMMA22;
|
| + case TransferCharacteristics::kGamma28curve:
|
| + return gfx::ColorSpace::TransferID::GAMMA28;
|
| + case TransferCharacteristics::kSmpte170M:
|
| + return gfx::ColorSpace::TransferID::SMPTE170M;
|
| + case TransferCharacteristics::kSmpte240M:
|
| + return gfx::ColorSpace::TransferID::SMPTE240M;
|
| + case TransferCharacteristics::kLinear:
|
| + return gfx::ColorSpace::TransferID::LINEAR;
|
| + case TransferCharacteristics::kLog:
|
| + return gfx::ColorSpace::TransferID::LOG;
|
| + case TransferCharacteristics::kLogSqrt:
|
| + return gfx::ColorSpace::TransferID::LOG_SQRT;
|
| + case TransferCharacteristics::kIec6196624:
|
| + return gfx::ColorSpace::TransferID::IEC61966_2_4;
|
| + case TransferCharacteristics::kBt1361ExtendedColourGamut:
|
| + return gfx::ColorSpace::TransferID::BT1361_ECG;
|
| + case TransferCharacteristics::kIec6196621:
|
| + return gfx::ColorSpace::TransferID::IEC61966_2_1;
|
| + case TransferCharacteristics::k10BitBt2020:
|
| + return gfx::ColorSpace::TransferID::BT2020_10;
|
| + case TransferCharacteristics::k12BitBt2020:
|
| + return gfx::ColorSpace::TransferID::BT2020_12;
|
| + case TransferCharacteristics::kSmpteSt2084:
|
| + return gfx::ColorSpace::TransferID::SMPTEST2084;
|
| + case TransferCharacteristics::kSmpteSt4281:
|
| + return gfx::ColorSpace::TransferID::SMPTEST428_1;
|
| + case TransferCharacteristics::kAribStdB67Hlg:
|
| + return gfx::ColorSpace::TransferID::ARIB_STD_B67;
|
| + }
|
| + NOTREACHED();
|
| + return gfx::ColorSpace::TransferID::UNSPECIFIED;
|
| +}
|
| +
|
| +gfx::ColorSpace::PrimaryID FromWebMPrimaries(Primaries primaries) {
|
| + switch (primaries) {
|
| + case Primaries::kBt709:
|
| + return gfx::ColorSpace::PrimaryID::BT709;
|
| + case Primaries::kUnspecified:
|
| + return gfx::ColorSpace::PrimaryID::UNSPECIFIED;
|
| + case Primaries::kBt470M:
|
| + return gfx::ColorSpace::PrimaryID::BT470M;
|
| + case Primaries::kBt470Bg:
|
| + return gfx::ColorSpace::PrimaryID::BT470BG;
|
| + case Primaries::kSmpte170M:
|
| + return gfx::ColorSpace::PrimaryID::SMPTE170M;
|
| + case Primaries::kSmpte240M:
|
| + return gfx::ColorSpace::PrimaryID::SMPTE240M;
|
| + case Primaries::kFilm:
|
| + return gfx::ColorSpace::PrimaryID::FILM;
|
| + case Primaries::kBt2020:
|
| + return gfx::ColorSpace::PrimaryID::BT2020;
|
| + case Primaries::kSmpteSt4281:
|
| + return gfx::ColorSpace::PrimaryID::SMPTEST428_1;
|
| + case Primaries::kJedecP22Phosphors:
|
| + return gfx::ColorSpace::PrimaryID::UNSPECIFIED;
|
| + }
|
| + NOTREACHED();
|
| + return gfx::ColorSpace::PrimaryID::UNSPECIFIED;
|
| +}
|
| +
|
| +WebMColorMetadata::WebMColorMetadata() {}
|
| +WebMColorMetadata::WebMColorMetadata(const WebMColorMetadata& rhs) = default;
|
| +
|
| +WebMMasteringMetadataParser::WebMMasteringMetadataParser() {}
|
| +WebMMasteringMetadataParser::~WebMMasteringMetadataParser() {}
|
| +
|
| +bool WebMMasteringMetadataParser::OnFloat(int id, double val) {
|
| + switch (id) {
|
| + case kWebMIdPrimaryRChromaticityX:
|
| + mastering_metadata_.primary_r_chromaticity_x = val;
|
| + break;
|
| + case kWebMIdPrimaryRChromaticityY:
|
| + mastering_metadata_.primary_r_chromaticity_y = val;
|
| + break;
|
| + case kWebMIdPrimaryGChromaticityX:
|
| + mastering_metadata_.primary_g_chromaticity_x = val;
|
| + break;
|
| + case kWebMIdPrimaryGChromaticityY:
|
| + mastering_metadata_.primary_g_chromaticity_y = val;
|
| + break;
|
| + case kWebMIdPrimaryBChromaticityX:
|
| + mastering_metadata_.primary_b_chromaticity_x = val;
|
| + break;
|
| + case kWebMIdPrimaryBChromaticityY:
|
| + mastering_metadata_.primary_b_chromaticity_y = val;
|
| + break;
|
| + case kWebMIdWhitePointChromaticityX:
|
| + mastering_metadata_.white_point_chromaticity_x = val;
|
| + break;
|
| + case kWebMIdWhitePointChromaticityY:
|
| + mastering_metadata_.white_point_chromaticity_y = val;
|
| + break;
|
| + case kWebMIdLuminanceMax:
|
| + mastering_metadata_.luminance_max = val;
|
| + break;
|
| + case kWebMIdLuminanceMin:
|
| + mastering_metadata_.luminance_min = val;
|
| + break;
|
| + default:
|
| + DVLOG(1) << "Unexpected id in MasteringMetadata: 0x" << std::hex << id;
|
| + return false;
|
| + }
|
| + return true;
|
| +}
|
| +
|
| +WebMColourParser::WebMColourParser() {
|
| + Reset();
|
| +}
|
| +
|
| +WebMColourParser::~WebMColourParser() {}
|
| +
|
| +void WebMColourParser::Reset() {
|
| + matrix_coefficients_ = -1;
|
| + bits_per_channel_ = -1;
|
| + chroma_subsampling_horz_ = -1;
|
| + chroma_subsampling_vert_ = -1;
|
| + cb_subsampling_horz_ = -1;
|
| + cb_subsampling_vert_ = -1;
|
| + chroma_siting_horz_ = -1;
|
| + chroma_siting_vert_ = -1;
|
| + range_ = -1;
|
| + transfer_characteristics_ = -1;
|
| + primaries_ = -1;
|
| + max_cll_ = -1;
|
| + max_fall_ = -1;
|
| +}
|
| +
|
| +WebMParserClient* WebMColourParser::OnListStart(int id) {
|
| + if (id == kWebMIdMasteringMetadata) {
|
| + mastering_metadata_parsed_ = false;
|
| + return &mastering_metadata_parser_;
|
| + }
|
| +
|
| + return this;
|
| +}
|
| +
|
| +bool WebMColourParser::OnListEnd(int id) {
|
| + if (id == kWebMIdMasteringMetadata)
|
| + mastering_metadata_parsed_ = true;
|
| + return true;
|
| +}
|
| +
|
| +bool WebMColourParser::OnUInt(int id, int64_t val) {
|
| + int64_t* dst = nullptr;
|
| +
|
| + switch (id) {
|
| + case kWebMIdMatrixCoefficients:
|
| + dst = &matrix_coefficients_;
|
| + break;
|
| + case kWebMIdBitsPerChannel:
|
| + dst = &bits_per_channel_;
|
| + break;
|
| + case kWebMIdChromaSubsamplingHorz:
|
| + dst = &chroma_subsampling_horz_;
|
| + break;
|
| + case kWebMIdChromaSubsamplingVert:
|
| + dst = &chroma_subsampling_vert_;
|
| + break;
|
| + case kWebMIdCbSubsamplingHorz:
|
| + dst = &cb_subsampling_horz_;
|
| + break;
|
| + case kWebMIdCbSubsamplingVert:
|
| + dst = &cb_subsampling_vert_;
|
| + break;
|
| + case kWebMIdChromaSitingHorz:
|
| + dst = &chroma_siting_horz_;
|
| + break;
|
| + case kWebMIdChromaSitingVert:
|
| + dst = &chroma_siting_vert_;
|
| + break;
|
| + case kWebMIdRange:
|
| + dst = &range_;
|
| + break;
|
| + case kWebMIdTransferCharacteristics:
|
| + dst = &transfer_characteristics_;
|
| + break;
|
| + case kWebMIdPrimaries:
|
| + dst = &primaries_;
|
| + break;
|
| + case kWebMIdMaxCLL:
|
| + dst = &max_cll_;
|
| + break;
|
| + case kWebMIdMaxFALL:
|
| + dst = &max_fall_;
|
| + break;
|
| + default:
|
| + return true;
|
| + }
|
| +
|
| + DCHECK(dst);
|
| + if (*dst != -1) {
|
| + LOG(ERROR) << "Multiple values for id " << std::hex << id << " specified ("
|
| + << *dst << " and " << val << ")";
|
| + return false;
|
| + }
|
| +
|
| + *dst = val;
|
| + return true;
|
| +}
|
| +
|
| +WebMColorMetadata WebMColourParser::GetWebMColorMetadata() const {
|
| + WebMColorMetadata color_metadata;
|
| +
|
| + if (bits_per_channel_ != -1)
|
| + color_metadata.BitsPerChannel = bits_per_channel_;
|
| +
|
| + if (chroma_subsampling_horz_ != -1)
|
| + color_metadata.ChromaSubsamplingHorz = chroma_subsampling_horz_;
|
| + if (chroma_subsampling_vert_ != -1)
|
| + color_metadata.ChromaSubsamplingVert = chroma_subsampling_vert_;
|
| + if (cb_subsampling_horz_ != -1)
|
| + color_metadata.CbSubsamplingHorz = cb_subsampling_horz_;
|
| + if (cb_subsampling_vert_ != -1)
|
| + color_metadata.CbSubsamplingVert = cb_subsampling_vert_;
|
| + if (chroma_siting_horz_ != -1)
|
| + color_metadata.ChromaSitingHorz = chroma_siting_horz_;
|
| + if (chroma_siting_vert_ != -1)
|
| + color_metadata.ChromaSitingVert = chroma_siting_vert_;
|
| +
|
| + gfx::ColorSpace::MatrixID matrix_id = gfx::ColorSpace::MatrixID::UNSPECIFIED;
|
| + if (matrix_coefficients_ != -1)
|
| + matrix_id = FromWebMMatrixCoefficients(
|
| + static_cast<MatrixCoefficients>(matrix_coefficients_));
|
| +
|
| + gfx::ColorSpace::RangeID range_id = gfx::ColorSpace::RangeID::UNSPECIFIED;
|
| + if (range_ != -1)
|
| + range_id = FromWebMRange(static_cast<Range>(range_));
|
| +
|
| + gfx::ColorSpace::TransferID transfer_id =
|
| + gfx::ColorSpace::TransferID::UNSPECIFIED;
|
| + if (transfer_characteristics_ != -1)
|
| + transfer_id = FromWebMTransferCharacteristics(
|
| + static_cast<TransferCharacteristics>(transfer_characteristics_));
|
| +
|
| + gfx::ColorSpace::PrimaryID primary_id =
|
| + gfx::ColorSpace::PrimaryID::UNSPECIFIED;
|
| + if (primaries_ != -1)
|
| + primary_id = FromWebMPrimaries(static_cast<Primaries>(primaries_));
|
| +
|
| + color_metadata.color_space =
|
| + gfx::ColorSpace(primary_id, transfer_id, matrix_id, range_id);
|
| +
|
| + if (max_cll_ != -1)
|
| + color_metadata.hdr_metadata.max_cll = max_cll_;
|
| +
|
| + if (max_fall_ != -1)
|
| + color_metadata.hdr_metadata.max_fall = max_fall_;
|
| +
|
| + if (mastering_metadata_parsed_)
|
| + color_metadata.hdr_metadata.mastering_metadata =
|
| + mastering_metadata_parser_.GetMasteringMetadata();
|
| +
|
| + return color_metadata;
|
| +}
|
| +
|
| +} // namespace media
|
|
|