| 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_demuxer_stream.h" | 5 #include "media/filters/decrypting_demuxer_stream.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/bind_to_current_loop.h" |
| 8 #include "base/callback_helpers.h" | 9 #include "base/callback_helpers.h" |
| 9 #include "base/location.h" | 10 #include "base/location.h" |
| 10 #include "base/logging.h" | 11 #include "base/logging.h" |
| 11 #include "base/single_thread_task_runner.h" | 12 #include "base/single_thread_task_runner.h" |
| 12 #include "media/base/audio_decoder_config.h" | 13 #include "media/base/audio_decoder_config.h" |
| 13 #include "media/base/bind_to_current_loop.h" | |
| 14 #include "media/base/decoder_buffer.h" | 14 #include "media/base/decoder_buffer.h" |
| 15 #include "media/base/decryptor.h" | 15 #include "media/base/decryptor.h" |
| 16 #include "media/base/demuxer_stream.h" | 16 #include "media/base/demuxer_stream.h" |
| 17 #include "media/base/pipeline.h" | 17 #include "media/base/pipeline.h" |
| 18 #include "media/base/video_decoder_config.h" | 18 #include "media/base/video_decoder_config.h" |
| 19 | 19 |
| 20 namespace media { | 20 namespace media { |
| 21 | 21 |
| 22 static bool IsStreamValidAndEncrypted(DemuxerStream* stream) { | 22 static bool IsStreamValidAndEncrypted(DemuxerStream* stream) { |
| 23 return ((stream->type() == DemuxerStream::AUDIO && | 23 return ((stream->type() == DemuxerStream::AUDIO && |
| (...skipping 20 matching lines...) Expand all Loading... |
| 44 | 44 |
| 45 void DecryptingDemuxerStream::Initialize(DemuxerStream* stream, | 45 void DecryptingDemuxerStream::Initialize(DemuxerStream* stream, |
| 46 const PipelineStatusCB& status_cb) { | 46 const PipelineStatusCB& status_cb) { |
| 47 DVLOG(2) << __FUNCTION__; | 47 DVLOG(2) << __FUNCTION__; |
| 48 DCHECK(task_runner_->BelongsToCurrentThread()); | 48 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 49 DCHECK_EQ(state_, kUninitialized) << state_; | 49 DCHECK_EQ(state_, kUninitialized) << state_; |
| 50 | 50 |
| 51 DCHECK(!demuxer_stream_); | 51 DCHECK(!demuxer_stream_); |
| 52 weak_this_ = weak_factory_.GetWeakPtr(); | 52 weak_this_ = weak_factory_.GetWeakPtr(); |
| 53 demuxer_stream_ = stream; | 53 demuxer_stream_ = stream; |
| 54 init_cb_ = BindToCurrentLoop(status_cb); | 54 init_cb_ = base::BindToCurrentLoop(status_cb); |
| 55 | 55 |
| 56 InitializeDecoderConfig(); | 56 InitializeDecoderConfig(); |
| 57 | 57 |
| 58 state_ = kDecryptorRequested; | 58 state_ = kDecryptorRequested; |
| 59 set_decryptor_ready_cb_.Run(BindToCurrentLoop( | 59 set_decryptor_ready_cb_.Run(base::BindToCurrentLoop( |
| 60 base::Bind(&DecryptingDemuxerStream::SetDecryptor, weak_this_))); | 60 base::Bind(&DecryptingDemuxerStream::SetDecryptor, weak_this_))); |
| 61 } | 61 } |
| 62 | 62 |
| 63 void DecryptingDemuxerStream::Read(const ReadCB& read_cb) { | 63 void DecryptingDemuxerStream::Read(const ReadCB& read_cb) { |
| 64 DVLOG(3) << __FUNCTION__; | 64 DVLOG(3) << __FUNCTION__; |
| 65 DCHECK(task_runner_->BelongsToCurrentThread()); | 65 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 66 DCHECK_EQ(state_, kIdle) << state_; | 66 DCHECK_EQ(state_, kIdle) << state_; |
| 67 DCHECK(!read_cb.is_null()); | 67 DCHECK(!read_cb.is_null()); |
| 68 CHECK(read_cb_.is_null()) << "Overlapping reads are not supported."; | 68 CHECK(read_cb_.is_null()) << "Overlapping reads are not supported."; |
| 69 | 69 |
| 70 read_cb_ = BindToCurrentLoop(read_cb); | 70 read_cb_ = base::BindToCurrentLoop(read_cb); |
| 71 state_ = kPendingDemuxerRead; | 71 state_ = kPendingDemuxerRead; |
| 72 demuxer_stream_->Read( | 72 demuxer_stream_->Read( |
| 73 base::Bind(&DecryptingDemuxerStream::DecryptBuffer, weak_this_)); | 73 base::Bind(&DecryptingDemuxerStream::DecryptBuffer, weak_this_)); |
| 74 } | 74 } |
| 75 | 75 |
| 76 void DecryptingDemuxerStream::Reset(const base::Closure& closure) { | 76 void DecryptingDemuxerStream::Reset(const base::Closure& closure) { |
| 77 DVLOG(2) << __FUNCTION__ << " - state: " << state_; | 77 DVLOG(2) << __FUNCTION__ << " - state: " << state_; |
| 78 DCHECK(task_runner_->BelongsToCurrentThread()); | 78 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 79 DCHECK(state_ != kUninitialized) << state_; | 79 DCHECK(state_ != kUninitialized) << state_; |
| 80 DCHECK(reset_cb_.is_null()); | 80 DCHECK(reset_cb_.is_null()); |
| 81 | 81 |
| 82 reset_cb_ = BindToCurrentLoop(closure); | 82 reset_cb_ = base::BindToCurrentLoop(closure); |
| 83 | 83 |
| 84 // TODO(xhwang): This should not happen. Remove it, DCHECK against the | 84 // TODO(xhwang): This should not happen. Remove it, DCHECK against the |
| 85 // condition and clean up related tests. | 85 // condition and clean up related tests. |
| 86 if (state_ == kDecryptorRequested) { | 86 if (state_ == kDecryptorRequested) { |
| 87 DCHECK(!init_cb_.is_null()); | 87 DCHECK(!init_cb_.is_null()); |
| 88 set_decryptor_ready_cb_.Run(DecryptorReadyCB()); | 88 set_decryptor_ready_cb_.Run(DecryptorReadyCB()); |
| 89 base::ResetAndReturn(&init_cb_).Run(PIPELINE_ERROR_ABORT); | 89 base::ResetAndReturn(&init_cb_).Run(PIPELINE_ERROR_ABORT); |
| 90 DoReset(); | 90 DoReset(); |
| 91 return; | 91 return; |
| 92 } | 92 } |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 183 state_ = kUninitialized; | 183 state_ = kUninitialized; |
| 184 base::ResetAndReturn(&init_cb_).Run(DECODER_ERROR_NOT_SUPPORTED); | 184 base::ResetAndReturn(&init_cb_).Run(DECODER_ERROR_NOT_SUPPORTED); |
| 185 decryptor_attached_cb.Run(false); | 185 decryptor_attached_cb.Run(false); |
| 186 return; | 186 return; |
| 187 } | 187 } |
| 188 | 188 |
| 189 decryptor_ = decryptor; | 189 decryptor_ = decryptor; |
| 190 | 190 |
| 191 decryptor_->RegisterNewKeyCB( | 191 decryptor_->RegisterNewKeyCB( |
| 192 GetDecryptorStreamType(), | 192 GetDecryptorStreamType(), |
| 193 BindToCurrentLoop( | 193 base::BindToCurrentLoop( |
| 194 base::Bind(&DecryptingDemuxerStream::OnKeyAdded, weak_this_))); | 194 base::Bind(&DecryptingDemuxerStream::OnKeyAdded, weak_this_))); |
| 195 | 195 |
| 196 state_ = kIdle; | 196 state_ = kIdle; |
| 197 base::ResetAndReturn(&init_cb_).Run(PIPELINE_OK); | 197 base::ResetAndReturn(&init_cb_).Run(PIPELINE_OK); |
| 198 decryptor_attached_cb.Run(true); | 198 decryptor_attached_cb.Run(true); |
| 199 } | 199 } |
| 200 | 200 |
| 201 void DecryptingDemuxerStream::DecryptBuffer( | 201 void DecryptingDemuxerStream::DecryptBuffer( |
| 202 DemuxerStream::Status status, | 202 DemuxerStream::Status status, |
| 203 const scoped_refptr<DecoderBuffer>& buffer) { | 203 const scoped_refptr<DecoderBuffer>& buffer) { |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 264 state_ = kPendingDecrypt; | 264 state_ = kPendingDecrypt; |
| 265 DecryptPendingBuffer(); | 265 DecryptPendingBuffer(); |
| 266 } | 266 } |
| 267 | 267 |
| 268 void DecryptingDemuxerStream::DecryptPendingBuffer() { | 268 void DecryptingDemuxerStream::DecryptPendingBuffer() { |
| 269 DCHECK(task_runner_->BelongsToCurrentThread()); | 269 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 270 DCHECK_EQ(state_, kPendingDecrypt) << state_; | 270 DCHECK_EQ(state_, kPendingDecrypt) << state_; |
| 271 decryptor_->Decrypt( | 271 decryptor_->Decrypt( |
| 272 GetDecryptorStreamType(), | 272 GetDecryptorStreamType(), |
| 273 pending_buffer_to_decrypt_, | 273 pending_buffer_to_decrypt_, |
| 274 BindToCurrentLoop( | 274 base::BindToCurrentLoop( |
| 275 base::Bind(&DecryptingDemuxerStream::DeliverBuffer, weak_this_))); | 275 base::Bind(&DecryptingDemuxerStream::DeliverBuffer, weak_this_))); |
| 276 } | 276 } |
| 277 | 277 |
| 278 void DecryptingDemuxerStream::DeliverBuffer( | 278 void DecryptingDemuxerStream::DeliverBuffer( |
| 279 Decryptor::Status status, | 279 Decryptor::Status status, |
| 280 const scoped_refptr<DecoderBuffer>& decrypted_buffer) { | 280 const scoped_refptr<DecoderBuffer>& decrypted_buffer) { |
| 281 DVLOG(3) << __FUNCTION__ << " - status: " << status; | 281 DVLOG(3) << __FUNCTION__ << " - status: " << status; |
| 282 DCHECK(task_runner_->BelongsToCurrentThread()); | 282 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 283 DCHECK_EQ(state_, kPendingDecrypt) << state_; | 283 DCHECK_EQ(state_, kPendingDecrypt) << state_; |
| 284 DCHECK_NE(status, Decryptor::kNeedMoreData); | 284 DCHECK_NE(status, Decryptor::kNeedMoreData); |
| (...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 403 break; | 403 break; |
| 404 } | 404 } |
| 405 | 405 |
| 406 default: | 406 default: |
| 407 NOTREACHED(); | 407 NOTREACHED(); |
| 408 return; | 408 return; |
| 409 } | 409 } |
| 410 } | 410 } |
| 411 | 411 |
| 412 } // namespace media | 412 } // namespace media |
| OLD | NEW |