Index: media/filters/decrypting_video_decoder.cc |
diff --git a/media/filters/decrypting_video_decoder.cc b/media/filters/decrypting_video_decoder.cc |
index 7117d753384fa7ab80d6323ceabe14a627f6a6fe..3ea3bba54b2d3fdc056d229915d57acf0b20fe86 100644 |
--- a/media/filters/decrypting_video_decoder.cc |
+++ b/media/filters/decrypting_video_decoder.cc |
@@ -86,6 +86,7 @@ void DecryptingVideoDecoder::Reset(const base::Closure& closure) { |
DVLOG(2) << "Reset() - state: " << state_; |
DCHECK(message_loop_->BelongsToCurrentThread()); |
DCHECK(state_ == kIdle || |
+ state_ == kPendingConfigChange || |
state_ == kPendingDemuxerRead || |
state_ == kPendingDecode || |
state_ == kWaitingForKey || |
@@ -101,7 +102,9 @@ void DecryptingVideoDecoder::Reset(const base::Closure& closure) { |
// Defer the resetting process in this case. The |reset_cb_| will be fired |
// after the read callback is fired - see DecryptAndDecodeBuffer() and |
// DeliverFrame(). |
- if (state_ == kPendingDemuxerRead || state_ == kPendingDecode) { |
+ if (state_ == kPendingConfigChange || |
+ state_ == kPendingDemuxerRead || |
+ state_ == kPendingDecode) { |
DCHECK(!read_cb_.is_null()); |
return; |
} |
@@ -195,6 +198,35 @@ void DecryptingVideoDecoder::FinishInitialization(bool success) { |
base::ResetAndReturn(&init_cb_).Run(PIPELINE_OK); |
} |
+void DecryptingVideoDecoder::FinishConfigChange(bool success) { |
+ DVLOG(2) << "FinishConfigChange()"; |
+ DCHECK(message_loop_->BelongsToCurrentThread()); |
+ |
+ if (state_ == kStopped) |
+ return; |
+ |
+ DCHECK_EQ(state_, kPendingConfigChange) << state_; |
+ DCHECK(!read_cb_.is_null()); |
+ |
+ if (!success) { |
+ base::ResetAndReturn(&read_cb_).Run(kDecodeError, NULL); |
+ state_ = kDecodeFinished; |
+ if (!reset_cb_.is_null()) |
+ base::ResetAndReturn(&reset_cb_).Run(); |
+ return; |
+ } |
+ |
+ // Config change succeeded. |
+ if (!reset_cb_.is_null()) { |
+ base::ResetAndReturn(&read_cb_).Run(kOk, NULL); |
+ DoReset(); |
+ return; |
+ } |
+ |
+ state_ = kPendingDemuxerRead; |
+ ReadFromDemuxerStream(); |
+} |
+ |
void DecryptingVideoDecoder::ReadFromDemuxerStream() { |
DCHECK(message_loop_->BelongsToCurrentThread()); |
DCHECK_EQ(state_, kPendingDemuxerRead) << state_; |
@@ -217,10 +249,23 @@ void DecryptingVideoDecoder::DecryptAndDecodeBuffer( |
DCHECK(!read_cb_.is_null()); |
DCHECK_EQ(buffer != NULL, status == DemuxerStream::kOk) << status; |
+ if (status == DemuxerStream::kConfigChanged) { |
+ DVLOG(2) << "DecryptAndDecodeBuffer() - kConfigChanged"; |
+ |
+ scoped_ptr<VideoDecoderConfig> scoped_config(new VideoDecoderConfig()); |
+ scoped_config->CopyFrom(demuxer_stream_->video_decoder_config()); |
+ |
+ state_ = kPendingConfigChange; |
+ decryptor_->DeinitializeDecoder(Decryptor::kVideo); |
+ decryptor_->InitializeVideoDecoder( |
+ scoped_config.Pass(), BindToCurrentLoop(base::Bind( |
+ &DecryptingVideoDecoder::FinishConfigChange, this))); |
+ return; |
+ } |
+ |
if (!reset_cb_.is_null()) { |
base::ResetAndReturn(&read_cb_).Run(kOk, NULL); |
- if (!reset_cb_.is_null()) |
- DoReset(); |
+ DoReset(); |
return; |
} |
@@ -231,16 +276,6 @@ void DecryptingVideoDecoder::DecryptAndDecodeBuffer( |
return; |
} |
- if (status == DemuxerStream::kConfigChanged) { |
- // TODO(xhwang): Add config change support. |
- // The |state_| is chosen to be kDecodeFinished here to be consistent with |
- // the implementation of FFmpegVideoDecoder. |
- DVLOG(2) << "DecryptAndDecodeBuffer() - kConfigChanged"; |
- state_ = kDecodeFinished; |
- base::ResetAndReturn(&read_cb_).Run(kDecodeError, NULL); |
- return; |
- } |
- |
DCHECK_EQ(status, DemuxerStream::kOk); |
pending_buffer_to_decode_ = buffer; |
state_ = kPendingDecode; |