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

Unified Diff: media/gpu/dxva_video_decode_accelerator_win.cc

Issue 2040093002: Fix black frames on segment boundaries in H/W decoded h.264 video on windows. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 6 months 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 | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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(
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698