Index: media/base/video_frame_metadata.cc |
diff --git a/media/base/video_frame_metadata.cc b/media/base/video_frame_metadata.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..37fb0579bd800e1a59386c99431aeea72405e7db |
--- /dev/null |
+++ b/media/base/video_frame_metadata.cc |
@@ -0,0 +1,124 @@ |
+// Copyright 2015 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 "base/logging.h" |
+#include "media/base/video_frame_metadata.h" |
+ |
+namespace media { |
+ |
+namespace { |
+ |
+// Map enum key to internal std::string key used by base::DictionaryValue. |
+inline std::string ToInternalKey(VideoFrameMetadata::Key key) { |
+ DCHECK_LT(key, VideoFrameMetadata::NUM_KEYS); |
+ return std::string(reinterpret_cast<char*>(&key), sizeof(key)); |
DaleCurtis
2015/03/02 23:23:28
Hmm, this creates an std::string() with 0x00 and 0
miu
2015/03/03 04:31:05
I accounted for that by using the Get/SetXXXWithou
|
+} |
+ |
+} // namespace |
+ |
+VideoFrameMetadata::VideoFrameMetadata() {} |
+ |
+VideoFrameMetadata::~VideoFrameMetadata() {} |
+ |
+bool VideoFrameMetadata::HasKey(Key key) const { |
+ return dictionary_.HasKey(ToInternalKey(key)); |
+} |
+ |
+void VideoFrameMetadata::SetBoolean(Key key, bool value) { |
+ dictionary_.SetBooleanWithoutPathExpansion(ToInternalKey(key), value); |
+} |
+ |
+void VideoFrameMetadata::SetInteger(Key key, int value) { |
+ dictionary_.SetIntegerWithoutPathExpansion(ToInternalKey(key), value); |
+} |
+ |
+void VideoFrameMetadata::SetDouble(Key key, double value) { |
+ dictionary_.SetDoubleWithoutPathExpansion(ToInternalKey(key), value); |
+} |
+ |
+void VideoFrameMetadata::SetString(Key key, const std::string& value) { |
+ dictionary_.SetWithoutPathExpansion( |
+ ToInternalKey(key), |
+ // Using BinaryValue since we don't want the |value| interpreted as having |
+ // any particular character encoding (e.g., UTF-8) by |
+ // base::DictionaryValue. |
+ base::BinaryValue::CreateWithCopiedBuffer(value.data(), value.size())); |
+} |
+ |
+void VideoFrameMetadata::SetTimeTicks(Key key, const base::TimeTicks& value) { |
+ const int64 internal_value = value.ToInternalValue(); |
+ dictionary_.SetWithoutPathExpansion( |
+ ToInternalKey(key), |
+ base::BinaryValue::CreateWithCopiedBuffer( |
+ reinterpret_cast<const char*>(&internal_value), |
+ sizeof(internal_value))); |
+} |
+ |
+void VideoFrameMetadata::SetValue(Key key, scoped_ptr<base::Value> value) { |
+ dictionary_.SetWithoutPathExpansion(ToInternalKey(key), value.Pass()); |
+} |
+ |
+bool VideoFrameMetadata::GetBoolean(Key key, bool* value) const { |
+ DCHECK(value); |
+ return dictionary_.GetBooleanWithoutPathExpansion(ToInternalKey(key), value); |
+} |
+ |
+bool VideoFrameMetadata::GetInteger(Key key, int* value) const { |
+ DCHECK(value); |
+ return dictionary_.GetIntegerWithoutPathExpansion(ToInternalKey(key), value); |
+} |
+ |
+bool VideoFrameMetadata::GetDouble(Key key, double* value) const { |
+ DCHECK(value); |
+ return dictionary_.GetDoubleWithoutPathExpansion(ToInternalKey(key), value); |
+} |
+ |
+bool VideoFrameMetadata::GetString(Key key, std::string* value) const { |
+ DCHECK(value); |
+ const base::BinaryValue* const binary_value = GetBinaryValue(key); |
+ if (binary_value) |
+ value->assign(binary_value->GetBuffer(), binary_value->GetSize()); |
+ return !!binary_value; |
+} |
+ |
+bool VideoFrameMetadata::GetTimeTicks(Key key, base::TimeTicks* value) const { |
+ DCHECK(value); |
+ const base::BinaryValue* const binary_value = GetBinaryValue(key); |
+ if (binary_value && binary_value->GetSize() == sizeof(int64)) { |
+ int64 internal_value; |
+ memcpy(&internal_value, binary_value->GetBuffer(), sizeof(internal_value)); |
+ *value = base::TimeTicks::FromInternalValue(internal_value); |
+ return true; |
+ } |
+ return false; |
+} |
+ |
+const base::Value* VideoFrameMetadata::GetValue(Key key) const { |
+ const base::Value* result = nullptr; |
+ if (!dictionary_.GetWithoutPathExpansion(ToInternalKey(key), &result)) |
+ return nullptr; |
+ return result; |
+} |
+ |
+void VideoFrameMetadata::MergeInternalValuesInto( |
+ base::DictionaryValue* out) const { |
+ out->MergeDictionary(&dictionary_); |
+} |
+ |
+void VideoFrameMetadata::MergeInternalValuesFrom( |
+ const base::DictionaryValue& in) { |
+ dictionary_.MergeDictionary(&in); |
+} |
+ |
+const base::BinaryValue* VideoFrameMetadata::GetBinaryValue(Key key) const { |
+ const base::Value* internal_value = nullptr; |
+ if (dictionary_.GetWithoutPathExpansion(ToInternalKey(key), |
+ &internal_value) && |
+ internal_value->GetType() == base::Value::TYPE_BINARY) { |
+ return static_cast<const base::BinaryValue*>(internal_value); |
+ } |
+ return nullptr; |
+} |
+ |
+} // namespace media |