| 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;
|
|
|