Chromium Code Reviews| 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 |