| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "media/filters/decrypting_video_decoder.h" | 5 #include "media/filters/decrypting_video_decoder.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/callback_helpers.h" | 8 #include "base/callback_helpers.h" |
| 9 #include "base/debug/trace_event.h" | 9 #include "base/debug/trace_event.h" |
| 10 #include "base/location.h" | 10 #include "base/location.h" |
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 118 if (state_ == kWaitingForKey) { | 118 if (state_ == kWaitingForKey) { |
| 119 DCHECK(!decode_cb_.is_null()); | 119 DCHECK(!decode_cb_.is_null()); |
| 120 pending_buffer_to_decode_ = NULL; | 120 pending_buffer_to_decode_ = NULL; |
| 121 base::ResetAndReturn(&decode_cb_).Run(kAborted); | 121 base::ResetAndReturn(&decode_cb_).Run(kAborted); |
| 122 } | 122 } |
| 123 | 123 |
| 124 DCHECK(decode_cb_.is_null()); | 124 DCHECK(decode_cb_.is_null()); |
| 125 DoReset(); | 125 DoReset(); |
| 126 } | 126 } |
| 127 | 127 |
| 128 void DecryptingVideoDecoder::Stop() { | 128 DecryptingVideoDecoder::~DecryptingVideoDecoder() { |
| 129 DCHECK(task_runner_->BelongsToCurrentThread()); | 129 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 130 DVLOG(2) << "Stop() - state: " << state_; | |
| 131 | 130 |
| 132 // Invalidate all weak pointers so that pending callbacks won't be fired into | 131 if (state_ == kUninitialized) |
| 133 // this object. | 132 return; |
| 134 weak_factory_.InvalidateWeakPtrs(); | |
| 135 | 133 |
| 136 // At this point the render thread is likely paused (in WebMediaPlayerImpl's | |
| 137 // Destroy()), so running |closure| can't wait for anything that requires the | |
| 138 // render thread to be processing messages to complete (such as PPAPI | |
| 139 // callbacks). | |
| 140 if (decryptor_) { | 134 if (decryptor_) { |
| 141 decryptor_->DeinitializeDecoder(Decryptor::kVideo); | 135 decryptor_->DeinitializeDecoder(Decryptor::kVideo); |
| 142 decryptor_ = NULL; | 136 decryptor_ = NULL; |
| 143 } | 137 } |
| 144 if (!set_decryptor_ready_cb_.is_null()) | 138 if (!set_decryptor_ready_cb_.is_null()) |
| 145 base::ResetAndReturn(&set_decryptor_ready_cb_).Run(DecryptorReadyCB()); | 139 base::ResetAndReturn(&set_decryptor_ready_cb_).Run(DecryptorReadyCB()); |
| 146 pending_buffer_to_decode_ = NULL; | 140 pending_buffer_to_decode_ = NULL; |
| 147 if (!init_cb_.is_null()) | 141 if (!init_cb_.is_null()) |
| 148 base::ResetAndReturn(&init_cb_).Run(DECODER_ERROR_NOT_SUPPORTED); | 142 base::ResetAndReturn(&init_cb_).Run(DECODER_ERROR_NOT_SUPPORTED); |
| 149 if (!decode_cb_.is_null()) | 143 if (!decode_cb_.is_null()) |
| 150 base::ResetAndReturn(&decode_cb_).Run(kAborted); | 144 base::ResetAndReturn(&decode_cb_).Run(kAborted); |
| 151 if (!reset_cb_.is_null()) | 145 if (!reset_cb_.is_null()) |
| 152 base::ResetAndReturn(&reset_cb_).Run(); | 146 base::ResetAndReturn(&reset_cb_).Run(); |
| 153 | |
| 154 state_ = kStopped; | |
| 155 } | |
| 156 | |
| 157 DecryptingVideoDecoder::~DecryptingVideoDecoder() { | |
| 158 DCHECK(state_ == kUninitialized || state_ == kStopped) << state_; | |
| 159 } | 147 } |
| 160 | 148 |
| 161 void DecryptingVideoDecoder::SetDecryptor(Decryptor* decryptor) { | 149 void DecryptingVideoDecoder::SetDecryptor(Decryptor* decryptor) { |
| 162 DVLOG(2) << "SetDecryptor()"; | 150 DVLOG(2) << "SetDecryptor()"; |
| 163 DCHECK(task_runner_->BelongsToCurrentThread()); | 151 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 164 DCHECK_EQ(state_, kDecryptorRequested) << state_; | 152 DCHECK_EQ(state_, kDecryptorRequested) << state_; |
| 165 DCHECK(!init_cb_.is_null()); | 153 DCHECK(!init_cb_.is_null()); |
| 166 DCHECK(!set_decryptor_ready_cb_.is_null()); | 154 DCHECK(!set_decryptor_ready_cb_.is_null()); |
| 167 set_decryptor_ready_cb_.Reset(); | 155 set_decryptor_ready_cb_.Reset(); |
| 168 | 156 |
| 169 if (!decryptor) { | 157 if (!decryptor) { |
| 170 base::ResetAndReturn(&init_cb_).Run(DECODER_ERROR_NOT_SUPPORTED); | 158 base::ResetAndReturn(&init_cb_).Run(DECODER_ERROR_NOT_SUPPORTED); |
| 171 state_ = kStopped; | 159 state_ = kError; |
| 172 return; | 160 return; |
| 173 } | 161 } |
| 174 | 162 |
| 175 decryptor_ = decryptor; | 163 decryptor_ = decryptor; |
| 176 | 164 |
| 177 state_ = kPendingDecoderInit; | 165 state_ = kPendingDecoderInit; |
| 178 decryptor_->InitializeVideoDecoder( | 166 decryptor_->InitializeVideoDecoder( |
| 179 config_, | 167 config_, |
| 180 BindToCurrentLoop(base::Bind( | 168 BindToCurrentLoop(base::Bind( |
| 181 &DecryptingVideoDecoder::FinishInitialization, weak_this_))); | 169 &DecryptingVideoDecoder::FinishInitialization, weak_this_))); |
| 182 } | 170 } |
| 183 | 171 |
| 184 void DecryptingVideoDecoder::FinishInitialization(bool success) { | 172 void DecryptingVideoDecoder::FinishInitialization(bool success) { |
| 185 DVLOG(2) << "FinishInitialization()"; | 173 DVLOG(2) << "FinishInitialization()"; |
| 186 DCHECK(task_runner_->BelongsToCurrentThread()); | 174 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 187 DCHECK_EQ(state_, kPendingDecoderInit) << state_; | 175 DCHECK_EQ(state_, kPendingDecoderInit) << state_; |
| 188 DCHECK(!init_cb_.is_null()); | 176 DCHECK(!init_cb_.is_null()); |
| 189 DCHECK(reset_cb_.is_null()); // No Reset() before initialization finished. | 177 DCHECK(reset_cb_.is_null()); // No Reset() before initialization finished. |
| 190 DCHECK(decode_cb_.is_null()); // No Decode() before initialization finished. | 178 DCHECK(decode_cb_.is_null()); // No Decode() before initialization finished. |
| 191 | 179 |
| 192 if (!success) { | 180 if (!success) { |
| 193 base::ResetAndReturn(&init_cb_).Run(DECODER_ERROR_NOT_SUPPORTED); | 181 base::ResetAndReturn(&init_cb_).Run(DECODER_ERROR_NOT_SUPPORTED); |
| 194 state_ = kStopped; | 182 decryptor_ = NULL; |
| 183 state_ = kError; |
| 195 return; | 184 return; |
| 196 } | 185 } |
| 197 | 186 |
| 198 decryptor_->RegisterNewKeyCB( | 187 decryptor_->RegisterNewKeyCB( |
| 199 Decryptor::kVideo, | 188 Decryptor::kVideo, |
| 200 BindToCurrentLoop( | 189 BindToCurrentLoop( |
| 201 base::Bind(&DecryptingVideoDecoder::OnKeyAdded, weak_this_))); | 190 base::Bind(&DecryptingVideoDecoder::OnKeyAdded, weak_this_))); |
| 202 | 191 |
| 203 // Success! | 192 // Success! |
| 204 state_ = kIdle; | 193 state_ = kIdle; |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 315 } | 304 } |
| 316 | 305 |
| 317 void DecryptingVideoDecoder::DoReset() { | 306 void DecryptingVideoDecoder::DoReset() { |
| 318 DCHECK(init_cb_.is_null()); | 307 DCHECK(init_cb_.is_null()); |
| 319 DCHECK(decode_cb_.is_null()); | 308 DCHECK(decode_cb_.is_null()); |
| 320 state_ = kIdle; | 309 state_ = kIdle; |
| 321 base::ResetAndReturn(&reset_cb_).Run(); | 310 base::ResetAndReturn(&reset_cb_).Run(); |
| 322 } | 311 } |
| 323 | 312 |
| 324 } // namespace media | 313 } // namespace media |
| OLD | NEW |