| 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/audio_receiver/audio_receiver.h" | 9 #include "media/cast/audio_receiver/audio_receiver.h" |
| 10 #include "media/cast/cast_defines.h" | 10 #include "media/cast/cast_defines.h" |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 85 } | 85 } |
| 86 | 86 |
| 87 virtual ~AudioReceiverTest() {} | 87 virtual ~AudioReceiverTest() {} |
| 88 | 88 |
| 89 virtual void SetUp() { | 89 virtual void SetUp() { |
| 90 payload_.assign(kMaxIpPacketSize, 0); | 90 payload_.assign(kMaxIpPacketSize, 0); |
| 91 rtp_header_.is_key_frame = true; | 91 rtp_header_.is_key_frame = true; |
| 92 rtp_header_.frame_id = kFirstFrameId; | 92 rtp_header_.frame_id = kFirstFrameId; |
| 93 rtp_header_.packet_id = 0; | 93 rtp_header_.packet_id = 0; |
| 94 rtp_header_.max_packet_id = 0; | 94 rtp_header_.max_packet_id = 0; |
| 95 rtp_header_.is_reference = false; | |
| 96 rtp_header_.reference_frame_id = 0; | 95 rtp_header_.reference_frame_id = 0; |
| 97 rtp_header_.webrtc.header.timestamp = 0; | 96 rtp_header_.rtp_timestamp = 0; |
| 98 } | 97 } |
| 99 | 98 |
| 100 void FeedOneFrameIntoReceiver() { | 99 void FeedOneFrameIntoReceiver() { |
| 101 receiver_->OnReceivedPayloadData( | 100 receiver_->OnReceivedPayloadData( |
| 102 payload_.data(), payload_.size(), rtp_header_); | 101 payload_.data(), payload_.size(), rtp_header_); |
| 103 } | 102 } |
| 104 | 103 |
| 105 AudioReceiverConfig audio_config_; | 104 AudioReceiverConfig audio_config_; |
| 106 std::vector<uint8> payload_; | 105 std::vector<uint8> payload_; |
| 107 RtpCastHeader rtp_header_; | 106 RtpCastHeader rtp_header_; |
| (...skipping 29 matching lines...) Expand all Loading... |
| 137 FeedOneFrameIntoReceiver(); | 136 FeedOneFrameIntoReceiver(); |
| 138 task_runner_->RunTasks(); | 137 task_runner_->RunTasks(); |
| 139 EXPECT_EQ(1, fake_audio_client_.number_times_called()); | 138 EXPECT_EQ(1, fake_audio_client_.number_times_called()); |
| 140 | 139 |
| 141 std::vector<FrameEvent> frame_events; | 140 std::vector<FrameEvent> frame_events; |
| 142 event_subscriber.GetFrameEventsAndReset(&frame_events); | 141 event_subscriber.GetFrameEventsAndReset(&frame_events); |
| 143 | 142 |
| 144 ASSERT_TRUE(!frame_events.empty()); | 143 ASSERT_TRUE(!frame_events.empty()); |
| 145 EXPECT_EQ(kAudioAckSent, frame_events.begin()->type); | 144 EXPECT_EQ(kAudioAckSent, frame_events.begin()->type); |
| 146 EXPECT_EQ(rtp_header_.frame_id, frame_events.begin()->frame_id); | 145 EXPECT_EQ(rtp_header_.frame_id, frame_events.begin()->frame_id); |
| 147 EXPECT_EQ(rtp_header_.webrtc.header.timestamp, | 146 EXPECT_EQ(rtp_header_.rtp_timestamp, frame_events.begin()->rtp_timestamp); |
| 148 frame_events.begin()->rtp_timestamp); | |
| 149 | 147 |
| 150 cast_environment_->Logging()->RemoveRawEventSubscriber(&event_subscriber); | 148 cast_environment_->Logging()->RemoveRawEventSubscriber(&event_subscriber); |
| 151 } | 149 } |
| 152 | 150 |
| 153 TEST_F(AudioReceiverTest, MultiplePendingGetCalls) { | 151 TEST_F(AudioReceiverTest, MultiplePendingGetCalls) { |
| 154 EXPECT_CALL(mock_transport_, SendRtcpPacket(_)) | 152 EXPECT_CALL(mock_transport_, SendRtcpPacket(_)) |
| 155 .WillRepeatedly(testing::Return(true)); | 153 .WillRepeatedly(testing::Return(true)); |
| 156 | 154 |
| 157 // Enqueue a request for an audio frame. | 155 // Enqueue a request for an audio frame. |
| 158 const AudioFrameEncodedCallback frame_encoded_callback = | 156 const AudioFrameEncodedCallback frame_encoded_callback = |
| 159 base::Bind(&FakeAudioClient::DeliverEncodedAudioFrame, | 157 base::Bind(&FakeAudioClient::DeliverEncodedAudioFrame, |
| 160 base::Unretained(&fake_audio_client_)); | 158 base::Unretained(&fake_audio_client_)); |
| 161 receiver_->GetEncodedAudioFrame(frame_encoded_callback); | 159 receiver_->GetEncodedAudioFrame(frame_encoded_callback); |
| 162 task_runner_->RunTasks(); | 160 task_runner_->RunTasks(); |
| 163 EXPECT_EQ(0, fake_audio_client_.number_times_called()); | 161 EXPECT_EQ(0, fake_audio_client_.number_times_called()); |
| 164 | 162 |
| 165 // Receive one audio frame and expect to see the first request satisfied. | 163 // Receive one audio frame and expect to see the first request satisfied. |
| 166 fake_audio_client_.SetNextExpectedResult(kFirstFrameId, | 164 fake_audio_client_.SetNextExpectedResult(kFirstFrameId, |
| 167 testing_clock_->NowTicks()); | 165 testing_clock_->NowTicks()); |
| 168 FeedOneFrameIntoReceiver(); | 166 FeedOneFrameIntoReceiver(); |
| 169 task_runner_->RunTasks(); | 167 task_runner_->RunTasks(); |
| 170 EXPECT_EQ(1, fake_audio_client_.number_times_called()); | 168 EXPECT_EQ(1, fake_audio_client_.number_times_called()); |
| 171 | 169 |
| 172 TestRtcpPacketBuilder rtcp_packet; | 170 TestRtcpPacketBuilder rtcp_packet; |
| 173 | 171 |
| 174 uint32 ntp_high; | 172 uint32 ntp_high; |
| 175 uint32 ntp_low; | 173 uint32 ntp_low; |
| 176 ConvertTimeTicksToNtp(testing_clock_->NowTicks(), &ntp_high, &ntp_low); | 174 ConvertTimeTicksToNtp(testing_clock_->NowTicks(), &ntp_high, &ntp_low); |
| 177 rtcp_packet.AddSrWithNtp(audio_config_.feedback_ssrc, ntp_high, ntp_low, | 175 rtcp_packet.AddSrWithNtp(audio_config_.feedback_ssrc, ntp_high, ntp_low, |
| 178 rtp_header_.webrtc.header.timestamp); | 176 rtp_header_.rtp_timestamp); |
| 179 | 177 |
| 180 testing_clock_->Advance(base::TimeDelta::FromMilliseconds(20)); | 178 testing_clock_->Advance(base::TimeDelta::FromMilliseconds(20)); |
| 181 | 179 |
| 182 receiver_->IncomingPacket(rtcp_packet.GetPacket().Pass()); | 180 receiver_->IncomingPacket(rtcp_packet.GetPacket().Pass()); |
| 183 | 181 |
| 184 // Enqueue a second request for an audio frame, but it should not be | 182 // Enqueue a second request for an audio frame, but it should not be |
| 185 // fulfilled yet. | 183 // fulfilled yet. |
| 186 receiver_->GetEncodedAudioFrame(frame_encoded_callback); | 184 receiver_->GetEncodedAudioFrame(frame_encoded_callback); |
| 187 task_runner_->RunTasks(); | 185 task_runner_->RunTasks(); |
| 188 EXPECT_EQ(1, fake_audio_client_.number_times_called()); | 186 EXPECT_EQ(1, fake_audio_client_.number_times_called()); |
| 189 | 187 |
| 190 // Receive one audio frame out-of-order: Make sure that we are not continuous | 188 // Receive one audio frame out-of-order: Make sure that we are not continuous |
| 191 // and that the RTP timestamp represents a time in the future. | 189 // and that the RTP timestamp represents a time in the future. |
| 192 rtp_header_.is_key_frame = false; | 190 rtp_header_.is_key_frame = false; |
| 193 rtp_header_.frame_id = kFirstFrameId + 2; | 191 rtp_header_.frame_id = kFirstFrameId + 2; |
| 194 rtp_header_.is_reference = true; | |
| 195 rtp_header_.reference_frame_id = 0; | 192 rtp_header_.reference_frame_id = 0; |
| 196 rtp_header_.webrtc.header.timestamp = 960; | 193 rtp_header_.rtp_timestamp = 960; |
| 197 fake_audio_client_.SetNextExpectedResult( | 194 fake_audio_client_.SetNextExpectedResult( |
| 198 kFirstFrameId + 2, | 195 kFirstFrameId + 2, |
| 199 testing_clock_->NowTicks() + base::TimeDelta::FromMilliseconds(100)); | 196 testing_clock_->NowTicks() + base::TimeDelta::FromMilliseconds(100)); |
| 200 FeedOneFrameIntoReceiver(); | 197 FeedOneFrameIntoReceiver(); |
| 201 | 198 |
| 202 // Frame 2 should not come out at this point in time. | 199 // Frame 2 should not come out at this point in time. |
| 203 task_runner_->RunTasks(); | 200 task_runner_->RunTasks(); |
| 204 EXPECT_EQ(1, fake_audio_client_.number_times_called()); | 201 EXPECT_EQ(1, fake_audio_client_.number_times_called()); |
| 205 | 202 |
| 206 // Enqueue a third request for an audio frame. | 203 // Enqueue a third request for an audio frame. |
| 207 receiver_->GetEncodedAudioFrame(frame_encoded_callback); | 204 receiver_->GetEncodedAudioFrame(frame_encoded_callback); |
| 208 task_runner_->RunTasks(); | 205 task_runner_->RunTasks(); |
| 209 EXPECT_EQ(1, fake_audio_client_.number_times_called()); | 206 EXPECT_EQ(1, fake_audio_client_.number_times_called()); |
| 210 | 207 |
| 211 // After 100 ms has elapsed, Frame 2 is emitted (to satisfy the second | 208 // After 100 ms has elapsed, Frame 2 is emitted (to satisfy the second |
| 212 // request) because a decision was made to skip over the no-show Frame 1. | 209 // request) because a decision was made to skip over the no-show Frame 1. |
| 213 testing_clock_->Advance(base::TimeDelta::FromMilliseconds(100)); | 210 testing_clock_->Advance(base::TimeDelta::FromMilliseconds(100)); |
| 214 task_runner_->RunTasks(); | 211 task_runner_->RunTasks(); |
| 215 EXPECT_EQ(2, fake_audio_client_.number_times_called()); | 212 EXPECT_EQ(2, fake_audio_client_.number_times_called()); |
| 216 | 213 |
| 217 // Receive Frame 3 and expect it to fulfill the third request immediately. | 214 // Receive Frame 3 and expect it to fulfill the third request immediately. |
| 218 rtp_header_.frame_id = kFirstFrameId + 3; | 215 rtp_header_.frame_id = kFirstFrameId + 3; |
| 219 rtp_header_.is_reference = false; | 216 rtp_header_.reference_frame_id = rtp_header_.frame_id - 1; |
| 220 rtp_header_.reference_frame_id = 0; | 217 rtp_header_.rtp_timestamp = 1280; |
| 221 rtp_header_.webrtc.header.timestamp = 1280; | |
| 222 fake_audio_client_.SetNextExpectedResult(kFirstFrameId + 3, | 218 fake_audio_client_.SetNextExpectedResult(kFirstFrameId + 3, |
| 223 testing_clock_->NowTicks()); | 219 testing_clock_->NowTicks()); |
| 224 FeedOneFrameIntoReceiver(); | 220 FeedOneFrameIntoReceiver(); |
| 225 task_runner_->RunTasks(); | 221 task_runner_->RunTasks(); |
| 226 EXPECT_EQ(3, fake_audio_client_.number_times_called()); | 222 EXPECT_EQ(3, fake_audio_client_.number_times_called()); |
| 227 | 223 |
| 228 // Move forward another 100 ms and run any pending tasks (there should be | 224 // Move forward another 100 ms and run any pending tasks (there should be |
| 229 // none). Expect no additional frames where emitted. | 225 // none). Expect no additional frames where emitted. |
| 230 testing_clock_->Advance(base::TimeDelta::FromMilliseconds(100)); | 226 testing_clock_->Advance(base::TimeDelta::FromMilliseconds(100)); |
| 231 task_runner_->RunTasks(); | 227 task_runner_->RunTasks(); |
| 232 EXPECT_EQ(3, fake_audio_client_.number_times_called()); | 228 EXPECT_EQ(3, fake_audio_client_.number_times_called()); |
| 233 } | 229 } |
| 234 | 230 |
| 235 } // namespace cast | 231 } // namespace cast |
| 236 } // namespace media | 232 } // namespace media |
| OLD | NEW |