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 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
224 state_ = kPendingDecrypt; | 222 state_ = kPendingDecrypt; |
225 DecryptPendingBuffer(); | 223 DecryptPendingBuffer(); |
226 } | 224 } |
227 | 225 |
228 void DecryptingDemuxerStream::DecryptPendingBuffer() { | 226 void DecryptingDemuxerStream::DecryptPendingBuffer() { |
229 DCHECK(task_runner_->BelongsToCurrentThread()); | 227 DCHECK(task_runner_->BelongsToCurrentThread()); |
230 DCHECK_EQ(state_, kPendingDecrypt) << state_; | 228 DCHECK_EQ(state_, kPendingDecrypt) << state_; |
231 decryptor_->Decrypt( | 229 decryptor_->Decrypt( |
232 GetDecryptorStreamType(), | 230 GetDecryptorStreamType(), |
233 pending_buffer_to_decrypt_, | 231 pending_buffer_to_decrypt_, |
234 BIND_TO_LOOP(&DecryptingDemuxerStream::DeliverBuffer)); | 232 BindToCurrentLoop( |
| 233 base::Bind(&DecryptingDemuxerStream::DeliverBuffer, weak_this_))); |
235 } | 234 } |
236 | 235 |
237 void DecryptingDemuxerStream::DeliverBuffer( | 236 void DecryptingDemuxerStream::DeliverBuffer( |
238 Decryptor::Status status, | 237 Decryptor::Status status, |
239 const scoped_refptr<DecoderBuffer>& decrypted_buffer) { | 238 const scoped_refptr<DecoderBuffer>& decrypted_buffer) { |
240 DVLOG(3) << __FUNCTION__ << " - status: " << status; | 239 DVLOG(3) << __FUNCTION__ << " - status: " << status; |
241 DCHECK(task_runner_->BelongsToCurrentThread()); | 240 DCHECK(task_runner_->BelongsToCurrentThread()); |
242 DCHECK_EQ(state_, kPendingDecrypt) << state_; | 241 DCHECK_EQ(state_, kPendingDecrypt) << state_; |
243 DCHECK_NE(status, Decryptor::kNeedMoreData); | 242 DCHECK_NE(status, Decryptor::kNeedMoreData); |
244 DCHECK(!read_cb_.is_null()); | 243 DCHECK(!read_cb_.is_null()); |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
355 break; | 354 break; |
356 } | 355 } |
357 | 356 |
358 default: | 357 default: |
359 NOTREACHED(); | 358 NOTREACHED(); |
360 return; | 359 return; |
361 } | 360 } |
362 } | 361 } |
363 | 362 |
364 } // namespace media | 363 } // namespace media |
OLD | NEW |