OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <list> | 5 #include <list> |
6 | 6 |
7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
8 #include "base/bind.h" | 8 #include "base/bind.h" |
9 #include "base/memory/ref_counted.h" | 9 #include "base/memory/ref_counted.h" |
10 #include "base/memory/scoped_ptr.h" | 10 #include "base/memory/scoped_ptr.h" |
11 #include "base/thread_task_runner_handle.h" | 11 #include "base/thread_task_runner_handle.h" |
12 #include "base/threading/thread.h" | 12 #include "base/threading/thread.h" |
13 #include "base/time/time.h" | 13 #include "base/time/time.h" |
14 #include "chromecast/media/cma/base/balanced_media_task_runner_factory.h" | 14 #include "chromecast/media/cma/base/balanced_media_task_runner_factory.h" |
15 #include "chromecast/media/cma/base/decoder_buffer_base.h" | 15 #include "chromecast/media/cma/base/decoder_buffer_base.h" |
16 #include "chromecast/media/cma/filters/demuxer_stream_adapter.h" | |
17 #include "chromecast/media/cma/test/demuxer_stream_for_test.h" | |
18 #include "chromecast/public/media/cast_decoder_buffer.h" | 16 #include "chromecast/public/media/cast_decoder_buffer.h" |
| 17 #include "chromecast/renderer/media/demuxer_stream_adapter.h" |
| 18 #include "chromecast/renderer/media/demuxer_stream_for_test.h" |
19 #include "media/base/audio_decoder_config.h" | 19 #include "media/base/audio_decoder_config.h" |
20 #include "media/base/decoder_buffer.h" | 20 #include "media/base/decoder_buffer.h" |
21 #include "media/base/demuxer_stream.h" | 21 #include "media/base/demuxer_stream.h" |
22 #include "media/base/video_decoder_config.h" | 22 #include "media/base/video_decoder_config.h" |
23 #include "testing/gtest/include/gtest/gtest.h" | 23 #include "testing/gtest/include/gtest/gtest.h" |
24 | 24 |
25 namespace chromecast { | 25 namespace chromecast { |
26 namespace media { | 26 namespace media { |
27 | 27 |
28 class DemuxerStreamAdapterTest : public testing::Test { | 28 class DemuxerStreamAdapterTest : public testing::Test { |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
65 | 65 |
66 DemuxerStreamAdapterTest::DemuxerStreamAdapterTest() | 66 DemuxerStreamAdapterTest::DemuxerStreamAdapterTest() |
67 : use_post_task_for_flush_(false) { | 67 : use_post_task_for_flush_(false) { |
68 } | 68 } |
69 | 69 |
70 DemuxerStreamAdapterTest::~DemuxerStreamAdapterTest() { | 70 DemuxerStreamAdapterTest::~DemuxerStreamAdapterTest() { |
71 } | 71 } |
72 | 72 |
73 void DemuxerStreamAdapterTest::Initialize( | 73 void DemuxerStreamAdapterTest::Initialize( |
74 ::media::DemuxerStream* demuxer_stream) { | 74 ::media::DemuxerStream* demuxer_stream) { |
75 coded_frame_provider_.reset(new DemuxerStreamAdapter( | 75 coded_frame_provider_.reset( |
76 base::ThreadTaskRunnerHandle::Get(), | 76 new DemuxerStreamAdapter(base::ThreadTaskRunnerHandle::Get(), |
77 scoped_refptr<BalancedMediaTaskRunnerFactory>(), demuxer_stream)); | 77 scoped_refptr<BalancedMediaTaskRunnerFactory>(), |
| 78 demuxer_stream)); |
78 } | 79 } |
79 | 80 |
80 void DemuxerStreamAdapterTest::Start() { | 81 void DemuxerStreamAdapterTest::Start() { |
81 frame_received_count_ = 0; | 82 frame_received_count_ = 0; |
82 | 83 |
83 // TODO(damienv): currently, test assertions which fail do not trigger the | 84 // TODO(damienv): currently, test assertions which fail do not trigger the |
84 // exit of the unit test, the message loop is still running. Find a different | 85 // exit of the unit test, the message loop is still running. Find a different |
85 // way to exit the unit test. | 86 // way to exit the unit test. |
86 base::MessageLoop::current()->PostDelayedTask( | 87 base::MessageLoop::current()->PostDelayedTask( |
87 FROM_HERE, | 88 FROM_HERE, |
88 base::Bind(&DemuxerStreamAdapterTest::OnTestTimeout, | 89 base::Bind(&DemuxerStreamAdapterTest::OnTestTimeout, |
89 base::Unretained(this)), | 90 base::Unretained(this)), |
90 base::TimeDelta::FromSeconds(5)); | 91 base::TimeDelta::FromSeconds(5)); |
91 | 92 |
92 coded_frame_provider_->Read( | 93 coded_frame_provider_->Read(base::Bind(&DemuxerStreamAdapterTest::OnNewFrame, |
93 base::Bind(&DemuxerStreamAdapterTest::OnNewFrame, | 94 base::Unretained(this))); |
94 base::Unretained(this))); | |
95 } | 95 } |
96 | 96 |
97 void DemuxerStreamAdapterTest::OnTestTimeout() { | 97 void DemuxerStreamAdapterTest::OnTestTimeout() { |
98 ADD_FAILURE() << "Test timed out"; | 98 ADD_FAILURE() << "Test timed out"; |
99 if (base::MessageLoop::current()) | 99 if (base::MessageLoop::current()) |
100 base::MessageLoop::current()->QuitWhenIdle(); | 100 base::MessageLoop::current()->QuitWhenIdle(); |
101 } | 101 } |
102 | 102 |
103 void DemuxerStreamAdapterTest::OnNewFrame( | 103 void DemuxerStreamAdapterTest::OnNewFrame( |
104 const scoped_refptr<DecoderBufferBase>& buffer, | 104 const scoped_refptr<DecoderBufferBase>& buffer, |
105 const ::media::AudioDecoderConfig& audio_config, | 105 const ::media::AudioDecoderConfig& audio_config, |
106 const ::media::VideoDecoderConfig& video_config) { | 106 const ::media::VideoDecoderConfig& video_config) { |
107 if (video_config.IsValidConfig()) { | 107 if (video_config.IsValidConfig()) { |
108 ASSERT_GT(config_idx_.size(), 0u); | 108 ASSERT_GT(config_idx_.size(), 0u); |
109 ASSERT_EQ(frame_received_count_, config_idx_.front()); | 109 ASSERT_EQ(frame_received_count_, config_idx_.front()); |
110 config_idx_.pop_front(); | 110 config_idx_.pop_front(); |
111 } | 111 } |
112 | 112 |
113 ASSERT_TRUE(buffer.get() != NULL); | 113 ASSERT_TRUE(buffer.get() != NULL); |
114 ASSERT_EQ(buffer->timestamp(), | 114 ASSERT_EQ(buffer->timestamp(), |
115 base::TimeDelta::FromMilliseconds(40 * frame_received_count_)); | 115 base::TimeDelta::FromMilliseconds(40 * frame_received_count_)); |
116 frame_received_count_++; | 116 frame_received_count_++; |
117 | 117 |
118 if (frame_received_count_ >= total_frames_) { | 118 if (frame_received_count_ >= total_frames_) { |
119 coded_frame_provider_->Flush( | 119 coded_frame_provider_->Flush(base::Bind( |
120 base::Bind(&DemuxerStreamAdapterTest::OnFlushCompleted, | 120 &DemuxerStreamAdapterTest::OnFlushCompleted, base::Unretained(this))); |
121 base::Unretained(this))); | |
122 return; | 121 return; |
123 } | 122 } |
124 | 123 |
125 coded_frame_provider_->Read( | 124 coded_frame_provider_->Read(base::Bind(&DemuxerStreamAdapterTest::OnNewFrame, |
126 base::Bind(&DemuxerStreamAdapterTest::OnNewFrame, | 125 base::Unretained(this))); |
127 base::Unretained(this))); | |
128 | 126 |
129 ASSERT_LE(frame_received_count_, early_flush_idx_); | 127 ASSERT_LE(frame_received_count_, early_flush_idx_); |
130 if (frame_received_count_ == early_flush_idx_) { | 128 if (frame_received_count_ == early_flush_idx_) { |
131 base::Closure flush_cb = | 129 base::Closure flush_cb = base::Bind( |
132 base::Bind(&DemuxerStreamAdapterTest::OnFlushCompleted, | 130 &DemuxerStreamAdapterTest::OnFlushCompleted, base::Unretained(this)); |
133 base::Unretained(this)); | |
134 if (use_post_task_for_flush_) { | 131 if (use_post_task_for_flush_) { |
135 base::MessageLoop::current()->PostTask( | 132 base::MessageLoop::current()->PostTask( |
136 FROM_HERE, | 133 FROM_HERE, |
137 base::Bind(&CodedFrameProvider::Flush, | 134 base::Bind(&CodedFrameProvider::Flush, |
138 base::Unretained(coded_frame_provider_.get()), | 135 base::Unretained(coded_frame_provider_.get()), |
139 flush_cb)); | 136 flush_cb)); |
140 } else { | 137 } else { |
141 coded_frame_provider_->Flush(flush_cb); | 138 coded_frame_provider_->Flush(flush_cb); |
142 } | 139 } |
143 return; | 140 return; |
144 } | 141 } |
145 } | 142 } |
146 | 143 |
147 void DemuxerStreamAdapterTest::OnFlushCompleted() { | 144 void DemuxerStreamAdapterTest::OnFlushCompleted() { |
148 ASSERT_EQ(frame_received_count_, total_expected_frames_); | 145 ASSERT_EQ(frame_received_count_, total_expected_frames_); |
149 ASSERT_FALSE(demuxer_stream_->has_pending_read()); | 146 ASSERT_FALSE(demuxer_stream_->has_pending_read()); |
150 base::MessageLoop::current()->QuitWhenIdle(); | 147 base::MessageLoop::current()->QuitWhenIdle(); |
151 } | 148 } |
152 | 149 |
153 TEST_F(DemuxerStreamAdapterTest, NoDelay) { | 150 TEST_F(DemuxerStreamAdapterTest, NoDelay) { |
154 total_frames_ = 10; | 151 total_frames_ = 10; |
155 early_flush_idx_ = total_frames_; // No early flush. | 152 early_flush_idx_ = total_frames_; // No early flush. |
156 total_expected_frames_ = 10; | 153 total_expected_frames_ = 10; |
157 config_idx_.push_back(0); | 154 config_idx_.push_back(0); |
158 config_idx_.push_back(5); | 155 config_idx_.push_back(5); |
159 | 156 |
160 int cycle_count = 1; | 157 int cycle_count = 1; |
161 int delayed_frame_count = 0; | 158 int delayed_frame_count = 0; |
162 demuxer_stream_.reset(new DemuxerStreamForTest( | 159 demuxer_stream_.reset(new DemuxerStreamForTest( |
163 -1, cycle_count, delayed_frame_count, config_idx_)); | 160 -1, cycle_count, delayed_frame_count, config_idx_)); |
164 | 161 |
165 scoped_ptr<base::MessageLoop> message_loop(new base::MessageLoop()); | 162 scoped_ptr<base::MessageLoop> message_loop(new base::MessageLoop()); |
166 Initialize(demuxer_stream_.get()); | 163 Initialize(demuxer_stream_.get()); |
167 message_loop->PostTask( | 164 message_loop->PostTask( |
168 FROM_HERE, | 165 FROM_HERE, |
169 base::Bind(&DemuxerStreamAdapterTest::Start, base::Unretained(this))); | 166 base::Bind(&DemuxerStreamAdapterTest::Start, base::Unretained(this))); |
170 message_loop->Run(); | 167 message_loop->Run(); |
171 } | 168 } |
172 | 169 |
173 TEST_F(DemuxerStreamAdapterTest, AllDelayed) { | 170 TEST_F(DemuxerStreamAdapterTest, AllDelayed) { |
174 total_frames_ = 10; | 171 total_frames_ = 10; |
175 early_flush_idx_ = total_frames_; // No early flush. | 172 early_flush_idx_ = total_frames_; // No early flush. |
176 total_expected_frames_ = 10; | 173 total_expected_frames_ = 10; |
177 config_idx_.push_back(0); | 174 config_idx_.push_back(0); |
178 config_idx_.push_back(5); | 175 config_idx_.push_back(5); |
179 | 176 |
180 int cycle_count = 1; | 177 int cycle_count = 1; |
181 int delayed_frame_count = 1; | 178 int delayed_frame_count = 1; |
182 demuxer_stream_.reset(new DemuxerStreamForTest( | 179 demuxer_stream_.reset(new DemuxerStreamForTest( |
183 -1, cycle_count, delayed_frame_count, config_idx_)); | 180 -1, cycle_count, delayed_frame_count, config_idx_)); |
184 | 181 |
185 scoped_ptr<base::MessageLoop> message_loop(new base::MessageLoop()); | 182 scoped_ptr<base::MessageLoop> message_loop(new base::MessageLoop()); |
(...skipping 20 matching lines...) Expand all Loading... |
206 scoped_ptr<base::MessageLoop> message_loop(new base::MessageLoop()); | 203 scoped_ptr<base::MessageLoop> message_loop(new base::MessageLoop()); |
207 Initialize(demuxer_stream_.get()); | 204 Initialize(demuxer_stream_.get()); |
208 message_loop->PostTask( | 205 message_loop->PostTask( |
209 FROM_HERE, | 206 FROM_HERE, |
210 base::Bind(&DemuxerStreamAdapterTest::Start, base::Unretained(this))); | 207 base::Bind(&DemuxerStreamAdapterTest::Start, base::Unretained(this))); |
211 message_loop->Run(); | 208 message_loop->Run(); |
212 } | 209 } |
213 | 210 |
214 } // namespace media | 211 } // namespace media |
215 } // namespace chromecast | 212 } // namespace chromecast |
OLD | NEW |