| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "media/base/audio_video_metadata_extractor.h" |
| 6 |
| 7 #include <memory> |
| 8 |
| 5 #include "base/logging.h" | 9 #include "base/logging.h" |
| 6 #include "base/memory/scoped_ptr.h" | |
| 7 #include "base/sha1.h" | 10 #include "base/sha1.h" |
| 8 #include "build/build_config.h" | 11 #include "build/build_config.h" |
| 9 #include "media/base/audio_video_metadata_extractor.h" | |
| 10 #include "media/base/test_data_util.h" | 12 #include "media/base/test_data_util.h" |
| 11 #include "media/filters/file_data_source.h" | 13 #include "media/filters/file_data_source.h" |
| 12 #include "testing/gtest/include/gtest/gtest.h" | 14 #include "testing/gtest/include/gtest/gtest.h" |
| 13 | 15 |
| 14 namespace media { | 16 namespace media { |
| 15 | 17 |
| 16 scoped_ptr<AudioVideoMetadataExtractor> GetExtractor( | 18 std::unique_ptr<AudioVideoMetadataExtractor> GetExtractor( |
| 17 const std::string& filename, | 19 const std::string& filename, |
| 18 bool extract_attached_images, | 20 bool extract_attached_images, |
| 19 bool expected_result, | 21 bool expected_result, |
| 20 double expected_duration, | 22 double expected_duration, |
| 21 int expected_width, | 23 int expected_width, |
| 22 int expected_height) { | 24 int expected_height) { |
| 23 FileDataSource source; | 25 FileDataSource source; |
| 24 EXPECT_TRUE(source.Initialize(GetTestDataFilePath(filename))); | 26 EXPECT_TRUE(source.Initialize(GetTestDataFilePath(filename))); |
| 25 | 27 |
| 26 scoped_ptr<AudioVideoMetadataExtractor> extractor( | 28 std::unique_ptr<AudioVideoMetadataExtractor> extractor( |
| 27 new AudioVideoMetadataExtractor); | 29 new AudioVideoMetadataExtractor); |
| 28 bool extracted = extractor->Extract(&source, extract_attached_images); | 30 bool extracted = extractor->Extract(&source, extract_attached_images); |
| 29 EXPECT_EQ(expected_result, extracted); | 31 EXPECT_EQ(expected_result, extracted); |
| 30 | 32 |
| 31 if (!extracted) | 33 if (!extracted) |
| 32 return extractor; | 34 return extractor; |
| 33 | 35 |
| 34 EXPECT_EQ(expected_duration, extractor->duration()); | 36 EXPECT_EQ(expected_duration, extractor->duration()); |
| 35 | 37 |
| 36 EXPECT_EQ(expected_width, extractor->width()); | 38 EXPECT_EQ(expected_width, extractor->width()); |
| 37 EXPECT_EQ(expected_height, extractor->height()); | 39 EXPECT_EQ(expected_height, extractor->height()); |
| 38 | 40 |
| 39 return extractor; | 41 return extractor; |
| 40 } | 42 } |
| 41 | 43 |
| 42 const std::string GetTagValue( | 44 const std::string GetTagValue( |
| 43 const media::AudioVideoMetadataExtractor::TagDictionary& tags, | 45 const media::AudioVideoMetadataExtractor::TagDictionary& tags, |
| 44 const char* tag_name) { | 46 const char* tag_name) { |
| 45 auto tag_data = tags.find(tag_name); | 47 auto tag_data = tags.find(tag_name); |
| 46 return tag_data == tags.end() ? "" : tag_data->second; | 48 return tag_data == tags.end() ? "" : tag_data->second; |
| 47 } | 49 } |
| 48 | 50 |
| 49 TEST(AudioVideoMetadataExtractorTest, InvalidFile) { | 51 TEST(AudioVideoMetadataExtractorTest, InvalidFile) { |
| 50 GetExtractor("ten_byte_file", true, false, 0, -1, -1); | 52 GetExtractor("ten_byte_file", true, false, 0, -1, -1); |
| 51 } | 53 } |
| 52 | 54 |
| 53 TEST(AudioVideoMetadataExtractorTest, AudioOGG) { | 55 TEST(AudioVideoMetadataExtractorTest, AudioOGG) { |
| 54 scoped_ptr<AudioVideoMetadataExtractor> extractor = | 56 std::unique_ptr<AudioVideoMetadataExtractor> extractor = |
| 55 GetExtractor("9ch.ogg", true, true, 0, -1, -1); | 57 GetExtractor("9ch.ogg", true, true, 0, -1, -1); |
| 56 EXPECT_EQ("Processed by SoX", extractor->comment()); | 58 EXPECT_EQ("Processed by SoX", extractor->comment()); |
| 57 | 59 |
| 58 EXPECT_EQ("ogg", extractor->stream_infos()[0].type); | 60 EXPECT_EQ("ogg", extractor->stream_infos()[0].type); |
| 59 EXPECT_EQ(2u, extractor->stream_infos().size()); | 61 EXPECT_EQ(2u, extractor->stream_infos().size()); |
| 60 | 62 |
| 61 EXPECT_EQ(0u, extractor->stream_infos()[0].tags.size()); | 63 EXPECT_EQ(0u, extractor->stream_infos()[0].tags.size()); |
| 62 | 64 |
| 63 EXPECT_EQ(1u, extractor->stream_infos()[1].tags.size()); | 65 EXPECT_EQ(1u, extractor->stream_infos()[1].tags.size()); |
| 64 EXPECT_EQ("vorbis", extractor->stream_infos()[1].type); | 66 EXPECT_EQ("vorbis", extractor->stream_infos()[1].type); |
| 65 EXPECT_EQ("Processed by SoX", | 67 EXPECT_EQ("Processed by SoX", |
| 66 GetTagValue(extractor->stream_infos()[1].tags, "COMMENT")); | 68 GetTagValue(extractor->stream_infos()[1].tags, "COMMENT")); |
| 67 | 69 |
| 68 EXPECT_EQ(0u, extractor->attached_images_bytes().size()); | 70 EXPECT_EQ(0u, extractor->attached_images_bytes().size()); |
| 69 } | 71 } |
| 70 | 72 |
| 71 TEST(AudioVideoMetadataExtractorTest, AudioWAV) { | 73 TEST(AudioVideoMetadataExtractorTest, AudioWAV) { |
| 72 scoped_ptr<AudioVideoMetadataExtractor> extractor = | 74 std::unique_ptr<AudioVideoMetadataExtractor> extractor = |
| 73 GetExtractor("sfx_u8.wav", true, true, 0, -1, -1); | 75 GetExtractor("sfx_u8.wav", true, true, 0, -1, -1); |
| 74 EXPECT_EQ("Lavf54.37.100", extractor->encoder()); | 76 EXPECT_EQ("Lavf54.37.100", extractor->encoder()); |
| 75 EXPECT_EQ("Amadeus Pro", extractor->encoded_by()); | 77 EXPECT_EQ("Amadeus Pro", extractor->encoded_by()); |
| 76 | 78 |
| 77 EXPECT_EQ("wav", extractor->stream_infos()[0].type); | 79 EXPECT_EQ("wav", extractor->stream_infos()[0].type); |
| 78 EXPECT_EQ(2u, extractor->stream_infos().size()); | 80 EXPECT_EQ(2u, extractor->stream_infos().size()); |
| 79 | 81 |
| 80 EXPECT_EQ(2u, extractor->stream_infos()[0].tags.size()); | 82 EXPECT_EQ(2u, extractor->stream_infos()[0].tags.size()); |
| 81 EXPECT_EQ("Lavf54.37.100", | 83 EXPECT_EQ("Lavf54.37.100", |
| 82 GetTagValue(extractor->stream_infos()[0].tags, "encoder")); | 84 GetTagValue(extractor->stream_infos()[0].tags, "encoder")); |
| 83 EXPECT_EQ("Amadeus Pro", | 85 EXPECT_EQ("Amadeus Pro", |
| 84 GetTagValue(extractor->stream_infos()[0].tags, "encoded_by")); | 86 GetTagValue(extractor->stream_infos()[0].tags, "encoded_by")); |
| 85 | 87 |
| 86 EXPECT_EQ("pcm_u8", extractor->stream_infos()[1].type); | 88 EXPECT_EQ("pcm_u8", extractor->stream_infos()[1].type); |
| 87 EXPECT_EQ(0u, extractor->stream_infos()[1].tags.size()); | 89 EXPECT_EQ(0u, extractor->stream_infos()[1].tags.size()); |
| 88 | 90 |
| 89 EXPECT_EQ(0u, extractor->attached_images_bytes().size()); | 91 EXPECT_EQ(0u, extractor->attached_images_bytes().size()); |
| 90 } | 92 } |
| 91 | 93 |
| 92 TEST(AudioVideoMetadataExtractorTest, VideoWebM) { | 94 TEST(AudioVideoMetadataExtractorTest, VideoWebM) { |
| 93 scoped_ptr<AudioVideoMetadataExtractor> extractor = | 95 std::unique_ptr<AudioVideoMetadataExtractor> extractor = |
| 94 GetExtractor("bear-320x240-multitrack.webm", true, true, 2, 320, 240); | 96 GetExtractor("bear-320x240-multitrack.webm", true, true, 2, 320, 240); |
| 95 EXPECT_EQ("Lavf53.9.0", extractor->encoder()); | 97 EXPECT_EQ("Lavf53.9.0", extractor->encoder()); |
| 96 | 98 |
| 97 EXPECT_EQ(6u, extractor->stream_infos().size()); | 99 EXPECT_EQ(6u, extractor->stream_infos().size()); |
| 98 | 100 |
| 99 EXPECT_EQ("matroska,webm", extractor->stream_infos()[0].type); | 101 EXPECT_EQ("matroska,webm", extractor->stream_infos()[0].type); |
| 100 EXPECT_EQ(1u, extractor->stream_infos()[0].tags.size()); | 102 EXPECT_EQ(1u, extractor->stream_infos()[0].tags.size()); |
| 101 EXPECT_EQ("Lavf53.9.0", | 103 EXPECT_EQ("Lavf53.9.0", |
| 102 GetTagValue(extractor->stream_infos()[0].tags, "ENCODER")); | 104 GetTagValue(extractor->stream_infos()[0].tags, "ENCODER")); |
| 103 | 105 |
| (...skipping 12 matching lines...) Expand all Loading... |
| 116 EXPECT_EQ("pcm_s16le", extractor->stream_infos()[5].type); | 118 EXPECT_EQ("pcm_s16le", extractor->stream_infos()[5].type); |
| 117 EXPECT_EQ(1u, extractor->stream_infos()[5].tags.size()); | 119 EXPECT_EQ(1u, extractor->stream_infos()[5].tags.size()); |
| 118 EXPECT_EQ("Lavc52.32.0", | 120 EXPECT_EQ("Lavc52.32.0", |
| 119 GetTagValue(extractor->stream_infos()[5].tags, "ENCODER")); | 121 GetTagValue(extractor->stream_infos()[5].tags, "ENCODER")); |
| 120 | 122 |
| 121 EXPECT_EQ(0u, extractor->attached_images_bytes().size()); | 123 EXPECT_EQ(0u, extractor->attached_images_bytes().size()); |
| 122 } | 124 } |
| 123 | 125 |
| 124 #if defined(USE_PROPRIETARY_CODECS) | 126 #if defined(USE_PROPRIETARY_CODECS) |
| 125 TEST(AudioVideoMetadataExtractorTest, AndroidRotatedMP4Video) { | 127 TEST(AudioVideoMetadataExtractorTest, AndroidRotatedMP4Video) { |
| 126 scoped_ptr<AudioVideoMetadataExtractor> extractor = | 128 std::unique_ptr<AudioVideoMetadataExtractor> extractor = |
| 127 GetExtractor("90rotation.mp4", true, true, 0, 1920, 1080); | 129 GetExtractor("90rotation.mp4", true, true, 0, 1920, 1080); |
| 128 | 130 |
| 129 EXPECT_EQ(90, extractor->rotation()); | 131 EXPECT_EQ(90, extractor->rotation()); |
| 130 | 132 |
| 131 EXPECT_EQ(3u, extractor->stream_infos().size()); | 133 EXPECT_EQ(3u, extractor->stream_infos().size()); |
| 132 | 134 |
| 133 EXPECT_EQ("mov,mp4,m4a,3gp,3g2,mj2", extractor->stream_infos()[0].type); | 135 EXPECT_EQ("mov,mp4,m4a,3gp,3g2,mj2", extractor->stream_infos()[0].type); |
| 134 EXPECT_EQ(4u, extractor->stream_infos()[0].tags.size()); | 136 EXPECT_EQ(4u, extractor->stream_infos()[0].tags.size()); |
| 135 EXPECT_EQ("isom3gp4", GetTagValue(extractor->stream_infos()[0].tags, | 137 EXPECT_EQ("isom3gp4", GetTagValue(extractor->stream_infos()[0].tags, |
| 136 "compatible_brands")); | 138 "compatible_brands")); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 155 EXPECT_EQ("2014-02-11 00:39:25", | 157 EXPECT_EQ("2014-02-11 00:39:25", |
| 156 GetTagValue(extractor->stream_infos()[2].tags, "creation_time")); | 158 GetTagValue(extractor->stream_infos()[2].tags, "creation_time")); |
| 157 EXPECT_EQ("SoundHandle", | 159 EXPECT_EQ("SoundHandle", |
| 158 GetTagValue(extractor->stream_infos()[2].tags, "handler_name")); | 160 GetTagValue(extractor->stream_infos()[2].tags, "handler_name")); |
| 159 EXPECT_EQ("eng", GetTagValue(extractor->stream_infos()[2].tags, "language")); | 161 EXPECT_EQ("eng", GetTagValue(extractor->stream_infos()[2].tags, "language")); |
| 160 | 162 |
| 161 EXPECT_EQ(0u, extractor->attached_images_bytes().size()); | 163 EXPECT_EQ(0u, extractor->attached_images_bytes().size()); |
| 162 } | 164 } |
| 163 | 165 |
| 164 TEST(AudioVideoMetadataExtractorTest, AudioMP3) { | 166 TEST(AudioVideoMetadataExtractorTest, AudioMP3) { |
| 165 scoped_ptr<AudioVideoMetadataExtractor> extractor = | 167 std::unique_ptr<AudioVideoMetadataExtractor> extractor = |
| 166 GetExtractor("id3_png_test.mp3", true, true, 1, -1, -1); | 168 GetExtractor("id3_png_test.mp3", true, true, 1, -1, -1); |
| 167 | 169 |
| 168 EXPECT_EQ("Airbag", extractor->title()); | 170 EXPECT_EQ("Airbag", extractor->title()); |
| 169 EXPECT_EQ("Radiohead", extractor->artist()); | 171 EXPECT_EQ("Radiohead", extractor->artist()); |
| 170 EXPECT_EQ("OK Computer", extractor->album()); | 172 EXPECT_EQ("OK Computer", extractor->album()); |
| 171 EXPECT_EQ(1, extractor->track()); | 173 EXPECT_EQ(1, extractor->track()); |
| 172 EXPECT_EQ("Alternative", extractor->genre()); | 174 EXPECT_EQ("Alternative", extractor->genre()); |
| 173 EXPECT_EQ("1997", extractor->date()); | 175 EXPECT_EQ("1997", extractor->date()); |
| 174 EXPECT_EQ("Lavf54.4.100", extractor->encoder()); | 176 EXPECT_EQ("Lavf54.4.100", extractor->encoder()); |
| 175 | 177 |
| (...skipping 27 matching lines...) Expand all Loading... |
| 203 extractor->attached_images_bytes()[0].substr(0, 8)); | 205 extractor->attached_images_bytes()[0].substr(0, 8)); |
| 204 EXPECT_EQ("IEND\xae\x42\x60\x82", | 206 EXPECT_EQ("IEND\xae\x42\x60\x82", |
| 205 extractor->attached_images_bytes()[0].substr( | 207 extractor->attached_images_bytes()[0].substr( |
| 206 extractor->attached_images_bytes()[0].size() - 8, 8)); | 208 extractor->attached_images_bytes()[0].size() - 8, 8)); |
| 207 EXPECT_EQ("\xF3\xED\x8F\xC7\xC7\x98\xB9V|p\xC0u!\xB5\x82\xCF\x95\xF0\xCD\xCE", | 209 EXPECT_EQ("\xF3\xED\x8F\xC7\xC7\x98\xB9V|p\xC0u!\xB5\x82\xCF\x95\xF0\xCD\xCE", |
| 208 base::SHA1HashString(extractor->attached_images_bytes()[0])); | 210 base::SHA1HashString(extractor->attached_images_bytes()[0])); |
| 209 } | 211 } |
| 210 #endif | 212 #endif |
| 211 | 213 |
| 212 } // namespace media | 214 } // namespace media |
| OLD | NEW |