Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(208)

Unified Diff: content/common/gpu/media/dxva_video_decode_accelerator_win.cc

Issue 1493913003: Ensure that the code in the DXVA DX11 decoder which can potentially access the DX11 device context … (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebased to tip Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « content/common/gpu/media/dxva_video_decode_accelerator_win.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/common/gpu/media/dxva_video_decode_accelerator_win.cc
diff --git a/content/common/gpu/media/dxva_video_decode_accelerator_win.cc b/content/common/gpu/media/dxva_video_decode_accelerator_win.cc
index 0e71f1e0e0e3a87ae3d17fd388766d676f9e5184..236d7840e87e54e37892a19489d5a2cb000f68b0 100644
--- a/content/common/gpu/media/dxva_video_decode_accelerator_win.cc
+++ b/content/common/gpu/media/dxva_video_decode_accelerator_win.cc
@@ -109,6 +109,24 @@ DEFINE_GUID(CLSID_VideoProcessorMFT,
DEFINE_GUID(MF_XVP_PLAYBACK_MODE, 0x3c5d293f, 0xad67, 0x4e29, 0xaf, 0x12,
0xcf, 0x3e, 0x23, 0x8a, 0xcc, 0xe9);
+// Helper class to automatically lock unlock the DX11 device in a scope.
+class AutoDX11DeviceLock {
+ public:
+ explicit AutoDX11DeviceLock(ID3D10Multithread* multi_threaded)
+ : multi_threaded_(multi_threaded) {
+ multi_threaded_->Enter();
+ }
+
+ ~AutoDX11DeviceLock() {
+ multi_threaded_->Leave();
+ }
+
+ private:
+ base::win::ScopedComPtr<ID3D10Multithread> multi_threaded_;
+
+ DISALLOW_COPY_AND_ASSIGN(AutoDX11DeviceLock);
+};
+
} // namespace
namespace content {
@@ -794,11 +812,6 @@ bool DXVAVideoDecodeAccelerator::CreateDX11DevManager() {
using_angle_device_ = true;
d3d11_device_ = angle_device;
- d3d11_device_->GetImmediateContext(d3d11_device_context_.Receive());
- RETURN_ON_FAILURE(
- d3d11_device_context_.get(),
- "Failed to query DX11 device context from ANGLE device",
- false);
// Enable multithreaded mode on the device. This ensures that accesses to
// context are synchronized across threads. We have multiple threads
@@ -812,14 +825,6 @@ bool DXVAVideoDecodeAccelerator::CreateDX11DevManager() {
dx11_dev_manager_reset_token_);
RETURN_ON_HR_FAILURE(hr, "Failed to reset device", false);
- D3D11_QUERY_DESC query_desc;
- query_desc.Query = D3D11_QUERY_EVENT;
- query_desc.MiscFlags = 0;
- hr = d3d11_device_->CreateQuery(
- &query_desc,
- d3d11_query_.Receive());
- RETURN_ON_HR_FAILURE(hr, "Failed to create DX11 device query", false);
-
HMODULE video_processor_dll = ::GetModuleHandle(L"msvproc.dll");
RETURN_ON_FAILURE(video_processor_dll, "Failed to load video processor",
false);
@@ -1527,10 +1532,8 @@ void DXVAVideoDecodeAccelerator::Invalidate() {
MFT_MESSAGE_NOTIFY_END_STREAMING, 0);
video_format_converter_mft_.Release();
}
- d3d11_device_context_.Release();
d3d11_device_.Release();
d3d11_device_manager_.Release();
- d3d11_query_.Release();
dx11_video_format_converter_media_type_needs_init_ = true;
} else {
d3d9_.Release();
@@ -2003,15 +2006,6 @@ void DXVAVideoDecodeAccelerator::CopyTexture(ID3D11Texture2D* src_texture,
DCHECK(video_format_converter_mft_.get());
- // d3d11_device_context_->Begin(d3d11_query_.get());
-
- hr = video_format_converter_mft_->ProcessInput(0, video_frame, 0);
- if (FAILED(hr)) {
- DCHECK(false);
- RETURN_AND_NOTIFY_ON_HR_FAILURE(hr,
- "Failed to convert output sample format.", PLATFORM_FAILURE,);
- }
-
// The video processor MFT requires output samples to be allocated by the
// caller. We create a sample with a buffer backed with the ID3D11Texture2D
// interface exposed by ANGLE. This works nicely as this ensures that the
@@ -2040,9 +2034,16 @@ void DXVAVideoDecodeAccelerator::CopyTexture(ID3D11Texture2D* src_texture,
output_sample->AddBuffer(output_buffer.get());
- // Lock the device here as we are accessing the destination texture created
- // on the main thread.
- multi_threaded_->Enter();
+ // Lock the device here as we are accessing the DX11 video context and the
+ // texture which need to be synchronized with the main thread.
+ AutoDX11DeviceLock device_lock(multi_threaded_.get());
+
+ hr = video_format_converter_mft_->ProcessInput(0, video_frame, 0);
+ if (FAILED(hr)) {
+ DCHECK(false);
+ RETURN_AND_NOTIFY_ON_HR_FAILURE(hr,
+ "Failed to convert output sample format.", PLATFORM_FAILURE,);
+ }
DWORD status = 0;
MFT_OUTPUT_DATA_BUFFER format_converter_output = {};
@@ -2053,11 +2054,6 @@ void DXVAVideoDecodeAccelerator::CopyTexture(ID3D11Texture2D* src_texture,
&format_converter_output,
&status);
- d3d11_device_context_->Flush();
- d3d11_device_context_->End(d3d11_query_.get());
-
- multi_threaded_->Leave();
-
if (FAILED(hr)) {
base::debug::Alias(&hr);
// TODO(ananta)
@@ -2239,16 +2235,6 @@ bool DXVAVideoDecodeAccelerator::InitializeDX11VideoFormatConverterMediaType(
RETURN_AND_NOTIFY_ON_HR_FAILURE(hr,
"Failed to set converter output type", PLATFORM_FAILURE, false);
- hr = video_format_converter_mft_->ProcessMessage(
- MFT_MESSAGE_NOTIFY_BEGIN_STREAMING, 0);
- if (FAILED(hr)) {
- // TODO(ananta)
- // Remove this CHECK when the change to use DX11 for H/W decoding
- // stablizes.
- RETURN_AND_NOTIFY_ON_FAILURE(
- false, "Failed to initialize video converter.", PLATFORM_FAILURE,
- false);
- }
dx11_video_format_converter_media_type_needs_init_ = false;
return true;
}
« no previous file with comments | « content/common/gpu/media/dxva_video_decode_accelerator_win.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698