Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions src/ffmpeg-dxva2/dxva2_renderer.cc
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ DXVA2Renderer::~DXVA2Renderer()

void DXVA2Renderer::RenderFrame(AVFrame* frame)
{
std::lock_guard<std::mutex> locker(mutex_);

if (!d3d9_device_) {
return;
}
Expand Down
1 change: 1 addition & 0 deletions src/ffmpeg-dxva2/main.cc
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ int main(int argc, char** argv)
return -2;
}

window.SetRender(&renderer);
renderer.SetSharpen(0.5);

bool abort_request = false;
Expand Down
12 changes: 11 additions & 1 deletion src/ffmpeg-dxva2/main_window.cc
Original file line number Diff line number Diff line change
@@ -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";
Expand Down Expand Up @@ -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 = false;
}
else {
this->render->Resize();
}
return true;
case WM_DESTROY:
::PostQuitMessage(0);
Expand Down
5 changes: 5 additions & 0 deletions src/ffmpeg-dxva2/main_window.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

#include <Windows.h>

class DXVA2Renderer;

class MainWindow
{
public:
Expand All @@ -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);

Expand All @@ -21,6 +24,8 @@ class MainWindow
static bool RegisterWindowClass();

HWND wnd_ = NULL;
DXVA2Renderer* render = NULL;
bool first_display = true;

static ATOM wnd_class_;
static const wchar_t kClassName[];
Expand Down
23 changes: 14 additions & 9 deletions src/video-renderer/d3d9_renderer.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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_);

Expand Down Expand Up @@ -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;
}

Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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 ;
Expand All @@ -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)
Expand Down
1 change: 1 addition & 0 deletions src/video-renderer/d3d9_renderer.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down