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 auto extractor = std::make_unique<AudioVideoMetadataExtractor>();
30 bool extracted = extractor->Extract(&source, extract_attached_images);
31 EXPECT_EQ(expected_result, extracted);
36 EXPECT_TRUE(extractor->has_duration());
37 EXPECT_EQ(expected_duration, extractor->duration());
39 EXPECT_EQ(expected_width, extractor->width());
40 EXPECT_EQ(expected_height, extractor->height());
45 const std::string GetTagValue(
46 const media::AudioVideoMetadataExtractor::TagDictionary& tags,
47 const char* tag_name) {
48 auto tag_data = tags.find(tag_name);
49 if (tag_data == tags.end()) {
50 DLOG(WARNING) << "Tag name \"" << tag_name << "\" not found!";
54 return tag_data->second;
57 const std::string TagsToString(
58 const media::AudioVideoMetadataExtractor::TagDictionary& tags) {
60 for (auto& kv : tags) {
70 TEST(AudioVideoMetadataExtractorTest, InvalidFile) {
71 GetExtractor("ten_byte_file", true, false, 0, -1, -1);
74 TEST(AudioVideoMetadataExtractorTest, AudioOGG) {
75 std::unique_ptr<AudioVideoMetadataExtractor> extractor =
76 GetExtractor("9ch.ogg", true, true, 0.1, -1, -1);
77 EXPECT_EQ("Processed by SoX", extractor->comment());
79 EXPECT_EQ("ogg", extractor->stream_infos()[0].type);
80 EXPECT_EQ(2u, extractor->stream_infos().size());
82 EXPECT_EQ(0u, extractor->stream_infos()[0].tags.size());
84 EXPECT_EQ(1u, extractor->stream_infos()[1].tags.size());
85 EXPECT_EQ("vorbis", extractor->stream_infos()[1].type);
86 EXPECT_EQ("Processed by SoX",
87 GetTagValue(extractor->stream_infos()[1].tags, "Comment"));
89 EXPECT_EQ(0u, extractor->attached_images_bytes().size());
92 TEST(AudioVideoMetadataExtractorTest, AudioWAV) {
93 std::unique_ptr<AudioVideoMetadataExtractor> extractor =
94 GetExtractor("sfx_u8.wav", true, true, 0.288413, -1, -1);
95 EXPECT_EQ("Lavf54.37.100", extractor->encoder());
96 EXPECT_EQ("Amadeus Pro", extractor->encoded_by());
98 EXPECT_EQ("wav", extractor->stream_infos()[0].type);
99 EXPECT_EQ(2u, extractor->stream_infos().size());
101 EXPECT_EQ(2u, extractor->stream_infos()[0].tags.size());
102 EXPECT_EQ("Lavf54.37.100",
103 GetTagValue(extractor->stream_infos()[0].tags, "encoder"));
104 EXPECT_EQ("Amadeus Pro",
105 GetTagValue(extractor->stream_infos()[0].tags, "encoded_by"));
107 EXPECT_EQ("pcm_u8", extractor->stream_infos()[1].type);
108 EXPECT_EQ(0u, extractor->stream_infos()[1].tags.size());
110 EXPECT_EQ(0u, extractor->attached_images_bytes().size());
113 TEST(AudioVideoMetadataExtractorTest, AudioFLAC) {
114 std::unique_ptr<AudioVideoMetadataExtractor> extractor =
115 GetExtractor("sfx.flac", true, true, 0.288413, -1, -1);
116 EXPECT_EQ("Lavf55.43.100", extractor->encoder());
117 EXPECT_EQ("Amadeus Pro", extractor->encoded_by());
119 EXPECT_EQ("flac", extractor->stream_infos()[0].type);
120 EXPECT_EQ(2u, extractor->stream_infos().size());
122 EXPECT_EQ(2u, extractor->stream_infos()[0].tags.size());
123 EXPECT_EQ("Lavf55.43.100",
124 GetTagValue(extractor->stream_infos()[0].tags, "encoder"));
125 EXPECT_EQ("Amadeus Pro",
126 GetTagValue(extractor->stream_infos()[0].tags, "encoded_by"));
128 EXPECT_EQ("flac", extractor->stream_infos()[1].type);
129 EXPECT_EQ(0u, extractor->stream_infos()[1].tags.size());
131 EXPECT_EQ(0u, extractor->attached_images_bytes().size());
134 TEST(AudioVideoMetadataExtractorTest, VideoWebM) {
135 std::unique_ptr<AudioVideoMetadataExtractor> extractor =
136 GetExtractor("bear-320x240-multitrack.webm", true, true, 2.744, 320, 240);
137 EXPECT_EQ("Lavf53.9.0", extractor->encoder());
139 EXPECT_EQ(6u, extractor->stream_infos().size());
141 EXPECT_EQ("matroska,webm", extractor->stream_infos()[0].type);
142 EXPECT_EQ(1u, extractor->stream_infos()[0].tags.size());
143 EXPECT_EQ("Lavf53.9.0",
144 GetTagValue(extractor->stream_infos()[0].tags, "ENCODER"));
146 EXPECT_EQ("vp8", extractor->stream_infos()[1].type);
147 EXPECT_EQ(0u, extractor->stream_infos()[1].tags.size());
149 EXPECT_EQ("vorbis", extractor->stream_infos()[2].type);
150 EXPECT_EQ(0u, extractor->stream_infos()[2].tags.size());
152 EXPECT_EQ("subrip", extractor->stream_infos()[3].type);
153 EXPECT_EQ(0u, extractor->stream_infos()[3].tags.size());
155 EXPECT_EQ("theora", extractor->stream_infos()[4].type);
156 EXPECT_EQ(0u, extractor->stream_infos()[4].tags.size());
158 EXPECT_EQ("pcm_s16le", extractor->stream_infos()[5].type);
159 EXPECT_EQ(1u, extractor->stream_infos()[5].tags.size());
160 EXPECT_EQ("Lavc52.32.0",
161 GetTagValue(extractor->stream_infos()[5].tags, "ENCODER"));
163 EXPECT_EQ(0u, extractor->attached_images_bytes().size());
166 #if BUILDFLAG(USE_PROPRIETARY_CODECS)
167 TEST(AudioVideoMetadataExtractorTest, AndroidRotatedMP4Video) {
168 std::unique_ptr<AudioVideoMetadataExtractor> extractor =
169 GetExtractor("90rotation.mp4", true, true, 0.196056, 1920, 1080);
171 EXPECT_EQ(90, extractor->rotation());
173 EXPECT_EQ(3u, extractor->stream_infos().size());
175 EXPECT_EQ("mov,mp4,m4a,3gp,3g2,mj2", extractor->stream_infos()[0].type);
176 EXPECT_EQ(4u, extractor->stream_infos()[0].tags.size());
177 EXPECT_EQ("isom3gp4", GetTagValue(extractor->stream_infos()[0].tags,
178 "compatible_brands"));
179 EXPECT_EQ("2014-02-11T00:39:25.000000Z",
180 GetTagValue(extractor->stream_infos()[0].tags, "creation_time"));
182 GetTagValue(extractor->stream_infos()[0].tags, "major_brand"));
184 GetTagValue(extractor->stream_infos()[0].tags, "minor_version"));
186 EXPECT_EQ("h264", extractor->stream_infos()[1].type);
187 EXPECT_EQ(6u, extractor->stream_infos()[1].tags.size())
188 << "Tags: " << TagsToString(extractor->stream_infos()[1].tags);
189 EXPECT_EQ("2014-02-11T00:39:25.000000Z",
190 GetTagValue(extractor->stream_infos()[1].tags, "creation_time"));
191 EXPECT_EQ("VideoHandle",
192 GetTagValue(extractor->stream_infos()[1].tags, "handler_name"));
193 EXPECT_EQ("MOTO", GetTagValue(extractor->stream_infos()[1].tags, "encoder"));
194 EXPECT_EQ("eng", GetTagValue(extractor->stream_infos()[1].tags, "language"));
195 EXPECT_EQ("90", GetTagValue(extractor->stream_infos()[1].tags, "rotate"));
197 EXPECT_EQ("aac", extractor->stream_infos()[2].type);
198 EXPECT_EQ(4u, extractor->stream_infos()[2].tags.size())
199 << "Tags: " << TagsToString(extractor->stream_infos()[2].tags);
200 EXPECT_EQ("2014-02-11T00:39:25.000000Z",
201 GetTagValue(extractor->stream_infos()[2].tags, "creation_time"));
202 EXPECT_EQ("SoundHandle",
203 GetTagValue(extractor->stream_infos()[2].tags, "handler_name"));
204 EXPECT_EQ("eng", GetTagValue(extractor->stream_infos()[2].tags, "language"));
206 EXPECT_EQ(0u, extractor->attached_images_bytes().size());
208 #endif // BUILDFLAG(USE_PROPRIETARY_CODECS)
210 TEST(AudioVideoMetadataExtractorTest, AudioMP3) {
211 std::unique_ptr<AudioVideoMetadataExtractor> extractor =
212 GetExtractor("id3_png_test.mp3", true, true, 1.018776, -1, -1);
214 EXPECT_EQ("Airbag", extractor->title());
215 EXPECT_EQ("Radiohead", extractor->artist());
216 EXPECT_EQ("OK Computer", extractor->album());
217 EXPECT_EQ(1, extractor->track());
218 EXPECT_EQ("Alternative", extractor->genre());
219 EXPECT_EQ("1997", extractor->date());
220 EXPECT_EQ("Lavf54.4.100", extractor->encoder());
222 EXPECT_EQ(3u, extractor->stream_infos().size());
224 EXPECT_EQ("mp3", extractor->stream_infos()[0].type);
225 EXPECT_EQ(7u, extractor->stream_infos()[0].tags.size());
226 EXPECT_EQ("OK Computer",
227 GetTagValue(extractor->stream_infos()[0].tags, "album"));
228 EXPECT_EQ("Radiohead",
229 GetTagValue(extractor->stream_infos()[0].tags, "artist"));
230 EXPECT_EQ("1997", GetTagValue(extractor->stream_infos()[0].tags, "date"));
231 EXPECT_EQ("Lavf54.4.100",
232 GetTagValue(extractor->stream_infos()[0].tags, "encoder"));
233 EXPECT_EQ("Alternative",
234 GetTagValue(extractor->stream_infos()[0].tags, "genre"));
235 EXPECT_EQ("Airbag", GetTagValue(extractor->stream_infos()[0].tags, "title"));
236 EXPECT_EQ("1", GetTagValue(extractor->stream_infos()[0].tags, "track"));
238 EXPECT_EQ("mp3", extractor->stream_infos()[1].type);
239 EXPECT_EQ(0u, extractor->stream_infos()[1].tags.size());
241 EXPECT_EQ("png", extractor->stream_infos()[2].type);
242 EXPECT_EQ(1u, extractor->stream_infos()[2].tags.size());
243 EXPECT_EQ("Other", GetTagValue(extractor->stream_infos()[2].tags, "comment"));
245 EXPECT_EQ(1u, extractor->attached_images_bytes().size());
246 EXPECT_EQ(155752u, extractor->attached_images_bytes()[0].size());
248 EXPECT_EQ("\x89PNG\r\n\x1a\n",
249 extractor->attached_images_bytes()[0].substr(0, 8));
250 EXPECT_EQ("IEND\xae\x42\x60\x82",
251 extractor->attached_images_bytes()[0].substr(
252 extractor->attached_images_bytes()[0].size() - 8, 8));
253 EXPECT_EQ("\xF3\xED\x8F\xC7\xC7\x98\xB9V|p\xC0u!\xB5\x82\xCF\x95\xF0\xCD\xCE",
254 base::SHA1HashString(extractor->attached_images_bytes()[0]));
257 TEST(AudioVideoMetadataExtractorTest, AudioFLACInMp4) {
258 std::unique_ptr<AudioVideoMetadataExtractor> extractor =
259 GetExtractor("sfx-flac.mp4", true, true, 0.288413, -1, -1);
260 EXPECT_EQ("Lavf57.75.100", extractor->encoder());
262 EXPECT_EQ("mov,mp4,m4a,3gp,3g2,mj2", extractor->stream_infos()[0].type);
263 EXPECT_EQ(2u, extractor->stream_infos().size());
265 EXPECT_EQ(4u, extractor->stream_infos()[0].tags.size());
267 GetTagValue(extractor->stream_infos()[0].tags, "major_brand"));
269 GetTagValue(extractor->stream_infos()[0].tags, "minor_version"));
270 EXPECT_EQ("isomiso2mp41", GetTagValue(extractor->stream_infos()[0].tags,
271 "compatible_brands"));
272 EXPECT_EQ("Lavf57.75.100",
273 GetTagValue(extractor->stream_infos()[0].tags, "encoder"));
275 EXPECT_EQ("flac", extractor->stream_infos()[1].type);
276 EXPECT_EQ(3u, extractor->stream_infos()[1].tags.size())
277 << "Tags: " << TagsToString(extractor->stream_infos()[1].tags);
278 EXPECT_EQ("SoundHandler",
279 GetTagValue(extractor->stream_infos()[1].tags, "handler_name"));
280 EXPECT_EQ("und", GetTagValue(extractor->stream_infos()[1].tags, "language"));
282 EXPECT_EQ(0u, extractor->attached_images_bytes().size());