From 9676f67cde1baa771cf988a01b51e67a1467af4a Mon Sep 17 00:00:00 2001 From: mamingkun Date: Wed, 13 Apr 2022 16:35:16 +0800 Subject: [PATCH 1/2] 1. commit d3d9 resize backbuffer func --- src/ffmpeg-dxva2/dxva2_renderer.cc | 2 ++ src/ffmpeg-dxva2/main.cc | 1 + src/ffmpeg-dxva2/main_window.cc | 12 +++++++++++- src/ffmpeg-dxva2/main_window.h | 5 +++++ src/video-renderer/d3d9_renderer.cc | 23 ++++++++++++++--------- src/video-renderer/d3d9_renderer.h | 1 + 6 files changed, 34 insertions(+), 10 deletions(-) diff --git a/src/ffmpeg-dxva2/dxva2_renderer.cc b/src/ffmpeg-dxva2/dxva2_renderer.cc index bc77a4a..8ccdf98 100644 --- a/src/ffmpeg-dxva2/dxva2_renderer.cc +++ b/src/ffmpeg-dxva2/dxva2_renderer.cc @@ -12,6 +12,8 @@ DXVA2Renderer::~DXVA2Renderer() void DXVA2Renderer::RenderFrame(AVFrame* frame) { + std::lock_guard locker(mutex_); + if (!d3d9_device_) { return; } diff --git a/src/ffmpeg-dxva2/main.cc b/src/ffmpeg-dxva2/main.cc index 3e8ccbf..a169044 100644 --- a/src/ffmpeg-dxva2/main.cc +++ b/src/ffmpeg-dxva2/main.cc @@ -30,6 +30,7 @@ int main(int argc, char** argv) return -2; } + window.SetRender(&renderer); renderer.SetSharpen(0.5); bool abort_request = false; diff --git a/src/ffmpeg-dxva2/main_window.cc b/src/ffmpeg-dxva2/main_window.cc index d4e8e96..c81e72c 100644 --- a/src/ffmpeg-dxva2/main_window.cc +++ b/src/ffmpeg-dxva2/main_window.cc @@ -1,4 +1,5 @@ #include "main_window.h" +#include "dxva2_renderer.h" ATOM MainWindow::wnd_class_ = 0; const wchar_t MainWindow::kClassName[] = L"VideoRender_MainWindow"; @@ -49,12 +50,21 @@ HWND MainWindow::GetHandle() return wnd_; } +void MainWindow::SetRender(DXVA2Renderer* render) { + this->render = render; +} + bool MainWindow::OnMessage(UINT msg, WPARAM wp, LPARAM lp, LRESULT* result) { switch (msg) { case WM_SIZE: - //resize + if (!first_display) { + first_display = true; + } + else { + this->render->Resize(); + } return true; case WM_DESTROY: ::PostQuitMessage(0); diff --git a/src/ffmpeg-dxva2/main_window.h b/src/ffmpeg-dxva2/main_window.h index 4286829..ec07db7 100644 --- a/src/ffmpeg-dxva2/main_window.h +++ b/src/ffmpeg-dxva2/main_window.h @@ -2,6 +2,8 @@ #include +class DXVA2Renderer; + class MainWindow { public: @@ -13,6 +15,7 @@ class MainWindow bool IsWindow(); HWND GetHandle(); + void SetRender(DXVA2Renderer* render); virtual bool OnMessage(UINT msg, WPARAM wp, LPARAM lp, LRESULT* result); @@ -21,6 +24,8 @@ class MainWindow static bool RegisterWindowClass(); HWND wnd_ = NULL; + DXVA2Renderer* render = NULL; + bool first_display = false; static ATOM wnd_class_; static const wchar_t kClassName[]; diff --git a/src/video-renderer/d3d9_renderer.cc b/src/video-renderer/d3d9_renderer.cc index 8049ede..27dfbed 100644 --- a/src/video-renderer/d3d9_renderer.cc +++ b/src/video-renderer/d3d9_renderer.cc @@ -56,6 +56,7 @@ void D3D9Renderer::Destroy() } DX_SAFE_RELEASE(back_buffer_); + DX_SAFE_RELEASE(this->d3d9_swap_chain_); DX_SAFE_RELEASE(d3d9_device_); DX_SAFE_RELEASE(d3d9_); @@ -98,12 +99,10 @@ bool D3D9Renderer::Resize() present_params_.BackBufferWidth = width; present_params_.BackBufferHeight = height; - HRESULT hr = d3d9_device_->Reset(&present_params_); + this->d3d9_swap_chain_->Release(); + HRESULT hr = this->d3d9_device_->CreateAdditionalSwapChain(&present_params_, &this->d3d9_swap_chain_); if (FAILED(hr)) { - Destroy(); - if (!Init(hwnd_)) { - LOG("IDirect3DDevice9::Reset() failed, %x ", hr); - } + LOG("IDirect3DDevice9::CreateAdditionalSwapChain() failed, %x", hr); return false; } @@ -216,18 +215,24 @@ bool D3D9Renderer::CreateDevice() } } + hr = this->d3d9_device_->CreateAdditionalSwapChain(&present_params_, &this->d3d9_swap_chain_); + if (FAILED(hr)) { + LOG("IDirect3DDevice9::CreateAdditionalSwapChain() failed, %x", hr); + return false; + } + return true; } bool D3D9Renderer::CreateRender() { - if (!d3d9_device_) { + if (!d3d9_device_ && !this->d3d9_swap_chain_) { return false; } HRESULT hr = S_OK; - hr = d3d9_device_->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &back_buffer_); + hr = this->d3d9_swap_chain_->GetBackBuffer(0, D3DBACKBUFFER_TYPE_MONO, &back_buffer_); if (FAILED(hr)) { LOG("IDirect3DDevice9::GetRenderTarget() failed, %x", hr); return false; @@ -413,7 +418,7 @@ void D3D9Renderer::End() //GetClientRect(hwnd_, &viewport); if (output_texture_) { - HRESULT hr = d3d9_device_->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &back_buffer_); + HRESULT hr = this->d3d9_swap_chain_->GetBackBuffer(0, D3DBACKBUFFER_TYPE_MONO, &back_buffer_); if (FAILED(hr)) { LOG("IDirect3DDevice9::GetRenderTarget() failed, %x", hr); return ; @@ -425,7 +430,7 @@ void D3D9Renderer::End() } d3d9_device_->EndScene(); - d3d9_device_->Present(NULL, NULL, NULL, NULL); + d3d9_swap_chain_->Present(NULL, NULL, NULL, NULL, 0); } void D3D9Renderer::UpdateARGB(PixelFrame* frame) diff --git a/src/video-renderer/d3d9_renderer.h b/src/video-renderer/d3d9_renderer.h index e198c20..9a8a394 100644 --- a/src/video-renderer/d3d9_renderer.h +++ b/src/video-renderer/d3d9_renderer.h @@ -49,6 +49,7 @@ class D3D9Renderer : public Renderer IDirect3D9* d3d9_ = NULL; IDirect3DDevice9* d3d9_device_ = NULL; + IDirect3DSwapChain9* d3d9_swap_chain_ = NULL; IDirect3DSurface9* back_buffer_ = NULL; PixelFormat pixel_format_ = PIXEL_FORMAT_UNKNOW; From 74f389ddf4757f3c0010dd6181f537638d9dae50 Mon Sep 17 00:00:00 2001 From: mamingkun Date: Wed, 13 Apr 2022 16:36:27 +0800 Subject: [PATCH 2/2] 1. Supplemental submission --- src/ffmpeg-dxva2/main_window.cc | 4 ++-- src/ffmpeg-dxva2/main_window.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/ffmpeg-dxva2/main_window.cc b/src/ffmpeg-dxva2/main_window.cc index c81e72c..c6d310c 100644 --- a/src/ffmpeg-dxva2/main_window.cc +++ b/src/ffmpeg-dxva2/main_window.cc @@ -59,8 +59,8 @@ bool MainWindow::OnMessage(UINT msg, WPARAM wp, LPARAM lp, LRESULT* result) switch (msg) { case WM_SIZE: - if (!first_display) { - first_display = true; + if (first_display) { + first_display = false; } else { this->render->Resize(); diff --git a/src/ffmpeg-dxva2/main_window.h b/src/ffmpeg-dxva2/main_window.h index ec07db7..3f24040 100644 --- a/src/ffmpeg-dxva2/main_window.h +++ b/src/ffmpeg-dxva2/main_window.h @@ -25,7 +25,7 @@ class MainWindow HWND wnd_ = NULL; DXVA2Renderer* render = NULL; - bool first_display = false; + bool first_display = true; static ATOM wnd_class_; static const wchar_t kClassName[];