| Index: media/gpu/dxva_video_decode_accelerator_win.cc
|
| diff --git a/media/gpu/dxva_video_decode_accelerator_win.cc b/media/gpu/dxva_video_decode_accelerator_win.cc
|
| index 1c2a6cb2cf661e1f0641fc1814c0a43377a51e2c..8f98feac0c80727dfde67ebfa590784aadd4db95 100644
|
| --- a/media/gpu/dxva_video_decode_accelerator_win.cc
|
| +++ b/media/gpu/dxva_video_decode_accelerator_win.cc
|
| @@ -710,6 +710,9 @@ bool DXVAVideoDecodeAccelerator::Initialize(const Config& config,
|
|
|
| bool DXVAVideoDecodeAccelerator::CreateD3DDevManager() {
|
| TRACE_EVENT0("gpu", "DXVAVideoDecodeAccelerator_CreateD3DDevManager");
|
| + // The device may exist if the last state was a config change.
|
| + if (d3d9_.get())
|
| + return true;
|
|
|
| HRESULT hr = E_FAIL;
|
|
|
| @@ -771,6 +774,9 @@ bool DXVAVideoDecodeAccelerator::CreateD3DDevManager() {
|
| }
|
|
|
| bool DXVAVideoDecodeAccelerator::CreateDX11DevManager() {
|
| + // The device may exist if the last state was a config change.
|
| + if (d3d11_device_.get())
|
| + return true;
|
| HRESULT hr = create_dxgi_device_manager_(&dx11_dev_manager_reset_token_,
|
| d3d11_device_manager_.Receive());
|
| RETURN_ON_HR_FAILURE(hr, "MFCreateDXGIDeviceManager failed", false);
|
| @@ -1805,35 +1811,40 @@ void DXVAVideoDecodeAccelerator::Invalidate() {
|
|
|
| decoder_thread_.Stop();
|
| weak_this_factory_.InvalidateWeakPtrs();
|
| - output_picture_buffers_.clear();
|
| - stale_output_picture_buffers_.clear();
|
| pending_output_samples_.clear();
|
| - // We want to continue processing pending input after detecting a config
|
| - // change.
|
| - if (GetState() != kConfigChange)
|
| - pending_input_buffers_.clear();
|
| decoder_.Release();
|
| - pictures_requested_ = false;
|
| -
|
| config_change_detector_.reset();
|
|
|
| - if (use_dx11_) {
|
| - if (video_format_converter_mft_.get()) {
|
| - video_format_converter_mft_->ProcessMessage(
|
| - MFT_MESSAGE_NOTIFY_END_STREAMING, 0);
|
| - video_format_converter_mft_.Release();
|
| + // If we are processing a config change, then leave the d3d9/d3d11 objects
|
| + // along with the output picture buffers intact as they can be reused. The
|
| + // output picture buffers may need to be recreated in case the video
|
| + // resolution changes. We already handle that in the
|
| + // HandleResolutionChanged() function.
|
| + if (GetState() != kConfigChange) {
|
| + output_picture_buffers_.clear();
|
| + stale_output_picture_buffers_.clear();
|
| + // We want to continue processing pending input after detecting a config
|
| + // change.
|
| + pending_input_buffers_.clear();
|
| + pictures_requested_ = false;
|
| + if (use_dx11_) {
|
| + if (video_format_converter_mft_.get()) {
|
| + video_format_converter_mft_->ProcessMessage(
|
| + 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();
|
| + multi_threaded_.Release();
|
| + dx11_video_format_converter_media_type_needs_init_ = true;
|
| + } else {
|
| + d3d9_.Release();
|
| + d3d9_device_ex_.Release();
|
| + device_manager_.Release();
|
| + query_.Release();
|
| }
|
| - d3d11_device_context_.Release();
|
| - d3d11_device_.Release();
|
| - d3d11_device_manager_.Release();
|
| - d3d11_query_.Release();
|
| - dx11_video_format_converter_media_type_needs_init_ = true;
|
| - multi_threaded_.Release();
|
| - } else {
|
| - d3d9_.Release();
|
| - d3d9_device_ex_.Release();
|
| - device_manager_.Release();
|
| - query_.Release();
|
| }
|
|
|
| SetState(kUninitialized);
|
| @@ -2642,7 +2653,6 @@ void DXVAVideoDecodeAccelerator::ConfigChanged(const Config& config) {
|
| DCHECK(main_thread_task_runner_->BelongsToCurrentThread());
|
|
|
| SetState(kConfigChange);
|
| - DismissStaleBuffers(true);
|
| Invalidate();
|
| Initialize(config_, client_);
|
| decoder_thread_task_runner_->PostTask(
|
|
|