video_frame_extractor_unittest.cc 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. // Copyright 2018 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/android/video_frame_extractor.h"
  5. #include <memory>
  6. #include "base/bind.h"
  7. #include "base/files/file_util.h"
  8. #include "base/files/scoped_temp_dir.h"
  9. #include "base/run_loop.h"
  10. #include "base/test/task_environment.h"
  11. #include "base/test/test_mock_time_task_runner.h"
  12. #include "media/base/test_data_util.h"
  13. #include "media/filters/file_data_source.h"
  14. #include "testing/gmock/include/gmock/gmock.h"
  15. #include "testing/gtest/include/gtest/gtest.h"
  16. namespace media {
  17. namespace {
  18. struct ExtractVideoFrameResult {
  19. bool success = false;
  20. std::vector<uint8_t> encoded_frame;
  21. VideoDecoderConfig decoder_config;
  22. };
  23. void OnFrameExtracted(ExtractVideoFrameResult* result,
  24. base::RepeatingClosure quit_closure,
  25. bool success,
  26. std::vector<uint8_t> encoded_frame,
  27. const VideoDecoderConfig& decoder_config) {
  28. result->success = success;
  29. result->encoded_frame = std::move(encoded_frame);
  30. result->decoder_config = decoder_config;
  31. quit_closure.Run();
  32. }
  33. class VideoFrameExtractorTest : public testing::Test {
  34. public:
  35. VideoFrameExtractorTest() {}
  36. VideoFrameExtractorTest(const VideoFrameExtractorTest&) = delete;
  37. VideoFrameExtractorTest& operator=(const VideoFrameExtractorTest&) = delete;
  38. ~VideoFrameExtractorTest() override {}
  39. protected:
  40. void SetUp() override { ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); }
  41. ExtractVideoFrameResult ExtractFrame(const base::FilePath& file_path) {
  42. base::File file(
  43. file_path, base::File::Flags::FLAG_OPEN | base::File::Flags::FLAG_READ);
  44. DCHECK(file.IsValid());
  45. data_source_ = std::make_unique<FileDataSource>();
  46. CHECK(data_source_->Initialize(file_path));
  47. extractor_ = std::make_unique<VideoFrameExtractor>(data_source_.get());
  48. ExtractVideoFrameResult result;
  49. base::RunLoop loop;
  50. extractor_->Start(
  51. base::BindOnce(&OnFrameExtracted, &result, loop.QuitClosure()));
  52. loop.Run();
  53. return result;
  54. }
  55. const base::FilePath& temp_dir() const { return temp_dir_.GetPath(); }
  56. private:
  57. base::test::TaskEnvironment task_environment_;
  58. base::ScopedTempDir temp_dir_;
  59. std::unique_ptr<FileDataSource> data_source_;
  60. std::unique_ptr<VideoFrameExtractor> extractor_;
  61. };
  62. // Verifies the encoded video frame can be extracted correctly.
  63. TEST_F(VideoFrameExtractorTest, ExtractVideoFrame) {
  64. auto result = ExtractFrame(GetTestDataFilePath("bear.mp4"));
  65. EXPECT_TRUE(result.success);
  66. EXPECT_GT(result.encoded_frame.size(), 0u);
  67. EXPECT_EQ(result.decoder_config.codec(), VideoCodec::kH264);
  68. }
  69. // Verifies graceful failure when trying to extract frame from an invalid video
  70. // file.
  71. TEST_F(VideoFrameExtractorTest, ExtractInvalidVideoFile) {
  72. // Creates a dummy video file, frame extraction should fail.
  73. base::FilePath file = temp_dir().AppendASCII("test.txt");
  74. EXPECT_GT(base::WriteFile(file, "123", sizeof("123")), 0);
  75. auto result = ExtractFrame(file);
  76. EXPECT_FALSE(result.success);
  77. EXPECT_EQ(result.encoded_frame.size(), 0u);
  78. EXPECT_FALSE(result.decoder_config.IsValidConfig());
  79. }
  80. } // namespace
  81. } // namespace media