| Index: media/filters/decrypting_audio_decoder.cc
|
| diff --git a/media/filters/decrypting_audio_decoder.cc b/media/filters/decrypting_audio_decoder.cc
|
| index 63c3c43912c9d5828bbb86bebb3eb410cde97485..92c0ae681858189235f5c5310b8268409f500d97 100644
|
| --- a/media/filters/decrypting_audio_decoder.cc
|
| +++ b/media/filters/decrypting_audio_decoder.cc
|
| @@ -120,7 +120,7 @@ void DecryptingAudioDecoder::Reset(const base::Closure& closure) {
|
| DCHECK(init_cb_.is_null()); // No Reset() during pending initialization.
|
| DCHECK(reset_cb_.is_null());
|
|
|
| - reset_cb_ = closure;
|
| + reset_cb_ = BindToCurrentLoop(closure);
|
|
|
| decryptor_->ResetDecoder(Decryptor::kAudio);
|
|
|
| @@ -145,6 +145,28 @@ void DecryptingAudioDecoder::Reset(const base::Closure& closure) {
|
| DoReset();
|
| }
|
|
|
| +void DecryptingAudioDecoder::Stop(const base::Closure& closure) {
|
| + DVLOG(2) << "Stop() - state: " << state_;
|
| + DCHECK(task_runner_->BelongsToCurrentThread());
|
| +
|
| + if (decryptor_) {
|
| + decryptor_->RegisterNewKeyCB(Decryptor::kAudio, Decryptor::NewKeyCB());
|
| + decryptor_->DeinitializeDecoder(Decryptor::kAudio);
|
| + decryptor_ = NULL;
|
| + }
|
| + if (!set_decryptor_ready_cb_.is_null())
|
| + base::ResetAndReturn(&set_decryptor_ready_cb_).Run(DecryptorReadyCB());
|
| + pending_buffer_to_decode_ = NULL;
|
| + if (!init_cb_.is_null())
|
| + base::ResetAndReturn(&init_cb_).Run(DECODER_ERROR_NOT_SUPPORTED);
|
| + if (!read_cb_.is_null())
|
| + base::ResetAndReturn(&read_cb_).Run(kAborted, NULL);
|
| + if (!reset_cb_.is_null())
|
| + base::ResetAndReturn(&reset_cb_).Run();
|
| + state_ = kStopped;
|
| + task_runner_->PostTask(FROM_HERE, closure);
|
| +}
|
| +
|
| int DecryptingAudioDecoder::bits_per_channel() {
|
| DCHECK(task_runner_->BelongsToCurrentThread());
|
| return bits_per_channel_;
|
| @@ -161,11 +183,16 @@ int DecryptingAudioDecoder::samples_per_second() {
|
| }
|
|
|
| DecryptingAudioDecoder::~DecryptingAudioDecoder() {
|
| + DCHECK(state_ == kUninitialized || state_ == kStopped) << state_;
|
| }
|
|
|
| void DecryptingAudioDecoder::SetDecryptor(Decryptor* decryptor) {
|
| DVLOG(2) << "SetDecryptor()";
|
| DCHECK(task_runner_->BelongsToCurrentThread());
|
| +
|
| + if (state_ == kStopped)
|
| + return;
|
| +
|
| DCHECK_EQ(state_, kDecryptorRequested) << state_;
|
| DCHECK(!init_cb_.is_null());
|
| DCHECK(!set_decryptor_ready_cb_.is_null());
|
| @@ -175,7 +202,7 @@ void DecryptingAudioDecoder::SetDecryptor(Decryptor* decryptor) {
|
| if (!decryptor) {
|
| base::ResetAndReturn(&init_cb_).Run(DECODER_ERROR_NOT_SUPPORTED);
|
| // TODO(xhwang): Add kError state. See http://crbug.com/251503
|
| - state_ = kDecodeFinished;
|
| + state_ = kStopped;
|
| return;
|
| }
|
|
|
| @@ -205,6 +232,10 @@ void DecryptingAudioDecoder::SetDecryptor(Decryptor* decryptor) {
|
| void DecryptingAudioDecoder::FinishInitialization(bool success) {
|
| DVLOG(2) << "FinishInitialization()";
|
| DCHECK(task_runner_->BelongsToCurrentThread());
|
| +
|
| + if (state_ == kStopped)
|
| + return;
|
| +
|
| DCHECK_EQ(state_, kPendingDecoderInit) << state_;
|
| DCHECK(!init_cb_.is_null());
|
| DCHECK(reset_cb_.is_null()); // No Reset() before initialization finished.
|
| @@ -212,7 +243,7 @@ void DecryptingAudioDecoder::FinishInitialization(bool success) {
|
|
|
| if (!success) {
|
| base::ResetAndReturn(&init_cb_).Run(DECODER_ERROR_NOT_SUPPORTED);
|
| - state_ = kDecodeFinished;
|
| + state_ = kStopped;
|
| return;
|
| }
|
|
|
| @@ -344,6 +375,10 @@ void DecryptingAudioDecoder::DeliverFrame(
|
| const Decryptor::AudioBuffers& frames) {
|
| DVLOG(3) << "DeliverFrame() - status: " << status;
|
| DCHECK(task_runner_->BelongsToCurrentThread());
|
| +
|
| + if (state_ == kStopped)
|
| + return;
|
| +
|
| DCHECK_EQ(state_, kPendingDecode) << state_;
|
| DCHECK(!read_cb_.is_null());
|
| DCHECK(pending_buffer_to_decode_.get());
|
|
|