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

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

Issue 2333663003: Add color metadata info to VideoDecoderConfig. (Closed)
Patch Set: buildfix 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
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..76bd21cafd56953d82e76396e92a4f732f42bc75
--- /dev/null
+++ b/media/formats/webm/webm_colour_parser.cc
@@ -0,0 +1,190 @@
+// 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 {
+
+WebMMasteringMetadataParser::WebMMasteringMetadataParser() {}
+WebMMasteringMetadataParser::~WebMMasteringMetadataParser() {}
+
+bool WebMMasteringMetadataParser::OnFloat(int id, double val) {
+ switch (id) {
+ case kWebMIdPrimaryRChromaticityX:
+ mastering_metadata_.PrimaryRChromaticityX = val;
+ break;
+ case kWebMIdPrimaryRChromaticityY:
+ mastering_metadata_.PrimaryRChromaticityY = val;
+ break;
+ case kWebMIdPrimaryGChromaticityX:
+ mastering_metadata_.PrimaryGChromaticityX = val;
+ break;
+ case kWebMIdPrimaryGChromaticityY:
+ mastering_metadata_.PrimaryGChromaticityY = val;
+ break;
+ case kWebMIdPrimaryBChromaticityX:
+ mastering_metadata_.PrimaryBChromaticityX = val;
+ break;
+ case kWebMIdPrimaryBChromaticityY:
+ mastering_metadata_.PrimaryBChromaticityY = val;
+ break;
+ case kWebMIdWhitePointChromaticityX:
+ mastering_metadata_.WhitePointChromaticityX = val;
+ break;
+ case kWebMIdWhitePointChromaticityY:
+ mastering_metadata_.WhitePointChromaticityY = val;
+ break;
+ case kWebMIdLuminanceMax:
+ mastering_metadata_.LuminanceMax = val;
+ break;
+ case kWebMIdLuminanceMin:
+ mastering_metadata_.LuminanceMin = 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;
+}
+
+ColorMetadata WebMColourParser::GetColorMetadata() const {
+ ColorMetadata color_metadata;
+
+ DCHECK_NE(-1, matrix_coefficients_);
+ color_metadata.matrix_coefficients =
+ static_cast<MatrixCoefficients>(matrix_coefficients_);
+ DCHECK_NE(-1, bits_per_channel_);
+ color_metadata.BitsPerChannel = bits_per_channel_;
+
+ if (chroma_subsampling_horz_ != -1)
halliwell 2016/09/14 18:58:40 is it expected that this data could be missing? L
servolk 2016/09/14 22:34:35 No, it's not expected to be missing, but this read
+ 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_;
+
+ if (range_ != -1)
+ color_metadata.range = static_cast<Range>(range_);
+ if (transfer_characteristics_ != -1)
+ color_metadata.transfer_characteristics =
+ static_cast<TransferCharacteristics>(transfer_characteristics_);
+ if (primaries_ != -1)
+ color_metadata.primaries = static_cast<Primaries>(primaries_);
+
+ DCHECK_NE(-1, max_cll_);
+ color_metadata.hdr_metadata.MaxCLL = max_cll_;
+ DCHECK_NE(-1, max_fall_);
+ color_metadata.hdr_metadata.MaxFALL = max_fall_;
+
+ DCHECK(mastering_metadata_parsed_);
+ color_metadata.hdr_metadata.mastering_metadata =
+ mastering_metadata_parser_.GetMasteringMetadata();
+ return color_metadata;
+}
+
+} // namespace media

Powered by Google App Engine
This is Rietveld 408576698