OLD | NEW |
---|---|
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "media/base/audio_video_metadata_extractor.h" | 5 #include "media/base/audio_video_metadata_extractor.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/strings/string_number_conversions.h" | 8 #include "base/strings/string_number_conversions.h" |
9 #include "base/strings/string_util.h" | 9 #include "base/strings/string_util.h" |
10 #include "base/time/time.h" | 10 #include "base/time/time.h" |
(...skipping 29 matching lines...) Expand all Loading... | |
40 | 40 |
41 int temporary = -1; | 41 int temporary = -1; |
42 if (*destination < 0 && base::StringToInt(tag->value, &temporary) && | 42 if (*destination < 0 && base::StringToInt(tag->value, &temporary) && |
43 temporary >= 0) { | 43 temporary >= 0) { |
44 *destination = temporary; | 44 *destination = temporary; |
45 } | 45 } |
46 | 46 |
47 return true; | 47 return true; |
48 } | 48 } |
49 | 49 |
50 // Set attached picture size limit to 4MB. Chosen arbitrarily. | |
51 const int kAttachedPicSizeLimit = 4 * 1024 * 1024; | |
52 | |
50 } // namespace | 53 } // namespace |
51 | 54 |
52 AudioVideoMetadataExtractor::StreamInfo::StreamInfo() {} | 55 AudioVideoMetadataExtractor::StreamInfo::StreamInfo() {} |
53 | 56 |
54 AudioVideoMetadataExtractor::StreamInfo::~StreamInfo() {} | 57 AudioVideoMetadataExtractor::StreamInfo::~StreamInfo() {} |
55 | 58 |
56 AudioVideoMetadataExtractor::AudioVideoMetadataExtractor() | 59 AudioVideoMetadataExtractor::AudioVideoMetadataExtractor() |
57 : extracted_(false), | 60 : extracted_(false), |
58 duration_(-1), | 61 duration_(-1), |
59 width_(-1), | 62 width_(-1), |
60 height_(-1), | 63 height_(-1), |
61 disc_(-1), | 64 disc_(-1), |
62 rotation_(-1), | 65 rotation_(-1), |
63 track_(-1) { | 66 track_(-1) { |
64 } | 67 } |
65 | 68 |
66 AudioVideoMetadataExtractor::~AudioVideoMetadataExtractor() { | 69 AudioVideoMetadataExtractor::~AudioVideoMetadataExtractor() { |
67 } | 70 } |
68 | 71 |
69 bool AudioVideoMetadataExtractor::Extract(DataSource* source) { | 72 bool AudioVideoMetadataExtractor::Extract(DataSource* source, |
73 bool extract_attached_pictures) { | |
70 DCHECK(!extracted_); | 74 DCHECK(!extracted_); |
71 | 75 |
72 bool read_ok = true; | 76 bool read_ok = true; |
73 media::BlockingUrlProtocol protocol(source, base::Bind(&OnError, &read_ok)); | 77 media::BlockingUrlProtocol protocol(source, base::Bind(&OnError, &read_ok)); |
74 media::FFmpegGlue glue(&protocol); | 78 media::FFmpegGlue glue(&protocol); |
75 AVFormatContext* format_context = glue.format_context(); | 79 AVFormatContext* format_context = glue.format_context(); |
76 | 80 |
77 if (!glue.OpenContext()) | 81 if (!glue.OpenContext()) |
78 return false; | 82 return false; |
79 | 83 |
(...skipping 30 matching lines...) Expand all Loading... | |
110 continue; | 114 continue; |
111 | 115 |
112 info.type = avcodec_get_name(stream->codec->codec_id); | 116 info.type = avcodec_get_name(stream->codec->codec_id); |
113 | 117 |
114 // Extract dimensions of largest stream that's not an attached picture. | 118 // Extract dimensions of largest stream that's not an attached picture. |
115 if (stream->codec->width > 0 && stream->codec->width > width_ && | 119 if (stream->codec->width > 0 && stream->codec->width > width_ && |
116 stream->codec->height > 0 && stream->codec->height > height_) { | 120 stream->codec->height > 0 && stream->codec->height > height_) { |
117 width_ = stream->codec->width; | 121 width_ = stream->codec->width; |
118 height_ = stream->codec->height; | 122 height_ = stream->codec->height; |
119 } | 123 } |
124 | |
125 // Extract attached picture if requested. | |
126 if (extract_attached_pictures && | |
127 stream->disposition == AV_DISPOSITION_ATTACHED_PIC && | |
128 stream->attached_pic.size > 0 && | |
129 stream->attached_pic.size <= kAttachedPicSizeLimit && | |
130 stream->attached_pic.data != NULL) { | |
131 std::string buffer( | |
vandebo (ex-Chrome)
2014/04/23 23:22:45
Looks like an extra copy... maybe pushback an empt
tommycli
2014/04/29 00:15:51
Done.
| |
132 reinterpret_cast<const char*>(stream->attached_pic.data), | |
133 stream->attached_pic.size); | |
134 attached_pictures_bytes_.push_back(buffer); | |
135 } | |
120 } | 136 } |
121 | 137 |
122 extracted_ = true; | 138 extracted_ = true; |
123 return true; | 139 return true; |
124 } | 140 } |
125 | 141 |
126 double AudioVideoMetadataExtractor::duration() const { | 142 double AudioVideoMetadataExtractor::duration() const { |
127 DCHECK(extracted_); | 143 DCHECK(extracted_); |
128 return duration_; | 144 return duration_; |
129 } | 145 } |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
202 DCHECK(extracted_); | 218 DCHECK(extracted_); |
203 return track_; | 219 return track_; |
204 } | 220 } |
205 | 221 |
206 const std::vector<AudioVideoMetadataExtractor::StreamInfo>& | 222 const std::vector<AudioVideoMetadataExtractor::StreamInfo>& |
207 AudioVideoMetadataExtractor::stream_infos() const { | 223 AudioVideoMetadataExtractor::stream_infos() const { |
208 DCHECK(extracted_); | 224 DCHECK(extracted_); |
209 return stream_infos_; | 225 return stream_infos_; |
210 } | 226 } |
211 | 227 |
228 const std::vector<std::string>& | |
229 AudioVideoMetadataExtractor::attached_pictures_bytes() const { | |
230 DCHECK(extracted_); | |
231 return attached_pictures_bytes_; | |
232 } | |
233 | |
212 void AudioVideoMetadataExtractor::ExtractDictionary( | 234 void AudioVideoMetadataExtractor::ExtractDictionary( |
213 AVDictionary* metadata, TagDictionary* raw_tags) { | 235 AVDictionary* metadata, TagDictionary* raw_tags) { |
214 if (!metadata) | 236 if (!metadata) |
215 return; | 237 return; |
216 | 238 |
217 AVDictionaryEntry* tag = NULL; | 239 AVDictionaryEntry* tag = NULL; |
218 while ((tag = av_dict_get(metadata, "", tag, AV_DICT_IGNORE_SUFFIX))) { | 240 while ((tag = av_dict_get(metadata, "", tag, AV_DICT_IGNORE_SUFFIX))) { |
219 if (raw_tags->find(tag->key) == raw_tags->end()) | 241 if (raw_tags->find(tag->key) == raw_tags->end()) |
220 (*raw_tags)[tag->key] = tag->value; | 242 (*raw_tags)[tag->key] = tag->value; |
221 | 243 |
222 if (ExtractInt(tag, "rotate", &rotation_)) continue; | 244 if (ExtractInt(tag, "rotate", &rotation_)) continue; |
223 if (ExtractString(tag, "album", &album_)) continue; | 245 if (ExtractString(tag, "album", &album_)) continue; |
224 if (ExtractString(tag, "artist", &artist_)) continue; | 246 if (ExtractString(tag, "artist", &artist_)) continue; |
225 if (ExtractString(tag, "comment", &comment_)) continue; | 247 if (ExtractString(tag, "comment", &comment_)) continue; |
226 if (ExtractString(tag, "copyright", ©right_)) continue; | 248 if (ExtractString(tag, "copyright", ©right_)) continue; |
227 if (ExtractString(tag, "date", &date_)) continue; | 249 if (ExtractString(tag, "date", &date_)) continue; |
228 if (ExtractInt(tag, "disc", &disc_)) continue; | 250 if (ExtractInt(tag, "disc", &disc_)) continue; |
229 if (ExtractString(tag, "encoder", &encoder_)) continue; | 251 if (ExtractString(tag, "encoder", &encoder_)) continue; |
230 if (ExtractString(tag, "encoded_by", &encoded_by_)) continue; | 252 if (ExtractString(tag, "encoded_by", &encoded_by_)) continue; |
231 if (ExtractString(tag, "genre", &genre_)) continue; | 253 if (ExtractString(tag, "genre", &genre_)) continue; |
232 if (ExtractString(tag, "language", &language_)) continue; | 254 if (ExtractString(tag, "language", &language_)) continue; |
233 if (ExtractString(tag, "title", &title_)) continue; | 255 if (ExtractString(tag, "title", &title_)) continue; |
234 if (ExtractInt(tag, "track", &track_)) continue; | 256 if (ExtractInt(tag, "track", &track_)) continue; |
235 } | 257 } |
236 } | 258 } |
237 | 259 |
238 } // namespace media | 260 } // namespace media |
OLD | NEW |