| 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 cf841fa5342748c5adc1beba4a9b9738bc7b6d99..0e0e9d25c06da967cf7a61157557785462b49b6f 100644
|
| --- a/media/gpu/dxva_video_decode_accelerator_win.cc
|
| +++ b/media/gpu/dxva_video_decode_accelerator_win.cc
|
| @@ -592,6 +592,7 @@ DXVAVideoDecodeAccelerator::DXVAVideoDecodeAccelerator(
|
| using_angle_device_(false),
|
| enable_accelerated_vpx_decode_(
|
| gpu_preferences.enable_accelerated_vpx_decode),
|
| + processing_config_changed_(false),
|
| weak_this_factory_(this) {
|
| weak_ptr_ = weak_this_factory_.GetWeakPtr();
|
| memset(&input_stream_info_, 0, sizeof(input_stream_info_));
|
| @@ -927,7 +928,7 @@ void DXVAVideoDecodeAccelerator::AssignPictureBuffers(
|
| }
|
|
|
| ProcessPendingSamples();
|
| - if (pending_flush_) {
|
| + if (pending_flush_ || processing_config_changed_) {
|
| decoder_thread_task_runner_->PostTask(
|
| FROM_HERE, base::Bind(&DXVAVideoDecodeAccelerator::FlushInternal,
|
| base::Unretained(this)));
|
| @@ -1020,7 +1021,7 @@ void DXVAVideoDecodeAccelerator::WaitForOutputBuffer(int32_t picture_buffer_id,
|
| PLATFORM_FAILURE, );
|
|
|
| ProcessPendingSamples();
|
| - if (pending_flush_) {
|
| + if (pending_flush_ || processing_config_changed_) {
|
| decoder_thread_task_runner_->PostTask(
|
| FROM_HERE, base::Bind(&DXVAVideoDecodeAccelerator::FlushInternal,
|
| base::Unretained(this)));
|
| @@ -1041,6 +1042,19 @@ void DXVAVideoDecodeAccelerator::Flush() {
|
|
|
| pending_flush_ = true;
|
|
|
| + // If we receive a flush while processing a video stream config change, then
|
| + // we treat this as a regular flush, i.e we process queued decode packets,
|
| + // etc.
|
| + // We are resetting the processing_config_changed_ flag here which means that
|
| + // we won't be tearing down the decoder instance and recreating it to handle
|
| + // the changed configuration. The expectation here is that after the decoder
|
| + // is drained it should be able to handle a changed configuration.
|
| + // TODO(ananta)
|
| + // If a flush is sufficient to get the decoder to process video stream config
|
| + // changes correctly, then we don't need to tear down the decoder instance
|
| + // and recreate it. Check if this is indeed the case.
|
| + processing_config_changed_ = false;
|
| +
|
| decoder_thread_task_runner_->PostTask(
|
| FROM_HERE, base::Bind(&DXVAVideoDecodeAccelerator::FlushInternal,
|
| base::Unretained(this)));
|
| @@ -1848,7 +1862,7 @@ void DXVAVideoDecodeAccelerator::Invalidate() {
|
| query_.Release();
|
| }
|
| }
|
| -
|
| + sent_drain_message_ = false;
|
| SetState(kUninitialized);
|
| }
|
|
|
| @@ -1925,6 +1939,8 @@ void DXVAVideoDecodeAccelerator::DecodePendingInputBuffers() {
|
| TRACE_EVENT0("media",
|
| "DXVAVideoDecodeAccelerator::DecodePendingInputBuffers");
|
| DCHECK(decoder_thread_task_runner_->BelongsToCurrentThread());
|
| + DCHECK(!processing_config_changed_);
|
| +
|
| State state = GetState();
|
| RETURN_AND_NOTIFY_ON_FAILURE((state != kUninitialized),
|
| "Invalid state: " << state, ILLEGAL_STATE, );
|
| @@ -1952,7 +1968,9 @@ void DXVAVideoDecodeAccelerator::FlushInternal() {
|
|
|
| // First drain the pending input because once the drain message is sent below,
|
| // the decoder will ignore further input until it's drained.
|
| - if (!pending_input_buffers_.empty()) {
|
| + // If we are processing a video configuration change, then we should just
|
| + // the drain the decoder.
|
| + if (!processing_config_changed_ && !pending_input_buffers_.empty()) {
|
| decoder_thread_task_runner_->PostTask(
|
| FROM_HERE,
|
| base::Bind(&DXVAVideoDecodeAccelerator::DecodePendingInputBuffers,
|
| @@ -1980,11 +1998,18 @@ void DXVAVideoDecodeAccelerator::FlushInternal() {
|
| if (OutputSamplesPresent())
|
| return;
|
|
|
| - SetState(kFlushing);
|
| + if (!processing_config_changed_) {
|
| + SetState(kFlushing);
|
|
|
| - main_thread_task_runner_->PostTask(
|
| - FROM_HERE, base::Bind(&DXVAVideoDecodeAccelerator::NotifyFlushDone,
|
| - weak_this_factory_.GetWeakPtr()));
|
| + main_thread_task_runner_->PostTask(
|
| + FROM_HERE, base::Bind(&DXVAVideoDecodeAccelerator::NotifyFlushDone,
|
| + weak_this_factory_.GetWeakPtr()));
|
| + } else {
|
| + processing_config_changed_ = false;
|
| + main_thread_task_runner_->PostTask(
|
| + FROM_HERE, base::Bind(&DXVAVideoDecodeAccelerator::ConfigChanged,
|
| + weak_this_factory_.GetWeakPtr(), config_));
|
| + }
|
|
|
| SetState(kNormal);
|
| }
|
| @@ -2010,11 +2035,11 @@ void DXVAVideoDecodeAccelerator::DecodeInternal(
|
| RETURN_AND_NOTIFY_ON_HR_FAILURE(hr, "Failed to check video stream config",
|
| PLATFORM_FAILURE, );
|
|
|
| + processing_config_changed_ = config_changed;
|
| +
|
| 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_));
|
| + FlushInternal();
|
| return;
|
| }
|
|
|
| @@ -2256,7 +2281,7 @@ void DXVAVideoDecodeAccelerator::CopySurfaceComplete(
|
| pending_output_samples_.pop_front();
|
| }
|
|
|
| - if (pending_flush_) {
|
| + if (pending_flush_ || processing_config_changed_) {
|
| decoder_thread_task_runner_->PostTask(
|
| FROM_HERE, base::Bind(&DXVAVideoDecodeAccelerator::FlushInternal,
|
| base::Unretained(this)));
|
| @@ -2308,7 +2333,7 @@ void DXVAVideoDecodeAccelerator::BindPictureBufferToSample(
|
| pending_output_samples_.pop_front();
|
| }
|
|
|
| - if (pending_flush_) {
|
| + if (pending_flush_ || processing_config_changed_) {
|
| decoder_thread_task_runner_->PostTask(
|
| FROM_HERE, base::Bind(&DXVAVideoDecodeAccelerator::FlushInternal,
|
| base::Unretained(this)));
|
|
|