Index: chromecast/media/cma/filters/demuxer_stream_adapter_unittest.cc |
diff --git a/chromecast/media/cma/filters/demuxer_stream_adapter_unittest.cc b/chromecast/media/cma/filters/demuxer_stream_adapter_unittest.cc |
index 4d8ba5420e214efd6ec661ba9818f0718caf2b85..cc1a6b0e9c783d74dffdd48f55f6c0ae27b5dca6 100644 |
--- a/chromecast/media/cma/filters/demuxer_stream_adapter_unittest.cc |
+++ b/chromecast/media/cma/filters/demuxer_stream_adapter_unittest.cc |
@@ -51,6 +51,10 @@ class DummyDemuxerStream : public ::media::DemuxerStream { |
virtual bool SupportsConfigChanges() OVERRIDE; |
virtual ::media::VideoRotation video_rotation() OVERRIDE; |
+ bool has_pending_read() const { |
+ return has_pending_read_; |
+ } |
+ |
private: |
void DoRead(const ReadCB& read_cb); |
@@ -62,6 +66,8 @@ class DummyDemuxerStream : public ::media::DemuxerStream { |
// Number of frames sent so far. |
int frame_count_; |
+ bool has_pending_read_; |
+ |
DISALLOW_COPY_AND_ASSIGN(DummyDemuxerStream); |
}; |
@@ -71,8 +77,9 @@ DummyDemuxerStream::DummyDemuxerStream( |
const std::list<int>& config_idx) |
: cycle_count_(cycle_count), |
delayed_frame_count_(delayed_frame_count), |
+ config_idx_(config_idx), |
frame_count_(0), |
- config_idx_(config_idx) { |
+ has_pending_read_(false) { |
DCHECK_LE(delayed_frame_count, cycle_count); |
} |
@@ -80,8 +87,10 @@ DummyDemuxerStream::~DummyDemuxerStream() { |
} |
void DummyDemuxerStream::Read(const ReadCB& read_cb) { |
+ has_pending_read_ = true; |
if (!config_idx_.empty() && config_idx_.front() == frame_count_) { |
config_idx_.pop_front(); |
+ has_pending_read_ = false; |
read_cb.Run(kConfigChanged, |
scoped_refptr< ::media::DecoderBuffer>()); |
return; |
@@ -131,6 +140,7 @@ bool DummyDemuxerStream::SupportsConfigChanges() { |
} |
void DummyDemuxerStream::DoRead(const ReadCB& read_cb) { |
+ has_pending_read_ = false; |
scoped_refptr< ::media::DecoderBuffer> buffer( |
new ::media::DecoderBuffer(16)); |
buffer->set_timestamp(frame_count_ * base::TimeDelta::FromMilliseconds(40)); |
@@ -160,6 +170,7 @@ class DemuxerStreamAdapterTest : public testing::Test { |
// Number of demuxer read before issuing an early flush. |
int early_flush_idx_; |
+ bool use_post_task_for_flush_; |
// Number of expected read frames. |
int total_expected_frames_; |
@@ -170,12 +181,15 @@ class DemuxerStreamAdapterTest : public testing::Test { |
// List of expected frame indices with decoder config changes. |
std::list<int> config_idx_; |
+ scoped_ptr<DummyDemuxerStream> demuxer_stream_; |
+ |
scoped_ptr<CodedFrameProvider> coded_frame_provider_; |
DISALLOW_COPY_AND_ASSIGN(DemuxerStreamAdapterTest); |
}; |
-DemuxerStreamAdapterTest::DemuxerStreamAdapterTest() { |
+DemuxerStreamAdapterTest::DemuxerStreamAdapterTest() |
+ : use_post_task_for_flush_(false) { |
} |
DemuxerStreamAdapterTest::~DemuxerStreamAdapterTest() { |
@@ -241,15 +255,25 @@ void DemuxerStreamAdapterTest::OnNewFrame( |
ASSERT_LE(frame_received_count_, early_flush_idx_); |
if (frame_received_count_ == early_flush_idx_) { |
- coded_frame_provider_->Flush( |
+ base::Closure flush_cb = |
base::Bind(&DemuxerStreamAdapterTest::OnFlushCompleted, |
- base::Unretained(this))); |
+ base::Unretained(this)); |
+ if (use_post_task_for_flush_) { |
+ base::MessageLoop::current()->PostTask( |
+ FROM_HERE, |
+ base::Bind(&CodedFrameProvider::Flush, |
+ base::Unretained(coded_frame_provider_.get()), |
+ flush_cb)); |
+ } else { |
+ coded_frame_provider_->Flush(flush_cb); |
+ } |
return; |
} |
} |
void DemuxerStreamAdapterTest::OnFlushCompleted() { |
ASSERT_EQ(frame_received_count_, total_expected_frames_); |
+ ASSERT_FALSE(demuxer_stream_->has_pending_read()); |
base::MessageLoop::current()->QuitWhenIdle(); |
} |
@@ -262,12 +286,12 @@ TEST_F(DemuxerStreamAdapterTest, NoDelay) { |
int cycle_count = 1; |
int delayed_frame_count = 0; |
- scoped_ptr<DummyDemuxerStream> demuxer_stream( |
+ demuxer_stream_.reset( |
new DummyDemuxerStream( |
cycle_count, delayed_frame_count, config_idx_)); |
scoped_ptr<base::MessageLoop> message_loop(new base::MessageLoop()); |
- Initialize(demuxer_stream.get()); |
+ Initialize(demuxer_stream_.get()); |
message_loop->PostTask( |
FROM_HERE, |
base::Bind(&DemuxerStreamAdapterTest::Start, base::Unretained(this))); |
@@ -283,12 +307,12 @@ TEST_F(DemuxerStreamAdapterTest, AllDelayed) { |
int cycle_count = 1; |
int delayed_frame_count = 1; |
- scoped_ptr<DummyDemuxerStream> demuxer_stream( |
+ demuxer_stream_.reset( |
new DummyDemuxerStream( |
cycle_count, delayed_frame_count, config_idx_)); |
scoped_ptr<base::MessageLoop> message_loop(new base::MessageLoop()); |
- Initialize(demuxer_stream.get()); |
+ Initialize(demuxer_stream_.get()); |
message_loop->PostTask( |
FROM_HERE, |
base::Bind(&DemuxerStreamAdapterTest::Start, base::Unretained(this))); |
@@ -298,18 +322,19 @@ TEST_F(DemuxerStreamAdapterTest, AllDelayed) { |
TEST_F(DemuxerStreamAdapterTest, AllDelayedEarlyFlush) { |
total_frames_ = 10; |
early_flush_idx_ = 5; |
+ use_post_task_for_flush_ = true; |
total_expected_frames_ = 5; |
config_idx_.push_back(0); |
- config_idx_.push_back(5); |
+ config_idx_.push_back(3); |
int cycle_count = 1; |
int delayed_frame_count = 1; |
- scoped_ptr<DummyDemuxerStream> demuxer_stream( |
+ demuxer_stream_.reset( |
new DummyDemuxerStream( |
cycle_count, delayed_frame_count, config_idx_)); |
scoped_ptr<base::MessageLoop> message_loop(new base::MessageLoop()); |
- Initialize(demuxer_stream.get()); |
+ Initialize(demuxer_stream_.get()); |
message_loop->PostTask( |
FROM_HERE, |
base::Bind(&DemuxerStreamAdapterTest::Start, base::Unretained(this))); |