1 // Copyright 2014 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "media/filters/audio_video_metadata_extractor.h"
9 #include "base/hash/sha1.h"
10 #include "base/logging.h"
11 #include "build/build_config.h"
12 #include "media/base/test_data_util.h"
13 #include "media/filters/file_data_source.h"
14 #include "media/media_buildflags.h"
15 #include "testing/gtest/include/gtest/gtest.h"
19 std::unique_ptr<AudioVideoMetadataExtractor> GetExtractor(
20 const std::string& filename,
21 bool extract_attached_images,
23 double expected_duration,
25 int expected_height) {
26 FileDataSource source;
27 EXPECT_TRUE(source.Initialize(GetTestDataFilePath(filename)));
29 std::unique_ptr<AudioVideoMetadataExtractor> extractor(
30 new AudioVideoMetadataExtractor);
31 bool extracted = extractor->Extract(&source, extract_attached_images);
32 EXPECT_EQ(expected_result, extracted);
37 EXPECT_TRUE(extractor->has_duration());
38 EXPECT_EQ(expected_duration, extractor->duration());
40 EXPECT_EQ(expected_width, extractor->width());
41 EXPECT_EQ(expected_height, extractor->height());
46 const std::string GetTagValue(
47 const media::AudioVideoMetadataExtractor::TagDictionary& tags,
48 const char* tag_name) {
49 auto tag_data = tags.find(tag_name);
50 if (tag_data == tags.end()) {
51 DLOG(WARNING) << "Tag name \"" << tag_name << "\" not found!";
55 return tag_data->second;
58 const std::string TagsToString(
59 const media::AudioVideoMetadataExtractor::TagDictionary& tags) {
61 for (auto& kv : tags) {
71 TEST(AudioVideoMetadataExtractorTest, InvalidFile) {
72 GetExtractor("ten_byte_file", true, false, 0, -1, -1);
75 TEST(AudioVideoMetadataExtractorTest, AudioOGG) {
76 std::unique_ptr<AudioVideoMetadataExtractor> extractor =
77 GetExtractor("9ch.ogg", true, true, 0.1, -1, -1);
78 EXPECT_EQ("Processed by SoX", extractor->comment());
80 EXPECT_EQ("ogg", extractor->stream_infos()[0].type);
81 EXPECT_EQ(2u, extractor->stream_infos().size());
83 EXPECT_EQ(0u, extractor->stream_infos()[0].tags.size());
85 EXPECT_EQ(1u, extractor->stream_infos()[1].tags.size());
86 EXPECT_EQ("vorbis", extractor->stream_infos()[1].type);
87 EXPECT_EQ("Processed by SoX",
88 GetTagValue(extractor->stream_infos()[1].tags, "Comment"));
90 EXPECT_EQ(0u, extractor->attached_images_bytes().size());
93 TEST(AudioVideoMetadataExtractorTest, AudioWAV) {
94 std::unique_ptr<AudioVideoMetadataExtractor> extractor =
95 GetExtractor("sfx_u8.wav", true, true, 0.288413, -1, -1);
96 EXPECT_EQ("Lavf54.37.100", extractor->encoder());
97 EXPECT_EQ("Amadeus Pro", extractor->encoded_by());
99 EXPECT_EQ("wav", extractor->stream_infos()[0].type);
100 EXPECT_EQ(2u, extractor->stream_infos().size());
102 EXPECT_EQ(2u, extractor->stream_infos()[0].tags.size());
103 EXPECT_EQ("Lavf54.37.100",
104 GetTagValue(extractor->stream_infos()[0].tags, "encoder"));
105 EXPECT_EQ("Amadeus Pro",
106 GetTagValue(extractor->stream_infos()[0].tags, "encoded_by"));
108 EXPECT_EQ("pcm_u8", extractor->stream_infos()[1].type);
109 EXPECT_EQ(0u, extractor->stream_infos()[1].tags.size());
111 EXPECT_EQ(0u, extractor->attached_images_bytes().size());
114 TEST(AudioVideoMetadataExtractorTest, AudioFLAC) {
115 std::unique_ptr<AudioVideoMetadataExtractor> extractor =
116 GetExtractor("sfx.flac", true, true, 0.288413, -1, -1);
117 EXPECT_EQ("Lavf55.43.100", extractor->encoder());
118 EXPECT_EQ("Amadeus Pro", extractor->encoded_by());
120 EXPECT_EQ("flac", extractor->stream_infos()[0].type);
121 EXPECT_EQ(2u, extractor->stream_infos().size());
123 EXPECT_EQ(2u, extractor->stream_infos()[0].tags.size());
124 EXPECT_EQ("Lavf55.43.100",
125 GetTagValue(extractor->stream_infos()[0].tags, "encoder"));
126 EXPECT_EQ("Amadeus Pro",
127 GetTagValue(extractor->stream_infos()[0].tags, "encoded_by"));
129 EXPECT_EQ("flac", extractor->stream_infos()[1].type);
130 EXPECT_EQ(0u, extractor->stream_infos()[1].tags.size());
132 EXPECT_EQ(0u, extractor->attached_images_bytes().size());
135 TEST(AudioVideoMetadataExtractorTest, VideoWebM) {
136 std::unique_ptr<AudioVideoMetadataExtractor> extractor =
137 GetExtractor("bear-320x240-multitrack.webm", true, true, 2.744, 320, 240);
138 EXPECT_EQ("Lavf53.9.0", extractor->encoder());
140 EXPECT_EQ(6u, extractor->stream_infos().size());
142 EXPECT_EQ("matroska,webm", extractor->stream_infos()[0].type);
143 EXPECT_EQ(1u, extractor->stream_infos()[0].tags.size());
144 EXPECT_EQ("Lavf53.9.0",
145 GetTagValue(extractor->stream_infos()[0].tags, "ENCODER"));
147 EXPECT_EQ("vp8", extractor->stream_infos()[1].type);
148 EXPECT_EQ(0u, extractor->stream_infos()[1].tags.size());
150 EXPECT_EQ("vorbis", extractor->stream_infos()[2].type);
151 EXPECT_EQ(0u, extractor->stream_infos()[2].tags.size());
153 EXPECT_EQ("subrip", extractor->stream_infos()[3].type);
154 EXPECT_EQ(0u, extractor->stream_infos()[3].tags.size());
156 EXPECT_EQ("theora", extractor->stream_infos()[4].type);
157 EXPECT_EQ(0u, extractor->stream_infos()[4].tags.size());
159 EXPECT_EQ("pcm_s16le", extractor->stream_infos()[5].type);
160 EXPECT_EQ(1u, extractor->stream_infos()[5].tags.size());
161 EXPECT_EQ("Lavc52.32.0",
162 GetTagValue(extractor->stream_infos()[5].tags, "ENCODER"));
164 EXPECT_EQ(0u, extractor->attached_images_bytes().size());
167 #if BUILDFLAG(USE_PROPRIETARY_CODECS)
168 TEST(AudioVideoMetadataExtractorTest, AndroidRotatedMP4Video) {
169 std::unique_ptr<AudioVideoMetadataExtractor> extractor =
170 GetExtractor("90rotation.mp4", true, true, 0.196056, 1920, 1080);
172 EXPECT_EQ(90, extractor->rotation());
174 EXPECT_EQ(3u, extractor->stream_infos().size());
176 EXPECT_EQ("mov,mp4,m4a,3gp,3g2,mj2", extractor->stream_infos()[0].type);
177 EXPECT_EQ(4u, extractor->stream_infos()[0].tags.size());
178 EXPECT_EQ("isom3gp4", GetTagValue(extractor->stream_infos()[0].tags,
179 "compatible_brands"));
180 EXPECT_EQ("2014-02-11T00:39:25.000000Z",
181 GetTagValue(extractor->stream_infos()[0].tags, "creation_time"));
183 GetTagValue(extractor->stream_infos()[0].tags, "major_brand"));
185 GetTagValue(extractor->stream_infos()[0].tags, "minor_version"));
187 EXPECT_EQ("h264", extractor->stream_infos()[1].type);
188 EXPECT_EQ(6u, extractor->stream_infos()[1].tags.size())
189 << "Tags: " << TagsToString(extractor->stream_infos()[1].tags);
190 EXPECT_EQ("2014-02-11T00:39:25.000000Z",
191 GetTagValue(extractor->stream_infos()[1].tags, "creation_time"));
192 EXPECT_EQ("VideoHandle",
193 GetTagValue(extractor->stream_infos()[1].tags, "handler_name"));
194 EXPECT_EQ("MOTO", GetTagValue(extractor->stream_infos()[1].tags, "encoder"));
195 EXPECT_EQ("eng", GetTagValue(extractor->stream_infos()[1].tags, "language"));
196 EXPECT_EQ("90", GetTagValue(extractor->stream_infos()[1].tags, "rotate"));
198 EXPECT_EQ("aac", extractor->stream_infos()[2].type);
199 EXPECT_EQ(4u, extractor->stream_infos()[2].tags.size())
200 << "Tags: " << TagsToString(extractor->stream_infos()[2].tags);
201 EXPECT_EQ("2014-02-11T00:39:25.000000Z",
202 GetTagValue(extractor->stream_infos()[2].tags, "creation_time"));
203 EXPECT_EQ("SoundHandle",
204 GetTagValue(extractor->stream_infos()[2].tags, "handler_name"));
205 EXPECT_EQ("eng", GetTagValue(extractor->stream_infos()[2].tags, "language"));
207 EXPECT_EQ(0u, extractor->attached_images_bytes().size());
209 #endif // BUILDFLAG(USE_PROPRIETARY_CODECS)
211 TEST(AudioVideoMetadataExtractorTest, AudioMP3) {
212 std::unique_ptr<AudioVideoMetadataExtractor> extractor =
213 GetExtractor("id3_png_test.mp3", true, true, 1.018776, -1, -1);
215 EXPECT_EQ("Airbag", extractor->title());
216 EXPECT_EQ("Radiohead", extractor->artist());
217 EXPECT_EQ("OK Computer", extractor->album());
218 EXPECT_EQ(1, extractor->track());
219 EXPECT_EQ("Alternative", extractor->genre());
220 EXPECT_EQ("1997", extractor->date());
221 EXPECT_EQ("Lavf54.4.100", extractor->encoder());
223 EXPECT_EQ(3u, extractor->stream_infos().size());
225 EXPECT_EQ("mp3", extractor->stream_infos()[0].type);
226 EXPECT_EQ(7u, extractor->stream_infos()[0].tags.size());
227 EXPECT_EQ("OK Computer",
228 GetTagValue(extractor->stream_infos()[0].tags, "album"));
229 EXPECT_EQ("Radiohead",
230 GetTagValue(extractor->stream_infos()[0].tags, "artist"));
231 EXPECT_EQ("1997", GetTagValue(extractor->stream_infos()[0].tags, "date"));
232 EXPECT_EQ("Lavf54.4.100",
233 GetTagValue(extractor->stream_infos()[0].tags, "encoder"));
234 EXPECT_EQ("Alternative",
235 GetTagValue(extractor->stream_infos()[0].tags, "genre"));
236 EXPECT_EQ("Airbag", GetTagValue(extractor->stream_infos()[0].tags, "title"));
237 EXPECT_EQ("1", GetTagValue(extractor->stream_infos()[0].tags, "track"));
239 EXPECT_EQ("mp3", extractor->stream_infos()[1].type);
240 EXPECT_EQ(0u, extractor->stream_infos()[1].tags.size());
242 EXPECT_EQ("png", extractor->stream_infos()[2].type);
243 EXPECT_EQ(1u, extractor->stream_infos()[2].tags.size());
244 EXPECT_EQ("Other", GetTagValue(extractor->stream_infos()[2].tags, "comment"));
246 EXPECT_EQ(1u, extractor->attached_images_bytes().size());
247 EXPECT_EQ(155752u, extractor->attached_images_bytes()[0].size());
249 EXPECT_EQ("\x89PNG\r\n\x1a\n",
250 extractor->attached_images_bytes()[0].substr(0, 8));
251 EXPECT_EQ("IEND\xae\x42\x60\x82",
252 extractor->attached_images_bytes()[0].substr(
253 extractor->attached_images_bytes()[0].size() - 8, 8));
254 EXPECT_EQ("\xF3\xED\x8F\xC7\xC7\x98\xB9V|p\xC0u!\xB5\x82\xCF\x95\xF0\xCD\xCE",
255 base::SHA1HashString(extractor->attached_images_bytes()[0]));
258 TEST(AudioVideoMetadataExtractorTest, AudioFLACInMp4) {
259 std::unique_ptr<AudioVideoMetadataExtractor> extractor =
260 GetExtractor("sfx-flac.mp4", true, true, 0.288413, -1, -1);
261 EXPECT_EQ("Lavf57.75.100", extractor->encoder());
263 EXPECT_EQ("mov,mp4,m4a,3gp,3g2,mj2", extractor->stream_infos()[0].type);
264 EXPECT_EQ(2u, extractor->stream_infos().size());
266 EXPECT_EQ(4u, extractor->stream_infos()[0].tags.size());
268 GetTagValue(extractor->stream_infos()[0].tags, "major_brand"));
270 GetTagValue(extractor->stream_infos()[0].tags, "minor_version"));
271 EXPECT_EQ("isomiso2mp41", GetTagValue(extractor->stream_infos()[0].tags,
272 "compatible_brands"));
273 EXPECT_EQ("Lavf57.75.100",
274 GetTagValue(extractor->stream_infos()[0].tags, "encoder"));
276 EXPECT_EQ("flac", extractor->stream_infos()[1].type);
277 EXPECT_EQ(3u, extractor->stream_infos()[1].tags.size())
278 << "Tags: " << TagsToString(extractor->stream_infos()[1].tags);
279 EXPECT_EQ("SoundHandler",
280 GetTagValue(extractor->stream_infos()[1].tags, "handler_name"));
281 EXPECT_EQ("und", GetTagValue(extractor->stream_infos()[1].tags, "language"));
283 EXPECT_EQ(0u, extractor->attached_images_bytes().size());