vaapi_wrapper_unittest.cc 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. // Copyright 2021 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 <va/va.h>
  5. #include "media/gpu/vaapi/vaapi_wrapper.h"
  6. #include "testing/gmock/include/gmock/gmock.h"
  7. #include "testing/gtest/include/gtest/gtest.h"
  8. using ::testing::_;
  9. using ::testing::Invoke;
  10. using ::testing::Return;
  11. namespace media {
  12. namespace {
  13. VaapiWrapper::VABufferDescriptor CreateVABufferDescriptor() {
  14. constexpr static char kData[] = "vaBufferData";
  15. return VaapiWrapper::VABufferDescriptor{VAProcPipelineParameterBufferType,
  16. sizeof(kData), kData};
  17. }
  18. class MockVaapiWrapper : public VaapiWrapper {
  19. public:
  20. MockVaapiWrapper() : VaapiWrapper(kVideoProcess) {}
  21. MOCK_METHOD1(SubmitBuffer_Locked, bool(const VABufferDescriptor&));
  22. MOCK_METHOD0(DestroyPendingBuffers_Locked, void());
  23. protected:
  24. ~MockVaapiWrapper() override = default;
  25. };
  26. } // namespace
  27. class VaapiWrapperTest : public testing::Test {
  28. public:
  29. VaapiWrapperTest() = default;
  30. void SetUp() override {
  31. // Create a VaapiWrapper for testing.
  32. mock_vaapi_wrapper_ = base::MakeRefCounted<MockVaapiWrapper>();
  33. ASSERT_TRUE(mock_vaapi_wrapper_);
  34. ON_CALL(*mock_vaapi_wrapper_, SubmitBuffer_Locked)
  35. .WillByDefault(
  36. Invoke(this, &VaapiWrapperTest::DefaultSubmitBuffer_Locked));
  37. ON_CALL(*mock_vaapi_wrapper_, DestroyPendingBuffers_Locked)
  38. .WillByDefault(Invoke(
  39. this, &VaapiWrapperTest::DefaultDestroyPendingBuffers_Locked));
  40. }
  41. void TearDown() override {
  42. // The VaapiWrapper destructor calls DestroyPendingBuffers_Locked(). Since
  43. // MockVaapiWrapper is a derived class,
  44. // MockVaapiWrapper::DestroyPendingBuffers_Locked() won't get called during
  45. // destruction even though it's a virtual function. Instead,
  46. // VaapiWrapper::DestroyPendingBuffers_Locked() will get called. Therefore,
  47. // we need to clear |pending_va_buffers_| before this happens so that
  48. // VaapiWrapper::DestroyPendingBuffers_Locked() doesn't call
  49. // vaDestroyBuffer().
  50. mock_vaapi_wrapper_->pending_va_buffers_.clear();
  51. mock_vaapi_wrapper_.reset();
  52. }
  53. bool DefaultSubmitBuffer_Locked(
  54. const VaapiWrapper::VABufferDescriptor& va_buffer)
  55. EXCLUSIVE_LOCKS_REQUIRED(mock_vaapi_wrapper_->va_lock_) {
  56. if (va_buffer.data) {
  57. constexpr VABufferID kFakeBufferId = 1234;
  58. mock_vaapi_wrapper_->pending_va_buffers_.push_back(kFakeBufferId);
  59. return true;
  60. }
  61. // When |va_buffer|.data is null, the base method should return false and
  62. // no libva calls should be made.
  63. const bool submit_buffer_res =
  64. (*mock_vaapi_wrapper_).VaapiWrapper::SubmitBuffer_Locked(va_buffer);
  65. if (submit_buffer_res)
  66. ADD_FAILURE();
  67. return false;
  68. }
  69. void DefaultDestroyPendingBuffers_Locked()
  70. EXCLUSIVE_LOCKS_REQUIRED(mock_vaapi_wrapper_->va_lock_) {
  71. mock_vaapi_wrapper_->pending_va_buffers_.clear();
  72. }
  73. size_t GetPendingBuffersSize() const {
  74. return mock_vaapi_wrapper_->pending_va_buffers_.size();
  75. }
  76. protected:
  77. scoped_refptr<MockVaapiWrapper> mock_vaapi_wrapper_;
  78. };
  79. // This test ensures SubmitBuffer() calls SubmitBuffer_Locked().
  80. TEST_F(VaapiWrapperTest, SubmitBuffer) {
  81. constexpr size_t kNumBuffers = 3;
  82. auto va_buffer = CreateVABufferDescriptor();
  83. EXPECT_CALL(*mock_vaapi_wrapper_, SubmitBuffer_Locked(_)).Times(kNumBuffers);
  84. for (size_t i = 0; i < kNumBuffers; ++i) {
  85. EXPECT_TRUE(mock_vaapi_wrapper_->SubmitBuffer(
  86. va_buffer.type, va_buffer.size, va_buffer.data));
  87. }
  88. EXPECT_EQ(GetPendingBuffersSize(), kNumBuffers);
  89. }
  90. // This test ensures SubmitBuffers() calls SubmitBuffer_Locked() as many times
  91. // as the number of passed buffers.
  92. TEST_F(VaapiWrapperTest, SubmitBuffers) {
  93. constexpr size_t kNumBuffers = 3;
  94. auto va_buffer = CreateVABufferDescriptor();
  95. std::vector<VaapiWrapper::VABufferDescriptor> buffers(kNumBuffers, va_buffer);
  96. EXPECT_CALL(*mock_vaapi_wrapper_, SubmitBuffer_Locked(_)).Times(kNumBuffers);
  97. EXPECT_TRUE(mock_vaapi_wrapper_->SubmitBuffers(buffers));
  98. EXPECT_EQ(GetPendingBuffersSize(), kNumBuffers);
  99. }
  100. // This test ensures DestroyPendingBuffers_Locked() is executed on a failure of
  101. // SubmitBuffer().
  102. TEST_F(VaapiWrapperTest, FailOnSubmitBuffer) {
  103. auto va_buffer = CreateVABufferDescriptor();
  104. ::testing::InSequence s;
  105. EXPECT_CALL(*mock_vaapi_wrapper_, SubmitBuffer_Locked(_)).Times(2);
  106. EXPECT_CALL(*mock_vaapi_wrapper_, DestroyPendingBuffers_Locked);
  107. EXPECT_TRUE(mock_vaapi_wrapper_->SubmitBuffer(va_buffer.type, va_buffer.size,
  108. va_buffer.data));
  109. EXPECT_FALSE(mock_vaapi_wrapper_->SubmitBuffer(va_buffer.type, va_buffer.size,
  110. /*data=*/nullptr));
  111. EXPECT_EQ(GetPendingBuffersSize(), 0u);
  112. }
  113. // This test ensures DestroyPendingBuffers_Locked() is executed on a failure of
  114. // SubmitBuffers().
  115. TEST_F(VaapiWrapperTest, FailOnSubmitBuffers) {
  116. constexpr size_t kNumBuffers = 3;
  117. auto va_buffer = CreateVABufferDescriptor();
  118. std::vector<VaapiWrapper::VABufferDescriptor> buffers(kNumBuffers, va_buffer);
  119. // Set data to nullptr so that VaapiWrapper::SubmitBuffer_Locked() fails.
  120. buffers[1].data = nullptr;
  121. ::testing::InSequence s;
  122. EXPECT_CALL(*mock_vaapi_wrapper_, SubmitBuffer_Locked(_))
  123. .Times(kNumBuffers - 1);
  124. EXPECT_CALL(*mock_vaapi_wrapper_, DestroyPendingBuffers_Locked);
  125. EXPECT_FALSE(mock_vaapi_wrapper_->SubmitBuffers(buffers));
  126. EXPECT_EQ(GetPendingBuffersSize(), 0u);
  127. }
  128. } // namespace media