jpeg_parser_unittest.cc 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. // Copyright 2015 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 <stdint.h>
  5. #include "base/at_exit.h"
  6. #include "base/files/memory_mapped_file.h"
  7. #include "base/path_service.h"
  8. #include "media/base/test_data_util.h"
  9. #include "media/parsers/jpeg_parser.h"
  10. #include "testing/gtest/include/gtest/gtest.h"
  11. namespace media {
  12. TEST(JpegParserTest, Parsing) {
  13. base::FilePath data_dir;
  14. ASSERT_TRUE(base::PathService::Get(base::DIR_SOURCE_ROOT, &data_dir));
  15. // This sample frame is captured from Chromebook Pixel
  16. base::FilePath file_path = data_dir.AppendASCII("media")
  17. .AppendASCII("test")
  18. .AppendASCII("data")
  19. .AppendASCII("pixel-1280x720.jpg");
  20. base::MemoryMappedFile stream;
  21. ASSERT_TRUE(stream.Initialize(file_path))
  22. << "Couldn't open stream file: " << file_path.MaybeAsASCII();
  23. JpegParseResult result;
  24. ASSERT_TRUE(ParseJpegPicture(stream.data(), stream.length(), &result));
  25. // Verify selected fields
  26. // SOF fields
  27. EXPECT_EQ(1280, result.frame_header.visible_width);
  28. EXPECT_EQ(720, result.frame_header.visible_height);
  29. EXPECT_EQ(1280, result.frame_header.coded_width);
  30. EXPECT_EQ(720, result.frame_header.coded_height);
  31. EXPECT_EQ(3, result.frame_header.num_components);
  32. EXPECT_EQ(1, result.frame_header.components[0].id);
  33. EXPECT_EQ(2, result.frame_header.components[0].horizontal_sampling_factor);
  34. EXPECT_EQ(1, result.frame_header.components[0].vertical_sampling_factor);
  35. EXPECT_EQ(0, result.frame_header.components[0].quantization_table_selector);
  36. EXPECT_EQ(2, result.frame_header.components[1].id);
  37. EXPECT_EQ(1, result.frame_header.components[1].horizontal_sampling_factor);
  38. EXPECT_EQ(1, result.frame_header.components[1].vertical_sampling_factor);
  39. EXPECT_EQ(1, result.frame_header.components[1].quantization_table_selector);
  40. EXPECT_EQ(3, result.frame_header.components[2].id);
  41. EXPECT_EQ(1, result.frame_header.components[2].horizontal_sampling_factor);
  42. EXPECT_EQ(1, result.frame_header.components[2].vertical_sampling_factor);
  43. EXPECT_EQ(1, result.frame_header.components[2].quantization_table_selector);
  44. // DRI fields
  45. EXPECT_EQ(0, result.restart_interval);
  46. // DQT fields
  47. EXPECT_TRUE(result.q_table[0].valid);
  48. EXPECT_TRUE(result.q_table[1].valid);
  49. EXPECT_FALSE(result.q_table[2].valid);
  50. EXPECT_FALSE(result.q_table[3].valid);
  51. // DHT fields (no DHT marker)
  52. EXPECT_FALSE(result.dc_table[0].valid);
  53. EXPECT_FALSE(result.ac_table[0].valid);
  54. EXPECT_FALSE(result.dc_table[1].valid);
  55. EXPECT_FALSE(result.ac_table[1].valid);
  56. // SOS fields
  57. EXPECT_EQ(3, result.scan.num_components);
  58. EXPECT_EQ(1, result.scan.components[0].component_selector);
  59. EXPECT_EQ(0, result.scan.components[0].dc_selector);
  60. EXPECT_EQ(0, result.scan.components[0].ac_selector);
  61. EXPECT_EQ(2, result.scan.components[1].component_selector);
  62. EXPECT_EQ(1, result.scan.components[1].dc_selector);
  63. EXPECT_EQ(1, result.scan.components[1].ac_selector);
  64. EXPECT_EQ(3, result.scan.components[2].component_selector);
  65. EXPECT_EQ(1, result.scan.components[2].dc_selector);
  66. EXPECT_EQ(1, result.scan.components[2].ac_selector);
  67. EXPECT_EQ(121148u, result.data_size);
  68. EXPECT_EQ(121358u, result.image_size);
  69. }
  70. TEST(JpegParserTest, TrailingZerosShouldBeIgnored) {
  71. base::FilePath data_dir;
  72. ASSERT_TRUE(base::PathService::Get(base::DIR_SOURCE_ROOT, &data_dir));
  73. base::FilePath file_path =
  74. data_dir.AppendASCII("media")
  75. .AppendASCII("test")
  76. .AppendASCII("data")
  77. .AppendASCII("pixel-1280x720-trailing-zeros.jpg");
  78. base::MemoryMappedFile stream;
  79. ASSERT_TRUE(stream.Initialize(file_path))
  80. << "Couldn't open stream file: " << file_path.MaybeAsASCII();
  81. JpegParseResult result;
  82. ASSERT_TRUE(ParseJpegPicture(stream.data(), stream.length(), &result));
  83. // Verify selected fields
  84. // SOS fields
  85. EXPECT_EQ(121148u, result.data_size);
  86. EXPECT_EQ(121358u, result.image_size);
  87. }
  88. TEST(JpegParserTest, CodedSizeNotEqualVisibleSize) {
  89. base::FilePath data_dir;
  90. ASSERT_TRUE(base::PathService::Get(base::DIR_SOURCE_ROOT, &data_dir));
  91. base::FilePath file_path = data_dir.AppendASCII("media")
  92. .AppendASCII("test")
  93. .AppendASCII("data")
  94. .AppendASCII("blank-1x1.jpg");
  95. base::MemoryMappedFile stream;
  96. ASSERT_TRUE(stream.Initialize(file_path))
  97. << "Couldn't open stream file: " << file_path.MaybeAsASCII();
  98. JpegParseResult result;
  99. ASSERT_TRUE(ParseJpegPicture(stream.data(), stream.length(), &result));
  100. EXPECT_EQ(1, result.frame_header.visible_width);
  101. EXPECT_EQ(1, result.frame_header.visible_height);
  102. // The sampling factor of the given image is 2:2, so coded size is 16x16
  103. EXPECT_EQ(16, result.frame_header.coded_width);
  104. EXPECT_EQ(16, result.frame_header.coded_height);
  105. EXPECT_EQ(2, result.frame_header.components[0].horizontal_sampling_factor);
  106. EXPECT_EQ(2, result.frame_header.components[0].vertical_sampling_factor);
  107. }
  108. TEST(JpegParserTest, ParsingFail) {
  109. const uint8_t data[] = {0, 1, 2, 3}; // not jpeg
  110. JpegParseResult result;
  111. ASSERT_FALSE(ParseJpegPicture(data, sizeof(data), &result));
  112. }
  113. } // namespace media