Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(954)

Unified Diff: media/filters/fake_video_decoder.cc

Issue 16274005: Separate DemuxerStream and VideoDecoder. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: VideoFrameStream ready for review. Created 7 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: media/filters/fake_video_decoder.cc
diff --git a/media/filters/fake_video_decoder.cc b/media/filters/fake_video_decoder.cc
index 95868d68ae5e3beca961a1a8645d170800da569d..81a7d8421ecba835551d56f1073652fcc577be10 100644
--- a/media/filters/fake_video_decoder.cc
+++ b/media/filters/fake_video_decoder.cc
@@ -8,8 +8,8 @@
#include "base/callback_helpers.h"
#include "base/location.h"
#include "base/message_loop_proxy.h"
+#include "base/pickle.h"
#include "media/base/bind_to_loop.h"
-#include "media/base/demuxer_stream.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,36 @@ 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(DecoderBuffer::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) {
@@ -77,8 +96,8 @@ void FakeVideoDecoder::Stop(const base::Closure& closure) {
DCHECK(message_loop_->BelongsToCurrentThread());
stop_cb_.SetCallback(BindToCurrentLoop(closure));
- // Defer the reset if a read and/or a reset is pending.
- if (!read_cb_.IsNull() || !reset_cb_.IsNull())
+ // Defer the stop if a init/read/reset is pending.
+ if (!init_cb_.IsNull() || !read_cb_.IsNull() || !reset_cb_.IsNull())
return;
DoStop();
@@ -142,79 +161,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) << 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 +177,6 @@ void FakeVideoDecoder::DoStop() {
DCHECK(!stop_cb_.IsNull());
state_ = UNINITIALIZED;
- demuxer_stream_ = NULL;
decoded_frames_.clear();
stop_cb_.RunOrHold();
}

Powered by Google App Engine
This is Rietveld 408576698