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

Unified Diff: chrome/utility/media_galleries/media_metadata_parser.cc

Issue 121383002: Media Galleries API Metadata: Add audio video metadata extractor. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: refine metadata extraction logic Created 6 years, 12 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: chrome/utility/media_galleries/media_metadata_parser.cc
diff --git a/chrome/utility/media_galleries/media_metadata_parser.cc b/chrome/utility/media_galleries/media_metadata_parser.cc
index 33102c9c6cf3368c74d39c2c34983bfce0e11eba..da0d669ebb8940b350c9d9e1b6a9363c62f4cd29 100644
--- a/chrome/utility/media_galleries/media_metadata_parser.cc
+++ b/chrome/utility/media_galleries/media_metadata_parser.cc
@@ -4,14 +4,77 @@
#include "chrome/utility/media_galleries/media_metadata_parser.h"
+#include <map>
+#include <string>
+
#include "base/bind.h"
#include "base/message_loop/message_loop.h"
+#include "base/strings/string_number_conversions.h"
+#include "base/strings/string_util.h"
+#include "media/base/audio_video_metadata_extractor.h"
+#include "media/base/data_source.h"
namespace metadata {
-MediaMetadataParser::MediaMetadataParser(DataReader* reader,
+namespace {
+
+void SetStringScopedPtrFromDict(const std::map<std::string, std::string>& dict,
+ const std::string& key,
+ scoped_ptr<std::string>* result) {
+ DCHECK(result);
+ std::map<std::string, std::string>::const_iterator it = dict.find(key);
+ if (it == dict.end())
+ return;
+
+ result->reset(new std::string(it->second));
+}
+
+void SetIntScopedPtrFromDict(const std::map<std::string, std::string>& dict,
+ const std::string& key,
+ scoped_ptr<int>* result) {
+ DCHECK(result);
+ std::map<std::string, std::string>::const_iterator it = dict.find(key);
+ if (it == dict.end())
+ return;
+
+ int converted;
+ if (base::StringToInt(it->second, &converted))
+ result->reset(new int(converted));
+}
+
+void PopulateAudioVideoMetadata(media::DataSource* source,
+ MediaMetadataParser::MediaMetadata* metadata) {
+ DCHECK(source);
+ DCHECK(metadata);
+ media::AudioVideoMetadataExtractor extractor(source);
+
+ if (!extractor.Extract())
+ return;
+
+ metadata->duration_seconds.reset(new int(extractor.GetDurationSeconds()));
+
+ if (extractor.GetHeight() > 0 && extractor.GetWidth() > 0) {
+ metadata->height.reset(new int(extractor.GetHeight()));
+ metadata->width.reset(new int(extractor.GetWidth()));
+ }
+
+ const std::map<std::string, std::string>& tags = extractor.GetTags();
+ SetStringScopedPtrFromDict(tags, "album", &metadata->album);
acolwell GONE FROM CHROMIUM 2014/01/03 19:14:04 This seems brittle and unnecessarily dependent on
tommycli 2014/01/03 23:08:36 Done.
+ SetStringScopedPtrFromDict(tags, "artist", &metadata->artist);
+ SetStringScopedPtrFromDict(tags, "comment", &metadata->comment);
+ SetStringScopedPtrFromDict(tags, "copyright", &metadata->copyright);
+ SetIntScopedPtrFromDict(tags, "disc", &metadata->disc);
+ SetStringScopedPtrFromDict(tags, "genre", &metadata->genre);
+ SetStringScopedPtrFromDict(tags, "language", &metadata->language);
+ SetStringScopedPtrFromDict(tags, "title", &metadata->title);
+ SetIntScopedPtrFromDict(tags, "track", &metadata->track);
+}
+
+} // namespace
+
+MediaMetadataParser::MediaMetadataParser(media::DataSource* source,
const std::string& mime_type)
- : reader_(reader),
+ : source_(source),
metadata_(new MediaMetadata) {
metadata_->mime_type = mime_type;
}
@@ -22,7 +85,12 @@ void MediaMetadataParser::Start(const MetadataCallback& callback) {
DCHECK(callback_.is_null());
callback_ = callback;
- // TODO(tommycli): Implement for various mime types.
+ if (StartsWithASCII(metadata_->mime_type, "audio/", true) ||
+ StartsWithASCII(metadata_->mime_type, "video/", true)) {
+ PopulateAudioVideoMetadata(source_.get(), metadata_.get());
acolwell GONE FROM CHROMIUM 2014/01/03 19:14:04 nit: Why don't you simply make this a private memb
tommycli 2014/01/03 23:08:36 Done.
+ }
+
+ // TODO(tommycli): Implement for image mime types.
callback_.Run(metadata_.Pass());
}

Powered by Google App Engine
This is Rietveld 408576698