| Index: media/filters/decrypting_video_decoder.cc
|
| diff --git a/media/filters/decrypting_video_decoder.cc b/media/filters/decrypting_video_decoder.cc
|
| index 3c39e3315fc7c3c73179be3bac0580b9e6efe556..72f8d4874861487bc403debf06ec7004e606a2f7 100644
|
| --- a/media/filters/decrypting_video_decoder.cc
|
| +++ b/media/filters/decrypting_video_decoder.cc
|
| @@ -13,7 +13,6 @@
|
| #include "media/base/bind_to_loop.h"
|
| #include "media/base/decoder_buffer.h"
|
| #include "media/base/decryptor.h"
|
| -#include "media/base/demuxer_stream.h"
|
| #include "media/base/pipeline.h"
|
| #include "media/base/video_decoder_config.h"
|
| #include "media/base/video_frame.h"
|
| @@ -26,7 +25,6 @@ DecryptingVideoDecoder::DecryptingVideoDecoder(
|
| : message_loop_(message_loop),
|
| weak_factory_(this),
|
| state_(kUninitialized),
|
| - demuxer_stream_(NULL),
|
| set_decryptor_ready_cb_(set_decryptor_ready_cb),
|
| decryptor_(NULL),
|
| key_added_while_decode_pending_(false),
|
| @@ -34,7 +32,7 @@ DecryptingVideoDecoder::DecryptingVideoDecoder(
|
| }
|
|
|
| void DecryptingVideoDecoder::Initialize(
|
| - DemuxerStream* stream,
|
| + const VideoDecoderConfig& config,
|
| const PipelineStatusCB& status_cb,
|
| const StatisticsCB& statistics_cb) {
|
| DVLOG(2) << "Initialize()";
|
| @@ -44,17 +42,14 @@ void DecryptingVideoDecoder::Initialize(
|
| state_ == kDecodeFinished) << state_;
|
| DCHECK(read_cb_.is_null());
|
| DCHECK(reset_cb_.is_null());
|
| - DCHECK(stream);
|
| + DCHECK(config.IsValidConfig());
|
| + DCHECK(config.is_encrypted());
|
|
|
| init_cb_ = BindToCurrentLoop(status_cb);
|
| weak_this_ = weak_factory_.GetWeakPtr();
|
| - demuxer_stream_ = stream;
|
| + config_ = config;
|
| statistics_cb_ = statistics_cb;
|
|
|
| - const VideoDecoderConfig& config = demuxer_stream_->video_decoder_config();
|
| - DCHECK(config.IsValidConfig());
|
| - DCHECK(config.is_encrypted());
|
| -
|
| if (state_ == kUninitialized) {
|
| state_ = kDecryptorRequested;
|
| set_decryptor_ready_cb_.Run(BindToCurrentLoop(base::Bind(
|
| @@ -69,14 +64,16 @@ void DecryptingVideoDecoder::Initialize(
|
| &DecryptingVideoDecoder::FinishInitialization, weak_this_)));
|
| }
|
|
|
| -void DecryptingVideoDecoder::Read(const ReadCB& read_cb) {
|
| - DVLOG(3) << "Read()";
|
| +void DecryptingVideoDecoder::Decode(const scoped_refptr<DecoderBuffer>& buffer,
|
| + const ReadCB& read_cb) {
|
| + DVLOG(3) << "Decode()";
|
| DCHECK(message_loop_->BelongsToCurrentThread());
|
| DCHECK(state_ == kIdle ||
|
| state_ == kDecodeFinished ||
|
| state_ == kError) << state_;
|
| DCHECK(!read_cb.is_null());
|
| CHECK(read_cb_.is_null()) << "Overlapping decodes are not supported.";
|
| +
|
| read_cb_ = BindToCurrentLoop(read_cb);
|
|
|
| if (state_ == kError) {
|
| @@ -90,15 +87,15 @@ void DecryptingVideoDecoder::Read(const ReadCB& read_cb) {
|
| return;
|
| }
|
|
|
| - state_ = kPendingDemuxerRead;
|
| - ReadFromDemuxerStream();
|
| + pending_buffer_to_decode_ = buffer;
|
| + state_ = kPendingDecode;
|
| + DecodePendingBuffer();
|
| }
|
|
|
| void DecryptingVideoDecoder::Reset(const base::Closure& closure) {
|
| DVLOG(2) << "Reset() - state: " << state_;
|
| DCHECK(message_loop_->BelongsToCurrentThread());
|
| DCHECK(state_ == kIdle ||
|
| - state_ == kPendingDemuxerRead ||
|
| state_ == kPendingDecode ||
|
| state_ == kWaitingForKey ||
|
| state_ == kDecodeFinished ||
|
| @@ -114,7 +111,7 @@ void DecryptingVideoDecoder::Reset(const base::Closure& closure) {
|
| // Defer the resetting process in this case. The |reset_cb_| will be fired
|
| // after the read callback is fired - see DecryptAndDecodeBuffer() and
|
| // DeliverFrame().
|
| - if (state_ == kPendingDemuxerRead || state_ == kPendingDecode) {
|
| + if (state_ == kPendingDecode) {
|
| DCHECK(!read_cb_.is_null());
|
| return;
|
| }
|
| @@ -181,7 +178,8 @@ void DecryptingVideoDecoder::SetDecryptor(Decryptor* decryptor) {
|
|
|
| state_ = kPendingDecoderInit;
|
| decryptor_->InitializeVideoDecoder(
|
| - demuxer_stream_->video_decoder_config(), BindToCurrentLoop(base::Bind(
|
| + config_,
|
| + BindToCurrentLoop(base::Bind(
|
| &DecryptingVideoDecoder::FinishInitialization, weak_this_)));
|
| }
|
|
|
| @@ -211,47 +209,6 @@ void DecryptingVideoDecoder::FinishInitialization(bool success) {
|
| base::ResetAndReturn(&init_cb_).Run(PIPELINE_OK);
|
| }
|
|
|
| -void DecryptingVideoDecoder::ReadFromDemuxerStream() {
|
| - DCHECK(message_loop_->BelongsToCurrentThread());
|
| - DCHECK_EQ(state_, kPendingDemuxerRead) << state_;
|
| - DCHECK(!read_cb_.is_null());
|
| -
|
| - demuxer_stream_->Read(
|
| - base::Bind(&DecryptingVideoDecoder::DecryptAndDecodeBuffer, weak_this_));
|
| -}
|
| -
|
| -void DecryptingVideoDecoder::DecryptAndDecodeBuffer(
|
| - DemuxerStream::Status status,
|
| - const scoped_refptr<DecoderBuffer>& buffer) {
|
| - DVLOG(3) << "DecryptAndDecodeBuffer()";
|
| - DCHECK(message_loop_->BelongsToCurrentThread());
|
| -
|
| - if (state_ == kStopped)
|
| - return;
|
| -
|
| - DCHECK_EQ(state_, kPendingDemuxerRead) << state_;
|
| - DCHECK(!read_cb_.is_null());
|
| - DCHECK_EQ(buffer.get() != NULL, status == DemuxerStream::kOk) << status;
|
| -
|
| - if (!reset_cb_.is_null()) {
|
| - base::ResetAndReturn(&read_cb_).Run(kOk, NULL);
|
| - DoReset();
|
| - return;
|
| - }
|
| -
|
| - if (status == DemuxerStream::kAborted) {
|
| - DVLOG(2) << "DecryptAndDecodeBuffer() - kAborted";
|
| - state_ = kIdle;
|
| - base::ResetAndReturn(&read_cb_).Run(kOk, NULL);
|
| - return;
|
| - }
|
| -
|
| - // VideoFrameStream ensures no kConfigChanged is passed to VideoDecoders.
|
| - DCHECK_EQ(status, DemuxerStream::kOk) << status;
|
| - pending_buffer_to_decode_ = buffer;
|
| - state_ = kPendingDecode;
|
| - DecodePendingBuffer();
|
| -}
|
|
|
| void DecryptingVideoDecoder::DecodePendingBuffer() {
|
| DCHECK(message_loop_->BelongsToCurrentThread());
|
| @@ -339,8 +296,8 @@ void DecryptingVideoDecoder::DeliverFrame(
|
| return;
|
| }
|
|
|
| - state_ = kPendingDemuxerRead;
|
| - ReadFromDemuxerStream();
|
| + state_ = kIdle;
|
| + base::ResetAndReturn(&read_cb_).Run(kNotEnoughData, NULL);
|
| return;
|
| }
|
|
|
|
|