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
3// found in the LICENSE file.
4
5#include "base/logging.h"
6#include "base/memory/scoped_ptr.h"
7#include "base/sha1.h"
8#include "build/build_config.h"
9#include "media/base/audio_video_metadata_extractor.h"
10#include "media/base/test_data_util.h"
11#include "media/filters/file_data_source.h"
12#include "testing/gtest/include/gtest/gtest.h"
13
14namespace media {
15
16scoped_ptr<AudioVideoMetadataExtractor> GetExtractor(
17    const std::string& filename,
18    bool extract_attached_images,
19    bool expected_result,
20    double expected_duration,
21    int expected_width,
22    int expected_height) {
23  FileDataSource source;
24  EXPECT_TRUE(source.Initialize(GetTestDataFilePath(filename)));
25
26  scoped_ptr<AudioVideoMetadataExtractor> extractor(
27      new AudioVideoMetadataExtractor);
28  bool extracted = extractor->Extract(&source, extract_attached_images);
29  EXPECT_EQ(expected_result, extracted);
30
31  if (!extracted)
32    return extractor.Pass();
33
34  EXPECT_EQ(expected_duration, extractor->duration());
35
36  EXPECT_EQ(expected_width, extractor->width());
37  EXPECT_EQ(expected_height, extractor->height());
38
39  return extractor.Pass();
40}
41
42TEST(AudioVideoMetadataExtractorTest, InvalidFile) {
43  GetExtractor("ten_byte_file", true, false, 0, -1, -1);
44}
45
46TEST(AudioVideoMetadataExtractorTest, AudioOGG) {
47  scoped_ptr<AudioVideoMetadataExtractor> extractor =
48      GetExtractor("9ch.ogg", true, true, 0, -1, -1);
49  EXPECT_EQ("Processed by SoX", extractor->comment());
50
51  EXPECT_EQ("ogg", extractor->stream_infos()[0].type);
52  EXPECT_EQ(2u, extractor->stream_infos().size());
53
54  EXPECT_EQ(0u, extractor->stream_infos()[0].tags.size());
55
56  EXPECT_EQ(1u, extractor->stream_infos()[1].tags.size());
57  EXPECT_EQ("vorbis", extractor->stream_infos()[1].type);
58  EXPECT_EQ("Processed by SoX",
59            extractor->stream_infos()[1].tags.find("COMMENT")->second);
60
61  EXPECT_EQ(0u, extractor->attached_images_bytes().size());
62}
63
64TEST(AudioVideoMetadataExtractorTest, AudioWAV) {
65  scoped_ptr<AudioVideoMetadataExtractor> extractor =
66      GetExtractor("sfx_u8.wav", true, true, 0, -1, -1);
67  EXPECT_EQ("Lavf54.37.100", extractor->encoder());
68  EXPECT_EQ("Amadeus Pro", extractor->encoded_by());
69
70  EXPECT_EQ("wav", extractor->stream_infos()[0].type);
71  EXPECT_EQ(2u, extractor->stream_infos().size());
72
73  EXPECT_EQ(2u, extractor->stream_infos()[0].tags.size());
74  EXPECT_EQ("Lavf54.37.100",
75            extractor->stream_infos()[0].tags.find("encoder")->second);
76  EXPECT_EQ("Amadeus Pro",
77            extractor->stream_infos()[0].tags.find("encoded_by")->second);
78
79  EXPECT_EQ("pcm_u8", extractor->stream_infos()[1].type);
80  EXPECT_EQ(0u, extractor->stream_infos()[1].tags.size());
81
82  EXPECT_EQ(0u, extractor->attached_images_bytes().size());
83}
84
85TEST(AudioVideoMetadataExtractorTest, VideoWebM) {
86  scoped_ptr<AudioVideoMetadataExtractor> extractor =
87      GetExtractor("bear-320x240-multitrack.webm", true, true, 2, 320, 240);
88  EXPECT_EQ("Lavf53.9.0", extractor->encoder());
89
90  EXPECT_EQ(6u, extractor->stream_infos().size());
91
92  EXPECT_EQ("matroska,webm", extractor->stream_infos()[0].type);
93  EXPECT_EQ(1u, extractor->stream_infos()[0].tags.size());
94  EXPECT_EQ("Lavf53.9.0",
95            extractor->stream_infos()[0].tags.find("ENCODER")->second);
96
97  EXPECT_EQ("vp8", extractor->stream_infos()[1].type);
98  EXPECT_EQ(0u, extractor->stream_infos()[1].tags.size());
99
100  EXPECT_EQ("vorbis", extractor->stream_infos()[2].type);
101  EXPECT_EQ(0u, extractor->stream_infos()[2].tags.size());
102
103  EXPECT_EQ("subrip", extractor->stream_infos()[3].type);
104  EXPECT_EQ(0u, extractor->stream_infos()[3].tags.size());
105
106  EXPECT_EQ("theora", extractor->stream_infos()[4].type);
107  EXPECT_EQ(0u, extractor->stream_infos()[4].tags.size());
108
109  EXPECT_EQ("pcm_s16le", extractor->stream_infos()[5].type);
110  EXPECT_EQ(1u, extractor->stream_infos()[5].tags.size());
111  EXPECT_EQ("Lavc52.32.0",
112            extractor->stream_infos()[5].tags.find("ENCODER")->second);
113
114  EXPECT_EQ(0u, extractor->attached_images_bytes().size());
115}
116
117#if defined(USE_PROPRIETARY_CODECS)
118TEST(AudioVideoMetadataExtractorTest, AndroidRotatedMP4Video) {
119  scoped_ptr<AudioVideoMetadataExtractor> extractor =
120      GetExtractor("90rotation.mp4", true, true, 0, 1920, 1080);
121
122  EXPECT_EQ(90, extractor->rotation());
123
124  EXPECT_EQ(3u, extractor->stream_infos().size());
125
126  EXPECT_EQ("mov,mp4,m4a,3gp,3g2,mj2", extractor->stream_infos()[0].type);
127  EXPECT_EQ(4u, extractor->stream_infos()[0].tags.size());
128  EXPECT_EQ(
129      "isom3gp4",
130      extractor->stream_infos()[0].tags.find("compatible_brands")->second);
131  EXPECT_EQ(
132      "2014-02-11 00:39:25",
133      extractor->stream_infos()[0].tags.find("creation_time")->second);
134  EXPECT_EQ("isom",
135            extractor->stream_infos()[0].tags.find("major_brand")->second);
136  EXPECT_EQ("0",
137            extractor->stream_infos()[0].tags.find("minor_version")->second);
138
139  EXPECT_EQ("h264", extractor->stream_infos()[1].type);
140  EXPECT_EQ(5u, extractor->stream_infos()[1].tags.size());
141  EXPECT_EQ("2014-02-11 00:39:25",
142            extractor->stream_infos()[1].tags.find("creation_time")->second);
143  EXPECT_EQ("VideoHandle",
144            extractor->stream_infos()[1].tags.find("handler_name")->second);
145  EXPECT_EQ("eng", extractor->stream_infos()[1].tags.find("language")->second);
146  EXPECT_EQ("90", extractor->stream_infos()[1].tags.find("rotate")->second);
147
148  EXPECT_EQ("aac", extractor->stream_infos()[2].type);
149  EXPECT_EQ(3u, extractor->stream_infos()[2].tags.size());
150  EXPECT_EQ("2014-02-11 00:39:25",
151            extractor->stream_infos()[2].tags.find("creation_time")->second);
152  EXPECT_EQ("SoundHandle",
153            extractor->stream_infos()[2].tags.find("handler_name")->second);
154  EXPECT_EQ("eng", extractor->stream_infos()[2].tags.find("language")->second);
155
156  EXPECT_EQ(0u, extractor->attached_images_bytes().size());
157}
158
159TEST(AudioVideoMetadataExtractorTest, AudioMP3) {
160  scoped_ptr<AudioVideoMetadataExtractor> extractor =
161      GetExtractor("id3_png_test.mp3", true, true, 1, -1, -1);
162
163  EXPECT_EQ("Airbag", extractor->title());
164  EXPECT_EQ("Radiohead", extractor->artist());
165  EXPECT_EQ("OK Computer", extractor->album());
166  EXPECT_EQ(1, extractor->track());
167  EXPECT_EQ("Alternative", extractor->genre());
168  EXPECT_EQ("1997", extractor->date());
169  EXPECT_EQ("Lavf54.4.100", extractor->encoder());
170
171  EXPECT_EQ(3u, extractor->stream_infos().size());
172
173  EXPECT_EQ("mp3", extractor->stream_infos()[0].type);
174  EXPECT_EQ(7u, extractor->stream_infos()[0].tags.size());
175  EXPECT_EQ("OK Computer",
176            extractor->stream_infos()[0].tags.find("album")->second);
177  EXPECT_EQ("Radiohead",
178            extractor->stream_infos()[0].tags.find("artist")->second);
179  EXPECT_EQ("1997", extractor->stream_infos()[0].tags.find("date")->second);
180  EXPECT_EQ("Lavf54.4.100",
181            extractor->stream_infos()[0].tags.find("encoder")->second);
182  EXPECT_EQ("Alternative",
183            extractor->stream_infos()[0].tags.find("genre")->second);
184  EXPECT_EQ("Airbag", extractor->stream_infos()[0].tags.find("title")->second);
185  EXPECT_EQ("1", extractor->stream_infos()[0].tags.find("track")->second);
186
187  EXPECT_EQ("mp3", extractor->stream_infos()[1].type);
188  EXPECT_EQ(0u, extractor->stream_infos()[1].tags.size());
189
190  EXPECT_EQ("png", extractor->stream_infos()[2].type);
191  EXPECT_EQ(2u, extractor->stream_infos()[2].tags.size());
192  EXPECT_EQ("Other", extractor->stream_infos()[2].tags.find("comment")->second);
193  EXPECT_EQ("", extractor->stream_infos()[2].tags.find("title")->second);
194
195  EXPECT_EQ(1u, extractor->attached_images_bytes().size());
196  EXPECT_EQ(155752u, extractor->attached_images_bytes()[0].size());
197
198  EXPECT_EQ("\x89PNG\r\n\x1a\n",
199            extractor->attached_images_bytes()[0].substr(0, 8));
200  EXPECT_EQ("IEND\xae\x42\x60\x82",
201            extractor->attached_images_bytes()[0].substr(
202                extractor->attached_images_bytes()[0].size() - 8, 8));
203  EXPECT_EQ("\xF3\xED\x8F\xC7\xC7\x98\xB9V|p\xC0u!\xB5\x82\xCF\x95\xF0\xCD\xCE",
204            base::SHA1HashString(extractor->attached_images_bytes()[0]));
205}
206#endif
207
208}  // namespace media
209