| OLD | NEW |
| 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 "base/bind.h" | 5 #include "base/bind.h" |
| 6 #include "base/memory/ref_counted.h" | 6 #include "base/memory/ref_counted.h" |
| 7 #include "base/memory/scoped_ptr.h" | 7 #include "base/memory/scoped_ptr.h" |
| 8 #include "base/test/simple_test_tick_clock.h" | 8 #include "base/test/simple_test_tick_clock.h" |
| 9 #include "media/cast/cast_defines.h" | 9 #include "media/cast/cast_defines.h" |
| 10 #include "media/cast/cast_environment.h" | 10 #include "media/cast/cast_environment.h" |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 84 } | 84 } |
| 85 | 85 |
| 86 virtual ~VideoReceiverTest() {} | 86 virtual ~VideoReceiverTest() {} |
| 87 | 87 |
| 88 virtual void SetUp() { | 88 virtual void SetUp() { |
| 89 payload_.assign(kPacketSize, 0); | 89 payload_.assign(kPacketSize, 0); |
| 90 | 90 |
| 91 // Always start with a key frame. | 91 // Always start with a key frame. |
| 92 rtp_header_.is_key_frame = true; | 92 rtp_header_.is_key_frame = true; |
| 93 rtp_header_.frame_id = kFirstFrameId; | 93 rtp_header_.frame_id = kFirstFrameId; |
| 94 rtp_header_.reference_frame_id = rtp_header_.frame_id; |
| 94 rtp_header_.packet_id = 0; | 95 rtp_header_.packet_id = 0; |
| 95 rtp_header_.max_packet_id = 0; | 96 rtp_header_.max_packet_id = 0; |
| 96 rtp_header_.is_reference = false; | |
| 97 rtp_header_.reference_frame_id = 0; | |
| 98 rtp_header_.webrtc.header.timestamp = 0; | |
| 99 } | 97 } |
| 100 | 98 |
| 101 void FeedOneFrameIntoReceiver() { | 99 void FeedOneFrameIntoReceiver() { |
| 102 receiver_->OnReceivedPayloadData( | 100 receiver_->OnReceivedPayloadData( |
| 103 payload_.data(), payload_.size(), rtp_header_); | 101 payload_.data(), payload_.size(), rtp_header_); |
| 104 } | 102 } |
| 105 | 103 |
| 106 VideoReceiverConfig config_; | 104 VideoReceiverConfig config_; |
| 107 std::vector<uint8> payload_; | 105 std::vector<uint8> payload_; |
| 108 RtpCastHeader rtp_header_; | 106 RtpCastHeader rtp_header_; |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 141 FeedOneFrameIntoReceiver(); | 139 FeedOneFrameIntoReceiver(); |
| 142 task_runner_->RunTasks(); | 140 task_runner_->RunTasks(); |
| 143 EXPECT_EQ(1, fake_video_client_.number_times_called()); | 141 EXPECT_EQ(1, fake_video_client_.number_times_called()); |
| 144 | 142 |
| 145 std::vector<FrameEvent> frame_events; | 143 std::vector<FrameEvent> frame_events; |
| 146 event_subscriber.GetFrameEventsAndReset(&frame_events); | 144 event_subscriber.GetFrameEventsAndReset(&frame_events); |
| 147 | 145 |
| 148 ASSERT_TRUE(!frame_events.empty()); | 146 ASSERT_TRUE(!frame_events.empty()); |
| 149 EXPECT_EQ(kVideoAckSent, frame_events.begin()->type); | 147 EXPECT_EQ(kVideoAckSent, frame_events.begin()->type); |
| 150 EXPECT_EQ(rtp_header_.frame_id, frame_events.begin()->frame_id); | 148 EXPECT_EQ(rtp_header_.frame_id, frame_events.begin()->frame_id); |
| 151 EXPECT_EQ(rtp_header_.webrtc.header.timestamp, | 149 EXPECT_EQ(rtp_header_.rtp_timestamp, frame_events.begin()->rtp_timestamp); |
| 152 frame_events.begin()->rtp_timestamp); | |
| 153 | 150 |
| 154 cast_environment_->Logging()->RemoveRawEventSubscriber(&event_subscriber); | 151 cast_environment_->Logging()->RemoveRawEventSubscriber(&event_subscriber); |
| 155 } | 152 } |
| 156 | 153 |
| 157 TEST_F(VideoReceiverTest, MultiplePendingGetCalls) { | 154 TEST_F(VideoReceiverTest, MultiplePendingGetCalls) { |
| 158 EXPECT_CALL(mock_transport_, SendRtcpPacket(_)) | 155 EXPECT_CALL(mock_transport_, SendRtcpPacket(_)) |
| 159 .WillRepeatedly(testing::Return(true)); | 156 .WillRepeatedly(testing::Return(true)); |
| 160 | 157 |
| 161 // Enqueue a request for an video frame. | 158 // Enqueue a request for an video frame. |
| 162 const VideoFrameEncodedCallback frame_encoded_callback = | 159 const VideoFrameEncodedCallback frame_encoded_callback = |
| (...skipping 17 matching lines...) Expand all Loading... |
| 180 // Enqueue a second request for an video frame, but it should not be | 177 // Enqueue a second request for an video frame, but it should not be |
| 181 // fulfilled yet. | 178 // fulfilled yet. |
| 182 receiver_->GetEncodedVideoFrame(frame_encoded_callback); | 179 receiver_->GetEncodedVideoFrame(frame_encoded_callback); |
| 183 task_runner_->RunTasks(); | 180 task_runner_->RunTasks(); |
| 184 EXPECT_EQ(1, fake_video_client_.number_times_called()); | 181 EXPECT_EQ(1, fake_video_client_.number_times_called()); |
| 185 | 182 |
| 186 // Receive one video frame out-of-order: Make sure that we are not continuous | 183 // Receive one video frame out-of-order: Make sure that we are not continuous |
| 187 // and that the RTP timestamp represents a time in the future. | 184 // and that the RTP timestamp represents a time in the future. |
| 188 rtp_header_.is_key_frame = false; | 185 rtp_header_.is_key_frame = false; |
| 189 rtp_header_.frame_id = kFirstFrameId + 2; | 186 rtp_header_.frame_id = kFirstFrameId + 2; |
| 190 rtp_header_.is_reference = true; | |
| 191 rtp_header_.reference_frame_id = 0; | 187 rtp_header_.reference_frame_id = 0; |
| 192 rtp_header_.webrtc.header.timestamp += | 188 rtp_header_.rtp_timestamp += |
| 193 config_.rtp_max_delay_ms * kVideoFrequency / 1000; | 189 config_.rtp_max_delay_ms * kVideoFrequency / 1000; |
| 194 fake_video_client_.SetNextExpectedResult( | 190 fake_video_client_.SetNextExpectedResult( |
| 195 kFirstFrameId + 2, | 191 kFirstFrameId + 2, |
| 196 time_at_first_frame_feed + | 192 time_at_first_frame_feed + |
| 197 base::TimeDelta::FromMilliseconds(config_.rtp_max_delay_ms)); | 193 base::TimeDelta::FromMilliseconds(config_.rtp_max_delay_ms)); |
| 198 FeedOneFrameIntoReceiver(); | 194 FeedOneFrameIntoReceiver(); |
| 199 | 195 |
| 200 // Frame 2 should not come out at this point in time. | 196 // Frame 2 should not come out at this point in time. |
| 201 task_runner_->RunTasks(); | 197 task_runner_->RunTasks(); |
| 202 EXPECT_EQ(1, fake_video_client_.number_times_called()); | 198 EXPECT_EQ(1, fake_video_client_.number_times_called()); |
| 203 | 199 |
| 204 // Enqueue a third request for an video frame. | 200 // Enqueue a third request for an video frame. |
| 205 receiver_->GetEncodedVideoFrame(frame_encoded_callback); | 201 receiver_->GetEncodedVideoFrame(frame_encoded_callback); |
| 206 task_runner_->RunTasks(); | 202 task_runner_->RunTasks(); |
| 207 EXPECT_EQ(1, fake_video_client_.number_times_called()); | 203 EXPECT_EQ(1, fake_video_client_.number_times_called()); |
| 208 | 204 |
| 209 // After |rtp_max_delay_ms| has elapsed, Frame 2 is emitted (to satisfy the | 205 // After |rtp_max_delay_ms| has elapsed, Frame 2 is emitted (to satisfy the |
| 210 // second request) because a decision was made to skip over the no-show Frame | 206 // second request) because a decision was made to skip over the no-show Frame |
| 211 // 1. | 207 // 1. |
| 212 testing_clock_->Advance( | 208 testing_clock_->Advance( |
| 213 base::TimeDelta::FromMilliseconds(config_.rtp_max_delay_ms)); | 209 base::TimeDelta::FromMilliseconds(config_.rtp_max_delay_ms)); |
| 214 task_runner_->RunTasks(); | 210 task_runner_->RunTasks(); |
| 215 EXPECT_EQ(2, fake_video_client_.number_times_called()); | 211 EXPECT_EQ(2, fake_video_client_.number_times_called()); |
| 216 | 212 |
| 217 // Receive Frame 3 and expect it to fulfill the third request immediately. | 213 // Receive Frame 3 and expect it to fulfill the third request immediately. |
| 218 rtp_header_.frame_id = kFirstFrameId + 3; | 214 rtp_header_.frame_id = kFirstFrameId + 3; |
| 219 rtp_header_.is_reference = false; | 215 rtp_header_.reference_frame_id = rtp_header_.frame_id - 1; |
| 220 rtp_header_.reference_frame_id = 0; | 216 rtp_header_.rtp_timestamp += kVideoFrequency / config_.max_frame_rate; |
| 221 rtp_header_.webrtc.header.timestamp += | |
| 222 kVideoFrequency / config_.max_frame_rate; | |
| 223 fake_video_client_.SetNextExpectedResult(kFirstFrameId + 3, | 217 fake_video_client_.SetNextExpectedResult(kFirstFrameId + 3, |
| 224 testing_clock_->NowTicks()); | 218 testing_clock_->NowTicks()); |
| 225 FeedOneFrameIntoReceiver(); | 219 FeedOneFrameIntoReceiver(); |
| 226 task_runner_->RunTasks(); | 220 task_runner_->RunTasks(); |
| 227 EXPECT_EQ(3, fake_video_client_.number_times_called()); | 221 EXPECT_EQ(3, fake_video_client_.number_times_called()); |
| 228 | 222 |
| 229 // Move forward another |rtp_max_delay_ms| and run any pending tasks (there | 223 // Move forward another |rtp_max_delay_ms| and run any pending tasks (there |
| 230 // should be none). Expect no additional frames where emitted. | 224 // should be none). Expect no additional frames where emitted. |
| 231 testing_clock_->Advance( | 225 testing_clock_->Advance( |
| 232 base::TimeDelta::FromMilliseconds(config_.rtp_max_delay_ms)); | 226 base::TimeDelta::FromMilliseconds(config_.rtp_max_delay_ms)); |
| 233 task_runner_->RunTasks(); | 227 task_runner_->RunTasks(); |
| 234 EXPECT_EQ(3, fake_video_client_.number_times_called()); | 228 EXPECT_EQ(3, fake_video_client_.number_times_called()); |
| 235 } | 229 } |
| 236 | 230 |
| 237 } // namespace cast | 231 } // namespace cast |
| 238 } // namespace media | 232 } // namespace media |
| OLD | NEW |