1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
|
// Copyright (c) 2010 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/mf/d3d_util.h"
#include <d3d9.h>
#include <dxva2api.h>
#include "base/scoped_comptr_win.h"
namespace media {
IDirect3DDeviceManager9* CreateD3DDevManager(HWND video_window,
IDirect3D9** direct3d,
IDirect3DDevice9** device) {
ScopedComPtr<IDirect3DDeviceManager9> dev_manager;
ScopedComPtr<IDirect3D9> d3d;
d3d.Attach(Direct3DCreate9(D3D_SDK_VERSION));
if (d3d == NULL) {
LOG(ERROR) << "Failed to create D3D9";
return NULL;
}
D3DPRESENT_PARAMETERS present_params = {0};
// Once we know the dimensions, we need to reset using
// AdjustD3DDeviceBackBufferDimensions().
present_params.BackBufferWidth = 0;
present_params.BackBufferHeight = 0;
present_params.BackBufferFormat = D3DFMT_UNKNOWN;
present_params.BackBufferCount = 1;
present_params.SwapEffect = D3DSWAPEFFECT_DISCARD;
present_params.hDeviceWindow = video_window;
present_params.Windowed = TRUE;
present_params.Flags = D3DPRESENTFLAG_VIDEO;
present_params.FullScreen_RefreshRateInHz = 0;
present_params.PresentationInterval = 0;
ScopedComPtr<IDirect3DDevice9> temp_device;
// D3DCREATE_HARDWARE_VERTEXPROCESSING specifies hardware vertex processing.
// (Is it even needed for just video decoding?)
HRESULT hr = d3d->CreateDevice(D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,
NULL,
D3DCREATE_HARDWARE_VERTEXPROCESSING,
&present_params,
temp_device.Receive());
if (FAILED(hr)) {
LOG(ERROR) << "Failed to create D3D Device";
return NULL;
}
UINT dev_manager_reset_token = 0;
hr = DXVA2CreateDirect3DDeviceManager9(&dev_manager_reset_token,
dev_manager.Receive());
if (FAILED(hr)) {
LOG(ERROR) << "Couldn't create D3D Device manager";
return NULL;
}
hr = dev_manager->ResetDevice(temp_device.get(), dev_manager_reset_token);
if (FAILED(hr)) {
LOG(ERROR) << "Failed to set device to device manager";
return NULL;
}
*direct3d = d3d.Detach();
*device = temp_device.Detach();
return dev_manager.Detach();
}
bool AdjustD3DDeviceBackBufferDimensions(IDirect3DDevice9* device,
HWND video_window,
int width,
int height) {
D3DPRESENT_PARAMETERS present_params = {0};
present_params.BackBufferWidth = width;
present_params.BackBufferHeight = height;
present_params.BackBufferFormat = D3DFMT_UNKNOWN;
present_params.BackBufferCount = 1;
present_params.SwapEffect = D3DSWAPEFFECT_DISCARD;
present_params.hDeviceWindow = video_window;
present_params.Windowed = TRUE;
present_params.Flags = D3DPRESENTFLAG_VIDEO;
present_params.FullScreen_RefreshRateInHz = 0;
present_params.PresentationInterval = 0;
return SUCCEEDED(device->Reset(&present_params)) ? true : false;
}
} // namespace media
|