| // Copyright 2019 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "media/gpu/android/video_frame_factory_impl.h" |
| |
| #include "media/gpu/android/codec_image.h" |
| #include "testing/gmock/include/gmock/gmock.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| |
| namespace media { |
| |
| using testing::NiceMock; |
| using testing::Return; |
| |
| // The dimensions for specifying MockImage behavior. |
| enum ImageKind { kTextureOwner, kOverlay }; |
| enum Phase { kInCodec, kInFrontBuffer, kInvalidated }; |
| enum Expectation { kRenderToFrontBuffer, kRenderToBackBuffer, kNone }; |
| |
| // A mock image with the same interface as CodecImage. |
| struct MockImage { |
| MockImage(ImageKind kind, Phase phase, Expectation expectation) { |
| ON_CALL(*this, is_texture_owner_backed()) |
| .WillByDefault(Return(kind == kTextureOwner)); |
| |
| ON_CALL(*this, was_rendered_to_front_buffer()) |
| .WillByDefault(Return(phase == kInFrontBuffer)); |
| |
| if (expectation == kRenderToFrontBuffer) { |
| EXPECT_CALL(*this, RenderToFrontBuffer()) |
| .WillOnce(Return(phase != kInvalidated)); |
| } else { |
| EXPECT_CALL(*this, RenderToFrontBuffer()).Times(0); |
| } |
| |
| if (expectation == kRenderToBackBuffer) { |
| EXPECT_CALL(*this, RenderToTextureOwnerBackBuffer()) |
| .WillOnce(Return(phase != kInvalidated)); |
| } else { |
| EXPECT_CALL(*this, RenderToTextureOwnerBackBuffer()).Times(0); |
| } |
| } |
| |
| MOCK_METHOD0(was_rendered_to_front_buffer, bool()); |
| MOCK_METHOD0(is_texture_owner_backed, bool()); |
| MOCK_METHOD0(RenderToFrontBuffer, bool()); |
| MOCK_METHOD0(RenderToTextureOwnerBackBuffer, bool()); |
| }; |
| |
| class MaybeRenderEarlyTest : public testing::Test { |
| public: |
| MaybeRenderEarlyTest() = default; |
| ~MaybeRenderEarlyTest() override = default; |
| |
| void AddImage(ImageKind kind, Phase phase, Expectation expectation) { |
| owned_images_.push_back( |
| std::make_unique<NiceMock<MockImage>>(kind, phase, expectation)); |
| images_.push_back(owned_images_.back().get()); |
| } |
| |
| std::vector<std::unique_ptr<NiceMock<MockImage>>> owned_images_; |
| std::vector<MockImage*> images_; |
| }; |
| |
| TEST_F(MaybeRenderEarlyTest, EmptyVector) { |
| internal::MaybeRenderEarly(&images_); |
| } |
| |
| TEST_F(MaybeRenderEarlyTest, SingleUnrenderedSTImageIsRendered) { |
| AddImage(kTextureOwner, kInCodec, Expectation::kRenderToFrontBuffer); |
| internal::MaybeRenderEarly(&images_); |
| } |
| |
| TEST_F(MaybeRenderEarlyTest, SingleUnrenderedOverlayImageIsRendered) { |
| AddImage(kOverlay, kInCodec, Expectation::kRenderToFrontBuffer); |
| internal::MaybeRenderEarly(&images_); |
| } |
| |
| TEST_F(MaybeRenderEarlyTest, InvalidatedImagesAreSkippedOver) { |
| AddImage(kTextureOwner, kInvalidated, Expectation::kRenderToFrontBuffer); |
| AddImage(kTextureOwner, kInvalidated, Expectation::kRenderToFrontBuffer); |
| AddImage(kTextureOwner, kInCodec, Expectation::kRenderToFrontBuffer); |
| internal::MaybeRenderEarly(&images_); |
| } |
| |
| // This also serves as a test that Overlay images are not back buffer rendered. |
| TEST_F(MaybeRenderEarlyTest, NoFrontBufferRenderingIfAlreadyPopulated) { |
| AddImage(kOverlay, kInFrontBuffer, Expectation::kNone); |
| AddImage(kOverlay, kInCodec, Expectation::kNone); |
| internal::MaybeRenderEarly(&images_); |
| } |
| |
| TEST_F(MaybeRenderEarlyTest, |
| ImageFollowingLatestFrontBufferIsBackBufferRendered) { |
| AddImage(kTextureOwner, kInCodec, Expectation::kNone); |
| AddImage(kTextureOwner, kInFrontBuffer, Expectation::kNone); |
| AddImage(kTextureOwner, kInCodec, Expectation::kRenderToBackBuffer); |
| AddImage(kTextureOwner, kInCodec, Expectation::kNone); |
| internal::MaybeRenderEarly(&images_); |
| } |
| |
| } // namespace media |