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

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: fix win64 Created 7 years, 5 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
« no previous file with comments | « media/filters/fake_video_decoder.h ('k') | media/filters/fake_video_decoder_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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();
}
« no previous file with comments | « media/filters/fake_video_decoder.h ('k') | media/filters/fake_video_decoder_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698