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 a744f486d4a7728c7d019256aba0df65b199dca1..8557bcc104720759a35669599dec95f608173999 100644 |
--- a/content/common/gpu/media/dxva_video_decode_accelerator_win.cc |
+++ b/content/common/gpu/media/dxva_video_decode_accelerator_win.cc |
@@ -1823,7 +1823,10 @@ void DXVAVideoDecodeAccelerator::Invalidate() { |
output_picture_buffers_.clear(); |
stale_output_picture_buffers_.clear(); |
pending_output_samples_.clear(); |
- pending_input_buffers_.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; |
@@ -2002,12 +2005,12 @@ void DXVAVideoDecodeAccelerator::DecodeInternal( |
PLATFORM_FAILURE,); |
if (config_changed) { |
+ pending_input_buffers_.push_back(sample); |
main_thread_task_runner_->PostTask( |
FROM_HERE, |
base::Bind(&DXVAVideoDecodeAccelerator::ConfigChanged, |
weak_this_factory_.GetWeakPtr(), |
- config_, |
- sample)); |
+ config_)); |
return; |
} |
@@ -2642,16 +2645,16 @@ HRESULT DXVAVideoDecodeAccelerator::CheckConfigChanged( |
} |
void DXVAVideoDecodeAccelerator::ConfigChanged( |
- const Config& config, |
- const base::win::ScopedComPtr<IMFSample>& input_sample) { |
+ const Config& config) { |
DCHECK(main_thread_task_runner_->BelongsToCurrentThread()); |
+ SetState(kConfigChange); |
DismissStaleBuffers(true); |
Invalidate(); |
Initialize(config_, client_); |
decoder_thread_task_runner_->PostTask( |
FROM_HERE, |
- base::Bind(&DXVAVideoDecodeAccelerator::DecodeInternal, |
- base::Unretained(this), input_sample)); |
+ base::Bind(&DXVAVideoDecodeAccelerator::DecodePendingInputBuffers, |
+ base::Unretained(this))); |
} |
} // namespace content |