| 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 |