| 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..1a2cba79c94a98ed267b5969d550333fc5453ed4 100644
|
| --- a/chrome/utility/media_galleries/media_metadata_parser.cc
|
| +++ b/chrome/utility/media_galleries/media_metadata_parser.cc
|
| @@ -4,14 +4,34 @@
|
|
|
| #include "chrome/utility/media_galleries/media_metadata_parser.h"
|
|
|
| +#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 +42,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
|
|
|