| 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 "base/strings/string_number_conversions.h" | 12 #include "base/strings/string_number_conversions.h" |
| 13 #include "media/base/bind_to_current_loop.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/media_log.h" | 15 #include "media/base/media_log.h" |
| 16 #include "media/base/media_util.h" | 16 #include "media/base/media_util.h" |
| 17 | 17 |
| 18 namespace media { | 18 namespace media { |
| 19 | 19 |
| 20 static bool IsStreamValidAndEncrypted(DemuxerStream* stream) { | 20 static bool IsStreamValid(DemuxerStream* stream) { |
| 21 return ((stream->type() == DemuxerStream::AUDIO && | 21 return ((stream->type() == DemuxerStream::AUDIO && |
| 22 stream->audio_decoder_config().IsValidConfig() && | 22 stream->audio_decoder_config().IsValidConfig()) || |
| 23 stream->audio_decoder_config().is_encrypted()) || | |
| 24 (stream->type() == DemuxerStream::VIDEO && | 23 (stream->type() == DemuxerStream::VIDEO && |
| 25 stream->video_decoder_config().IsValidConfig() && | 24 stream->video_decoder_config().IsValidConfig())); |
| 26 stream->video_decoder_config().is_encrypted())); | |
| 27 } | 25 } |
| 28 | 26 |
| 29 DecryptingDemuxerStream::DecryptingDemuxerStream( | 27 DecryptingDemuxerStream::DecryptingDemuxerStream( |
| 30 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, | 28 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, |
| 31 const scoped_refptr<MediaLog>& media_log, | 29 const scoped_refptr<MediaLog>& media_log, |
| 32 const base::Closure& waiting_for_decryption_key_cb) | 30 const base::Closure& waiting_for_decryption_key_cb) |
| 33 : task_runner_(task_runner), | 31 : task_runner_(task_runner), |
| 34 media_log_(media_log), | 32 media_log_(media_log), |
| 35 state_(kUninitialized), | 33 state_(kUninitialized), |
| 36 waiting_for_decryption_key_cb_(waiting_for_decryption_key_cb), | 34 waiting_for_decryption_key_cb_(waiting_for_decryption_key_cb), |
| (...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 220 return; | 218 return; |
| 221 } | 219 } |
| 222 | 220 |
| 223 if (status == kAborted) { | 221 if (status == kAborted) { |
| 224 DVLOG(2) << "DoDecryptBuffer() - kAborted."; | 222 DVLOG(2) << "DoDecryptBuffer() - kAborted."; |
| 225 state_ = kIdle; | 223 state_ = kIdle; |
| 226 base::ResetAndReturn(&read_cb_).Run(kAborted, NULL); | 224 base::ResetAndReturn(&read_cb_).Run(kAborted, NULL); |
| 227 return; | 225 return; |
| 228 } | 226 } |
| 229 | 227 |
| 228 DCHECK_EQ(kOk, status); |
| 229 |
| 230 if (buffer->end_of_stream()) { | 230 if (buffer->end_of_stream()) { |
| 231 DVLOG(2) << "DoDecryptBuffer() - EOS buffer."; | 231 DVLOG(2) << "DoDecryptBuffer() - EOS buffer."; |
| 232 state_ = kIdle; | 232 state_ = kIdle; |
| 233 base::ResetAndReturn(&read_cb_).Run(status, buffer); | 233 base::ResetAndReturn(&read_cb_).Run(kOk, buffer); |
| 234 return; | 234 return; |
| 235 } | 235 } |
| 236 | 236 |
| 237 DCHECK(buffer->decrypt_config()); | 237 // TODO(xhwang): Unify clear buffer handling in clear and encrypted stream. |
| 238 // See http://crbug.com/675003 |
| 239 if (!buffer->decrypt_config()) { |
| 240 DVLOG(2) << "DoDecryptBuffer() - clear buffer in clear stream."; |
| 241 state_ = kIdle; |
| 242 base::ResetAndReturn(&read_cb_).Run(kOk, buffer); |
| 243 return; |
| 244 } |
| 245 |
| 238 if (!buffer->decrypt_config()->is_encrypted()) { | 246 if (!buffer->decrypt_config()->is_encrypted()) { |
| 239 DVLOG(2) << "DoDecryptBuffer() - clear buffer."; | 247 DVLOG(2) << "DoDecryptBuffer() - clear buffer in encrypted stream."; |
| 240 scoped_refptr<DecoderBuffer> decrypted = DecoderBuffer::CopyFrom( | 248 scoped_refptr<DecoderBuffer> decrypted = DecoderBuffer::CopyFrom( |
| 241 buffer->data(), buffer->data_size()); | 249 buffer->data(), buffer->data_size()); |
| 242 decrypted->set_timestamp(buffer->timestamp()); | 250 decrypted->set_timestamp(buffer->timestamp()); |
| 243 decrypted->set_duration(buffer->duration()); | 251 decrypted->set_duration(buffer->duration()); |
| 244 if (buffer->is_key_frame()) | 252 if (buffer->is_key_frame()) |
| 245 decrypted->set_is_key_frame(true); | 253 decrypted->set_is_key_frame(true); |
| 246 | 254 |
| 247 state_ = kIdle; | 255 state_ = kIdle; |
| 248 base::ResetAndReturn(&read_cb_).Run(kOk, decrypted); | 256 base::ResetAndReturn(&read_cb_).Run(kOk, decrypted); |
| 249 return; | 257 return; |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 355 | 363 |
| 356 Decryptor::StreamType DecryptingDemuxerStream::GetDecryptorStreamType() const { | 364 Decryptor::StreamType DecryptingDemuxerStream::GetDecryptorStreamType() const { |
| 357 if (demuxer_stream_->type() == AUDIO) | 365 if (demuxer_stream_->type() == AUDIO) |
| 358 return Decryptor::kAudio; | 366 return Decryptor::kAudio; |
| 359 | 367 |
| 360 DCHECK_EQ(demuxer_stream_->type(), VIDEO); | 368 DCHECK_EQ(demuxer_stream_->type(), VIDEO); |
| 361 return Decryptor::kVideo; | 369 return Decryptor::kVideo; |
| 362 } | 370 } |
| 363 | 371 |
| 364 void DecryptingDemuxerStream::InitializeDecoderConfig() { | 372 void DecryptingDemuxerStream::InitializeDecoderConfig() { |
| 365 // The decoder selector or upstream demuxer make sure the stream is valid and | 373 // The decoder selector or upstream demuxer make sure the stream is valid. |
| 366 // potentially encrypted. | 374 DCHECK(IsStreamValid(demuxer_stream_)); |
| 367 DCHECK(IsStreamValidAndEncrypted(demuxer_stream_)); | |
| 368 | 375 |
| 369 switch (demuxer_stream_->type()) { | 376 switch (demuxer_stream_->type()) { |
| 370 case AUDIO: { | 377 case AUDIO: { |
| 371 AudioDecoderConfig input_audio_config = | 378 AudioDecoderConfig input_audio_config = |
| 372 demuxer_stream_->audio_decoder_config(); | 379 demuxer_stream_->audio_decoder_config(); |
| 373 audio_config_.Initialize( | 380 audio_config_.Initialize( |
| 374 input_audio_config.codec(), input_audio_config.sample_format(), | 381 input_audio_config.codec(), input_audio_config.sample_format(), |
| 375 input_audio_config.channel_layout(), | 382 input_audio_config.channel_layout(), |
| 376 input_audio_config.samples_per_second(), | 383 input_audio_config.samples_per_second(), |
| 377 input_audio_config.extra_data(), Unencrypted(), | 384 input_audio_config.extra_data(), Unencrypted(), |
| (...skipping 13 matching lines...) Expand all Loading... |
| 391 break; | 398 break; |
| 392 } | 399 } |
| 393 | 400 |
| 394 default: | 401 default: |
| 395 NOTREACHED(); | 402 NOTREACHED(); |
| 396 return; | 403 return; |
| 397 } | 404 } |
| 398 } | 405 } |
| 399 | 406 |
| 400 } // namespace media | 407 } // namespace media |
| OLD | NEW |