audio_video_metadata_extractor_unittest.cc 11 KB

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