video_thumbnail_decoder_unittest.cc 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  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 <memory>
  5. #include <vector>
  6. #include "base/bind.h"
  7. #include "base/callback_helpers.h"
  8. #include "base/memory/raw_ptr.h"
  9. #include "base/run_loop.h"
  10. #include "base/test/gmock_callback_support.h"
  11. #include "base/test/task_environment.h"
  12. #include "media/base/media_util.h"
  13. #include "media/base/mock_filters.h"
  14. #include "media/base/video_decoder_config.h"
  15. #include "media/base/video_frame.h"
  16. #include "media/base/video_thumbnail_decoder.h"
  17. #include "media/base/video_types.h"
  18. #include "testing/gtest/include/gtest/gtest.h"
  19. using ::base::test::RunCallback;
  20. using ::base::test::RunOnceCallback;
  21. using ::testing::_;
  22. using ::testing::DoAll;
  23. namespace media {
  24. namespace {
  25. class VideoThumbnailDecoderTest : public testing::Test {
  26. public:
  27. VideoThumbnailDecoderTest() = default;
  28. VideoThumbnailDecoderTest(const VideoThumbnailDecoderTest&) = delete;
  29. VideoThumbnailDecoderTest& operator=(const VideoThumbnailDecoderTest&) =
  30. delete;
  31. ~VideoThumbnailDecoderTest() override = default;
  32. protected:
  33. void SetUp() override {
  34. auto mock_video_decoder = std::make_unique<MockVideoDecoder>();
  35. mock_video_decoder_ = mock_video_decoder.get();
  36. VideoDecoderConfig valid_config(
  37. VideoCodec::kVP8, VP8PROFILE_ANY,
  38. VideoDecoderConfig::AlphaMode::kIsOpaque, VideoColorSpace(),
  39. kNoTransformation, gfx::Size(1, 1), gfx::Rect(1, 1), gfx::Size(1, 1),
  40. EmptyExtraData(), EncryptionScheme::kUnencrypted);
  41. thumbnail_decoder_ = std::make_unique<VideoThumbnailDecoder>(
  42. std::move(mock_video_decoder), valid_config, std::vector<uint8_t>{0u});
  43. }
  44. void TearDown() override {}
  45. void Start() {
  46. thumbnail_decoder_->Start(base::BindOnce(
  47. &VideoThumbnailDecoderTest::OnFrameDecoded, base::Unretained(this)));
  48. base::RunLoop().RunUntilIdle();
  49. }
  50. scoped_refptr<VideoFrame> CreateFrame() {
  51. return VideoFrame::CreateZeroInitializedFrame(
  52. VideoPixelFormat::PIXEL_FORMAT_I420, gfx::Size(1, 1), gfx::Rect(1, 1),
  53. gfx::Size(1, 1), base::TimeDelta());
  54. }
  55. VideoThumbnailDecoder* thumbnail_decoder() {
  56. return thumbnail_decoder_.get();
  57. }
  58. MockVideoDecoder* mock_video_decoder() { return mock_video_decoder_; }
  59. scoped_refptr<VideoFrame> frame() { return frame_; }
  60. private:
  61. void OnFrameDecoded(scoped_refptr<VideoFrame> frame) {
  62. frame_ = std::move(frame);
  63. }
  64. base::test::TaskEnvironment task_environment_;
  65. raw_ptr<MockVideoDecoder> mock_video_decoder_;
  66. std::unique_ptr<VideoThumbnailDecoder> thumbnail_decoder_;
  67. // The video frame returned from the thumbnail decoder.
  68. scoped_refptr<VideoFrame> frame_;
  69. };
  70. // Verifies a video frame can be delivered when decoder successfully created
  71. // the video frame.
  72. TEST_F(VideoThumbnailDecoderTest, Success) {
  73. auto expected_frame = CreateFrame();
  74. EXPECT_CALL(*mock_video_decoder(), Initialize_(_, _, _, _, _, _))
  75. .WillOnce(DoAll(RunOnceCallback<3>(DecoderStatus::Codes::kOk),
  76. RunCallback<4>(expected_frame)));
  77. EXPECT_CALL(*mock_video_decoder(), Decode_(_, _))
  78. .Times(2)
  79. .WillRepeatedly(RunOnceCallback<1>(DecoderStatus::Codes::kOk));
  80. Start();
  81. EXPECT_TRUE(frame());
  82. }
  83. // No output video frame when decoder failed to initialize.
  84. TEST_F(VideoThumbnailDecoderTest, InitializationFailed) {
  85. auto expected_frame = CreateFrame();
  86. EXPECT_CALL(*mock_video_decoder(), Initialize_(_, _, _, _, _, _))
  87. .WillOnce(RunOnceCallback<3>(DecoderStatus::Codes::kFailed));
  88. Start();
  89. EXPECT_FALSE(frame());
  90. }
  91. // No output video frame when decoder failed to decode.
  92. TEST_F(VideoThumbnailDecoderTest, DecodingFailed) {
  93. auto expected_frame = CreateFrame();
  94. EXPECT_CALL(*mock_video_decoder(), Initialize_(_, _, _, _, _, _))
  95. .WillOnce(RunOnceCallback<3>(DecoderStatus::Codes::kOk));
  96. EXPECT_CALL(*mock_video_decoder(), Decode_(_, _))
  97. .WillOnce(RunOnceCallback<1>(DecoderStatus::Codes::kFailed));
  98. Start();
  99. EXPECT_FALSE(frame());
  100. }
  101. } // namespace
  102. } // namespace media