| 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/message_loop_proxy.h" | 11 #include "base/message_loop_proxy.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) \ | 22 #define BIND_TO_LOOP(function) \ |
| 23 media::BindToLoop(message_loop_, base::Bind(function, this)) | 23 media::BindToLoop(message_loop_, base::Bind(function, weak_this_)) |
| 24 | 24 |
| 25 static bool IsStreamValidAndEncrypted( | 25 static bool IsStreamValidAndEncrypted(DemuxerStream* stream) { |
| 26 const scoped_refptr<DemuxerStream>& stream) { | |
| 27 return ((stream->type() == DemuxerStream::AUDIO && | 26 return ((stream->type() == DemuxerStream::AUDIO && |
| 28 stream->audio_decoder_config().IsValidConfig() && | 27 stream->audio_decoder_config().IsValidConfig() && |
| 29 stream->audio_decoder_config().is_encrypted()) || | 28 stream->audio_decoder_config().is_encrypted()) || |
| 30 (stream->type() == DemuxerStream::VIDEO && | 29 (stream->type() == DemuxerStream::VIDEO && |
| 31 stream->video_decoder_config().IsValidConfig() && | 30 stream->video_decoder_config().IsValidConfig() && |
| 32 stream->video_decoder_config().is_encrypted())); | 31 stream->video_decoder_config().is_encrypted())); |
| 33 } | 32 } |
| 34 | 33 |
| 35 DecryptingDemuxerStream::DecryptingDemuxerStream( | 34 DecryptingDemuxerStream::DecryptingDemuxerStream( |
| 36 const scoped_refptr<base::MessageLoopProxy>& message_loop, | 35 const scoped_refptr<base::MessageLoopProxy>& message_loop, |
| 37 const SetDecryptorReadyCB& set_decryptor_ready_cb) | 36 const SetDecryptorReadyCB& set_decryptor_ready_cb) |
| 38 : message_loop_(message_loop), | 37 : message_loop_(message_loop), |
| 38 weak_factory_(this), |
| 39 state_(kUninitialized), | 39 state_(kUninitialized), |
| 40 demuxer_stream_(NULL), |
| 40 set_decryptor_ready_cb_(set_decryptor_ready_cb), | 41 set_decryptor_ready_cb_(set_decryptor_ready_cb), |
| 41 decryptor_(NULL), | 42 decryptor_(NULL), |
| 42 key_added_while_decrypt_pending_(false) { | 43 key_added_while_decrypt_pending_(false) { |
| 43 } | 44 } |
| 44 | 45 |
| 45 void DecryptingDemuxerStream::Initialize( | 46 void DecryptingDemuxerStream::Initialize( |
| 46 const scoped_refptr<DemuxerStream>& stream, | 47 DemuxerStream* stream, |
| 47 const PipelineStatusCB& status_cb) { | 48 const PipelineStatusCB& status_cb) { |
| 48 DVLOG(2) << "Initialize()"; | 49 DVLOG(2) << "Initialize()"; |
| 49 DCHECK(message_loop_->BelongsToCurrentThread()); | 50 DCHECK(message_loop_->BelongsToCurrentThread()); |
| 50 DCHECK_EQ(state_, kUninitialized) << state_; | 51 DCHECK_EQ(state_, kUninitialized) << state_; |
| 51 | 52 |
| 52 DCHECK(!demuxer_stream_); | 53 DCHECK(!demuxer_stream_); |
| 54 weak_this_ = weak_factory_.GetWeakPtr(); |
| 53 demuxer_stream_ = stream; | 55 demuxer_stream_ = stream; |
| 54 init_cb_ = status_cb; | 56 init_cb_ = status_cb; |
| 55 | 57 |
| 56 InitializeDecoderConfig(); | 58 InitializeDecoderConfig(); |
| 57 | 59 |
| 58 state_ = kDecryptorRequested; | 60 state_ = kDecryptorRequested; |
| 59 set_decryptor_ready_cb_.Run( | 61 set_decryptor_ready_cb_.Run( |
| 60 BIND_TO_LOOP(&DecryptingDemuxerStream::SetDecryptor)); | 62 BIND_TO_LOOP(&DecryptingDemuxerStream::SetDecryptor)); |
| 61 } | 63 } |
| 62 | 64 |
| 63 void DecryptingDemuxerStream::Read(const ReadCB& read_cb) { | 65 void DecryptingDemuxerStream::Read(const ReadCB& read_cb) { |
| 64 DVLOG(3) << "Read()"; | 66 DVLOG(3) << "Read()"; |
| 65 DCHECK(message_loop_->BelongsToCurrentThread()); | 67 DCHECK(message_loop_->BelongsToCurrentThread()); |
| 66 DCHECK_EQ(state_, kIdle) << state_; | 68 DCHECK_EQ(state_, kIdle) << state_; |
| 67 DCHECK(!read_cb.is_null()); | 69 DCHECK(!read_cb.is_null()); |
| 68 CHECK(read_cb_.is_null()) << "Overlapping reads are not supported."; | 70 CHECK(read_cb_.is_null()) << "Overlapping reads are not supported."; |
| 69 | 71 |
| 70 read_cb_ = read_cb; | 72 read_cb_ = read_cb; |
| 71 state_ = kPendingDemuxerRead; | 73 state_ = kPendingDemuxerRead; |
| 72 demuxer_stream_->Read( | 74 demuxer_stream_->Read( |
| 73 base::Bind(&DecryptingDemuxerStream::DecryptBuffer, this)); | 75 base::Bind(&DecryptingDemuxerStream::DecryptBuffer, weak_this_)); |
| 74 } | 76 } |
| 75 | 77 |
| 76 void DecryptingDemuxerStream::Reset(const base::Closure& closure) { | 78 void DecryptingDemuxerStream::Reset(const base::Closure& closure) { |
| 77 DVLOG(2) << "Reset() - state: " << state_; | 79 DVLOG(2) << "Reset() - state: " << state_; |
| 78 DCHECK(message_loop_->BelongsToCurrentThread()); | 80 DCHECK(message_loop_->BelongsToCurrentThread()); |
| 79 DCHECK(state_ != kUninitialized && state_ != kDecryptorRequested) << state_; | 81 DCHECK(state_ != kUninitialized && state_ != kDecryptorRequested) << state_; |
| 80 DCHECK(init_cb_.is_null()); // No Reset() during pending initialization. | 82 DCHECK(init_cb_.is_null()); // No Reset() during pending initialization. |
| 81 DCHECK(reset_cb_.is_null()); | 83 DCHECK(reset_cb_.is_null()); |
| 82 | 84 |
| 83 reset_cb_ = BindToCurrentLoop(closure); | 85 reset_cb_ = BindToCurrentLoop(closure); |
| (...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 315 break; | 317 break; |
| 316 } | 318 } |
| 317 | 319 |
| 318 default: | 320 default: |
| 319 NOTREACHED(); | 321 NOTREACHED(); |
| 320 return; | 322 return; |
| 321 } | 323 } |
| 322 } | 324 } |
| 323 | 325 |
| 324 } // namespace media | 326 } // namespace media |
| OLD | NEW |