Revert "[M120 Migration]Fix for crash during chrome exit"
[platform/framework/web/chromium-efl.git] / media / filters / audio_video_metadata_extractor_unittest.cc
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.
4
5 #include "media/filters/audio_video_metadata_extractor.h"
6
7 #include <memory>
8
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"
16
17 namespace media {
18
19 std::unique_ptr<AudioVideoMetadataExtractor> GetExtractor(
20     const std::string& filename,
21     bool extract_attached_images,
22     bool expected_result,
23     double expected_duration,
24     int expected_width,
25     int expected_height) {
26   FileDataSource source;
27   EXPECT_TRUE(source.Initialize(GetTestDataFilePath(filename)));
28
29   auto extractor = std::make_unique<AudioVideoMetadataExtractor>();
30   bool extracted = extractor->Extract(&source, extract_attached_images);
31   EXPECT_EQ(expected_result, extracted);
32
33   if (!extracted)
34     return extractor;
35
36   EXPECT_TRUE(extractor->has_duration());
37   EXPECT_EQ(expected_duration, extractor->duration());
38
39   EXPECT_EQ(expected_width, extractor->width());
40   EXPECT_EQ(expected_height, extractor->height());
41
42   return extractor;
43 }
44
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!";
51     return "";
52   }
53
54   return tag_data->second;
55 }
56
57 const std::string TagsToString(
58     const media::AudioVideoMetadataExtractor::TagDictionary& tags) {
59   std::string result;
60   for (auto& kv : tags) {
61     if (!result.empty())
62       result += " | ";
63     result += kv.first;
64     result += ": ";
65     result += kv.second;
66   }
67   return result;
68 }
69
70 TEST(AudioVideoMetadataExtractorTest, InvalidFile) {
71   GetExtractor("ten_byte_file", true, false, 0, -1, -1);
72 }
73
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());
78
79   EXPECT_EQ("ogg", extractor->stream_infos()[0].type);
80   EXPECT_EQ(2u, extractor->stream_infos().size());
81
82   EXPECT_EQ(0u, extractor->stream_infos()[0].tags.size());
83
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"));
88
89   EXPECT_EQ(0u, extractor->attached_images_bytes().size());
90 }
91
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());
97
98   EXPECT_EQ("wav", extractor->stream_infos()[0].type);
99   EXPECT_EQ(2u, extractor->stream_infos().size());
100
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"));
106
107   EXPECT_EQ("pcm_u8", extractor->stream_infos()[1].type);
108   EXPECT_EQ(0u, extractor->stream_infos()[1].tags.size());
109
110   EXPECT_EQ(0u, extractor->attached_images_bytes().size());
111 }
112
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());
118
119   EXPECT_EQ("flac", extractor->stream_infos()[0].type);
120   EXPECT_EQ(2u, extractor->stream_infos().size());
121
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"));
127
128   EXPECT_EQ("flac", extractor->stream_infos()[1].type);
129   EXPECT_EQ(0u, extractor->stream_infos()[1].tags.size());
130
131   EXPECT_EQ(0u, extractor->attached_images_bytes().size());
132 }
133
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());
138
139   EXPECT_EQ(6u, extractor->stream_infos().size());
140
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"));
145
146   EXPECT_EQ("vp8", extractor->stream_infos()[1].type);
147   EXPECT_EQ(0u, extractor->stream_infos()[1].tags.size());
148
149   EXPECT_EQ("vorbis", extractor->stream_infos()[2].type);
150   EXPECT_EQ(0u, extractor->stream_infos()[2].tags.size());
151
152   EXPECT_EQ("subrip", extractor->stream_infos()[3].type);
153   EXPECT_EQ(0u, extractor->stream_infos()[3].tags.size());
154
155   EXPECT_EQ("theora", extractor->stream_infos()[4].type);
156   EXPECT_EQ(0u, extractor->stream_infos()[4].tags.size());
157
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"));
162
163   EXPECT_EQ(0u, extractor->attached_images_bytes().size());
164 }
165
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);
170
171   EXPECT_EQ(90, extractor->rotation());
172
173   EXPECT_EQ(3u, extractor->stream_infos().size());
174
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"));
181   EXPECT_EQ("isom",
182             GetTagValue(extractor->stream_infos()[0].tags, "major_brand"));
183   EXPECT_EQ("0",
184             GetTagValue(extractor->stream_infos()[0].tags, "minor_version"));
185
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"));
196
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"));
205
206   EXPECT_EQ(0u, extractor->attached_images_bytes().size());
207 }
208 #endif  // BUILDFLAG(USE_PROPRIETARY_CODECS)
209
210 TEST(AudioVideoMetadataExtractorTest, AudioMP3) {
211   std::unique_ptr<AudioVideoMetadataExtractor> extractor =
212       GetExtractor("id3_png_test.mp3", true, true, 1.018776, -1, -1);
213
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());
221
222   EXPECT_EQ(3u, extractor->stream_infos().size());
223
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"));
237
238   EXPECT_EQ("mp3", extractor->stream_infos()[1].type);
239   EXPECT_EQ(0u, extractor->stream_infos()[1].tags.size());
240
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"));
244
245   EXPECT_EQ(1u, extractor->attached_images_bytes().size());
246   EXPECT_EQ(155752u, extractor->attached_images_bytes()[0].size());
247
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]));
255 }
256
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());
261
262   EXPECT_EQ("mov,mp4,m4a,3gp,3g2,mj2", extractor->stream_infos()[0].type);
263   EXPECT_EQ(2u, extractor->stream_infos().size());
264
265   EXPECT_EQ(4u, extractor->stream_infos()[0].tags.size());
266   EXPECT_EQ("isom",
267             GetTagValue(extractor->stream_infos()[0].tags, "major_brand"));
268   EXPECT_EQ("512",
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"));
274
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"));
281
282   EXPECT_EQ(0u, extractor->attached_images_bytes().size());
283 }
284
285 }  // namespace media