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 <stdint.h> | 5 #include <stdint.h> |
6 | 6 |
7 #include <vector> | 7 #include <vector> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/memory/scoped_ptr.h" | 10 #include "base/memory/scoped_ptr.h" |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
45 void CreateSharedMemory( | 45 void CreateSharedMemory( |
46 size_t size, const ReceiveVideoEncodeMemoryCallback& callback) { | 46 size_t size, const ReceiveVideoEncodeMemoryCallback& callback) { |
47 scoped_ptr<base::SharedMemory> shm(new base::SharedMemory()); | 47 scoped_ptr<base::SharedMemory> shm(new base::SharedMemory()); |
48 if (!shm->CreateAndMapAnonymous(size)) { | 48 if (!shm->CreateAndMapAnonymous(size)) { |
49 NOTREACHED(); | 49 NOTREACHED(); |
50 return; | 50 return; |
51 } | 51 } |
52 callback.Run(shm.Pass()); | 52 callback.Run(shm.Pass()); |
53 } | 53 } |
54 | 54 |
55 void SaveInitializationStatus(CastInitializationStatus* out_status, | 55 void SaveOperationalStatus(OperationalStatus* out_status, |
56 CastInitializationStatus in_status) { | 56 OperationalStatus in_status) { |
| 57 DVLOG(1) << "OperationalStatus transitioning from " << *out_status << " to " |
| 58 << in_status; |
57 *out_status = in_status; | 59 *out_status = in_status; |
58 } | 60 } |
59 | 61 |
60 class TestPacketSender : public PacketSender { | 62 class TestPacketSender : public PacketSender { |
61 public: | 63 public: |
62 TestPacketSender() | 64 TestPacketSender() |
63 : number_of_rtp_packets_(0), | 65 : number_of_rtp_packets_(0), |
64 number_of_rtcp_packets_(0), | 66 number_of_rtcp_packets_(0), |
65 paused_(false) {} | 67 paused_(false) {} |
66 | 68 |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
104 int number_of_rtcp_packets_; | 106 int number_of_rtcp_packets_; |
105 bool paused_; | 107 bool paused_; |
106 base::Closure callback_; | 108 base::Closure callback_; |
107 PacketRef stored_packet_; | 109 PacketRef stored_packet_; |
108 | 110 |
109 DISALLOW_COPY_AND_ASSIGN(TestPacketSender); | 111 DISALLOW_COPY_AND_ASSIGN(TestPacketSender); |
110 }; | 112 }; |
111 | 113 |
112 void IgnorePlayoutDelayChanges(base::TimeDelta unused_playout_delay) { | 114 void IgnorePlayoutDelayChanges(base::TimeDelta unused_playout_delay) { |
113 } | 115 } |
| 116 |
114 class PeerVideoSender : public VideoSender { | 117 class PeerVideoSender : public VideoSender { |
115 public: | 118 public: |
116 PeerVideoSender( | 119 PeerVideoSender( |
117 scoped_refptr<CastEnvironment> cast_environment, | 120 scoped_refptr<CastEnvironment> cast_environment, |
118 const VideoSenderConfig& video_config, | 121 const VideoSenderConfig& video_config, |
119 const CastInitializationCallback& initialization_cb, | 122 const StatusChangeCallback& status_change_cb, |
120 const CreateVideoEncodeAcceleratorCallback& create_vea_cb, | 123 const CreateVideoEncodeAcceleratorCallback& create_vea_cb, |
121 const CreateVideoEncodeMemoryCallback& create_video_encode_mem_cb, | 124 const CreateVideoEncodeMemoryCallback& create_video_encode_mem_cb, |
122 CastTransportSender* const transport_sender) | 125 CastTransportSender* const transport_sender) |
123 : VideoSender(cast_environment, | 126 : VideoSender(cast_environment, |
124 video_config, | 127 video_config, |
125 initialization_cb, | 128 status_change_cb, |
126 create_vea_cb, | 129 create_vea_cb, |
127 create_video_encode_mem_cb, | 130 create_video_encode_mem_cb, |
128 transport_sender, | 131 transport_sender, |
129 base::Bind(&IgnorePlayoutDelayChanges)) {} | 132 base::Bind(&IgnorePlayoutDelayChanges)) {} |
130 using VideoSender::OnReceivedCastFeedback; | 133 using VideoSender::OnReceivedCastFeedback; |
131 }; | 134 }; |
132 } // namespace | 135 } // namespace |
133 | 136 |
134 class VideoSenderTest : public ::testing::Test { | 137 class VideoSenderTest : public ::testing::Test { |
135 protected: | 138 protected: |
136 VideoSenderTest() | 139 VideoSenderTest() |
137 : stored_bitrates_(NULL) { | 140 : testing_clock_(new base::SimpleTestTickClock()), |
138 testing_clock_ = new base::SimpleTestTickClock(); | 141 task_runner_(new test::FakeSingleThreadTaskRunner(testing_clock_)), |
| 142 cast_environment_(new CastEnvironment( |
| 143 scoped_ptr<base::TickClock>(testing_clock_).Pass(), |
| 144 task_runner_, |
| 145 task_runner_, |
| 146 task_runner_)), |
| 147 operational_status_(STATUS_UNINITIALIZED), |
| 148 stored_bitrates_(NULL) { |
139 testing_clock_->Advance(base::TimeTicks::Now() - base::TimeTicks()); | 149 testing_clock_->Advance(base::TimeTicks::Now() - base::TimeTicks()); |
140 task_runner_ = new test::FakeSingleThreadTaskRunner(testing_clock_); | |
141 cast_environment_ = | |
142 new CastEnvironment(scoped_ptr<base::TickClock>(testing_clock_).Pass(), | |
143 task_runner_, | |
144 task_runner_, | |
145 task_runner_); | |
146 last_pixel_value_ = kPixelValue; | 150 last_pixel_value_ = kPixelValue; |
147 net::IPEndPoint dummy_endpoint; | 151 net::IPEndPoint dummy_endpoint; |
148 transport_sender_.reset(new CastTransportSenderImpl( | 152 transport_sender_.reset(new CastTransportSenderImpl( |
149 NULL, | 153 NULL, |
150 testing_clock_, | 154 testing_clock_, |
151 dummy_endpoint, | 155 dummy_endpoint, |
152 dummy_endpoint, | 156 dummy_endpoint, |
153 make_scoped_ptr(new base::DictionaryValue), | 157 make_scoped_ptr(new base::DictionaryValue), |
154 base::Bind(&UpdateCastTransportStatus), | 158 base::Bind(&UpdateCastTransportStatus), |
155 BulkRawEventsCallback(), | 159 BulkRawEventsCallback(), |
156 base::TimeDelta(), | 160 base::TimeDelta(), |
157 task_runner_, | 161 task_runner_, |
158 PacketReceiverCallback(), | 162 PacketReceiverCallback(), |
159 &transport_)); | 163 &transport_)); |
160 } | 164 } |
161 | 165 |
162 ~VideoSenderTest() override {} | 166 ~VideoSenderTest() override {} |
163 | 167 |
164 void TearDown() override { | 168 void TearDown() override { |
165 video_sender_.reset(); | 169 video_sender_.reset(); |
166 task_runner_->RunTasks(); | 170 task_runner_->RunTasks(); |
167 } | 171 } |
168 | 172 |
169 static void UpdateCastTransportStatus(CastTransportStatus status) { | 173 static void UpdateCastTransportStatus(CastTransportStatus status) { |
170 EXPECT_EQ(TRANSPORT_VIDEO_INITIALIZED, status); | 174 EXPECT_EQ(TRANSPORT_VIDEO_INITIALIZED, status); |
171 } | 175 } |
172 | 176 |
173 // If |external| is true then external video encoder (VEA) is used. | 177 // If |external| is true then external video encoder (VEA) is used. |
174 // |expect_init_sucess| is true if initialization is expected to succeed. | 178 // |expect_init_sucess| is true if initialization is expected to succeed. |
175 CastInitializationStatus InitEncoder(bool external, | 179 void InitEncoder(bool external, bool expect_init_success) { |
176 bool expect_init_success) { | |
177 VideoSenderConfig video_config; | 180 VideoSenderConfig video_config; |
178 video_config.ssrc = 1; | 181 video_config.ssrc = 1; |
179 video_config.receiver_ssrc = 2; | 182 video_config.receiver_ssrc = 2; |
180 video_config.rtp_payload_type = 127; | 183 video_config.rtp_payload_type = 127; |
181 video_config.use_external_encoder = external; | 184 video_config.use_external_encoder = external; |
182 video_config.width = kWidth; | 185 video_config.width = kWidth; |
183 video_config.height = kHeight; | 186 video_config.height = kHeight; |
184 video_config.max_bitrate = 5000000; | 187 video_config.max_bitrate = 5000000; |
185 video_config.min_bitrate = 1000000; | 188 video_config.min_bitrate = 1000000; |
186 video_config.start_bitrate = 1000000; | 189 video_config.start_bitrate = 1000000; |
187 video_config.max_qp = 56; | 190 video_config.max_qp = 56; |
188 video_config.min_qp = 0; | 191 video_config.min_qp = 0; |
189 video_config.max_frame_rate = 30; | 192 video_config.max_frame_rate = 30; |
190 video_config.max_number_of_video_buffers_used = 1; | 193 video_config.max_number_of_video_buffers_used = 1; |
191 video_config.codec = CODEC_VIDEO_VP8; | 194 video_config.codec = CODEC_VIDEO_VP8; |
192 CastInitializationStatus status = STATUS_VIDEO_UNINITIALIZED; | 195 |
| 196 ASSERT_EQ(operational_status_, STATUS_UNINITIALIZED); |
193 | 197 |
194 if (external) { | 198 if (external) { |
195 media::FakeVideoEncodeAccelerator* fake_vea = | 199 media::FakeVideoEncodeAccelerator* fake_vea = |
196 new media::FakeVideoEncodeAccelerator(task_runner_); | 200 new media::FakeVideoEncodeAccelerator(task_runner_); |
197 stored_bitrates_ = &fake_vea->stored_bitrates(); | 201 stored_bitrates_ = &fake_vea->stored_bitrates(); |
198 fake_vea->SetWillInitializationSucceed(expect_init_success); | 202 fake_vea->SetWillInitializationSucceed(expect_init_success); |
199 scoped_ptr<VideoEncodeAccelerator> fake_vea_owner(fake_vea); | 203 scoped_ptr<VideoEncodeAccelerator> fake_vea_owner(fake_vea); |
200 video_sender_.reset( | 204 video_sender_.reset( |
201 new PeerVideoSender(cast_environment_, | 205 new PeerVideoSender(cast_environment_, |
202 video_config, | 206 video_config, |
203 base::Bind(&SaveInitializationStatus, | 207 base::Bind(&SaveOperationalStatus, |
204 &status), | 208 &operational_status_), |
205 base::Bind(&CreateVideoEncodeAccelerator, | 209 base::Bind(&CreateVideoEncodeAccelerator, |
206 task_runner_, | 210 task_runner_, |
207 base::Passed(&fake_vea_owner)), | 211 base::Passed(&fake_vea_owner)), |
208 base::Bind(&CreateSharedMemory), | 212 base::Bind(&CreateSharedMemory), |
209 transport_sender_.get())); | 213 transport_sender_.get())); |
210 } else { | 214 } else { |
211 video_sender_.reset( | 215 video_sender_.reset( |
212 new PeerVideoSender(cast_environment_, | 216 new PeerVideoSender(cast_environment_, |
213 video_config, | 217 video_config, |
214 base::Bind(&SaveInitializationStatus, | 218 base::Bind(&SaveOperationalStatus, |
215 &status), | 219 &operational_status_), |
216 CreateDefaultVideoEncodeAcceleratorCallback(), | 220 CreateDefaultVideoEncodeAcceleratorCallback(), |
217 CreateDefaultVideoEncodeMemoryCallback(), | 221 CreateDefaultVideoEncodeMemoryCallback(), |
218 transport_sender_.get())); | 222 transport_sender_.get())); |
219 } | 223 } |
220 task_runner_->RunTasks(); | 224 task_runner_->RunTasks(); |
221 return status; | |
222 } | 225 } |
223 | 226 |
224 scoped_refptr<media::VideoFrame> GetNewVideoFrame() { | 227 scoped_refptr<media::VideoFrame> GetNewVideoFrame() { |
225 if (first_frame_timestamp_.is_null()) | 228 if (first_frame_timestamp_.is_null()) |
226 first_frame_timestamp_ = testing_clock_->NowTicks(); | 229 first_frame_timestamp_ = testing_clock_->NowTicks(); |
227 gfx::Size size(kWidth, kHeight); | 230 gfx::Size size(kWidth, kHeight); |
228 scoped_refptr<media::VideoFrame> video_frame = | 231 scoped_refptr<media::VideoFrame> video_frame = |
229 media::VideoFrame::CreateFrame( | 232 media::VideoFrame::CreateFrame( |
230 VideoFrame::I420, size, gfx::Rect(size), size, | 233 VideoFrame::I420, size, gfx::Rect(size), size, |
231 testing_clock_->NowTicks() - first_frame_timestamp_); | 234 testing_clock_->NowTicks() - first_frame_timestamp_); |
(...skipping 10 matching lines...) Expand all Loading... |
242 VideoFrame::I420, size, gfx::Rect(size), size, | 245 VideoFrame::I420, size, gfx::Rect(size), size, |
243 testing_clock_->NowTicks() - first_frame_timestamp_); | 246 testing_clock_->NowTicks() - first_frame_timestamp_); |
244 PopulateVideoFrameWithNoise(video_frame.get()); | 247 PopulateVideoFrameWithNoise(video_frame.get()); |
245 return video_frame; | 248 return video_frame; |
246 } | 249 } |
247 | 250 |
248 void RunTasks(int during_ms) { | 251 void RunTasks(int during_ms) { |
249 task_runner_->Sleep(base::TimeDelta::FromMilliseconds(during_ms)); | 252 task_runner_->Sleep(base::TimeDelta::FromMilliseconds(during_ms)); |
250 } | 253 } |
251 | 254 |
252 base::SimpleTestTickClock* testing_clock_; // Owned by CastEnvironment. | 255 base::SimpleTestTickClock* const testing_clock_; // Owned by CastEnvironment. |
| 256 const scoped_refptr<test::FakeSingleThreadTaskRunner> task_runner_; |
| 257 const scoped_refptr<CastEnvironment> cast_environment_; |
| 258 OperationalStatus operational_status_; |
253 TestPacketSender transport_; | 259 TestPacketSender transport_; |
254 scoped_ptr<CastTransportSenderImpl> transport_sender_; | 260 scoped_ptr<CastTransportSenderImpl> transport_sender_; |
255 scoped_refptr<test::FakeSingleThreadTaskRunner> task_runner_; | |
256 scoped_ptr<PeerVideoSender> video_sender_; | 261 scoped_ptr<PeerVideoSender> video_sender_; |
257 const std::vector<uint32>* stored_bitrates_; // Owned by |video_sender_|. | 262 const std::vector<uint32>* stored_bitrates_; // Owned by |video_sender_|. |
258 scoped_refptr<CastEnvironment> cast_environment_; | |
259 int last_pixel_value_; | 263 int last_pixel_value_; |
260 base::TimeTicks first_frame_timestamp_; | 264 base::TimeTicks first_frame_timestamp_; |
261 | 265 |
262 DISALLOW_COPY_AND_ASSIGN(VideoSenderTest); | 266 DISALLOW_COPY_AND_ASSIGN(VideoSenderTest); |
263 }; | 267 }; |
264 | 268 |
265 TEST_F(VideoSenderTest, BuiltInEncoder) { | 269 TEST_F(VideoSenderTest, BuiltInEncoder) { |
266 EXPECT_EQ(STATUS_VIDEO_INITIALIZED, InitEncoder(false, true)); | 270 InitEncoder(false, true); |
| 271 ASSERT_EQ(STATUS_INITIALIZED, operational_status_); |
| 272 |
267 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); | 273 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); |
268 | 274 |
269 const base::TimeTicks reference_time = testing_clock_->NowTicks(); | 275 const base::TimeTicks reference_time = testing_clock_->NowTicks(); |
270 video_sender_->InsertRawVideoFrame(video_frame, reference_time); | 276 video_sender_->InsertRawVideoFrame(video_frame, reference_time); |
271 | 277 |
272 task_runner_->RunTasks(); | 278 task_runner_->RunTasks(); |
273 EXPECT_LE(1, transport_.number_of_rtp_packets()); | 279 EXPECT_LE(1, transport_.number_of_rtp_packets()); |
274 EXPECT_LE(1, transport_.number_of_rtcp_packets()); | 280 EXPECT_LE(1, transport_.number_of_rtcp_packets()); |
275 } | 281 } |
276 | 282 |
277 TEST_F(VideoSenderTest, ExternalEncoder) { | 283 TEST_F(VideoSenderTest, ExternalEncoder) { |
278 EXPECT_EQ(STATUS_VIDEO_INITIALIZED, InitEncoder(true, true)); | 284 InitEncoder(true, true); |
| 285 ASSERT_EQ(STATUS_INITIALIZED, operational_status_); |
279 | 286 |
280 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); | 287 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); |
281 | 288 |
282 const base::TimeTicks reference_time = testing_clock_->NowTicks(); | 289 const base::TimeTicks reference_time = testing_clock_->NowTicks(); |
283 video_sender_->InsertRawVideoFrame(video_frame, reference_time); | 290 video_sender_->InsertRawVideoFrame(video_frame, reference_time); |
284 task_runner_->RunTasks(); | 291 task_runner_->RunTasks(); |
285 video_sender_->InsertRawVideoFrame(video_frame, reference_time); | 292 video_sender_->InsertRawVideoFrame(video_frame, reference_time); |
286 task_runner_->RunTasks(); | 293 task_runner_->RunTasks(); |
287 video_sender_->InsertRawVideoFrame(video_frame, reference_time); | 294 video_sender_->InsertRawVideoFrame(video_frame, reference_time); |
288 task_runner_->RunTasks(); | 295 task_runner_->RunTasks(); |
289 | 296 |
290 // Fixed bitrate is used for external encoder. Bitrate is only once | 297 // Fixed bitrate is used for external encoder. Bitrate is only once |
291 // to the encoder. | 298 // to the encoder. |
292 EXPECT_EQ(1u, stored_bitrates_->size()); | 299 EXPECT_EQ(1u, stored_bitrates_->size()); |
293 video_sender_.reset(NULL); | 300 video_sender_.reset(NULL); |
294 task_runner_->RunTasks(); | 301 task_runner_->RunTasks(); |
295 } | 302 } |
296 | 303 |
297 TEST_F(VideoSenderTest, ExternalEncoderInitFails) { | 304 TEST_F(VideoSenderTest, ExternalEncoderInitFails) { |
298 EXPECT_EQ(STATUS_HW_VIDEO_ENCODER_NOT_SUPPORTED, | 305 InitEncoder(true, false); |
299 InitEncoder(true, false)); | 306 EXPECT_EQ(STATUS_CODEC_INIT_FAILED, operational_status_); |
| 307 |
300 video_sender_.reset(NULL); | 308 video_sender_.reset(NULL); |
301 task_runner_->RunTasks(); | 309 task_runner_->RunTasks(); |
302 } | 310 } |
303 | 311 |
304 TEST_F(VideoSenderTest, RtcpTimer) { | 312 TEST_F(VideoSenderTest, RtcpTimer) { |
305 EXPECT_EQ(STATUS_VIDEO_INITIALIZED, InitEncoder(false, true)); | 313 InitEncoder(false, true); |
| 314 ASSERT_EQ(STATUS_INITIALIZED, operational_status_); |
306 | 315 |
307 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); | 316 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); |
308 | 317 |
309 const base::TimeTicks reference_time = testing_clock_->NowTicks(); | 318 const base::TimeTicks reference_time = testing_clock_->NowTicks(); |
310 video_sender_->InsertRawVideoFrame(video_frame, reference_time); | 319 video_sender_->InsertRawVideoFrame(video_frame, reference_time); |
311 | 320 |
312 // Make sure that we send at least one RTCP packet. | 321 // Make sure that we send at least one RTCP packet. |
313 base::TimeDelta max_rtcp_timeout = | 322 base::TimeDelta max_rtcp_timeout = |
314 base::TimeDelta::FromMilliseconds(1 + kDefaultRtcpIntervalMs * 3 / 2); | 323 base::TimeDelta::FromMilliseconds(1 + kDefaultRtcpIntervalMs * 3 / 2); |
315 | 324 |
316 RunTasks(max_rtcp_timeout.InMilliseconds()); | 325 RunTasks(max_rtcp_timeout.InMilliseconds()); |
317 EXPECT_LE(1, transport_.number_of_rtp_packets()); | 326 EXPECT_LE(1, transport_.number_of_rtp_packets()); |
318 EXPECT_LE(1, transport_.number_of_rtcp_packets()); | 327 EXPECT_LE(1, transport_.number_of_rtcp_packets()); |
319 // Build Cast msg and expect RTCP packet. | 328 // Build Cast msg and expect RTCP packet. |
320 RtcpCastMessage cast_feedback(1); | 329 RtcpCastMessage cast_feedback(1); |
321 cast_feedback.media_ssrc = 2; | 330 cast_feedback.media_ssrc = 2; |
322 cast_feedback.ack_frame_id = 0; | 331 cast_feedback.ack_frame_id = 0; |
323 video_sender_->OnReceivedCastFeedback(cast_feedback); | 332 video_sender_->OnReceivedCastFeedback(cast_feedback); |
324 RunTasks(max_rtcp_timeout.InMilliseconds()); | 333 RunTasks(max_rtcp_timeout.InMilliseconds()); |
325 EXPECT_LE(1, transport_.number_of_rtcp_packets()); | 334 EXPECT_LE(1, transport_.number_of_rtcp_packets()); |
326 } | 335 } |
327 | 336 |
328 TEST_F(VideoSenderTest, ResendTimer) { | 337 TEST_F(VideoSenderTest, ResendTimer) { |
329 EXPECT_EQ(STATUS_VIDEO_INITIALIZED, InitEncoder(false, true)); | 338 InitEncoder(false, true); |
| 339 ASSERT_EQ(STATUS_INITIALIZED, operational_status_); |
330 | 340 |
331 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); | 341 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); |
332 | 342 |
333 const base::TimeTicks reference_time = testing_clock_->NowTicks(); | 343 const base::TimeTicks reference_time = testing_clock_->NowTicks(); |
334 video_sender_->InsertRawVideoFrame(video_frame, reference_time); | 344 video_sender_->InsertRawVideoFrame(video_frame, reference_time); |
335 | 345 |
336 // ACK the key frame. | 346 // ACK the key frame. |
337 RtcpCastMessage cast_feedback(1); | 347 RtcpCastMessage cast_feedback(1); |
338 cast_feedback.media_ssrc = 2; | 348 cast_feedback.media_ssrc = 2; |
339 cast_feedback.ack_frame_id = 0; | 349 cast_feedback.ack_frame_id = 0; |
340 video_sender_->OnReceivedCastFeedback(cast_feedback); | 350 video_sender_->OnReceivedCastFeedback(cast_feedback); |
341 | 351 |
342 video_frame = GetNewVideoFrame(); | 352 video_frame = GetNewVideoFrame(); |
343 video_sender_->InsertRawVideoFrame(video_frame, reference_time); | 353 video_sender_->InsertRawVideoFrame(video_frame, reference_time); |
344 | 354 |
345 base::TimeDelta max_resend_timeout = | 355 base::TimeDelta max_resend_timeout = |
346 base::TimeDelta::FromMilliseconds(1 + kDefaultRtpMaxDelayMs); | 356 base::TimeDelta::FromMilliseconds(1 + kDefaultRtpMaxDelayMs); |
347 | 357 |
348 // Make sure that we do a re-send. | 358 // Make sure that we do a re-send. |
349 RunTasks(max_resend_timeout.InMilliseconds()); | 359 RunTasks(max_resend_timeout.InMilliseconds()); |
350 // Should have sent at least 3 packets. | 360 // Should have sent at least 3 packets. |
351 EXPECT_LE( | 361 EXPECT_LE( |
352 3, | 362 3, |
353 transport_.number_of_rtp_packets() + transport_.number_of_rtcp_packets()); | 363 transport_.number_of_rtp_packets() + transport_.number_of_rtcp_packets()); |
354 } | 364 } |
355 | 365 |
356 TEST_F(VideoSenderTest, LogAckReceivedEvent) { | 366 TEST_F(VideoSenderTest, LogAckReceivedEvent) { |
357 EXPECT_EQ(STATUS_VIDEO_INITIALIZED, InitEncoder(false, true)); | 367 InitEncoder(false, true); |
| 368 ASSERT_EQ(STATUS_INITIALIZED, operational_status_); |
| 369 |
358 SimpleEventSubscriber event_subscriber; | 370 SimpleEventSubscriber event_subscriber; |
359 cast_environment_->Logging()->AddRawEventSubscriber(&event_subscriber); | 371 cast_environment_->Logging()->AddRawEventSubscriber(&event_subscriber); |
360 | 372 |
361 int num_frames = 10; | 373 int num_frames = 10; |
362 for (int i = 0; i < num_frames; i++) { | 374 for (int i = 0; i < num_frames; i++) { |
363 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); | 375 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); |
364 | 376 |
365 const base::TimeTicks reference_time = testing_clock_->NowTicks(); | 377 const base::TimeTicks reference_time = testing_clock_->NowTicks(); |
366 video_sender_->InsertRawVideoFrame(video_frame, reference_time); | 378 video_sender_->InsertRawVideoFrame(video_frame, reference_time); |
367 RunTasks(33); | 379 RunTasks(33); |
(...skipping 11 matching lines...) Expand all Loading... |
379 | 391 |
380 ASSERT_TRUE(!frame_events.empty()); | 392 ASSERT_TRUE(!frame_events.empty()); |
381 EXPECT_EQ(FRAME_ACK_RECEIVED, frame_events.rbegin()->type); | 393 EXPECT_EQ(FRAME_ACK_RECEIVED, frame_events.rbegin()->type); |
382 EXPECT_EQ(VIDEO_EVENT, frame_events.rbegin()->media_type); | 394 EXPECT_EQ(VIDEO_EVENT, frame_events.rbegin()->media_type); |
383 EXPECT_EQ(num_frames - 1u, frame_events.rbegin()->frame_id); | 395 EXPECT_EQ(num_frames - 1u, frame_events.rbegin()->frame_id); |
384 | 396 |
385 cast_environment_->Logging()->RemoveRawEventSubscriber(&event_subscriber); | 397 cast_environment_->Logging()->RemoveRawEventSubscriber(&event_subscriber); |
386 } | 398 } |
387 | 399 |
388 TEST_F(VideoSenderTest, StopSendingInTheAbsenceOfAck) { | 400 TEST_F(VideoSenderTest, StopSendingInTheAbsenceOfAck) { |
389 EXPECT_EQ(STATUS_VIDEO_INITIALIZED, InitEncoder(false, true)); | 401 InitEncoder(false, true); |
| 402 ASSERT_EQ(STATUS_INITIALIZED, operational_status_); |
| 403 |
390 // Send a stream of frames and don't ACK; by default we shouldn't have more | 404 // Send a stream of frames and don't ACK; by default we shouldn't have more |
391 // than 4 frames in flight. | 405 // than 4 frames in flight. |
392 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); | 406 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); |
393 video_sender_->InsertRawVideoFrame(video_frame, testing_clock_->NowTicks()); | 407 video_sender_->InsertRawVideoFrame(video_frame, testing_clock_->NowTicks()); |
394 RunTasks(33); | 408 RunTasks(33); |
395 | 409 |
396 // Send 3 more frames and record the number of packets sent. | 410 // Send 3 more frames and record the number of packets sent. |
397 for (int i = 0; i < 3; ++i) { | 411 for (int i = 0; i < 3; ++i) { |
398 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); | 412 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); |
399 video_sender_->InsertRawVideoFrame(video_frame, testing_clock_->NowTicks()); | 413 video_sender_->InsertRawVideoFrame(video_frame, testing_clock_->NowTicks()); |
(...skipping 25 matching lines...) Expand all Loading... |
425 | 439 |
426 // Empty the pipeline. | 440 // Empty the pipeline. |
427 RunTasks(100); | 441 RunTasks(100); |
428 // Should have sent at least 7 packets. | 442 // Should have sent at least 7 packets. |
429 EXPECT_LE( | 443 EXPECT_LE( |
430 7, | 444 7, |
431 transport_.number_of_rtp_packets() + transport_.number_of_rtcp_packets()); | 445 transport_.number_of_rtp_packets() + transport_.number_of_rtcp_packets()); |
432 } | 446 } |
433 | 447 |
434 TEST_F(VideoSenderTest, DuplicateAckRetransmit) { | 448 TEST_F(VideoSenderTest, DuplicateAckRetransmit) { |
435 EXPECT_EQ(STATUS_VIDEO_INITIALIZED, InitEncoder(false, true)); | 449 InitEncoder(false, true); |
| 450 ASSERT_EQ(STATUS_INITIALIZED, operational_status_); |
| 451 |
436 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); | 452 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); |
437 video_sender_->InsertRawVideoFrame(video_frame, testing_clock_->NowTicks()); | 453 video_sender_->InsertRawVideoFrame(video_frame, testing_clock_->NowTicks()); |
438 RunTasks(33); | 454 RunTasks(33); |
439 RtcpCastMessage cast_feedback(1); | 455 RtcpCastMessage cast_feedback(1); |
440 cast_feedback.media_ssrc = 2; | 456 cast_feedback.media_ssrc = 2; |
441 cast_feedback.ack_frame_id = 0; | 457 cast_feedback.ack_frame_id = 0; |
442 | 458 |
443 // Send 3 more frames but don't ACK. | 459 // Send 3 more frames but don't ACK. |
444 for (int i = 0; i < 3; ++i) { | 460 for (int i = 0; i < 3; ++i) { |
445 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); | 461 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); |
(...skipping 19 matching lines...) Expand all Loading... |
465 for (int i = 0; i < 3; ++i) { | 481 for (int i = 0; i < 3; ++i) { |
466 RtcpCastMessage ack_feedback(1); | 482 RtcpCastMessage ack_feedback(1); |
467 ack_feedback.media_ssrc = 2; | 483 ack_feedback.media_ssrc = 2; |
468 ack_feedback.ack_frame_id = 0; | 484 ack_feedback.ack_frame_id = 0; |
469 video_sender_->OnReceivedCastFeedback(ack_feedback); | 485 video_sender_->OnReceivedCastFeedback(ack_feedback); |
470 } | 486 } |
471 EXPECT_EQ(number_of_packets_sent + 1, transport_.number_of_rtp_packets()); | 487 EXPECT_EQ(number_of_packets_sent + 1, transport_.number_of_rtp_packets()); |
472 } | 488 } |
473 | 489 |
474 TEST_F(VideoSenderTest, DuplicateAckRetransmitDoesNotCancelRetransmits) { | 490 TEST_F(VideoSenderTest, DuplicateAckRetransmitDoesNotCancelRetransmits) { |
475 EXPECT_EQ(STATUS_VIDEO_INITIALIZED, InitEncoder(false, true)); | 491 InitEncoder(false, true); |
| 492 ASSERT_EQ(STATUS_INITIALIZED, operational_status_); |
| 493 |
476 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); | 494 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); |
477 video_sender_->InsertRawVideoFrame(video_frame, testing_clock_->NowTicks()); | 495 video_sender_->InsertRawVideoFrame(video_frame, testing_clock_->NowTicks()); |
478 RunTasks(33); | 496 RunTasks(33); |
479 RtcpCastMessage cast_feedback(1); | 497 RtcpCastMessage cast_feedback(1); |
480 cast_feedback.media_ssrc = 2; | 498 cast_feedback.media_ssrc = 2; |
481 cast_feedback.ack_frame_id = 0; | 499 cast_feedback.ack_frame_id = 0; |
482 | 500 |
483 // Send 2 more frames but don't ACK. | 501 // Send 2 more frames but don't ACK. |
484 for (int i = 0; i < 2; ++i) { | 502 for (int i = 0; i < 2; ++i) { |
485 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); | 503 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); |
(...skipping 30 matching lines...) Expand all Loading... |
516 ack_feedback.ack_frame_id = 0; | 534 ack_feedback.ack_frame_id = 0; |
517 video_sender_->OnReceivedCastFeedback(ack_feedback); | 535 video_sender_->OnReceivedCastFeedback(ack_feedback); |
518 } | 536 } |
519 | 537 |
520 transport_.SetPause(false); | 538 transport_.SetPause(false); |
521 RunTasks(100); | 539 RunTasks(100); |
522 EXPECT_LT(number_of_packets_sent + 1, transport_.number_of_rtp_packets()); | 540 EXPECT_LT(number_of_packets_sent + 1, transport_.number_of_rtp_packets()); |
523 } | 541 } |
524 | 542 |
525 TEST_F(VideoSenderTest, AcksCancelRetransmits) { | 543 TEST_F(VideoSenderTest, AcksCancelRetransmits) { |
526 EXPECT_EQ(STATUS_VIDEO_INITIALIZED, InitEncoder(false, true)); | 544 InitEncoder(false, true); |
| 545 ASSERT_EQ(STATUS_INITIALIZED, operational_status_); |
| 546 |
527 transport_.SetPause(true); | 547 transport_.SetPause(true); |
528 scoped_refptr<media::VideoFrame> video_frame = GetLargeNewVideoFrame(); | 548 scoped_refptr<media::VideoFrame> video_frame = GetLargeNewVideoFrame(); |
529 video_sender_->InsertRawVideoFrame(video_frame, testing_clock_->NowTicks()); | 549 video_sender_->InsertRawVideoFrame(video_frame, testing_clock_->NowTicks()); |
530 RunTasks(33); | 550 RunTasks(33); |
531 | 551 |
532 // Frame should be in buffer, waiting. Now let's ack it. | 552 // Frame should be in buffer, waiting. Now let's ack it. |
533 RtcpCastMessage cast_feedback(1); | 553 RtcpCastMessage cast_feedback(1); |
534 cast_feedback.media_ssrc = 2; | 554 cast_feedback.media_ssrc = 2; |
535 cast_feedback.ack_frame_id = 0; | 555 cast_feedback.ack_frame_id = 0; |
536 video_sender_->OnReceivedCastFeedback(cast_feedback); | 556 video_sender_->OnReceivedCastFeedback(cast_feedback); |
537 | 557 |
538 transport_.SetPause(false); | 558 transport_.SetPause(false); |
539 RunTasks(33); | 559 RunTasks(33); |
540 EXPECT_EQ(0, transport_.number_of_rtp_packets()); | 560 EXPECT_EQ(0, transport_.number_of_rtp_packets()); |
541 } | 561 } |
542 | 562 |
543 TEST_F(VideoSenderTest, CheckVideoFrameFactoryIsNull) { | 563 TEST_F(VideoSenderTest, CheckVideoFrameFactoryIsNull) { |
544 EXPECT_EQ(STATUS_VIDEO_INITIALIZED, InitEncoder(false, true)); | 564 InitEncoder(false, true); |
| 565 ASSERT_EQ(STATUS_INITIALIZED, operational_status_); |
| 566 |
545 EXPECT_EQ(nullptr, video_sender_->CreateVideoFrameFactory().get()); | 567 EXPECT_EQ(nullptr, video_sender_->CreateVideoFrameFactory().get()); |
546 } | 568 } |
547 | 569 |
548 } // namespace cast | 570 } // namespace cast |
549 } // namespace media | 571 } // namespace media |
OLD | NEW |