Index: media/filters/fake_video_decoder.cc |
diff --git a/media/filters/fake_video_decoder.cc b/media/filters/fake_video_decoder.cc |
index 9a59d1cf195766a7f3388a7c892254e5fa757c38..6e0577cd07213e5172cecd6203172dc8ce134e21 100644 |
--- a/media/filters/fake_video_decoder.cc |
+++ b/media/filters/fake_video_decoder.cc |
@@ -9,7 +9,7 @@ |
#include "base/location.h" |
#include "base/message_loop/message_loop_proxy.h" |
#include "media/base/bind_to_loop.h" |
-#include "media/base/demuxer_stream.h" |
+#include "media/base/test_helpers.h" |
namespace media { |
@@ -17,8 +17,7 @@ FakeVideoDecoder::FakeVideoDecoder(int decoding_delay) |
: message_loop_(base::MessageLoopProxy::current()), |
weak_factory_(this), |
decoding_delay_(decoding_delay), |
- state_(UNINITIALIZED), |
- demuxer_stream_(NULL) { |
+ state_(UNINITIALIZED) { |
DCHECK_GE(decoding_delay, 0); |
} |
@@ -26,20 +25,18 @@ FakeVideoDecoder::~FakeVideoDecoder() { |
DCHECK_EQ(state_, UNINITIALIZED); |
} |
-void FakeVideoDecoder::Initialize(DemuxerStream* stream, |
+void FakeVideoDecoder::Initialize(const VideoDecoderConfig& config, |
const PipelineStatusCB& status_cb, |
const StatisticsCB& statistics_cb) { |
DCHECK(message_loop_->BelongsToCurrentThread()); |
- DCHECK(stream); |
- DCHECK(stream->video_decoder_config().IsValidConfig()); |
+ DCHECK(config.IsValidConfig()); |
DCHECK(read_cb_.IsNull()) << "No reinitialization during pending read."; |
DCHECK(reset_cb_.IsNull()) << "No reinitialization during pending reset."; |
weak_this_ = weak_factory_.GetWeakPtr(); |
- demuxer_stream_ = stream; |
statistics_cb_ = statistics_cb; |
- current_config_ = stream->video_decoder_config(); |
+ current_config_ = config; |
init_cb_.SetCallback(BindToCurrentLoop(status_cb)); |
if (!decoded_frames_.empty()) { |
@@ -51,14 +48,35 @@ void FakeVideoDecoder::Initialize(DemuxerStream* stream, |
init_cb_.RunOrHold(PIPELINE_OK); |
} |
-void FakeVideoDecoder::Read(const ReadCB& read_cb) { |
+void FakeVideoDecoder::Decode(const scoped_refptr<DecoderBuffer>& buffer, |
+ const ReadCB& read_cb) { |
DCHECK(message_loop_->BelongsToCurrentThread()); |
DCHECK(read_cb_.IsNull()) << "Overlapping decodes are not supported."; |
DCHECK(reset_cb_.IsNull()); |
DCHECK_LE(decoded_frames_.size(), static_cast<size_t>(decoding_delay_)); |
read_cb_.SetCallback(BindToCurrentLoop(read_cb)); |
- ReadFromDemuxerStream(); |
+ |
+ if (buffer->IsEndOfStream() && decoded_frames_.empty()) { |
+ read_cb_.RunOrHold(kOk, VideoFrame::CreateEmptyFrame()); |
+ return; |
+ } |
+ |
+ if (!buffer->IsEndOfStream()) { |
+ DCHECK(VerifyFakeVideoBufferForTest(buffer, current_config_)); |
+ scoped_refptr<VideoFrame> video_frame = VideoFrame::CreateColorFrame( |
+ current_config_.coded_size(), 0, 0, 0, buffer->GetTimestamp()); |
+ decoded_frames_.push_back(video_frame); |
+ |
+ if (decoded_frames_.size() <= static_cast<size_t>(decoding_delay_)) { |
+ read_cb_.RunOrHold(kNotEnoughData, scoped_refptr<VideoFrame>()); |
+ return; |
+ } |
+ } |
+ |
+ scoped_refptr<VideoFrame> frame = decoded_frames_.front(); |
+ decoded_frames_.pop_front(); |
+ read_cb_.RunOrHold(kOk, frame); |
} |
void FakeVideoDecoder::Reset(const base::Closure& closure) { |
@@ -142,79 +160,6 @@ void FakeVideoDecoder::SatisfyStop() { |
stop_cb_.RunHeldCallback(); |
} |
-void FakeVideoDecoder::ReadFromDemuxerStream() { |
- DCHECK_EQ(state_, NORMAL); |
- DCHECK(!read_cb_.IsNull()); |
- demuxer_stream_->Read(base::Bind(&FakeVideoDecoder::BufferReady, weak_this_)); |
-} |
- |
-void FakeVideoDecoder::BufferReady(DemuxerStream::Status status, |
- const scoped_refptr<DecoderBuffer>& buffer) { |
- DCHECK(message_loop_->BelongsToCurrentThread()); |
- DCHECK_EQ(state_, NORMAL); |
- DCHECK(!read_cb_.IsNull()); |
- DCHECK_EQ(status != DemuxerStream::kOk, !buffer.get()) << status; |
- |
- if (!stop_cb_.IsNull()) { |
- read_cb_.RunOrHold(kOk, scoped_refptr<VideoFrame>()); |
- if (!reset_cb_.IsNull()) { |
- DoReset(); |
- } |
- DoStop(); |
- return; |
- } |
- |
- if (status == DemuxerStream::kConfigChanged) { |
- DCHECK(demuxer_stream_->video_decoder_config().IsValidConfig()); |
- current_config_ = demuxer_stream_->video_decoder_config(); |
- |
- if (reset_cb_.IsNull()) { |
- ReadFromDemuxerStream(); |
- return; |
- } |
- } |
- |
- if (!reset_cb_.IsNull()) { |
- read_cb_.RunOrHold(kOk, scoped_refptr<VideoFrame>()); |
- DoReset(); |
- return; |
- } |
- |
- if (status == DemuxerStream::kAborted) { |
- read_cb_.RunOrHold(kOk, scoped_refptr<VideoFrame>()); |
- return; |
- } |
- |
- DCHECK_EQ(status, DemuxerStream::kOk); |
- |
- if (buffer->IsEndOfStream() && decoded_frames_.empty()) { |
- read_cb_.RunOrHold(kOk, VideoFrame::CreateEmptyFrame()); |
- return; |
- } |
- |
- if (!buffer->IsEndOfStream()) { |
- // Make sure the decoder is always configured with the latest config. |
- DCHECK(current_config_.Matches(demuxer_stream_->video_decoder_config())) |
- << "Decoder's Current Config: " |
- << current_config_.AsHumanReadableString() |
- << "DemuxerStream's Current Config: " |
- << demuxer_stream_->video_decoder_config().AsHumanReadableString(); |
- |
- scoped_refptr<VideoFrame> video_frame = VideoFrame::CreateColorFrame( |
- current_config_.coded_size(), 0, 0, 0, buffer->GetTimestamp()); |
- decoded_frames_.push_back(video_frame); |
- |
- if (decoded_frames_.size() <= static_cast<size_t>(decoding_delay_)) { |
- ReadFromDemuxerStream(); |
- return; |
- } |
- } |
- |
- scoped_refptr<VideoFrame> frame = decoded_frames_.front(); |
- decoded_frames_.pop_front(); |
- read_cb_.RunOrHold(kOk, frame); |
-} |
- |
void FakeVideoDecoder::DoReset() { |
DCHECK(message_loop_->BelongsToCurrentThread()); |
DCHECK(read_cb_.IsNull()); |
@@ -231,7 +176,6 @@ void FakeVideoDecoder::DoStop() { |
DCHECK(!stop_cb_.IsNull()); |
state_ = UNINITIALIZED; |
- demuxer_stream_ = NULL; |
decoded_frames_.clear(); |
stop_cb_.RunOrHold(); |
} |