| // 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 <random> |
| #include <utility> |
| |
| #include "base/callback_helpers.h" |
| #include "media/base/win/d3d11_mocks.h" |
| #include "media/gpu/windows/d3d11_copying_texture_wrapper.h" |
| #include "media/gpu/windows/d3d11_texture_wrapper.h" |
| #include "media/gpu/windows/d3d11_video_processor_proxy.h" |
| #include "testing/gmock/include/gmock/gmock.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| |
| using ::testing::_; |
| using ::testing::DoAll; |
| using ::testing::Return; |
| using ::testing::SetArgPointee; |
| |
| namespace media { |
| |
| using MockD3D11VideoDevice = Microsoft::WRL::ComPtr<D3D11VideoDeviceMock>; |
| using MockD3D11DeviceContext = Microsoft::WRL::ComPtr<D3D11DeviceContextMock>; |
| using MockD3D11VideoContext = Microsoft::WRL::ComPtr<D3D11VideoContextMock>; |
| using MockD3D11VideoProcessor = Microsoft::WRL::ComPtr<D3D11VideoProcessorMock>; |
| using MockD3D11VideoProcessorEnumerator = |
| Microsoft::WRL::ComPtr<D3D11VideoProcessorEnumeratorMock>; |
| |
| class D3D11VideoProcessorProxyUnittest : public ::testing::Test { |
| public: |
| MockD3D11VideoDevice dev_; |
| MockD3D11DeviceContext ctx_; |
| MockD3D11VideoContext vctx_; |
| MockD3D11VideoProcessorEnumerator enumerator_; |
| MockD3D11VideoProcessor proc_; |
| |
| scoped_refptr<VideoProcessorProxy> CreateProxy() { |
| dev_ = MakeComPtr<D3D11VideoDeviceMock>(); |
| ctx_ = MakeComPtr<D3D11DeviceContextMock>(); |
| vctx_ = MakeComPtr<D3D11VideoContextMock>(); |
| proc_ = MakeComPtr<D3D11VideoProcessorMock>(); |
| enumerator_ = MakeComPtr<D3D11VideoProcessorEnumeratorMock>(); |
| |
| EXPECT_CALL(*dev_.Get(), CreateVideoProcessorEnumerator(_, _)) |
| .WillOnce(SetComPointeeAndReturnOk<1>(enumerator_.Get())); |
| |
| EXPECT_CALL(*dev_.Get(), CreateVideoProcessor(_, _, _)) |
| .WillOnce(SetComPointeeAndReturnOk<2>(proc_.Get())); |
| |
| EXPECT_CALL(*ctx_.Get(), QueryInterface(_, _)) |
| .WillOnce(SetComPointeeAndReturnOk<1>(vctx_.Get())); |
| |
| return base::MakeRefCounted<VideoProcessorProxy>(dev_, ctx_); |
| } |
| |
| // Pull a random pointer off the stack, rather than relying on nullptrs. |
| template <typename T> |
| T* CreateGarbagePtr() { |
| int foo; |
| void* local = &foo; |
| return static_cast<T*>(local); |
| } |
| }; |
| |
| // The processor proxy wraps the VideoDevice/VideoContext and stores some of the |
| // d3d11 types. Make sure that the arguments we give these methods are passed |
| // through correctly. |
| TEST_F(D3D11VideoProcessorProxyUnittest, EnsureMethodPassthrough) { |
| auto proxy = CreateProxy(); |
| |
| // Garbage pointers are used because the proxy just passes them along and does |
| // absolutely nothing with them. |
| auto* texture = CreateGarbagePtr<ID3D11Texture2D>(); |
| auto* out_desc = CreateGarbagePtr<D3D11_VIDEO_PROCESSOR_OUTPUT_VIEW_DESC>(); |
| auto* in_desc = CreateGarbagePtr<D3D11_VIDEO_PROCESSOR_INPUT_VIEW_DESC>(); |
| auto* out_view = CreateGarbagePtr<ID3D11VideoProcessorOutputView>(); |
| auto* streams = CreateGarbagePtr<D3D11_VIDEO_PROCESSOR_STREAM>(); |
| |
| EXPECT_CALL(*dev_.Get(), CreateVideoProcessorOutputView( |
| texture, enumerator_.Get(), out_desc, nullptr)); |
| |
| EXPECT_CALL(*dev_.Get(), CreateVideoProcessorInputView( |
| texture, enumerator_.Get(), in_desc, nullptr)); |
| |
| EXPECT_CALL(*vctx_.Get(), |
| VideoProcessorBlt(proc_.Get(), out_view, 6, 7, streams)); |
| |
| EXPECT_TRUE(proxy->Init(0, 0).is_ok()); |
| proxy->CreateVideoProcessorOutputView(texture, out_desc, nullptr); |
| proxy->CreateVideoProcessorInputView(texture, in_desc, nullptr); |
| proxy->VideoProcessorBlt(out_view, 6, 7, streams); |
| } |
| |
| } // namespace media |