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 |