| 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/callback_helpers.h" | 8 #include "base/callback_helpers.h" |
| 9 #include "base/location.h" | 9 #include "base/location.h" |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| 11 #include "base/single_thread_task_runner.h" | 11 #include "base/single_thread_task_runner.h" |
| 12 #include "media/base/audio_decoder_config.h" | 12 #include "media/base/audio_decoder_config.h" |
| 13 #include "media/base/video_decoder_config.h" | 13 #include "media/base/video_decoder_config.h" |
| 14 #include "media/base/bind_to_loop.h" | 14 #include "media/base/bind_to_loop.h" |
| 15 #include "media/base/decoder_buffer.h" | 15 #include "media/base/decoder_buffer.h" |
| 16 #include "media/base/decryptor.h" | 16 #include "media/base/decryptor.h" |
| 17 #include "media/base/demuxer_stream.h" | 17 #include "media/base/demuxer_stream.h" |
| 18 #include "media/base/pipeline.h" | 18 #include "media/base/pipeline.h" |
| 19 | 19 |
| 20 namespace media { | 20 namespace media { |
| 21 | 21 |
| 22 #define BIND_TO_LOOP(function) \ | |
| 23 media::BindToLoop(task_runner_, base::Bind(function, weak_this_)) | |
| 24 | |
| 25 static bool IsStreamValidAndEncrypted(DemuxerStream* stream) { | 22 static bool IsStreamValidAndEncrypted(DemuxerStream* stream) { |
| 26 return ((stream->type() == DemuxerStream::AUDIO && | 23 return ((stream->type() == DemuxerStream::AUDIO && |
| 27 stream->audio_decoder_config().IsValidConfig() && | 24 stream->audio_decoder_config().IsValidConfig() && |
| 28 stream->audio_decoder_config().is_encrypted()) || | 25 stream->audio_decoder_config().is_encrypted()) || |
| 29 (stream->type() == DemuxerStream::VIDEO && | 26 (stream->type() == DemuxerStream::VIDEO && |
| 30 stream->video_decoder_config().IsValidConfig() && | 27 stream->video_decoder_config().IsValidConfig() && |
| 31 stream->video_decoder_config().is_encrypted())); | 28 stream->video_decoder_config().is_encrypted())); |
| 32 } | 29 } |
| 33 | 30 |
| 34 DecryptingDemuxerStream::DecryptingDemuxerStream( | 31 DecryptingDemuxerStream::DecryptingDemuxerStream( |
| (...skipping 15 matching lines...) Expand all Loading... |
| 50 DCHECK_EQ(state_, kUninitialized) << state_; | 47 DCHECK_EQ(state_, kUninitialized) << state_; |
| 51 | 48 |
| 52 DCHECK(!demuxer_stream_); | 49 DCHECK(!demuxer_stream_); |
| 53 weak_this_ = weak_factory_.GetWeakPtr(); | 50 weak_this_ = weak_factory_.GetWeakPtr(); |
| 54 demuxer_stream_ = stream; | 51 demuxer_stream_ = stream; |
| 55 init_cb_ = BindToCurrentLoop(status_cb); | 52 init_cb_ = BindToCurrentLoop(status_cb); |
| 56 | 53 |
| 57 InitializeDecoderConfig(); | 54 InitializeDecoderConfig(); |
| 58 | 55 |
| 59 state_ = kDecryptorRequested; | 56 state_ = kDecryptorRequested; |
| 60 set_decryptor_ready_cb_.Run( | 57 set_decryptor_ready_cb_.Run(BindToCurrentLoop( |
| 61 BIND_TO_LOOP(&DecryptingDemuxerStream::SetDecryptor)); | 58 base::Bind(&DecryptingDemuxerStream::SetDecryptor, weak_this_))); |
| 62 } | 59 } |
| 63 | 60 |
| 64 void DecryptingDemuxerStream::Read(const ReadCB& read_cb) { | 61 void DecryptingDemuxerStream::Read(const ReadCB& read_cb) { |
| 65 DVLOG(3) << __FUNCTION__; | 62 DVLOG(3) << __FUNCTION__; |
| 66 DCHECK(task_runner_->BelongsToCurrentThread()); | 63 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 67 DCHECK_EQ(state_, kIdle) << state_; | 64 DCHECK_EQ(state_, kIdle) << state_; |
| 68 DCHECK(!read_cb.is_null()); | 65 DCHECK(!read_cb.is_null()); |
| 69 CHECK(read_cb_.is_null()) << "Overlapping reads are not supported."; | 66 CHECK(read_cb_.is_null()) << "Overlapping reads are not supported."; |
| 70 | 67 |
| 71 read_cb_ = BindToCurrentLoop(read_cb); | 68 read_cb_ = BindToCurrentLoop(read_cb); |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 148 if (!decryptor) { | 145 if (!decryptor) { |
| 149 state_ = kUninitialized; | 146 state_ = kUninitialized; |
| 150 base::ResetAndReturn(&init_cb_).Run(DECODER_ERROR_NOT_SUPPORTED); | 147 base::ResetAndReturn(&init_cb_).Run(DECODER_ERROR_NOT_SUPPORTED); |
| 151 return; | 148 return; |
| 152 } | 149 } |
| 153 | 150 |
| 154 decryptor_ = decryptor; | 151 decryptor_ = decryptor; |
| 155 | 152 |
| 156 decryptor_->RegisterNewKeyCB( | 153 decryptor_->RegisterNewKeyCB( |
| 157 GetDecryptorStreamType(), | 154 GetDecryptorStreamType(), |
| 158 BIND_TO_LOOP(&DecryptingDemuxerStream::OnKeyAdded)); | 155 BindToCurrentLoop( |
| 156 base::Bind(&DecryptingDemuxerStream::OnKeyAdded, weak_this_))); |
| 159 | 157 |
| 160 state_ = kIdle; | 158 state_ = kIdle; |
| 161 base::ResetAndReturn(&init_cb_).Run(PIPELINE_OK); | 159 base::ResetAndReturn(&init_cb_).Run(PIPELINE_OK); |
| 162 } | 160 } |
| 163 | 161 |
| 164 void DecryptingDemuxerStream::DecryptBuffer( | 162 void DecryptingDemuxerStream::DecryptBuffer( |
| 165 DemuxerStream::Status status, | 163 DemuxerStream::Status status, |
| 166 const scoped_refptr<DecoderBuffer>& buffer) { | 164 const scoped_refptr<DecoderBuffer>& buffer) { |
| 167 DVLOG(3) << __FUNCTION__; | 165 DVLOG(3) << __FUNCTION__; |
| 168 DCHECK(task_runner_->BelongsToCurrentThread()); | 166 DCHECK(task_runner_->BelongsToCurrentThread()); |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 225 state_ = kPendingDecrypt; | 223 state_ = kPendingDecrypt; |
| 226 DecryptPendingBuffer(); | 224 DecryptPendingBuffer(); |
| 227 } | 225 } |
| 228 | 226 |
| 229 void DecryptingDemuxerStream::DecryptPendingBuffer() { | 227 void DecryptingDemuxerStream::DecryptPendingBuffer() { |
| 230 DCHECK(task_runner_->BelongsToCurrentThread()); | 228 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 231 DCHECK_EQ(state_, kPendingDecrypt) << state_; | 229 DCHECK_EQ(state_, kPendingDecrypt) << state_; |
| 232 decryptor_->Decrypt( | 230 decryptor_->Decrypt( |
| 233 GetDecryptorStreamType(), | 231 GetDecryptorStreamType(), |
| 234 pending_buffer_to_decrypt_, | 232 pending_buffer_to_decrypt_, |
| 235 BIND_TO_LOOP(&DecryptingDemuxerStream::DeliverBuffer)); | 233 BindToCurrentLoop( |
| 234 base::Bind(&DecryptingDemuxerStream::DeliverBuffer, weak_this_))); |
| 236 } | 235 } |
| 237 | 236 |
| 238 void DecryptingDemuxerStream::DeliverBuffer( | 237 void DecryptingDemuxerStream::DeliverBuffer( |
| 239 Decryptor::Status status, | 238 Decryptor::Status status, |
| 240 const scoped_refptr<DecoderBuffer>& decrypted_buffer) { | 239 const scoped_refptr<DecoderBuffer>& decrypted_buffer) { |
| 241 DVLOG(3) << __FUNCTION__ << " - status: " << status; | 240 DVLOG(3) << __FUNCTION__ << " - status: " << status; |
| 242 DCHECK(task_runner_->BelongsToCurrentThread()); | 241 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 243 DCHECK_EQ(state_, kPendingDecrypt) << state_; | 242 DCHECK_EQ(state_, kPendingDecrypt) << state_; |
| 244 DCHECK_NE(status, Decryptor::kNeedMoreData); | 243 DCHECK_NE(status, Decryptor::kNeedMoreData); |
| 245 DCHECK(!read_cb_.is_null()); | 244 DCHECK(!read_cb_.is_null()); |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 356 break; | 355 break; |
| 357 } | 356 } |
| 358 | 357 |
| 359 default: | 358 default: |
| 360 NOTREACHED(); | 359 NOTREACHED(); |
| 361 return; | 360 return; |
| 362 } | 361 } |
| 363 } | 362 } |
| 364 | 363 |
| 365 } // namespace media | 364 } // namespace media |
| OLD | NEW |