Upload upstream chromium 108.0.5359.1
[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   std::unique_ptr<AudioVideoMetadataExtractor> extractor(
30       new AudioVideoMetadataExtractor);
31   bool extracted = extractor->Extract(&source, extract_attached_images);
32   EXPECT_EQ(expected_result, extracted);
33
34   if (!extracted)
35     return extractor;
36
37   EXPECT_TRUE(extractor->has_duration());
38   EXPECT_EQ(expected_duration, extractor->duration());
39
40   EXPECT_EQ(expected_width, extractor->width());
41   EXPECT_EQ(expected_height, extractor->height());
42
43   return extractor;
44 }
45
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!";
52     return "";
53   }
54
55   return tag_data->second;
56 }
57
58 const std::string TagsToString(
59     const media::AudioVideoMetadataExtractor::TagDictionary& tags) {
60   std::string result;
61   for (auto& kv : tags) {
62     if (!result.empty())
63       result += " | ";
64     result += kv.first;
65     result += ": ";
66     result += kv.second;
67   }
68   return result;
69 }
70
71 TEST(AudioVideoMetadataExtractorTest, InvalidFile) {
72   GetExtractor("ten_byte_file", true, false, 0, -1, -1);
73 }
74
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());
79
80   EXPECT_EQ("ogg", extractor->stream_infos()[0].type);
81   EXPECT_EQ(2u, extractor->stream_infos().size());
82
83   EXPECT_EQ(0u, extractor->stream_infos()[0].tags.size());
84
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"));
89
90   EXPECT_EQ(0u, extractor->attached_images_bytes().size());
91 }
92
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());
98
99   EXPECT_EQ("wav", extractor->stream_infos()[0].type);
100   EXPECT_EQ(2u, extractor->stream_infos().size());
101
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"));
107
108   EXPECT_EQ("pcm_u8", extractor->stream_infos()[1].type);
109   EXPECT_EQ(0u, extractor->stream_infos()[1].tags.size());
110
111   EXPECT_EQ(0u, extractor->attached_images_bytes().size());
112 }
113
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());
119
120   EXPECT_EQ("flac", extractor->stream_infos()[0].type);
121   EXPECT_EQ(2u, extractor->stream_infos().size());
122
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"));
128
129   EXPECT_EQ("flac", extractor->stream_infos()[1].type);
130   EXPECT_EQ(0u, extractor->stream_infos()[1].tags.size());
131
132   EXPECT_EQ(0u, extractor->attached_images_bytes().size());
133 }
134
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());
139
140   EXPECT_EQ(6u, extractor->stream_infos().size());
141
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"));
146
147   EXPECT_EQ("vp8", extractor->stream_infos()[1].type);
148   EXPECT_EQ(0u, extractor->stream_infos()[1].tags.size());
149
150   EXPECT_EQ("vorbis", extractor->stream_infos()[2].type);
151   EXPECT_EQ(0u, extractor->stream_infos()[2].tags.size());
152
153   EXPECT_EQ("subrip", extractor->stream_infos()[3].type);
154   EXPECT_EQ(0u, extractor->stream_infos()[3].tags.size());
155
156   EXPECT_EQ("theora", extractor->stream_infos()[4].type);
157   EXPECT_EQ(0u, extractor->stream_infos()[4].tags.size());
158
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"));
163
164   EXPECT_EQ(0u, extractor->attached_images_bytes().size());
165 }
166
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);
171
172   EXPECT_EQ(90, extractor->rotation());
173
174   EXPECT_EQ(3u, extractor->stream_infos().size());
175
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"));
182   EXPECT_EQ("isom",
183             GetTagValue(extractor->stream_infos()[0].tags, "major_brand"));
184   EXPECT_EQ("0",
185             GetTagValue(extractor->stream_infos()[0].tags, "minor_version"));
186
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"));
197
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"));
206
207   EXPECT_EQ(0u, extractor->attached_images_bytes().size());
208 }
209 #endif  // BUILDFLAG(USE_PROPRIETARY_CODECS)
210
211 TEST(AudioVideoMetadataExtractorTest, AudioMP3) {
212   std::unique_ptr<AudioVideoMetadataExtractor> extractor =
213       GetExtractor("id3_png_test.mp3", true, true, 1.018776, -1, -1);
214
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());
222
223   EXPECT_EQ(3u, extractor->stream_infos().size());
224
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"));
238
239   EXPECT_EQ("mp3", extractor->stream_infos()[1].type);
240   EXPECT_EQ(0u, extractor->stream_infos()[1].tags.size());
241
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"));
245
246   EXPECT_EQ(1u, extractor->attached_images_bytes().size());
247   EXPECT_EQ(155752u, extractor->attached_images_bytes()[0].size());
248
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]));
256 }
257
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());
262
263   EXPECT_EQ("mov,mp4,m4a,3gp,3g2,mj2", extractor->stream_infos()[0].type);
264   EXPECT_EQ(2u, extractor->stream_infos().size());
265
266   EXPECT_EQ(4u, extractor->stream_infos()[0].tags.size());
267   EXPECT_EQ("isom",
268             GetTagValue(extractor->stream_infos()[0].tags, "major_brand"));
269   EXPECT_EQ("512",
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"));
275
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"));
282
283   EXPECT_EQ(0u, extractor->attached_images_bytes().size());
284 }
285
286 }  // namespace media