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 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
68 class AudioReceiverTest : public ::testing::Test { | 68 class AudioReceiverTest : public ::testing::Test { |
69 protected: | 69 protected: |
70 AudioReceiverTest() { | 70 AudioReceiverTest() { |
71 // Configure the audio receiver to use PCM16. | 71 // Configure the audio receiver to use PCM16. |
72 audio_config_.rtp_payload_type = 127; | 72 audio_config_.rtp_payload_type = 127; |
73 audio_config_.frequency = 16000; | 73 audio_config_.frequency = 16000; |
74 audio_config_.channels = 1; | 74 audio_config_.channels = 1; |
75 audio_config_.codec = transport::kPcm16; | 75 audio_config_.codec = transport::kPcm16; |
76 audio_config_.use_external_decoder = false; | 76 audio_config_.use_external_decoder = false; |
77 audio_config_.feedback_ssrc = 1234; | 77 audio_config_.feedback_ssrc = 1234; |
78 testing_clock_.Advance( | 78 testing_clock_ = new base::SimpleTestTickClock(); |
| 79 testing_clock_->Advance( |
79 base::TimeDelta::FromMilliseconds(kStartMillisecond)); | 80 base::TimeDelta::FromMilliseconds(kStartMillisecond)); |
80 task_runner_ = new test::FakeTaskRunner(&testing_clock_); | 81 task_runner_ = new test::FakeTaskRunner(testing_clock_); |
81 cast_environment_ = new CastEnvironment(&testing_clock_, task_runner_, | 82 cast_environment_ = new CastEnvironment( |
| 83 scoped_ptr<base::TickClock>(testing_clock_).Pass(), task_runner_, |
82 task_runner_, task_runner_, task_runner_, task_runner_, | 84 task_runner_, task_runner_, task_runner_, task_runner_, |
83 task_runner_, GetDefaultCastReceiverLoggingConfig()); | 85 task_runner_, GetDefaultCastReceiverLoggingConfig()); |
84 test_audio_encoder_callback_ = new TestAudioEncoderCallback(); | 86 test_audio_encoder_callback_ = new TestAudioEncoderCallback(); |
85 } | 87 } |
86 | 88 |
87 void Configure(bool use_external_decoder) { | 89 void Configure(bool use_external_decoder) { |
88 audio_config_.use_external_decoder = use_external_decoder; | 90 audio_config_.use_external_decoder = use_external_decoder; |
89 receiver_.reset(new PeerAudioReceiver(cast_environment_, audio_config_, | 91 receiver_.reset(new PeerAudioReceiver(cast_environment_, audio_config_, |
90 &mock_transport_)); | 92 &mock_transport_)); |
91 } | 93 } |
92 | 94 |
93 virtual ~AudioReceiverTest() {} | 95 virtual ~AudioReceiverTest() {} |
94 | 96 |
95 static void DummyDeletePacket(const uint8* packet) {}; | 97 static void DummyDeletePacket(const uint8* packet) {}; |
96 | 98 |
97 virtual void SetUp() { | 99 virtual void SetUp() { |
98 payload_.assign(kMaxIpPacketSize, 0); | 100 payload_.assign(kMaxIpPacketSize, 0); |
99 rtp_header_.is_key_frame = true; | 101 rtp_header_.is_key_frame = true; |
100 rtp_header_.frame_id = 0; | 102 rtp_header_.frame_id = 0; |
101 rtp_header_.packet_id = 0; | 103 rtp_header_.packet_id = 0; |
102 rtp_header_.max_packet_id = 0; | 104 rtp_header_.max_packet_id = 0; |
103 rtp_header_.is_reference = false; | 105 rtp_header_.is_reference = false; |
104 rtp_header_.reference_frame_id = 0; | 106 rtp_header_.reference_frame_id = 0; |
105 rtp_header_.webrtc.header.timestamp = 0; | 107 rtp_header_.webrtc.header.timestamp = 0; |
106 } | 108 } |
107 | 109 |
108 AudioReceiverConfig audio_config_; | 110 AudioReceiverConfig audio_config_; |
109 std::vector<uint8> payload_; | 111 std::vector<uint8> payload_; |
110 RtpCastHeader rtp_header_; | 112 RtpCastHeader rtp_header_; |
111 base::SimpleTestTickClock testing_clock_; | 113 base::SimpleTestTickClock* testing_clock_; // Owned by CastEnvironment. |
112 transport::MockPacedPacketSender mock_transport_; | 114 transport::MockPacedPacketSender mock_transport_; |
113 scoped_refptr<test::FakeTaskRunner> task_runner_; | 115 scoped_refptr<test::FakeTaskRunner> task_runner_; |
114 scoped_ptr<PeerAudioReceiver> receiver_; | 116 scoped_ptr<PeerAudioReceiver> receiver_; |
115 scoped_refptr<CastEnvironment> cast_environment_; | 117 scoped_refptr<CastEnvironment> cast_environment_; |
116 scoped_refptr<TestAudioEncoderCallback> test_audio_encoder_callback_; | 118 scoped_refptr<TestAudioEncoderCallback> test_audio_encoder_callback_; |
117 }; | 119 }; |
118 | 120 |
119 TEST_F(AudioReceiverTest, GetOnePacketEncodedframe) { | 121 TEST_F(AudioReceiverTest, GetOnePacketEncodedframe) { |
120 Configure(true); | 122 Configure(true); |
121 EXPECT_CALL(mock_transport_, SendRtcpPacket(testing::_)).Times(1); | 123 EXPECT_CALL(mock_transport_, SendRtcpPacket(testing::_)).Times(1); |
122 | 124 |
123 receiver_->IncomingParsedRtpPacket(payload_.data(), | 125 receiver_->IncomingParsedRtpPacket(payload_.data(), |
124 payload_.size(), rtp_header_); | 126 payload_.size(), rtp_header_); |
125 transport::EncodedAudioFrame audio_frame; | 127 transport::EncodedAudioFrame audio_frame; |
126 base::TimeTicks playout_time; | 128 base::TimeTicks playout_time; |
127 test_audio_encoder_callback_->SetExpectedResult(0, testing_clock_.NowTicks()); | 129 test_audio_encoder_callback_->SetExpectedResult( |
| 130 0, testing_clock_->NowTicks()); |
128 | 131 |
129 AudioFrameEncodedCallback frame_encoded_callback = | 132 AudioFrameEncodedCallback frame_encoded_callback = |
130 base::Bind(&TestAudioEncoderCallback::DeliverEncodedAudioFrame, | 133 base::Bind(&TestAudioEncoderCallback::DeliverEncodedAudioFrame, |
131 test_audio_encoder_callback_.get()); | 134 test_audio_encoder_callback_.get()); |
132 | 135 |
133 receiver_->GetEncodedAudioFrame(frame_encoded_callback); | 136 receiver_->GetEncodedAudioFrame(frame_encoded_callback); |
134 task_runner_->RunTasks(); | 137 task_runner_->RunTasks(); |
135 EXPECT_EQ(1, test_audio_encoder_callback_->number_times_called()); | 138 EXPECT_EQ(1, test_audio_encoder_callback_->number_times_called()); |
136 } | 139 } |
137 | 140 |
138 TEST_F(AudioReceiverTest, MultiplePendingGetCalls) { | 141 TEST_F(AudioReceiverTest, MultiplePendingGetCalls) { |
139 Configure(true); | 142 Configure(true); |
140 EXPECT_CALL(mock_transport_, SendRtcpPacket(testing::_)).WillRepeatedly( | 143 EXPECT_CALL(mock_transport_, SendRtcpPacket(testing::_)).WillRepeatedly( |
141 testing::Return(true)); | 144 testing::Return(true)); |
142 | 145 |
143 AudioFrameEncodedCallback frame_encoded_callback = | 146 AudioFrameEncodedCallback frame_encoded_callback = |
144 base::Bind(&TestAudioEncoderCallback::DeliverEncodedAudioFrame, | 147 base::Bind(&TestAudioEncoderCallback::DeliverEncodedAudioFrame, |
145 test_audio_encoder_callback_.get()); | 148 test_audio_encoder_callback_.get()); |
146 | 149 |
147 receiver_->GetEncodedAudioFrame(frame_encoded_callback); | 150 receiver_->GetEncodedAudioFrame(frame_encoded_callback); |
148 | 151 |
149 receiver_->IncomingParsedRtpPacket(payload_.data(), payload_.size(), | 152 receiver_->IncomingParsedRtpPacket(payload_.data(), payload_.size(), |
150 rtp_header_); | 153 rtp_header_); |
151 | 154 |
152 transport::EncodedAudioFrame audio_frame; | 155 transport::EncodedAudioFrame audio_frame; |
153 base::TimeTicks playout_time; | 156 base::TimeTicks playout_time; |
154 test_audio_encoder_callback_->SetExpectedResult(0, testing_clock_.NowTicks()); | 157 test_audio_encoder_callback_->SetExpectedResult( |
| 158 0, testing_clock_->NowTicks()); |
155 | 159 |
156 task_runner_->RunTasks(); | 160 task_runner_->RunTasks(); |
157 EXPECT_EQ(1, test_audio_encoder_callback_->number_times_called()); | 161 EXPECT_EQ(1, test_audio_encoder_callback_->number_times_called()); |
158 | 162 |
159 TestRtcpPacketBuilder rtcp_packet; | 163 TestRtcpPacketBuilder rtcp_packet; |
160 | 164 |
161 uint32 ntp_high; | 165 uint32 ntp_high; |
162 uint32 ntp_low; | 166 uint32 ntp_low; |
163 ConvertTimeTicksToNtp(testing_clock_.NowTicks(), &ntp_high, &ntp_low); | 167 ConvertTimeTicksToNtp(testing_clock_->NowTicks(), &ntp_high, &ntp_low); |
164 rtcp_packet.AddSrWithNtp(audio_config_.feedback_ssrc, ntp_high, ntp_low, | 168 rtcp_packet.AddSrWithNtp(audio_config_.feedback_ssrc, ntp_high, ntp_low, |
165 rtp_header_.webrtc.header.timestamp); | 169 rtp_header_.webrtc.header.timestamp); |
166 | 170 |
167 testing_clock_.Advance(base::TimeDelta::FromMilliseconds(20)); | 171 testing_clock_->Advance(base::TimeDelta::FromMilliseconds(20)); |
168 | 172 |
169 receiver_->IncomingPacket(rtcp_packet.Packet(), rtcp_packet.Length(), | 173 receiver_->IncomingPacket(rtcp_packet.Packet(), rtcp_packet.Length(), |
170 base::Bind(AudioReceiverTest::DummyDeletePacket, rtcp_packet.Packet())); | 174 base::Bind(AudioReceiverTest::DummyDeletePacket, rtcp_packet.Packet())); |
171 | 175 |
172 // Make sure that we are not continuous and that the RTP timestamp represent a | 176 // Make sure that we are not continuous and that the RTP timestamp represent a |
173 // time in the future. | 177 // time in the future. |
174 rtp_header_.is_key_frame = false; | 178 rtp_header_.is_key_frame = false; |
175 rtp_header_.frame_id = 2; | 179 rtp_header_.frame_id = 2; |
176 rtp_header_.is_reference = true; | 180 rtp_header_.is_reference = true; |
177 rtp_header_.reference_frame_id = 0; | 181 rtp_header_.reference_frame_id = 0; |
178 rtp_header_.webrtc.header.timestamp = 960; | 182 rtp_header_.webrtc.header.timestamp = 960; |
179 test_audio_encoder_callback_->SetExpectedResult(2, | 183 test_audio_encoder_callback_->SetExpectedResult(2, |
180 testing_clock_.NowTicks() + base::TimeDelta::FromMilliseconds(100)); | 184 testing_clock_->NowTicks() + base::TimeDelta::FromMilliseconds(100)); |
181 | 185 |
182 receiver_->IncomingParsedRtpPacket(payload_.data(), payload_.size(), | 186 receiver_->IncomingParsedRtpPacket(payload_.data(), payload_.size(), |
183 rtp_header_); | 187 rtp_header_); |
184 receiver_->GetEncodedAudioFrame(frame_encoded_callback); | 188 receiver_->GetEncodedAudioFrame(frame_encoded_callback); |
185 task_runner_->RunTasks(); | 189 task_runner_->RunTasks(); |
186 | 190 |
187 // Frame 2 should not come out at this point in time. | 191 // Frame 2 should not come out at this point in time. |
188 EXPECT_EQ(1, test_audio_encoder_callback_->number_times_called()); | 192 EXPECT_EQ(1, test_audio_encoder_callback_->number_times_called()); |
189 | 193 |
190 // Through on one more pending callback. | 194 // Through on one more pending callback. |
191 receiver_->GetEncodedAudioFrame(frame_encoded_callback); | 195 receiver_->GetEncodedAudioFrame(frame_encoded_callback); |
192 | 196 |
193 testing_clock_.Advance(base::TimeDelta::FromMilliseconds(100)); | 197 testing_clock_->Advance(base::TimeDelta::FromMilliseconds(100)); |
194 | 198 |
195 task_runner_->RunTasks(); | 199 task_runner_->RunTasks(); |
196 EXPECT_EQ(2, test_audio_encoder_callback_->number_times_called()); | 200 EXPECT_EQ(2, test_audio_encoder_callback_->number_times_called()); |
197 | 201 |
198 test_audio_encoder_callback_->SetExpectedResult(3, testing_clock_.NowTicks()); | 202 test_audio_encoder_callback_->SetExpectedResult( |
| 203 3, testing_clock_->NowTicks()); |
199 | 204 |
200 // Through on one more pending audio frame. | 205 // Through on one more pending audio frame. |
201 rtp_header_.frame_id = 3; | 206 rtp_header_.frame_id = 3; |
202 rtp_header_.is_reference = false; | 207 rtp_header_.is_reference = false; |
203 rtp_header_.reference_frame_id = 0; | 208 rtp_header_.reference_frame_id = 0; |
204 rtp_header_.webrtc.header.timestamp = 1280; | 209 rtp_header_.webrtc.header.timestamp = 1280; |
205 receiver_->IncomingParsedRtpPacket(payload_.data(), payload_.size(), | 210 receiver_->IncomingParsedRtpPacket(payload_.data(), payload_.size(), |
206 rtp_header_); | 211 rtp_header_); |
207 | 212 |
208 receiver_->GetEncodedAudioFrame(frame_encoded_callback); | 213 receiver_->GetEncodedAudioFrame(frame_encoded_callback); |
209 task_runner_->RunTasks(); | 214 task_runner_->RunTasks(); |
210 EXPECT_EQ(3, test_audio_encoder_callback_->number_times_called()); | 215 EXPECT_EQ(3, test_audio_encoder_callback_->number_times_called()); |
211 } | 216 } |
212 | 217 |
213 // TODO(mikhal): Add encoded frames. | 218 // TODO(mikhal): Add encoded frames. |
214 TEST_F(AudioReceiverTest, GetRawFrame) { | 219 TEST_F(AudioReceiverTest, GetRawFrame) { |
215 } | 220 } |
216 | 221 |
217 } // namespace cast | 222 } // namespace cast |
218 } // namespace media | 223 } // namespace media |
OLD | NEW |