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

Side by Side Diff: media/cast/video_sender/video_sender_unittest.cc

Issue 317243007: Cast: reduce the amount of retransmission packets (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: moved FastCopyPacket to RtpSender Created 6 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « media/cast/video_sender/video_sender.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
104 protected: 104 protected:
105 VideoSenderTest() { 105 VideoSenderTest() {
106 testing_clock_ = new base::SimpleTestTickClock(); 106 testing_clock_ = new base::SimpleTestTickClock();
107 testing_clock_->Advance(base::TimeTicks::Now() - base::TimeTicks()); 107 testing_clock_->Advance(base::TimeTicks::Now() - base::TimeTicks());
108 task_runner_ = new test::FakeSingleThreadTaskRunner(testing_clock_); 108 task_runner_ = new test::FakeSingleThreadTaskRunner(testing_clock_);
109 cast_environment_ = 109 cast_environment_ =
110 new CastEnvironment(scoped_ptr<base::TickClock>(testing_clock_).Pass(), 110 new CastEnvironment(scoped_ptr<base::TickClock>(testing_clock_).Pass(),
111 task_runner_, 111 task_runner_,
112 task_runner_, 112 task_runner_,
113 task_runner_); 113 task_runner_);
114 last_pixel_value_ = kPixelValue;
114 net::IPEndPoint dummy_endpoint; 115 net::IPEndPoint dummy_endpoint;
115 transport_sender_.reset(new transport::CastTransportSenderImpl( 116 transport_sender_.reset(new transport::CastTransportSenderImpl(
116 NULL, 117 NULL,
117 testing_clock_, 118 testing_clock_,
118 dummy_endpoint, 119 dummy_endpoint,
119 base::Bind(&UpdateCastTransportStatus), 120 base::Bind(&UpdateCastTransportStatus),
120 transport::BulkRawEventsCallback(), 121 transport::BulkRawEventsCallback(),
121 base::TimeDelta(), 122 base::TimeDelta(),
122 task_runner_, 123 task_runner_,
123 &transport_)); 124 &transport_));
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
172 transport_sender_.get())); 173 transport_sender_.get()));
173 } 174 }
174 ASSERT_EQ(STATUS_VIDEO_INITIALIZED, video_sender_->InitializationResult()); 175 ASSERT_EQ(STATUS_VIDEO_INITIALIZED, video_sender_->InitializationResult());
175 } 176 }
176 177
177 scoped_refptr<media::VideoFrame> GetNewVideoFrame() { 178 scoped_refptr<media::VideoFrame> GetNewVideoFrame() {
178 gfx::Size size(kWidth, kHeight); 179 gfx::Size size(kWidth, kHeight);
179 scoped_refptr<media::VideoFrame> video_frame = 180 scoped_refptr<media::VideoFrame> video_frame =
180 media::VideoFrame::CreateFrame( 181 media::VideoFrame::CreateFrame(
181 VideoFrame::I420, size, gfx::Rect(size), size, base::TimeDelta()); 182 VideoFrame::I420, size, gfx::Rect(size), size, base::TimeDelta());
182 PopulateVideoFrame(video_frame, kPixelValue); 183 PopulateVideoFrame(video_frame, last_pixel_value_++);
183 return video_frame; 184 return video_frame;
184 } 185 }
185 186
186 void RunTasks(int during_ms) { 187 void RunTasks(int during_ms) {
187 for (int i = 0; i < during_ms; ++i) { 188 for (int i = 0; i < during_ms; ++i) {
188 // Call process the timers every 1 ms. 189 // Call process the timers every 1 ms.
189 testing_clock_->Advance(base::TimeDelta::FromMilliseconds(1)); 190 testing_clock_->Advance(base::TimeDelta::FromMilliseconds(1));
190 task_runner_->RunTasks(); 191 task_runner_->RunTasks();
191 } 192 }
192 } 193 }
193 194
194 base::SimpleTestTickClock* testing_clock_; // Owned by CastEnvironment. 195 base::SimpleTestTickClock* testing_clock_; // Owned by CastEnvironment.
195 TestPacketSender transport_; 196 TestPacketSender transport_;
196 scoped_ptr<transport::CastTransportSenderImpl> transport_sender_; 197 scoped_ptr<transport::CastTransportSenderImpl> transport_sender_;
197 scoped_refptr<test::FakeSingleThreadTaskRunner> task_runner_; 198 scoped_refptr<test::FakeSingleThreadTaskRunner> task_runner_;
198 scoped_ptr<PeerVideoSender> video_sender_; 199 scoped_ptr<PeerVideoSender> video_sender_;
199 scoped_refptr<CastEnvironment> cast_environment_; 200 scoped_refptr<CastEnvironment> cast_environment_;
201 int last_pixel_value_;
200 202
201 DISALLOW_COPY_AND_ASSIGN(VideoSenderTest); 203 DISALLOW_COPY_AND_ASSIGN(VideoSenderTest);
202 }; 204 };
203 205
204 TEST_F(VideoSenderTest, BuiltInEncoder) { 206 TEST_F(VideoSenderTest, BuiltInEncoder) {
205 InitEncoder(false); 207 InitEncoder(false);
206 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); 208 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame();
207 209
208 const base::TimeTicks capture_time = testing_clock_->NowTicks(); 210 const base::TimeTicks capture_time = testing_clock_->NowTicks();
209 video_sender_->InsertRawVideoFrame(video_frame, capture_time); 211 video_sender_->InsertRawVideoFrame(video_frame, capture_time);
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
310 EXPECT_EQ(VIDEO_EVENT, frame_events.rbegin()->media_type); 312 EXPECT_EQ(VIDEO_EVENT, frame_events.rbegin()->media_type);
311 EXPECT_EQ(num_frames - 1u, frame_events.rbegin()->frame_id); 313 EXPECT_EQ(num_frames - 1u, frame_events.rbegin()->frame_id);
312 314
313 cast_environment_->Logging()->RemoveRawEventSubscriber(&event_subscriber); 315 cast_environment_->Logging()->RemoveRawEventSubscriber(&event_subscriber);
314 } 316 }
315 317
316 TEST_F(VideoSenderTest, StopSendingInTheAbsenceOfAck) { 318 TEST_F(VideoSenderTest, StopSendingInTheAbsenceOfAck) {
317 InitEncoder(false); 319 InitEncoder(false);
318 // Send a stream of frames and don't ACK; by default we shouldn't have more 320 // Send a stream of frames and don't ACK; by default we shouldn't have more
319 // than 4 frames in flight. 321 // than 4 frames in flight.
320 // Store size in packets of frame 0, as it should be resent sue to timeout.
321 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); 322 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame();
322 video_sender_->InsertRawVideoFrame(video_frame, testing_clock_->NowTicks()); 323 video_sender_->InsertRawVideoFrame(video_frame, testing_clock_->NowTicks());
323 RunTasks(33); 324 RunTasks(33);
324 const int size_of_frame0 = transport_.number_of_rtp_packets();
325 325
326 for (int i = 1; i < 4; ++i) { 326 // Send 3 more frames and record the number of packets sent.
327 for (int i = 0; i < 3; ++i) {
327 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); 328 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame();
328 video_sender_->InsertRawVideoFrame(video_frame, testing_clock_->NowTicks()); 329 video_sender_->InsertRawVideoFrame(video_frame, testing_clock_->NowTicks());
329 RunTasks(33); 330 RunTasks(33);
330 } 331 }
332 const int number_of_packets_sent = transport_.number_of_rtp_packets();
331 333
332 const int number_of_packets_sent = transport_.number_of_rtp_packets(); 334 // Send 3 more frames - they should not be encoded, as we have not received
333 // Send 4 more frames - they should not be sent to the transport, as we have 335 // any acks.
334 // received any acks.
335 for (int i = 0; i < 3; ++i) { 336 for (int i = 0; i < 3; ++i) {
336 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); 337 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame();
337 video_sender_->InsertRawVideoFrame(video_frame, testing_clock_->NowTicks()); 338 video_sender_->InsertRawVideoFrame(video_frame, testing_clock_->NowTicks());
338 RunTasks(33); 339 RunTasks(33);
339 } 340 }
340 341
341 EXPECT_EQ(number_of_packets_sent + size_of_frame0, 342 // We expect a frame to be retransmitted because of duplicated ACKs.
343 // Only one packet of the frame is re-transmitted.
344 EXPECT_EQ(number_of_packets_sent + 1,
342 transport_.number_of_rtp_packets()); 345 transport_.number_of_rtp_packets());
343 346
344 // Start acking and make sure we're back to steady-state. 347 // Start acking and make sure we're back to steady-state.
345 RtcpCastMessage cast_feedback(1); 348 RtcpCastMessage cast_feedback(1);
346 cast_feedback.media_ssrc_ = 2; 349 cast_feedback.media_ssrc_ = 2;
347 cast_feedback.ack_frame_id_ = 0; 350 cast_feedback.ack_frame_id_ = 0;
348 video_sender_->OnReceivedCastFeedback(cast_feedback); 351 video_sender_->OnReceivedCastFeedback(cast_feedback);
349 EXPECT_LE( 352 EXPECT_LE(
350 4, 353 4,
351 transport_.number_of_rtp_packets() + transport_.number_of_rtcp_packets()); 354 transport_.number_of_rtp_packets() + transport_.number_of_rtcp_packets());
352 355
353 // Empty the pipeline. 356 // Empty the pipeline.
354 RunTasks(100); 357 RunTasks(100);
355 // Should have sent at least 7 packets. 358 // Should have sent at least 7 packets.
356 EXPECT_LE( 359 EXPECT_LE(
357 7, 360 7,
358 transport_.number_of_rtp_packets() + transport_.number_of_rtcp_packets()); 361 transport_.number_of_rtp_packets() + transport_.number_of_rtcp_packets());
359 } 362 }
360 363
364 TEST_F(VideoSenderTest, DuplicateAckRetransmit) {
365 InitEncoder(false);
366 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame();
367 video_sender_->InsertRawVideoFrame(video_frame, testing_clock_->NowTicks());
368 RunTasks(33);
369 RtcpCastMessage cast_feedback(1);
370 cast_feedback.media_ssrc_ = 2;
371 cast_feedback.ack_frame_id_ = 0;
372
373 // Send 3 more frames but don't ACK.
374 for (int i = 0; i < 3; ++i) {
375 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame();
376 video_sender_->InsertRawVideoFrame(video_frame, testing_clock_->NowTicks());
377 RunTasks(33);
378 }
379 const int number_of_packets_sent = transport_.number_of_rtp_packets();
380
381 // Send duplicated ACKs and mix some invalid NACKs.
382 for (int i = 0; i < 10; ++i) {
383 RtcpCastMessage ack_feedback(1);
384 ack_feedback.media_ssrc_ = 2;
385 ack_feedback.ack_frame_id_ = 0;
386 RtcpCastMessage nack_feedback(1);
387 nack_feedback.media_ssrc_ = 2;
388 nack_feedback.missing_frames_and_packets_[255] = PacketIdSet();
389 video_sender_->OnReceivedCastFeedback(ack_feedback);
390 video_sender_->OnReceivedCastFeedback(nack_feedback);
391 }
392 EXPECT_EQ(number_of_packets_sent, transport_.number_of_rtp_packets());
393
394 // Re-transmit one packet because of duplicated ACKs.
395 for (int i = 0; i < 3; ++i) {
396 RtcpCastMessage ack_feedback(1);
397 ack_feedback.media_ssrc_ = 2;
398 ack_feedback.ack_frame_id_ = 0;
399 video_sender_->OnReceivedCastFeedback(ack_feedback);
400 }
401 EXPECT_EQ(number_of_packets_sent + 1, transport_.number_of_rtp_packets());
402 }
403
361 } // namespace cast 404 } // namespace cast
362 } // namespace media 405 } // namespace media
OLDNEW
« no previous file with comments | « media/cast/video_sender/video_sender.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698