Index: media/formats/mp4/dolby_vision.cc |
diff --git a/media/formats/mp4/dolby_vision.cc b/media/formats/mp4/dolby_vision.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..c40decdf28276deb3830a4c5fe4a49d0a0b7fad1 |
--- /dev/null |
+++ b/media/formats/mp4/dolby_vision.cc |
@@ -0,0 +1,83 @@ |
+// Copyright 2017 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/mp4/dolby_vision.h" |
+ |
+#include "base/logging.h" |
+#include "media/base/video_codecs.h" |
+#include "media/formats/mp4/box_definitions.h" |
+#include "media/formats/mp4/box_reader.h" |
+ |
+namespace media { |
+namespace mp4 { |
+ |
+DolbyVisionConfiguration::DolbyVisionConfiguration() |
+ : dv_version_major(0), |
+ dv_version_minor(0), |
+ dv_profile(0), |
+ dv_level(0), |
+ rpu_present_flag(0), |
+ el_present_flag(0), |
+ bl_present_flag(0), |
+ codec_profile(VIDEO_CODEC_PROFILE_UNKNOWN) {} |
+ |
+DolbyVisionConfiguration::~DolbyVisionConfiguration() {} |
+ |
+FourCC DolbyVisionConfiguration::BoxType() const { |
+ return FOURCC_DVCC; |
+} |
+ |
+bool DolbyVisionConfiguration::Parse(BoxReader* reader) { |
+ return ParseInternal(reader, reader->media_log()); |
+} |
+ |
+bool DolbyVisionConfiguration::Parse(const uint8_t* data, int data_size) { |
+ BufferReader reader(data, data_size); |
+ return ParseInternal(&reader, new MediaLog()); |
+} |
+ |
+bool DolbyVisionConfiguration::ParseInternal( |
+ BufferReader* reader, |
+ const scoped_refptr<MediaLog>& media_log) { |
+ uint16_t profile_track_indication = 0; |
+ RCHECK(reader->Read1(&dv_version_major) && reader->Read1(&dv_version_minor) && |
+ reader->Read2(&profile_track_indication)); |
+ |
+ dv_profile = profile_track_indication >> 9; |
+ dv_level = (profile_track_indication >> 3) & 0x3F; |
+ rpu_present_flag = (profile_track_indication >> 2) & 1; |
+ el_present_flag = (profile_track_indication >> 1) & 1; |
+ bl_present_flag = profile_track_indication & 1; |
+ |
+ switch (dv_profile) { |
+ case 0: |
+ codec_profile = DOLBYVISION_PROFILE0; |
+ break; |
+ case 4: |
+ codec_profile = DOLBYVISION_PROFILE4; |
+ break; |
+ case 5: |
+ codec_profile = DOLBYVISION_PROFILE5; |
+ break; |
+ case 7: |
+ codec_profile = DOLBYVISION_PROFILE7; |
+ break; |
+ default: |
+ DVLOG(2) << "Deprecated or invalid Dolby Vision profile:" |
+ << static_cast<int>(dv_profile); |
+ return false; |
+ } |
+ |
+ DVLOG(2) << "Dolby Vision profile:" << static_cast<int>(dv_profile) |
+ << " level:" << static_cast<int>(dv_level) |
+ << " has_bl:" << static_cast<int>(bl_present_flag) |
+ << " has_el:" << static_cast<int>(el_present_flag) |
+ << " has_rpu:" << static_cast<int>(rpu_present_flag) |
+ << " profile type:" << codec_profile; |
+ |
+ return true; |
+} |
+ |
+} // namespace mp4 |
+} // namespace media |