Chromium Code Reviews| 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..e577fa02117a30ad48772d9338734a74f467963b 100644 |
| --- a/chrome/utility/media_galleries/media_metadata_parser.cc |
| +++ b/chrome/utility/media_galleries/media_metadata_parser.cc |
| @@ -4,14 +4,35 @@ |
| #include "chrome/utility/media_galleries/media_metadata_parser.h" |
| +#include <map> |
|
Lei Zhang
2014/01/07 21:44:25
not used
tommycli
2014/01/07 23:12:36
Done.
|
| +#include <string> |
| + |
| #include "base/bind.h" |
| #include "base/message_loop/message_loop.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 SetStringScopedPtr(const std::string& value, |
| + scoped_ptr<std::string>* destination) { |
| + if (!value.empty()) |
| + destination->reset(new std::string(value)); |
| +} |
| + |
| +void SetIntScopedPtr(int value, scoped_ptr<int>* destination) { |
| + if (value >= 0) |
| + destination->reset(new int(value)); |
| +} |
| + |
| +} // namespace |
| + |
| +MediaMetadataParser::MediaMetadataParser(media::DataSource* source, |
| const std::string& mime_type) |
| - : reader_(reader), |
| + : source_(source), |
| metadata_(new MediaMetadata) { |
| metadata_->mime_type = mime_type; |
| } |
| @@ -22,8 +43,41 @@ 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(); |
| + } |
| + |
| + // TODO(tommycli): Implement for image mime types. |
| callback_.Run(metadata_.Pass()); |
| } |
| +void MediaMetadataParser::PopulateAudioVideoMetadata() { |
| + DCHECK(source_); |
| + DCHECK(metadata_.get()); |
| + media::AudioVideoMetadataExtractor extractor; |
| + |
| + if (!extractor.Extract(source_)) |
| + return; |
| + |
| + if (extractor.duration() >= 0) |
| + metadata_->duration.reset(new double(extractor.duration())); |
| + |
| + if (extractor.height() >= 0 && extractor.width() >= 0) { |
| + metadata_->height.reset(new int(extractor.height())); |
| + metadata_->width.reset(new int(extractor.width())); |
| + } |
| + |
| + SetStringScopedPtr(extractor.artist(), &metadata_->artist); |
| + SetStringScopedPtr(extractor.album(), &metadata_->album); |
| + SetStringScopedPtr(extractor.artist(), &metadata_->artist); |
| + SetStringScopedPtr(extractor.comment(), &metadata_->comment); |
| + SetStringScopedPtr(extractor.copyright(), &metadata_->copyright); |
| + SetIntScopedPtr(extractor.disc(), &metadata_->disc); |
| + SetStringScopedPtr(extractor.genre(), &metadata_->genre); |
| + SetStringScopedPtr(extractor.language(), &metadata_->language); |
| + SetStringScopedPtr(extractor.title(), &metadata_->title); |
| + SetIntScopedPtr(extractor.track(), &metadata_->track); |
| +} |
| + |
| } // namespace metadata |