| 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_audio_decoder.h" | 5 #include "media/filters/decrypting_audio_decoder.h" |
| 6 | 6 |
| 7 #include <cstdlib> | 7 #include <cstdlib> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/callback_helpers.h" | 10 #include "base/callback_helpers.h" |
| (...skipping 30 matching lines...) Expand all Loading... |
| 41 decryptor_(NULL), | 41 decryptor_(NULL), |
| 42 key_added_while_decode_pending_(false), | 42 key_added_while_decode_pending_(false), |
| 43 weak_factory_(this) { | 43 weak_factory_(this) { |
| 44 } | 44 } |
| 45 | 45 |
| 46 std::string DecryptingAudioDecoder::GetDisplayName() const { | 46 std::string DecryptingAudioDecoder::GetDisplayName() const { |
| 47 return "DecryptingAudioDecoder"; | 47 return "DecryptingAudioDecoder"; |
| 48 } | 48 } |
| 49 | 49 |
| 50 void DecryptingAudioDecoder::Initialize(const AudioDecoderConfig& config, | 50 void DecryptingAudioDecoder::Initialize(const AudioDecoderConfig& config, |
| 51 const InitCB& init_cb, | 51 const PipelineStatusCB& status_cb, |
| 52 const OutputCB& output_cb) { | 52 const OutputCB& output_cb) { |
| 53 DVLOG(2) << "Initialize()"; | 53 DVLOG(2) << "Initialize()"; |
| 54 DCHECK(task_runner_->BelongsToCurrentThread()); | 54 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 55 DCHECK(decode_cb_.is_null()); | 55 DCHECK(decode_cb_.is_null()); |
| 56 DCHECK(reset_cb_.is_null()); | 56 DCHECK(reset_cb_.is_null()); |
| 57 | 57 |
| 58 weak_this_ = weak_factory_.GetWeakPtr(); | 58 weak_this_ = weak_factory_.GetWeakPtr(); |
| 59 init_cb_ = BindToCurrentLoop(init_cb); | 59 init_cb_ = BindToCurrentLoop(status_cb); |
| 60 output_cb_ = BindToCurrentLoop(output_cb); | 60 output_cb_ = BindToCurrentLoop(output_cb); |
| 61 | 61 |
| 62 if (!config.IsValidConfig()) { | 62 if (!config.IsValidConfig()) { |
| 63 DLOG(ERROR) << "Invalid audio stream config."; | 63 DLOG(ERROR) << "Invalid audio stream config."; |
| 64 base::ResetAndReturn(&init_cb_).Run(false); | 64 base::ResetAndReturn(&init_cb_).Run(PIPELINE_ERROR_DECODE); |
| 65 return; | 65 return; |
| 66 } | 66 } |
| 67 | 67 |
| 68 // DecryptingAudioDecoder only accepts potentially encrypted stream. | 68 // DecryptingAudioDecoder only accepts potentially encrypted stream. |
| 69 if (!config.is_encrypted()) { | 69 if (!config.is_encrypted()) { |
| 70 base::ResetAndReturn(&init_cb_).Run(false); | 70 base::ResetAndReturn(&init_cb_).Run(DECODER_ERROR_NOT_SUPPORTED); |
| 71 return; | 71 return; |
| 72 } | 72 } |
| 73 | 73 |
| 74 config_ = config; | 74 config_ = config; |
| 75 | 75 |
| 76 if (state_ == kUninitialized) { | 76 if (state_ == kUninitialized) { |
| 77 state_ = kDecryptorRequested; | 77 state_ = kDecryptorRequested; |
| 78 set_decryptor_ready_cb_.Run(BindToCurrentLoop( | 78 set_decryptor_ready_cb_.Run(BindToCurrentLoop( |
| 79 base::Bind(&DecryptingAudioDecoder::SetDecryptor, weak_this_))); | 79 base::Bind(&DecryptingAudioDecoder::SetDecryptor, weak_this_))); |
| 80 return; | 80 return; |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 155 return; | 155 return; |
| 156 | 156 |
| 157 if (decryptor_) { | 157 if (decryptor_) { |
| 158 decryptor_->DeinitializeDecoder(Decryptor::kAudio); | 158 decryptor_->DeinitializeDecoder(Decryptor::kAudio); |
| 159 decryptor_ = NULL; | 159 decryptor_ = NULL; |
| 160 } | 160 } |
| 161 if (!set_decryptor_ready_cb_.is_null()) | 161 if (!set_decryptor_ready_cb_.is_null()) |
| 162 base::ResetAndReturn(&set_decryptor_ready_cb_).Run(DecryptorReadyCB()); | 162 base::ResetAndReturn(&set_decryptor_ready_cb_).Run(DecryptorReadyCB()); |
| 163 pending_buffer_to_decode_ = NULL; | 163 pending_buffer_to_decode_ = NULL; |
| 164 if (!init_cb_.is_null()) | 164 if (!init_cb_.is_null()) |
| 165 base::ResetAndReturn(&init_cb_).Run(false); | 165 base::ResetAndReturn(&init_cb_).Run(DECODER_ERROR_NOT_SUPPORTED); |
| 166 if (!decode_cb_.is_null()) | 166 if (!decode_cb_.is_null()) |
| 167 base::ResetAndReturn(&decode_cb_).Run(kAborted); | 167 base::ResetAndReturn(&decode_cb_).Run(kAborted); |
| 168 if (!reset_cb_.is_null()) | 168 if (!reset_cb_.is_null()) |
| 169 base::ResetAndReturn(&reset_cb_).Run(); | 169 base::ResetAndReturn(&reset_cb_).Run(); |
| 170 } | 170 } |
| 171 | 171 |
| 172 void DecryptingAudioDecoder::SetDecryptor( | 172 void DecryptingAudioDecoder::SetDecryptor( |
| 173 Decryptor* decryptor, | 173 Decryptor* decryptor, |
| 174 const DecryptorAttachedCB& decryptor_attached_cb) { | 174 const DecryptorAttachedCB& decryptor_attached_cb) { |
| 175 DVLOG(2) << "SetDecryptor()"; | 175 DVLOG(2) << "SetDecryptor()"; |
| 176 DCHECK(task_runner_->BelongsToCurrentThread()); | 176 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 177 DCHECK_EQ(state_, kDecryptorRequested) << state_; | 177 DCHECK_EQ(state_, kDecryptorRequested) << state_; |
| 178 DCHECK(!init_cb_.is_null()); | 178 DCHECK(!init_cb_.is_null()); |
| 179 DCHECK(!set_decryptor_ready_cb_.is_null()); | 179 DCHECK(!set_decryptor_ready_cb_.is_null()); |
| 180 | 180 |
| 181 set_decryptor_ready_cb_.Reset(); | 181 set_decryptor_ready_cb_.Reset(); |
| 182 | 182 |
| 183 if (!decryptor) { | 183 if (!decryptor) { |
| 184 base::ResetAndReturn(&init_cb_).Run(false); | 184 base::ResetAndReturn(&init_cb_).Run(DECODER_ERROR_NOT_SUPPORTED); |
| 185 state_ = kError; | 185 state_ = kError; |
| 186 decryptor_attached_cb.Run(false); | 186 decryptor_attached_cb.Run(false); |
| 187 return; | 187 return; |
| 188 } | 188 } |
| 189 | 189 |
| 190 decryptor_ = decryptor; | 190 decryptor_ = decryptor; |
| 191 | 191 |
| 192 InitializeDecoder(); | 192 InitializeDecoder(); |
| 193 decryptor_attached_cb.Run(true); | 193 decryptor_attached_cb.Run(true); |
| 194 } | 194 } |
| 195 | 195 |
| 196 void DecryptingAudioDecoder::InitializeDecoder() { | 196 void DecryptingAudioDecoder::InitializeDecoder() { |
| 197 state_ = kPendingDecoderInit; | 197 state_ = kPendingDecoderInit; |
| 198 decryptor_->InitializeAudioDecoder( | 198 decryptor_->InitializeAudioDecoder( |
| 199 config_, | 199 config_, |
| 200 BindToCurrentLoop(base::Bind( | 200 BindToCurrentLoop(base::Bind( |
| 201 &DecryptingAudioDecoder::FinishInitialization, weak_this_))); | 201 &DecryptingAudioDecoder::FinishInitialization, weak_this_))); |
| 202 } | 202 } |
| 203 | 203 |
| 204 void DecryptingAudioDecoder::FinishInitialization(bool success) { | 204 void DecryptingAudioDecoder::FinishInitialization(bool success) { |
| 205 DVLOG(2) << "FinishInitialization()"; | 205 DVLOG(2) << "FinishInitialization()"; |
| 206 DCHECK(task_runner_->BelongsToCurrentThread()); | 206 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 207 DCHECK(state_ == kPendingDecoderInit) << state_; | 207 DCHECK(state_ == kPendingDecoderInit) << state_; |
| 208 DCHECK(!init_cb_.is_null()); | 208 DCHECK(!init_cb_.is_null()); |
| 209 DCHECK(reset_cb_.is_null()); // No Reset() before initialization finished. | 209 DCHECK(reset_cb_.is_null()); // No Reset() before initialization finished. |
| 210 DCHECK(decode_cb_.is_null()); // No Decode() before initialization finished. | 210 DCHECK(decode_cb_.is_null()); // No Decode() before initialization finished. |
| 211 | 211 |
| 212 if (!success) { | 212 if (!success) { |
| 213 base::ResetAndReturn(&init_cb_).Run(false); | 213 base::ResetAndReturn(&init_cb_).Run(DECODER_ERROR_NOT_SUPPORTED); |
| 214 decryptor_ = NULL; | 214 decryptor_ = NULL; |
| 215 state_ = kError; | 215 state_ = kError; |
| 216 return; | 216 return; |
| 217 } | 217 } |
| 218 | 218 |
| 219 // Success! | 219 // Success! |
| 220 timestamp_helper_.reset( | 220 timestamp_helper_.reset( |
| 221 new AudioTimestampHelper(config_.samples_per_second())); | 221 new AudioTimestampHelper(config_.samples_per_second())); |
| 222 | 222 |
| 223 decryptor_->RegisterNewKeyCB( | 223 decryptor_->RegisterNewKeyCB( |
| 224 Decryptor::kAudio, | 224 Decryptor::kAudio, |
| 225 BindToCurrentLoop( | 225 BindToCurrentLoop( |
| 226 base::Bind(&DecryptingAudioDecoder::OnKeyAdded, weak_this_))); | 226 base::Bind(&DecryptingAudioDecoder::OnKeyAdded, weak_this_))); |
| 227 | 227 |
| 228 state_ = kIdle; | 228 state_ = kIdle; |
| 229 base::ResetAndReturn(&init_cb_).Run(true); | 229 base::ResetAndReturn(&init_cb_).Run(PIPELINE_OK); |
| 230 } | 230 } |
| 231 | 231 |
| 232 void DecryptingAudioDecoder::DecodePendingBuffer() { | 232 void DecryptingAudioDecoder::DecodePendingBuffer() { |
| 233 DCHECK(task_runner_->BelongsToCurrentThread()); | 233 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 234 DCHECK_EQ(state_, kPendingDecode) << state_; | 234 DCHECK_EQ(state_, kPendingDecode) << state_; |
| 235 | 235 |
| 236 int buffer_size = 0; | 236 int buffer_size = 0; |
| 237 if (!pending_buffer_to_decode_->end_of_stream()) { | 237 if (!pending_buffer_to_decode_->end_of_stream()) { |
| 238 buffer_size = pending_buffer_to_decode_->data_size(); | 238 buffer_size = pending_buffer_to_decode_->data_size(); |
| 239 } | 239 } |
| (...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 358 } | 358 } |
| 359 | 359 |
| 360 frame->set_timestamp(current_time); | 360 frame->set_timestamp(current_time); |
| 361 timestamp_helper_->AddFrames(frame->frame_count()); | 361 timestamp_helper_->AddFrames(frame->frame_count()); |
| 362 | 362 |
| 363 output_cb_.Run(frame); | 363 output_cb_.Run(frame); |
| 364 } | 364 } |
| 365 } | 365 } |
| 366 | 366 |
| 367 } // namespace media | 367 } // namespace media |
| OLD | NEW |