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 |