| 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 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 44 void CreateSharedMemory( | 44 void CreateSharedMemory( |
| 45 size_t size, const ReceiveVideoEncodeMemoryCallback& callback) { | 45 size_t size, const ReceiveVideoEncodeMemoryCallback& callback) { |
| 46 scoped_ptr<base::SharedMemory> shm(new base::SharedMemory()); | 46 scoped_ptr<base::SharedMemory> shm(new base::SharedMemory()); |
| 47 if (!shm->CreateAndMapAnonymous(size)) { | 47 if (!shm->CreateAndMapAnonymous(size)) { |
| 48 NOTREACHED(); | 48 NOTREACHED(); |
| 49 return; | 49 return; |
| 50 } | 50 } |
| 51 callback.Run(shm.Pass()); | 51 callback.Run(shm.Pass()); |
| 52 } | 52 } |
| 53 | 53 |
| 54 void SaveInitializationStatus(CastInitializationStatus* out_status, |
| 55 CastInitializationStatus in_status) { |
| 56 *out_status = in_status; |
| 57 } |
| 58 |
| 54 class TestPacketSender : public PacketSender { | 59 class TestPacketSender : public PacketSender { |
| 55 public: | 60 public: |
| 56 TestPacketSender() | 61 TestPacketSender() |
| 57 : number_of_rtp_packets_(0), | 62 : number_of_rtp_packets_(0), |
| 58 number_of_rtcp_packets_(0), | 63 number_of_rtcp_packets_(0), |
| 59 paused_(false) {} | 64 paused_(false) {} |
| 60 | 65 |
| 61 // A singular packet implies a RTCP packet. | 66 // A singular packet implies a RTCP packet. |
| 62 virtual bool SendPacket(PacketRef packet, | 67 virtual bool SendPacket(PacketRef packet, |
| 63 const base::Closure& cb) OVERRIDE { | 68 const base::Closure& cb) OVERRIDE { |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 104 PacketRef stored_packet_; | 109 PacketRef stored_packet_; |
| 105 | 110 |
| 106 DISALLOW_COPY_AND_ASSIGN(TestPacketSender); | 111 DISALLOW_COPY_AND_ASSIGN(TestPacketSender); |
| 107 }; | 112 }; |
| 108 | 113 |
| 109 class PeerVideoSender : public VideoSender { | 114 class PeerVideoSender : public VideoSender { |
| 110 public: | 115 public: |
| 111 PeerVideoSender( | 116 PeerVideoSender( |
| 112 scoped_refptr<CastEnvironment> cast_environment, | 117 scoped_refptr<CastEnvironment> cast_environment, |
| 113 const VideoSenderConfig& video_config, | 118 const VideoSenderConfig& video_config, |
| 119 const CastInitializationCallback& initialization_cb, |
| 114 const CreateVideoEncodeAcceleratorCallback& create_vea_cb, | 120 const CreateVideoEncodeAcceleratorCallback& create_vea_cb, |
| 115 const CreateVideoEncodeMemoryCallback& create_video_encode_mem_cb, | 121 const CreateVideoEncodeMemoryCallback& create_video_encode_mem_cb, |
| 116 CastTransportSender* const transport_sender) | 122 CastTransportSender* const transport_sender) |
| 117 : VideoSender(cast_environment, | 123 : VideoSender(cast_environment, |
| 118 video_config, | 124 video_config, |
| 125 initialization_cb, |
| 119 create_vea_cb, | 126 create_vea_cb, |
| 120 create_video_encode_mem_cb, | 127 create_video_encode_mem_cb, |
| 121 transport_sender) {} | 128 transport_sender) {} |
| 122 using VideoSender::OnReceivedCastFeedback; | 129 using VideoSender::OnReceivedCastFeedback; |
| 123 }; | 130 }; |
| 124 } // namespace | 131 } // namespace |
| 125 | 132 |
| 126 class VideoSenderTest : public ::testing::Test { | 133 class VideoSenderTest : public ::testing::Test { |
| 127 protected: | 134 protected: |
| 128 VideoSenderTest() { | 135 VideoSenderTest() { |
| (...skipping 22 matching lines...) Expand all Loading... |
| 151 | 158 |
| 152 virtual void TearDown() OVERRIDE { | 159 virtual void TearDown() OVERRIDE { |
| 153 video_sender_.reset(); | 160 video_sender_.reset(); |
| 154 task_runner_->RunTasks(); | 161 task_runner_->RunTasks(); |
| 155 } | 162 } |
| 156 | 163 |
| 157 static void UpdateCastTransportStatus(CastTransportStatus status) { | 164 static void UpdateCastTransportStatus(CastTransportStatus status) { |
| 158 EXPECT_EQ(TRANSPORT_VIDEO_INITIALIZED, status); | 165 EXPECT_EQ(TRANSPORT_VIDEO_INITIALIZED, status); |
| 159 } | 166 } |
| 160 | 167 |
| 161 void InitEncoder(bool external) { | 168 // If |external| is true then external video encoder (VEA) is used. |
| 169 // |expect_init_sucess| is true if initialization is expected to succeed. |
| 170 CastInitializationStatus InitEncoder(bool external, |
| 171 bool expect_init_success) { |
| 162 VideoSenderConfig video_config; | 172 VideoSenderConfig video_config; |
| 163 video_config.ssrc = 1; | 173 video_config.ssrc = 1; |
| 164 video_config.incoming_feedback_ssrc = 2; | 174 video_config.incoming_feedback_ssrc = 2; |
| 165 video_config.rtp_payload_type = 127; | 175 video_config.rtp_payload_type = 127; |
| 166 video_config.use_external_encoder = external; | 176 video_config.use_external_encoder = external; |
| 167 video_config.width = kWidth; | 177 video_config.width = kWidth; |
| 168 video_config.height = kHeight; | 178 video_config.height = kHeight; |
| 169 video_config.max_bitrate = 5000000; | 179 video_config.max_bitrate = 5000000; |
| 170 video_config.min_bitrate = 1000000; | 180 video_config.min_bitrate = 1000000; |
| 171 video_config.start_bitrate = 1000000; | 181 video_config.start_bitrate = 1000000; |
| 172 video_config.max_qp = 56; | 182 video_config.max_qp = 56; |
| 173 video_config.min_qp = 0; | 183 video_config.min_qp = 0; |
| 174 video_config.max_frame_rate = 30; | 184 video_config.max_frame_rate = 30; |
| 175 video_config.max_number_of_video_buffers_used = 1; | 185 video_config.max_number_of_video_buffers_used = 1; |
| 176 video_config.codec = CODEC_VIDEO_VP8; | 186 video_config.codec = CODEC_VIDEO_VP8; |
| 187 CastInitializationStatus status = STATUS_VIDEO_UNINITIALIZED; |
| 177 | 188 |
| 178 if (external) { | 189 if (external) { |
| 179 scoped_ptr<VideoEncodeAccelerator> fake_vea( | 190 test::FakeVideoEncodeAccelerator* fake_vea = |
| 180 new test::FakeVideoEncodeAccelerator(task_runner_, | 191 new test::FakeVideoEncodeAccelerator( |
| 181 &stored_bitrates_)); | 192 task_runner_, &stored_bitrates_); |
| 193 fake_vea->SetWillInitializationSucceed(expect_init_success); |
| 194 scoped_ptr<VideoEncodeAccelerator> fake_vea_owner(fake_vea); |
| 182 video_sender_.reset( | 195 video_sender_.reset( |
| 183 new PeerVideoSender(cast_environment_, | 196 new PeerVideoSender(cast_environment_, |
| 184 video_config, | 197 video_config, |
| 198 base::Bind(&SaveInitializationStatus, |
| 199 &status), |
| 185 base::Bind(&CreateVideoEncodeAccelerator, | 200 base::Bind(&CreateVideoEncodeAccelerator, |
| 186 task_runner_, | 201 task_runner_, |
| 187 base::Passed(&fake_vea)), | 202 base::Passed(&fake_vea_owner)), |
| 188 base::Bind(&CreateSharedMemory), | 203 base::Bind(&CreateSharedMemory), |
| 189 transport_sender_.get())); | 204 transport_sender_.get())); |
| 190 } else { | 205 } else { |
| 191 video_sender_.reset( | 206 video_sender_.reset( |
| 192 new PeerVideoSender(cast_environment_, | 207 new PeerVideoSender(cast_environment_, |
| 193 video_config, | 208 video_config, |
| 209 base::Bind(&SaveInitializationStatus, |
| 210 &status), |
| 194 CreateDefaultVideoEncodeAcceleratorCallback(), | 211 CreateDefaultVideoEncodeAcceleratorCallback(), |
| 195 CreateDefaultVideoEncodeMemoryCallback(), | 212 CreateDefaultVideoEncodeMemoryCallback(), |
| 196 transport_sender_.get())); | 213 transport_sender_.get())); |
| 197 } | 214 } |
| 198 ASSERT_EQ(STATUS_VIDEO_INITIALIZED, video_sender_->InitializationResult()); | 215 task_runner_->RunTasks(); |
| 216 return status; |
| 199 } | 217 } |
| 200 | 218 |
| 201 scoped_refptr<media::VideoFrame> GetNewVideoFrame() { | 219 scoped_refptr<media::VideoFrame> GetNewVideoFrame() { |
| 202 gfx::Size size(kWidth, kHeight); | 220 gfx::Size size(kWidth, kHeight); |
| 203 scoped_refptr<media::VideoFrame> video_frame = | 221 scoped_refptr<media::VideoFrame> video_frame = |
| 204 media::VideoFrame::CreateFrame( | 222 media::VideoFrame::CreateFrame( |
| 205 VideoFrame::I420, size, gfx::Rect(size), size, base::TimeDelta()); | 223 VideoFrame::I420, size, gfx::Rect(size), size, base::TimeDelta()); |
| 206 PopulateVideoFrame(video_frame.get(), last_pixel_value_++); | 224 PopulateVideoFrame(video_frame.get(), last_pixel_value_++); |
| 207 return video_frame; | 225 return video_frame; |
| 208 } | 226 } |
| (...skipping 17 matching lines...) Expand all Loading... |
| 226 scoped_refptr<test::FakeSingleThreadTaskRunner> task_runner_; | 244 scoped_refptr<test::FakeSingleThreadTaskRunner> task_runner_; |
| 227 scoped_ptr<PeerVideoSender> video_sender_; | 245 scoped_ptr<PeerVideoSender> video_sender_; |
| 228 std::vector<uint32> stored_bitrates_; | 246 std::vector<uint32> stored_bitrates_; |
| 229 scoped_refptr<CastEnvironment> cast_environment_; | 247 scoped_refptr<CastEnvironment> cast_environment_; |
| 230 int last_pixel_value_; | 248 int last_pixel_value_; |
| 231 | 249 |
| 232 DISALLOW_COPY_AND_ASSIGN(VideoSenderTest); | 250 DISALLOW_COPY_AND_ASSIGN(VideoSenderTest); |
| 233 }; | 251 }; |
| 234 | 252 |
| 235 TEST_F(VideoSenderTest, BuiltInEncoder) { | 253 TEST_F(VideoSenderTest, BuiltInEncoder) { |
| 236 InitEncoder(false); | 254 EXPECT_EQ(STATUS_VIDEO_INITIALIZED, InitEncoder(false, true)); |
| 237 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); | 255 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); |
| 238 | 256 |
| 239 const base::TimeTicks capture_time = testing_clock_->NowTicks(); | 257 const base::TimeTicks capture_time = testing_clock_->NowTicks(); |
| 240 video_sender_->InsertRawVideoFrame(video_frame, capture_time); | 258 video_sender_->InsertRawVideoFrame(video_frame, capture_time); |
| 241 | 259 |
| 242 task_runner_->RunTasks(); | 260 task_runner_->RunTasks(); |
| 243 EXPECT_LE(1, transport_.number_of_rtp_packets()); | 261 EXPECT_LE(1, transport_.number_of_rtp_packets()); |
| 244 EXPECT_LE(1, transport_.number_of_rtcp_packets()); | 262 EXPECT_LE(1, transport_.number_of_rtcp_packets()); |
| 245 } | 263 } |
| 246 | 264 |
| 247 TEST_F(VideoSenderTest, ExternalEncoder) { | 265 TEST_F(VideoSenderTest, ExternalEncoder) { |
| 248 InitEncoder(true); | 266 EXPECT_EQ(STATUS_VIDEO_INITIALIZED, InitEncoder(true, true)); |
| 249 task_runner_->RunTasks(); | |
| 250 | 267 |
| 251 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); | 268 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); |
| 252 | 269 |
| 253 const base::TimeTicks capture_time = testing_clock_->NowTicks(); | 270 const base::TimeTicks capture_time = testing_clock_->NowTicks(); |
| 254 video_sender_->InsertRawVideoFrame(video_frame, capture_time); | 271 video_sender_->InsertRawVideoFrame(video_frame, capture_time); |
| 255 task_runner_->RunTasks(); | 272 task_runner_->RunTasks(); |
| 256 video_sender_->InsertRawVideoFrame(video_frame, capture_time); | 273 video_sender_->InsertRawVideoFrame(video_frame, capture_time); |
| 257 task_runner_->RunTasks(); | 274 task_runner_->RunTasks(); |
| 258 video_sender_->InsertRawVideoFrame(video_frame, capture_time); | 275 video_sender_->InsertRawVideoFrame(video_frame, capture_time); |
| 259 task_runner_->RunTasks(); | 276 task_runner_->RunTasks(); |
| 260 | 277 |
| 261 // Fixed bitrate is used for external encoder. Bitrate is only once | 278 // Fixed bitrate is used for external encoder. Bitrate is only once |
| 262 // to the encoder. | 279 // to the encoder. |
| 263 EXPECT_EQ(1u, stored_bitrates_.size()); | 280 EXPECT_EQ(1u, stored_bitrates_.size()); |
| 281 video_sender_.reset(NULL); |
| 282 task_runner_->RunTasks(); |
| 283 } |
| 264 | 284 |
| 265 // We need to run the task to cleanup the GPU instance. | 285 TEST_F(VideoSenderTest, ExternalEncoderInitFails) { |
| 286 EXPECT_EQ(STATUS_HW_VIDEO_ENCODER_NOT_SUPPORTED, |
| 287 InitEncoder(true, false)); |
| 266 video_sender_.reset(NULL); | 288 video_sender_.reset(NULL); |
| 267 task_runner_->RunTasks(); | 289 task_runner_->RunTasks(); |
| 268 } | 290 } |
| 269 | 291 |
| 270 TEST_F(VideoSenderTest, RtcpTimer) { | 292 TEST_F(VideoSenderTest, RtcpTimer) { |
| 271 InitEncoder(false); | 293 EXPECT_EQ(STATUS_VIDEO_INITIALIZED, InitEncoder(false, true)); |
| 272 | 294 |
| 273 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); | 295 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); |
| 274 | 296 |
| 275 const base::TimeTicks capture_time = testing_clock_->NowTicks(); | 297 const base::TimeTicks capture_time = testing_clock_->NowTicks(); |
| 276 video_sender_->InsertRawVideoFrame(video_frame, capture_time); | 298 video_sender_->InsertRawVideoFrame(video_frame, capture_time); |
| 277 | 299 |
| 278 // Make sure that we send at least one RTCP packet. | 300 // Make sure that we send at least one RTCP packet. |
| 279 base::TimeDelta max_rtcp_timeout = | 301 base::TimeDelta max_rtcp_timeout = |
| 280 base::TimeDelta::FromMilliseconds(1 + kDefaultRtcpIntervalMs * 3 / 2); | 302 base::TimeDelta::FromMilliseconds(1 + kDefaultRtcpIntervalMs * 3 / 2); |
| 281 | 303 |
| 282 RunTasks(max_rtcp_timeout.InMilliseconds()); | 304 RunTasks(max_rtcp_timeout.InMilliseconds()); |
| 283 EXPECT_LE(1, transport_.number_of_rtp_packets()); | 305 EXPECT_LE(1, transport_.number_of_rtp_packets()); |
| 284 EXPECT_LE(1, transport_.number_of_rtcp_packets()); | 306 EXPECT_LE(1, transport_.number_of_rtcp_packets()); |
| 285 // Build Cast msg and expect RTCP packet. | 307 // Build Cast msg and expect RTCP packet. |
| 286 RtcpCastMessage cast_feedback(1); | 308 RtcpCastMessage cast_feedback(1); |
| 287 cast_feedback.media_ssrc = 2; | 309 cast_feedback.media_ssrc = 2; |
| 288 cast_feedback.ack_frame_id = 0; | 310 cast_feedback.ack_frame_id = 0; |
| 289 video_sender_->OnReceivedCastFeedback(cast_feedback); | 311 video_sender_->OnReceivedCastFeedback(cast_feedback); |
| 290 RunTasks(max_rtcp_timeout.InMilliseconds()); | 312 RunTasks(max_rtcp_timeout.InMilliseconds()); |
| 291 EXPECT_LE(1, transport_.number_of_rtcp_packets()); | 313 EXPECT_LE(1, transport_.number_of_rtcp_packets()); |
| 292 } | 314 } |
| 293 | 315 |
| 294 TEST_F(VideoSenderTest, ResendTimer) { | 316 TEST_F(VideoSenderTest, ResendTimer) { |
| 295 InitEncoder(false); | 317 EXPECT_EQ(STATUS_VIDEO_INITIALIZED, InitEncoder(false, true)); |
| 296 | 318 |
| 297 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); | 319 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); |
| 298 | 320 |
| 299 const base::TimeTicks capture_time = testing_clock_->NowTicks(); | 321 const base::TimeTicks capture_time = testing_clock_->NowTicks(); |
| 300 video_sender_->InsertRawVideoFrame(video_frame, capture_time); | 322 video_sender_->InsertRawVideoFrame(video_frame, capture_time); |
| 301 | 323 |
| 302 // ACK the key frame. | 324 // ACK the key frame. |
| 303 RtcpCastMessage cast_feedback(1); | 325 RtcpCastMessage cast_feedback(1); |
| 304 cast_feedback.media_ssrc = 2; | 326 cast_feedback.media_ssrc = 2; |
| 305 cast_feedback.ack_frame_id = 0; | 327 cast_feedback.ack_frame_id = 0; |
| 306 video_sender_->OnReceivedCastFeedback(cast_feedback); | 328 video_sender_->OnReceivedCastFeedback(cast_feedback); |
| 307 | 329 |
| 308 video_frame = GetNewVideoFrame(); | 330 video_frame = GetNewVideoFrame(); |
| 309 video_sender_->InsertRawVideoFrame(video_frame, capture_time); | 331 video_sender_->InsertRawVideoFrame(video_frame, capture_time); |
| 310 | 332 |
| 311 base::TimeDelta max_resend_timeout = | 333 base::TimeDelta max_resend_timeout = |
| 312 base::TimeDelta::FromMilliseconds(1 + kDefaultRtpMaxDelayMs); | 334 base::TimeDelta::FromMilliseconds(1 + kDefaultRtpMaxDelayMs); |
| 313 | 335 |
| 314 // Make sure that we do a re-send. | 336 // Make sure that we do a re-send. |
| 315 RunTasks(max_resend_timeout.InMilliseconds()); | 337 RunTasks(max_resend_timeout.InMilliseconds()); |
| 316 // Should have sent at least 3 packets. | 338 // Should have sent at least 3 packets. |
| 317 EXPECT_LE( | 339 EXPECT_LE( |
| 318 3, | 340 3, |
| 319 transport_.number_of_rtp_packets() + transport_.number_of_rtcp_packets()); | 341 transport_.number_of_rtp_packets() + transport_.number_of_rtcp_packets()); |
| 320 } | 342 } |
| 321 | 343 |
| 322 TEST_F(VideoSenderTest, LogAckReceivedEvent) { | 344 TEST_F(VideoSenderTest, LogAckReceivedEvent) { |
| 323 InitEncoder(false); | 345 EXPECT_EQ(STATUS_VIDEO_INITIALIZED, InitEncoder(false, true)); |
| 324 SimpleEventSubscriber event_subscriber; | 346 SimpleEventSubscriber event_subscriber; |
| 325 cast_environment_->Logging()->AddRawEventSubscriber(&event_subscriber); | 347 cast_environment_->Logging()->AddRawEventSubscriber(&event_subscriber); |
| 326 | 348 |
| 327 int num_frames = 10; | 349 int num_frames = 10; |
| 328 for (int i = 0; i < num_frames; i++) { | 350 for (int i = 0; i < num_frames; i++) { |
| 329 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); | 351 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); |
| 330 | 352 |
| 331 const base::TimeTicks capture_time = testing_clock_->NowTicks(); | 353 const base::TimeTicks capture_time = testing_clock_->NowTicks(); |
| 332 video_sender_->InsertRawVideoFrame(video_frame, capture_time); | 354 video_sender_->InsertRawVideoFrame(video_frame, capture_time); |
| 333 RunTasks(33); | 355 RunTasks(33); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 345 | 367 |
| 346 ASSERT_TRUE(!frame_events.empty()); | 368 ASSERT_TRUE(!frame_events.empty()); |
| 347 EXPECT_EQ(FRAME_ACK_RECEIVED, frame_events.rbegin()->type); | 369 EXPECT_EQ(FRAME_ACK_RECEIVED, frame_events.rbegin()->type); |
| 348 EXPECT_EQ(VIDEO_EVENT, frame_events.rbegin()->media_type); | 370 EXPECT_EQ(VIDEO_EVENT, frame_events.rbegin()->media_type); |
| 349 EXPECT_EQ(num_frames - 1u, frame_events.rbegin()->frame_id); | 371 EXPECT_EQ(num_frames - 1u, frame_events.rbegin()->frame_id); |
| 350 | 372 |
| 351 cast_environment_->Logging()->RemoveRawEventSubscriber(&event_subscriber); | 373 cast_environment_->Logging()->RemoveRawEventSubscriber(&event_subscriber); |
| 352 } | 374 } |
| 353 | 375 |
| 354 TEST_F(VideoSenderTest, StopSendingInTheAbsenceOfAck) { | 376 TEST_F(VideoSenderTest, StopSendingInTheAbsenceOfAck) { |
| 355 InitEncoder(false); | 377 EXPECT_EQ(STATUS_VIDEO_INITIALIZED, InitEncoder(false, true)); |
| 356 // Send a stream of frames and don't ACK; by default we shouldn't have more | 378 // Send a stream of frames and don't ACK; by default we shouldn't have more |
| 357 // than 4 frames in flight. | 379 // than 4 frames in flight. |
| 358 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); | 380 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); |
| 359 video_sender_->InsertRawVideoFrame(video_frame, testing_clock_->NowTicks()); | 381 video_sender_->InsertRawVideoFrame(video_frame, testing_clock_->NowTicks()); |
| 360 RunTasks(33); | 382 RunTasks(33); |
| 361 | 383 |
| 362 // Send 3 more frames and record the number of packets sent. | 384 // Send 3 more frames and record the number of packets sent. |
| 363 for (int i = 0; i < 3; ++i) { | 385 for (int i = 0; i < 3; ++i) { |
| 364 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); | 386 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); |
| 365 video_sender_->InsertRawVideoFrame(video_frame, testing_clock_->NowTicks()); | 387 video_sender_->InsertRawVideoFrame(video_frame, testing_clock_->NowTicks()); |
| (...skipping 25 matching lines...) Expand all Loading... |
| 391 | 413 |
| 392 // Empty the pipeline. | 414 // Empty the pipeline. |
| 393 RunTasks(100); | 415 RunTasks(100); |
| 394 // Should have sent at least 7 packets. | 416 // Should have sent at least 7 packets. |
| 395 EXPECT_LE( | 417 EXPECT_LE( |
| 396 7, | 418 7, |
| 397 transport_.number_of_rtp_packets() + transport_.number_of_rtcp_packets()); | 419 transport_.number_of_rtp_packets() + transport_.number_of_rtcp_packets()); |
| 398 } | 420 } |
| 399 | 421 |
| 400 TEST_F(VideoSenderTest, DuplicateAckRetransmit) { | 422 TEST_F(VideoSenderTest, DuplicateAckRetransmit) { |
| 401 InitEncoder(false); | 423 EXPECT_EQ(STATUS_VIDEO_INITIALIZED, InitEncoder(false, true)); |
| 402 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); | 424 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); |
| 403 video_sender_->InsertRawVideoFrame(video_frame, testing_clock_->NowTicks()); | 425 video_sender_->InsertRawVideoFrame(video_frame, testing_clock_->NowTicks()); |
| 404 RunTasks(33); | 426 RunTasks(33); |
| 405 RtcpCastMessage cast_feedback(1); | 427 RtcpCastMessage cast_feedback(1); |
| 406 cast_feedback.media_ssrc = 2; | 428 cast_feedback.media_ssrc = 2; |
| 407 cast_feedback.ack_frame_id = 0; | 429 cast_feedback.ack_frame_id = 0; |
| 408 | 430 |
| 409 // Send 3 more frames but don't ACK. | 431 // Send 3 more frames but don't ACK. |
| 410 for (int i = 0; i < 3; ++i) { | 432 for (int i = 0; i < 3; ++i) { |
| 411 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); | 433 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 431 for (int i = 0; i < 3; ++i) { | 453 for (int i = 0; i < 3; ++i) { |
| 432 RtcpCastMessage ack_feedback(1); | 454 RtcpCastMessage ack_feedback(1); |
| 433 ack_feedback.media_ssrc = 2; | 455 ack_feedback.media_ssrc = 2; |
| 434 ack_feedback.ack_frame_id = 0; | 456 ack_feedback.ack_frame_id = 0; |
| 435 video_sender_->OnReceivedCastFeedback(ack_feedback); | 457 video_sender_->OnReceivedCastFeedback(ack_feedback); |
| 436 } | 458 } |
| 437 EXPECT_EQ(number_of_packets_sent + 1, transport_.number_of_rtp_packets()); | 459 EXPECT_EQ(number_of_packets_sent + 1, transport_.number_of_rtp_packets()); |
| 438 } | 460 } |
| 439 | 461 |
| 440 TEST_F(VideoSenderTest, DuplicateAckRetransmitDoesNotCancelRetransmits) { | 462 TEST_F(VideoSenderTest, DuplicateAckRetransmitDoesNotCancelRetransmits) { |
| 441 InitEncoder(false); | 463 EXPECT_EQ(STATUS_VIDEO_INITIALIZED, InitEncoder(false, true)); |
| 442 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); | 464 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); |
| 443 video_sender_->InsertRawVideoFrame(video_frame, testing_clock_->NowTicks()); | 465 video_sender_->InsertRawVideoFrame(video_frame, testing_clock_->NowTicks()); |
| 444 RunTasks(33); | 466 RunTasks(33); |
| 445 RtcpCastMessage cast_feedback(1); | 467 RtcpCastMessage cast_feedback(1); |
| 446 cast_feedback.media_ssrc = 2; | 468 cast_feedback.media_ssrc = 2; |
| 447 cast_feedback.ack_frame_id = 0; | 469 cast_feedback.ack_frame_id = 0; |
| 448 | 470 |
| 449 // Send 2 more frames but don't ACK. | 471 // Send 2 more frames but don't ACK. |
| 450 for (int i = 0; i < 2; ++i) { | 472 for (int i = 0; i < 2; ++i) { |
| 451 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); | 473 scoped_refptr<media::VideoFrame> video_frame = GetNewVideoFrame(); |
| (...skipping 30 matching lines...) Expand all Loading... |
| 482 ack_feedback.ack_frame_id = 0; | 504 ack_feedback.ack_frame_id = 0; |
| 483 video_sender_->OnReceivedCastFeedback(ack_feedback); | 505 video_sender_->OnReceivedCastFeedback(ack_feedback); |
| 484 } | 506 } |
| 485 | 507 |
| 486 transport_.SetPause(false); | 508 transport_.SetPause(false); |
| 487 RunTasks(100); | 509 RunTasks(100); |
| 488 EXPECT_LT(number_of_packets_sent + 1, transport_.number_of_rtp_packets()); | 510 EXPECT_LT(number_of_packets_sent + 1, transport_.number_of_rtp_packets()); |
| 489 } | 511 } |
| 490 | 512 |
| 491 TEST_F(VideoSenderTest, AcksCancelRetransmits) { | 513 TEST_F(VideoSenderTest, AcksCancelRetransmits) { |
| 492 InitEncoder(false); | 514 EXPECT_EQ(STATUS_VIDEO_INITIALIZED, InitEncoder(false, true)); |
| 493 transport_.SetPause(true); | 515 transport_.SetPause(true); |
| 494 scoped_refptr<media::VideoFrame> video_frame = GetLargeNewVideoFrame(); | 516 scoped_refptr<media::VideoFrame> video_frame = GetLargeNewVideoFrame(); |
| 495 video_sender_->InsertRawVideoFrame(video_frame, testing_clock_->NowTicks()); | 517 video_sender_->InsertRawVideoFrame(video_frame, testing_clock_->NowTicks()); |
| 496 RunTasks(33); | 518 RunTasks(33); |
| 497 | 519 |
| 498 // Frame should be in buffer, waiting. Now let's ack it. | 520 // Frame should be in buffer, waiting. Now let's ack it. |
| 499 RtcpCastMessage cast_feedback(1); | 521 RtcpCastMessage cast_feedback(1); |
| 500 cast_feedback.media_ssrc = 2; | 522 cast_feedback.media_ssrc = 2; |
| 501 cast_feedback.ack_frame_id = 0; | 523 cast_feedback.ack_frame_id = 0; |
| 502 video_sender_->OnReceivedCastFeedback(cast_feedback); | 524 video_sender_->OnReceivedCastFeedback(cast_feedback); |
| 503 | 525 |
| 504 transport_.SetPause(false); | 526 transport_.SetPause(false); |
| 505 RunTasks(33); | 527 RunTasks(33); |
| 506 EXPECT_EQ(0, transport_.number_of_rtp_packets()); | 528 EXPECT_EQ(0, transport_.number_of_rtp_packets()); |
| 507 } | 529 } |
| 508 | 530 |
| 509 } // namespace cast | 531 } // namespace cast |
| 510 } // namespace media | 532 } // namespace media |
| OLD | NEW |