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

Unified Diff: media/formats/webm/webm_colour_parser.cc

Issue 2333663003: Add color metadata info to VideoDecoderConfig. (Closed)
Patch Set: Commented the RangeID comment as suggested 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 side-by-side diff with in-line comments
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 »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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..ddc9b931f304efdc4fb965b965a6688cde0d6ae4
--- /dev/null
+++ b/media/formats/webm/webm_colour_parser.cc
@@ -0,0 +1,529 @@
+// 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 ----
+
+// Ensure that libwebm enum values match enums in gfx::ColorSpace.
+#define STATIC_ASSERT_ENUM(a, b) \
+ static_assert(static_cast<int>(a) == static_cast<int>(gfx::ColorSpace::b), \
+ "mismatching enums: " #a " and " #b)
+
+STATIC_ASSERT_ENUM(MatrixCoefficients::kRgb, MatrixID::RGB);
+STATIC_ASSERT_ENUM(MatrixCoefficients::kBt709, MatrixID::BT709);
+STATIC_ASSERT_ENUM(MatrixCoefficients::kUnspecified, MatrixID::UNSPECIFIED);
+STATIC_ASSERT_ENUM(MatrixCoefficients::kFcc, MatrixID::FCC);
+STATIC_ASSERT_ENUM(MatrixCoefficients::kBt470Bg, MatrixID::BT470BG);
+STATIC_ASSERT_ENUM(MatrixCoefficients::kSmpte170M, MatrixID::SMPTE170M);
+STATIC_ASSERT_ENUM(MatrixCoefficients::kSmpte240M, MatrixID::SMPTE240M);
+STATIC_ASSERT_ENUM(MatrixCoefficients::kYCgCo, MatrixID::YCOCG);
+STATIC_ASSERT_ENUM(MatrixCoefficients::kBt2020NonconstantLuminance,
+ MatrixID::BT2020_NCL);
+STATIC_ASSERT_ENUM(MatrixCoefficients::kBt2020ConstantLuminance,
+ MatrixID::BT2020_CL);
+
+gfx::ColorSpace::MatrixID FromWebMMatrixCoefficients(MatrixCoefficients c) {
+ return static_cast<gfx::ColorSpace::MatrixID>(c);
+}
+
+STATIC_ASSERT_ENUM(Range::kUnspecified, RangeID::UNSPECIFIED);
+STATIC_ASSERT_ENUM(Range::kBroadcast, RangeID::LIMITED);
+STATIC_ASSERT_ENUM(Range::kFull, RangeID::FULL);
+STATIC_ASSERT_ENUM(Range::kDerived, RangeID::DERIVED);
+
+gfx::ColorSpace::RangeID FromWebMRange(Range range) {
+ return static_cast<gfx::ColorSpace::RangeID>(range);
+}
+
+STATIC_ASSERT_ENUM(TransferCharacteristics::kBt709, TransferID::BT709);
+STATIC_ASSERT_ENUM(TransferCharacteristics::kUnspecified,
+ TransferID::UNSPECIFIED);
+STATIC_ASSERT_ENUM(TransferCharacteristics::kGamma22curve, TransferID::GAMMA22);
+STATIC_ASSERT_ENUM(TransferCharacteristics::kGamma28curve, TransferID::GAMMA28);
+STATIC_ASSERT_ENUM(TransferCharacteristics::kSmpte170M, TransferID::SMPTE170M);
+STATIC_ASSERT_ENUM(TransferCharacteristics::kSmpte240M, TransferID::SMPTE240M);
+STATIC_ASSERT_ENUM(TransferCharacteristics::kLinear, TransferID::LINEAR);
+STATIC_ASSERT_ENUM(TransferCharacteristics::kLog, TransferID::LOG);
+STATIC_ASSERT_ENUM(TransferCharacteristics::kLogSqrt, TransferID::LOG_SQRT);
+STATIC_ASSERT_ENUM(TransferCharacteristics::kIec6196624,
+ TransferID::IEC61966_2_4);
+STATIC_ASSERT_ENUM(TransferCharacteristics::kBt1361ExtendedColourGamut,
+ TransferID::BT1361_ECG);
+STATIC_ASSERT_ENUM(TransferCharacteristics::kIec6196621,
+ TransferID::IEC61966_2_1);
+STATIC_ASSERT_ENUM(TransferCharacteristics::k10BitBt2020,
+ TransferID::BT2020_10);
+STATIC_ASSERT_ENUM(TransferCharacteristics::k12BitBt2020,
+ TransferID::BT2020_12);
+STATIC_ASSERT_ENUM(TransferCharacteristics::kSmpteSt2084,
+ TransferID::SMPTEST2084);
+STATIC_ASSERT_ENUM(TransferCharacteristics::kSmpteSt4281,
+ TransferID::SMPTEST428_1);
+STATIC_ASSERT_ENUM(TransferCharacteristics::kAribStdB67Hlg,
+ TransferID::ARIB_STD_B67);
+
+gfx::ColorSpace::TransferID FromWebMTransferCharacteristics(
+ TransferCharacteristics tc) {
+ return static_cast<gfx::ColorSpace::TransferID>(tc);
+}
+
+STATIC_ASSERT_ENUM(Primaries::kBt709, PrimaryID::BT709);
+STATIC_ASSERT_ENUM(Primaries::kUnspecified, PrimaryID::UNSPECIFIED);
+STATIC_ASSERT_ENUM(Primaries::kBt470M, PrimaryID::BT470M);
+STATIC_ASSERT_ENUM(Primaries::kBt470Bg, PrimaryID::BT470BG);
+STATIC_ASSERT_ENUM(Primaries::kSmpte170M, PrimaryID::SMPTE170M);
+STATIC_ASSERT_ENUM(Primaries::kSmpte240M, PrimaryID::SMPTE240M);
+STATIC_ASSERT_ENUM(Primaries::kFilm, PrimaryID::FILM);
+STATIC_ASSERT_ENUM(Primaries::kBt2020, PrimaryID::BT2020);
+STATIC_ASSERT_ENUM(Primaries::kSmpteSt4281, PrimaryID::SMPTEST428_1);
+
+gfx::ColorSpace::PrimaryID FromWebMPrimaries(Primaries primaries) {
+ return static_cast<gfx::ColorSpace::PrimaryID>(primaries);
+}
+
+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
« 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