Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(209)

Side by Side Diff: media/cast/receiver/frame_receiver_unittest.cc

Issue 308043006: [Cast] Clean-up: Merge RtpReceiver+AudioReceiver+VideoReceiver-->FrameReceiver. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Addressed hclam's comments. Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « media/cast/receiver/frame_receiver.cc ('k') | media/cast/receiver/video_decoder.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 <deque> 5 #include <deque>
6 #include <utility> 6 #include <utility>
7 7
8 #include "base/bind.h" 8 #include "base/bind.h"
9 #include "base/memory/ref_counted.h" 9 #include "base/memory/ref_counted.h"
10 #include "base/memory/scoped_ptr.h" 10 #include "base/memory/scoped_ptr.h"
11 #include "base/test/simple_test_tick_clock.h" 11 #include "base/test/simple_test_tick_clock.h"
12 #include "media/cast/cast_defines.h" 12 #include "media/cast/cast_defines.h"
13 #include "media/cast/cast_environment.h" 13 #include "media/cast/cast_environment.h"
14 #include "media/cast/logging/simple_event_subscriber.h" 14 #include "media/cast/logging/simple_event_subscriber.h"
15 #include "media/cast/receiver/frame_receiver.h"
15 #include "media/cast/rtcp/test_rtcp_packet_builder.h" 16 #include "media/cast/rtcp/test_rtcp_packet_builder.h"
16 #include "media/cast/test/fake_single_thread_task_runner.h" 17 #include "media/cast/test/fake_single_thread_task_runner.h"
17 #include "media/cast/test/utility/default_config.h" 18 #include "media/cast/test/utility/default_config.h"
18 #include "media/cast/transport/pacing/mock_paced_packet_sender.h" 19 #include "media/cast/transport/pacing/mock_paced_packet_sender.h"
19 #include "media/cast/video_receiver/video_receiver.h"
20 #include "testing/gmock/include/gmock/gmock.h" 20 #include "testing/gmock/include/gmock/gmock.h"
21 21
22 using ::testing::_; 22 using ::testing::_;
23 23
24 namespace media { 24 namespace media {
25 namespace cast { 25 namespace cast {
26 26
27 namespace { 27 namespace {
28 28
29 const int kPacketSize = 1500; 29 const int kPacketSize = 1500;
30 const uint32 kFirstFrameId = 1234; 30 const uint32 kFirstFrameId = 1234;
31 const int kPlayoutDelayMillis = 100; 31 const int kPlayoutDelayMillis = 100;
32 32
33 class FakeVideoClient { 33 class FakeFrameClient {
34 public: 34 public:
35 FakeVideoClient() : num_called_(0) {} 35 FakeFrameClient() : num_called_(0) {}
36 virtual ~FakeVideoClient() {} 36 virtual ~FakeFrameClient() {}
37 37
38 void AddExpectedResult(uint32 expected_frame_id, 38 void AddExpectedResult(uint32 expected_frame_id,
39 const base::TimeTicks& expected_playout_time) { 39 const base::TimeTicks& expected_playout_time) {
40 expected_results_.push_back( 40 expected_results_.push_back(
41 std::make_pair(expected_frame_id, expected_playout_time)); 41 std::make_pair(expected_frame_id, expected_playout_time));
42 } 42 }
43 43
44 void DeliverEncodedVideoFrame( 44 void DeliverEncodedFrame(scoped_ptr<transport::EncodedFrame> frame) {
45 scoped_ptr<transport::EncodedFrame> video_frame) {
46 SCOPED_TRACE(::testing::Message() << "num_called_ is " << num_called_); 45 SCOPED_TRACE(::testing::Message() << "num_called_ is " << num_called_);
47 ASSERT_FALSE(!video_frame) 46 ASSERT_FALSE(!frame)
48 << "If at shutdown: There were unsatisfied requests enqueued."; 47 << "If at shutdown: There were unsatisfied requests enqueued.";
49 ASSERT_FALSE(expected_results_.empty()); 48 ASSERT_FALSE(expected_results_.empty());
50 EXPECT_EQ(expected_results_.front().first, video_frame->frame_id); 49 EXPECT_EQ(expected_results_.front().first, frame->frame_id);
51 EXPECT_EQ(expected_results_.front().second, video_frame->reference_time); 50 EXPECT_EQ(expected_results_.front().second, frame->reference_time);
52 expected_results_.pop_front(); 51 expected_results_.pop_front();
53 ++num_called_; 52 ++num_called_;
54 } 53 }
55 54
56 int number_times_called() const { return num_called_; } 55 int number_times_called() const { return num_called_; }
57 56
58 private: 57 private:
59 std::deque<std::pair<uint32, base::TimeTicks> > expected_results_; 58 std::deque<std::pair<uint32, base::TimeTicks> > expected_results_;
60 int num_called_; 59 int num_called_;
61 60
62 DISALLOW_COPY_AND_ASSIGN(FakeVideoClient); 61 DISALLOW_COPY_AND_ASSIGN(FakeFrameClient);
63 }; 62 };
64 } // namespace 63 } // namespace
65 64
66 class VideoReceiverTest : public ::testing::Test { 65 class FrameReceiverTest : public ::testing::Test {
67 protected: 66 protected:
68 VideoReceiverTest() { 67 FrameReceiverTest() {
69 config_ = GetDefaultVideoReceiverConfig();
70 config_.rtp_max_delay_ms = kPlayoutDelayMillis;
71 // Note: Frame rate must divide 1000 without remainder so the test code
72 // doesn't have to account for rounding errors.
73 config_.max_frame_rate = 25;
74 config_.codec.video = transport::kVp8; // Frame skipping not allowed.
75 testing_clock_ = new base::SimpleTestTickClock(); 68 testing_clock_ = new base::SimpleTestTickClock();
76 testing_clock_->Advance(base::TimeTicks::Now() - base::TimeTicks()); 69 testing_clock_->Advance(base::TimeTicks::Now() - base::TimeTicks());
77 start_time_ = testing_clock_->NowTicks(); 70 start_time_ = testing_clock_->NowTicks();
78 task_runner_ = new test::FakeSingleThreadTaskRunner(testing_clock_); 71 task_runner_ = new test::FakeSingleThreadTaskRunner(testing_clock_);
79 72
80 cast_environment_ = 73 cast_environment_ =
81 new CastEnvironment(scoped_ptr<base::TickClock>(testing_clock_).Pass(), 74 new CastEnvironment(scoped_ptr<base::TickClock>(testing_clock_).Pass(),
82 task_runner_, 75 task_runner_,
83 task_runner_, 76 task_runner_,
84 task_runner_); 77 task_runner_);
85
86 receiver_.reset(new VideoReceiver(
87 cast_environment_, config_, &mock_transport_));
88 } 78 }
89 79
90 virtual ~VideoReceiverTest() {} 80 virtual ~FrameReceiverTest() {}
91 81
92 virtual void SetUp() { 82 virtual void SetUp() {
93 payload_.assign(kPacketSize, 0); 83 payload_.assign(kPacketSize, 0);
94 84
95 // Always start with a key frame. 85 // Always start with a key frame.
96 rtp_header_.is_key_frame = true; 86 rtp_header_.is_key_frame = true;
97 rtp_header_.frame_id = kFirstFrameId; 87 rtp_header_.frame_id = kFirstFrameId;
98 rtp_header_.reference_frame_id = rtp_header_.frame_id;
99 rtp_header_.packet_id = 0; 88 rtp_header_.packet_id = 0;
100 rtp_header_.max_packet_id = 0; 89 rtp_header_.max_packet_id = 0;
90 rtp_header_.reference_frame_id = rtp_header_.frame_id;
91 rtp_header_.rtp_timestamp = 0;
92 }
93
94 void CreateFrameReceiverOfAudio() {
95 config_ = GetDefaultAudioReceiverConfig();
96 config_.rtp_max_delay_ms = kPlayoutDelayMillis;
97
98 receiver_.reset(new FrameReceiver(
99 cast_environment_, config_, AUDIO_EVENT, &mock_transport_));
100 }
101
102 void CreateFrameReceiverOfVideo() {
103 config_ = GetDefaultVideoReceiverConfig();
104 config_.rtp_max_delay_ms = kPlayoutDelayMillis;
105 // Note: Frame rate must divide 1000 without remainder so the test code
106 // doesn't have to account for rounding errors.
107 config_.max_frame_rate = 25;
108
109 receiver_.reset(new FrameReceiver(
110 cast_environment_, config_, VIDEO_EVENT, &mock_transport_));
101 } 111 }
102 112
103 void FeedOneFrameIntoReceiver() { 113 void FeedOneFrameIntoReceiver() {
104 receiver_->OnReceivedPayloadData( 114 // Note: For testing purposes, a frame consists of only a single packet.
105 payload_.data(), payload_.size(), rtp_header_); 115 receiver_->ProcessParsedPacket(
116 rtp_header_, payload_.data(), payload_.size());
106 } 117 }
107 118
108 void FeedLipSyncInfoIntoReceiver() { 119 void FeedLipSyncInfoIntoReceiver() {
109 const base::TimeTicks now = testing_clock_->NowTicks(); 120 const base::TimeTicks now = testing_clock_->NowTicks();
110 const int64 rtp_timestamp = (now - start_time_) * 121 const int64 rtp_timestamp = (now - start_time_) *
111 kVideoFrequency / base::TimeDelta::FromSeconds(1); 122 config_.frequency / base::TimeDelta::FromSeconds(1);
112 CHECK_LE(0, rtp_timestamp); 123 CHECK_LE(0, rtp_timestamp);
113 uint32 ntp_seconds; 124 uint32 ntp_seconds;
114 uint32 ntp_fraction; 125 uint32 ntp_fraction;
115 ConvertTimeTicksToNtp(now, &ntp_seconds, &ntp_fraction); 126 ConvertTimeTicksToNtp(now, &ntp_seconds, &ntp_fraction);
116 TestRtcpPacketBuilder rtcp_packet; 127 TestRtcpPacketBuilder rtcp_packet;
117 rtcp_packet.AddSrWithNtp(config_.incoming_ssrc, 128 rtcp_packet.AddSrWithNtp(config_.incoming_ssrc,
118 ntp_seconds, ntp_fraction, 129 ntp_seconds, ntp_fraction,
119 static_cast<uint32>(rtp_timestamp)); 130 static_cast<uint32>(rtp_timestamp));
120 receiver_->IncomingPacket(rtcp_packet.GetPacket().Pass()); 131 ASSERT_TRUE(receiver_->ProcessPacket(rtcp_packet.GetPacket().Pass()));
121 } 132 }
122 133
123 FrameReceiverConfig config_; 134 FrameReceiverConfig config_;
124 std::vector<uint8> payload_; 135 std::vector<uint8> payload_;
125 RtpCastHeader rtp_header_; 136 RtpCastHeader rtp_header_;
126 base::SimpleTestTickClock* testing_clock_; // Owned by CastEnvironment. 137 base::SimpleTestTickClock* testing_clock_; // Owned by CastEnvironment.
127 base::TimeTicks start_time_; 138 base::TimeTicks start_time_;
128 transport::MockPacedPacketSender mock_transport_; 139 transport::MockPacedPacketSender mock_transport_;
129 scoped_refptr<test::FakeSingleThreadTaskRunner> task_runner_; 140 scoped_refptr<test::FakeSingleThreadTaskRunner> task_runner_;
130 scoped_refptr<CastEnvironment> cast_environment_; 141 scoped_refptr<CastEnvironment> cast_environment_;
131 FakeVideoClient fake_video_client_; 142 FakeFrameClient frame_client_;
132 143
133 // Important for the VideoReceiver to be declared last, since its dependencies 144 // Important for the FrameReceiver to be declared last, since its dependencies
134 // must remain alive until after its destruction. 145 // must remain alive until after its destruction.
135 scoped_ptr<VideoReceiver> receiver_; 146 scoped_ptr<FrameReceiver> receiver_;
136 147
137 DISALLOW_COPY_AND_ASSIGN(VideoReceiverTest); 148 DISALLOW_COPY_AND_ASSIGN(FrameReceiverTest);
138 }; 149 };
139 150
140 TEST_F(VideoReceiverTest, ReceivesOneFrame) { 151 TEST_F(FrameReceiverTest, RejectsUnparsablePackets) {
152 CreateFrameReceiverOfVideo();
153
141 SimpleEventSubscriber event_subscriber; 154 SimpleEventSubscriber event_subscriber;
142 cast_environment_->Logging()->AddRawEventSubscriber(&event_subscriber); 155 cast_environment_->Logging()->AddRawEventSubscriber(&event_subscriber);
143 156
157 const bool success = receiver_->ProcessPacket(
158 scoped_ptr<Packet>(new Packet(kPacketSize, 0xff)).Pass());
159 EXPECT_FALSE(success);
160
161 // Confirm no log events.
162 std::vector<FrameEvent> frame_events;
163 event_subscriber.GetFrameEventsAndReset(&frame_events);
164 EXPECT_TRUE(frame_events.empty());
165 cast_environment_->Logging()->RemoveRawEventSubscriber(&event_subscriber);
166 }
167
168 TEST_F(FrameReceiverTest, ReceivesOneFrame) {
169 CreateFrameReceiverOfAudio();
170
171 SimpleEventSubscriber event_subscriber;
172 cast_environment_->Logging()->AddRawEventSubscriber(&event_subscriber);
173
144 EXPECT_CALL(mock_transport_, SendRtcpPacket(_, _)) 174 EXPECT_CALL(mock_transport_, SendRtcpPacket(_, _))
145 .WillRepeatedly(testing::Return(true)); 175 .WillRepeatedly(testing::Return(true));
146 176
147 FeedLipSyncInfoIntoReceiver(); 177 FeedLipSyncInfoIntoReceiver();
148 task_runner_->RunTasks(); 178 task_runner_->RunTasks();
149 179
150 // Enqueue a request for a video frame. 180 // Enqueue a request for a frame.
151 receiver_->GetEncodedVideoFrame( 181 receiver_->RequestEncodedFrame(
152 base::Bind(&FakeVideoClient::DeliverEncodedVideoFrame, 182 base::Bind(&FakeFrameClient::DeliverEncodedFrame,
153 base::Unretained(&fake_video_client_))); 183 base::Unretained(&frame_client_)));
154 184
155 // The request should not be satisfied since no packets have been received. 185 // The request should not be satisfied since no packets have been received.
156 task_runner_->RunTasks(); 186 task_runner_->RunTasks();
157 EXPECT_EQ(0, fake_video_client_.number_times_called()); 187 EXPECT_EQ(0, frame_client_.number_times_called());
158 188
159 // Deliver one video frame to the receiver and expect to get one frame back. 189 // Deliver one frame to the receiver and expect to get one frame back.
160 const base::TimeDelta target_playout_delay = 190 const base::TimeDelta target_playout_delay =
161 base::TimeDelta::FromMilliseconds(kPlayoutDelayMillis); 191 base::TimeDelta::FromMilliseconds(kPlayoutDelayMillis);
162 fake_video_client_.AddExpectedResult( 192 frame_client_.AddExpectedResult(
163 kFirstFrameId, testing_clock_->NowTicks() + target_playout_delay); 193 kFirstFrameId, testing_clock_->NowTicks() + target_playout_delay);
164 FeedOneFrameIntoReceiver(); 194 FeedOneFrameIntoReceiver();
165 task_runner_->RunTasks(); 195 task_runner_->RunTasks();
166 EXPECT_EQ(1, fake_video_client_.number_times_called()); 196 EXPECT_EQ(1, frame_client_.number_times_called());
167 197
198 // Was the frame logged?
168 std::vector<FrameEvent> frame_events; 199 std::vector<FrameEvent> frame_events;
169 event_subscriber.GetFrameEventsAndReset(&frame_events); 200 event_subscriber.GetFrameEventsAndReset(&frame_events);
170
171 ASSERT_TRUE(!frame_events.empty()); 201 ASSERT_TRUE(!frame_events.empty());
172 EXPECT_EQ(FRAME_ACK_SENT, frame_events.begin()->type); 202 EXPECT_EQ(FRAME_ACK_SENT, frame_events.begin()->type);
203 EXPECT_EQ(AUDIO_EVENT, frame_events.begin()->media_type);
173 EXPECT_EQ(rtp_header_.frame_id, frame_events.begin()->frame_id); 204 EXPECT_EQ(rtp_header_.frame_id, frame_events.begin()->frame_id);
174 EXPECT_EQ(rtp_header_.rtp_timestamp, frame_events.begin()->rtp_timestamp); 205 EXPECT_EQ(rtp_header_.rtp_timestamp, frame_events.begin()->rtp_timestamp);
175
176 cast_environment_->Logging()->RemoveRawEventSubscriber(&event_subscriber); 206 cast_environment_->Logging()->RemoveRawEventSubscriber(&event_subscriber);
177 } 207 }
178 208
179 TEST_F(VideoReceiverTest, ReceivesFramesRefusingToSkipAny) { 209 TEST_F(FrameReceiverTest, ReceivesFramesSkippingWhenAppropriate) {
210 CreateFrameReceiverOfAudio();
211
212 SimpleEventSubscriber event_subscriber;
213 cast_environment_->Logging()->AddRawEventSubscriber(&event_subscriber);
214
180 EXPECT_CALL(mock_transport_, SendRtcpPacket(_, _)) 215 EXPECT_CALL(mock_transport_, SendRtcpPacket(_, _))
181 .WillRepeatedly(testing::Return(true)); 216 .WillRepeatedly(testing::Return(true));
182 217
218 const uint32 rtp_advance_per_frame =
219 config_.frequency / config_.max_frame_rate;
220 const base::TimeDelta time_advance_per_frame =
221 base::TimeDelta::FromSeconds(1) / config_.max_frame_rate;
222
223 // Feed and process lip sync in receiver.
224 FeedLipSyncInfoIntoReceiver();
225 task_runner_->RunTasks();
226 const base::TimeTicks first_frame_capture_time = testing_clock_->NowTicks();
227
228 // Enqueue a request for a frame.
229 const ReceiveEncodedFrameCallback frame_encoded_callback =
230 base::Bind(&FakeFrameClient::DeliverEncodedFrame,
231 base::Unretained(&frame_client_));
232 receiver_->RequestEncodedFrame(frame_encoded_callback);
233 task_runner_->RunTasks();
234 EXPECT_EQ(0, frame_client_.number_times_called());
235
236 // Receive one frame and expect to see the first request satisfied.
237 const base::TimeDelta target_playout_delay =
238 base::TimeDelta::FromMilliseconds(kPlayoutDelayMillis);
239 frame_client_.AddExpectedResult(
240 kFirstFrameId, first_frame_capture_time + target_playout_delay);
241 rtp_header_.rtp_timestamp = 0;
242 FeedOneFrameIntoReceiver(); // Frame 1
243 task_runner_->RunTasks();
244 EXPECT_EQ(1, frame_client_.number_times_called());
245
246 // Enqueue a second request for a frame, but it should not be fulfilled yet.
247 receiver_->RequestEncodedFrame(frame_encoded_callback);
248 task_runner_->RunTasks();
249 EXPECT_EQ(1, frame_client_.number_times_called());
250
251 // Receive one frame out-of-order: Make sure that we are not continuous and
252 // that the RTP timestamp represents a time in the future.
253 rtp_header_.frame_id = kFirstFrameId + 2; // "Frame 3"
254 rtp_header_.reference_frame_id = rtp_header_.frame_id;
255 rtp_header_.rtp_timestamp += 2 * rtp_advance_per_frame;
256 frame_client_.AddExpectedResult(
257 kFirstFrameId + 2,
258 first_frame_capture_time + 2 * time_advance_per_frame +
259 target_playout_delay);
260 FeedOneFrameIntoReceiver(); // Frame 3
261
262 // Frame 2 should not come out at this point in time.
263 task_runner_->RunTasks();
264 EXPECT_EQ(1, frame_client_.number_times_called());
265
266 // Enqueue a third request for a frame.
267 receiver_->RequestEncodedFrame(frame_encoded_callback);
268 task_runner_->RunTasks();
269 EXPECT_EQ(1, frame_client_.number_times_called());
270
271 // Now, advance time forward such that the receiver is convinced it should
272 // skip Frame 2. Frame 3 is emitted (to satisfy the second request) because a
273 // decision was made to skip over the no-show Frame 2.
274 testing_clock_->Advance(2 * time_advance_per_frame + target_playout_delay);
275 task_runner_->RunTasks();
276 EXPECT_EQ(2, frame_client_.number_times_called());
277
278 // Receive Frame 4 and expect it to fulfill the third request immediately.
279 rtp_header_.frame_id = kFirstFrameId + 3; // "Frame 4"
280 rtp_header_.reference_frame_id = rtp_header_.frame_id;
281 rtp_header_.rtp_timestamp += rtp_advance_per_frame;
282 frame_client_.AddExpectedResult(
283 kFirstFrameId + 3, first_frame_capture_time + 3 * time_advance_per_frame +
284 target_playout_delay);
285 FeedOneFrameIntoReceiver(); // Frame 4
286 task_runner_->RunTasks();
287 EXPECT_EQ(3, frame_client_.number_times_called());
288
289 // Move forward to the playout time of an unreceived Frame 5. Expect no
290 // additional frames were emitted.
291 testing_clock_->Advance(3 * time_advance_per_frame);
292 task_runner_->RunTasks();
293 EXPECT_EQ(3, frame_client_.number_times_called());
294
295 // Were only non-skipped frames logged?
296 std::vector<FrameEvent> frame_events;
297 event_subscriber.GetFrameEventsAndReset(&frame_events);
298 ASSERT_TRUE(!frame_events.empty());
299 for (size_t i = 0; i < frame_events.size(); ++i) {
300 EXPECT_EQ(FRAME_ACK_SENT, frame_events[i].type);
301 EXPECT_EQ(AUDIO_EVENT, frame_events[i].media_type);
302 EXPECT_LE(kFirstFrameId, frame_events[i].frame_id);
303 EXPECT_GE(kFirstFrameId + 4, frame_events[i].frame_id);
304 const int frame_offset = frame_events[i].frame_id - kFirstFrameId;
305 EXPECT_NE(frame_offset, 1); // Frame 2 never received.
306 EXPECT_EQ(frame_offset * rtp_advance_per_frame,
307 frame_events[i].rtp_timestamp);
308 }
309 cast_environment_->Logging()->RemoveRawEventSubscriber(&event_subscriber);
310 }
311
312 TEST_F(FrameReceiverTest, ReceivesFramesRefusingToSkipAny) {
313 CreateFrameReceiverOfVideo();
314
315 SimpleEventSubscriber event_subscriber;
316 cast_environment_->Logging()->AddRawEventSubscriber(&event_subscriber);
317
318 EXPECT_CALL(mock_transport_, SendRtcpPacket(_, _))
319 .WillRepeatedly(testing::Return(true));
320
183 const uint32 rtp_advance_per_frame = 321 const uint32 rtp_advance_per_frame =
184 config_.frequency / config_.max_frame_rate; 322 config_.frequency / config_.max_frame_rate;
185 const base::TimeDelta time_advance_per_frame = 323 const base::TimeDelta time_advance_per_frame =
186 base::TimeDelta::FromSeconds(1) / config_.max_frame_rate; 324 base::TimeDelta::FromSeconds(1) / config_.max_frame_rate;
187 325
188 // Feed and process lip sync in receiver. 326 // Feed and process lip sync in receiver.
189 FeedLipSyncInfoIntoReceiver(); 327 FeedLipSyncInfoIntoReceiver();
190 task_runner_->RunTasks(); 328 task_runner_->RunTasks();
191 const base::TimeTicks first_frame_capture_time = testing_clock_->NowTicks(); 329 const base::TimeTicks first_frame_capture_time = testing_clock_->NowTicks();
192 330
193 // Enqueue a request for a video frame. 331 // Enqueue a request for a frame.
194 const FrameEncodedCallback frame_encoded_callback = 332 const ReceiveEncodedFrameCallback frame_encoded_callback =
195 base::Bind(&FakeVideoClient::DeliverEncodedVideoFrame, 333 base::Bind(&FakeFrameClient::DeliverEncodedFrame,
196 base::Unretained(&fake_video_client_)); 334 base::Unretained(&frame_client_));
197 receiver_->GetEncodedVideoFrame(frame_encoded_callback); 335 receiver_->RequestEncodedFrame(frame_encoded_callback);
198 task_runner_->RunTasks(); 336 task_runner_->RunTasks();
199 EXPECT_EQ(0, fake_video_client_.number_times_called()); 337 EXPECT_EQ(0, frame_client_.number_times_called());
200 338
201 // Receive one video frame and expect to see the first request satisfied. 339 // Receive one frame and expect to see the first request satisfied.
202 const base::TimeDelta target_playout_delay = 340 const base::TimeDelta target_playout_delay =
203 base::TimeDelta::FromMilliseconds(kPlayoutDelayMillis); 341 base::TimeDelta::FromMilliseconds(kPlayoutDelayMillis);
204 fake_video_client_.AddExpectedResult( 342 frame_client_.AddExpectedResult(
205 kFirstFrameId, first_frame_capture_time + target_playout_delay); 343 kFirstFrameId, first_frame_capture_time + target_playout_delay);
206 rtp_header_.rtp_timestamp = 0; 344 rtp_header_.rtp_timestamp = 0;
207 FeedOneFrameIntoReceiver(); 345 FeedOneFrameIntoReceiver(); // Frame 1
208 task_runner_->RunTasks(); 346 task_runner_->RunTasks();
209 EXPECT_EQ(1, fake_video_client_.number_times_called()); 347 EXPECT_EQ(1, frame_client_.number_times_called());
210 348
211 // Enqueue a second request for a video frame, but it should not be 349 // Enqueue a second request for a frame, but it should not be fulfilled yet.
212 // fulfilled yet. 350 receiver_->RequestEncodedFrame(frame_encoded_callback);
213 receiver_->GetEncodedVideoFrame(frame_encoded_callback);
214 task_runner_->RunTasks(); 351 task_runner_->RunTasks();
215 EXPECT_EQ(1, fake_video_client_.number_times_called()); 352 EXPECT_EQ(1, frame_client_.number_times_called());
216 353
217 // Receive one video frame out-of-order: Make sure that we are not continuous 354 // Receive one frame out-of-order: Make sure that we are not continuous and
218 // and that the RTP timestamp represents a time in the future. 355 // that the RTP timestamp represents a time in the future.
219 rtp_header_.is_key_frame = false; 356 rtp_header_.is_key_frame = false;
220 rtp_header_.frame_id = kFirstFrameId + 2; // "Frame 3" 357 rtp_header_.frame_id = kFirstFrameId + 2; // "Frame 3"
221 rtp_header_.reference_frame_id = kFirstFrameId + 1; // "Frame 2" 358 rtp_header_.reference_frame_id = kFirstFrameId + 1; // "Frame 2"
222 rtp_header_.rtp_timestamp += 2 * rtp_advance_per_frame; 359 rtp_header_.rtp_timestamp += 2 * rtp_advance_per_frame;
223 FeedOneFrameIntoReceiver(); 360 FeedOneFrameIntoReceiver(); // Frame 3
224 361
225 // Frame 2 should not come out at this point in time. 362 // Frame 2 should not come out at this point in time.
226 task_runner_->RunTasks(); 363 task_runner_->RunTasks();
227 EXPECT_EQ(1, fake_video_client_.number_times_called()); 364 EXPECT_EQ(1, frame_client_.number_times_called());
228 365
229 // Enqueue a third request for a video frame. 366 // Enqueue a third request for a frame.
230 receiver_->GetEncodedVideoFrame(frame_encoded_callback); 367 receiver_->RequestEncodedFrame(frame_encoded_callback);
231 task_runner_->RunTasks(); 368 task_runner_->RunTasks();
232 EXPECT_EQ(1, fake_video_client_.number_times_called()); 369 EXPECT_EQ(1, frame_client_.number_times_called());
233 370
234 // Now, advance time forward such that Frame 2 is now too late for playback. 371 // Now, advance time forward such that Frame 2 is now too late for playback.
235 // Regardless, the receiver must NOT emit Frame 3 yet because it is not 372 // Regardless, the receiver must NOT emit Frame 3 yet because it is not
236 // allowed to skip frames for VP8. 373 // allowed to skip frames when dependencies are not satisfied. In other
374 // words, Frame 3 is not decodable without Frame 2.
237 testing_clock_->Advance(2 * time_advance_per_frame + target_playout_delay); 375 testing_clock_->Advance(2 * time_advance_per_frame + target_playout_delay);
238 task_runner_->RunTasks(); 376 task_runner_->RunTasks();
239 EXPECT_EQ(1, fake_video_client_.number_times_called()); 377 EXPECT_EQ(1, frame_client_.number_times_called());
240 378
241 // Now receive Frame 2 and expect both the second and third requests to be 379 // Now receive Frame 2 and expect both the second and third requests to be
242 // fulfilled immediately. 380 // fulfilled immediately.
243 fake_video_client_.AddExpectedResult( 381 frame_client_.AddExpectedResult(
244 kFirstFrameId + 1, // "Frame 2" 382 kFirstFrameId + 1, // "Frame 2"
245 first_frame_capture_time + 1 * time_advance_per_frame + 383 first_frame_capture_time + 1 * time_advance_per_frame +
246 target_playout_delay); 384 target_playout_delay);
247 fake_video_client_.AddExpectedResult( 385 frame_client_.AddExpectedResult(
248 kFirstFrameId + 2, // "Frame 3" 386 kFirstFrameId + 2, // "Frame 3"
249 first_frame_capture_time + 2 * time_advance_per_frame + 387 first_frame_capture_time + 2 * time_advance_per_frame +
250 target_playout_delay); 388 target_playout_delay);
251 --rtp_header_.frame_id; // "Frame 2" 389 --rtp_header_.frame_id; // "Frame 2"
252 --rtp_header_.reference_frame_id; // "Frame 1" 390 --rtp_header_.reference_frame_id; // "Frame 1"
253 rtp_header_.rtp_timestamp -= rtp_advance_per_frame; 391 rtp_header_.rtp_timestamp -= rtp_advance_per_frame;
254 FeedOneFrameIntoReceiver(); 392 FeedOneFrameIntoReceiver(); // Frame 2
255 task_runner_->RunTasks(); 393 task_runner_->RunTasks();
256 EXPECT_EQ(3, fake_video_client_.number_times_called()); 394 EXPECT_EQ(3, frame_client_.number_times_called());
257 395
258 // Move forward to the playout time of an unreceived Frame 5. Expect no 396 // Move forward to the playout time of an unreceived Frame 5. Expect no
259 // additional frames were emitted. 397 // additional frames were emitted.
260 testing_clock_->Advance(3 * time_advance_per_frame); 398 testing_clock_->Advance(3 * time_advance_per_frame);
261 task_runner_->RunTasks(); 399 task_runner_->RunTasks();
262 EXPECT_EQ(3, fake_video_client_.number_times_called()); 400 EXPECT_EQ(3, frame_client_.number_times_called());
401
402 // Sanity-check logging results.
403 std::vector<FrameEvent> frame_events;
404 event_subscriber.GetFrameEventsAndReset(&frame_events);
405 ASSERT_TRUE(!frame_events.empty());
406 for (size_t i = 0; i < frame_events.size(); ++i) {
407 EXPECT_EQ(FRAME_ACK_SENT, frame_events[i].type);
408 EXPECT_EQ(VIDEO_EVENT, frame_events[i].media_type);
409 EXPECT_LE(kFirstFrameId, frame_events[i].frame_id);
410 EXPECT_GE(kFirstFrameId + 3, frame_events[i].frame_id);
411 const int frame_offset = frame_events[i].frame_id - kFirstFrameId;
412 EXPECT_EQ(frame_offset * rtp_advance_per_frame,
413 frame_events[i].rtp_timestamp);
414 }
415 cast_environment_->Logging()->RemoveRawEventSubscriber(&event_subscriber);
263 } 416 }
264 417
265 } // namespace cast 418 } // namespace cast
266 } // namespace media 419 } // namespace media
OLDNEW
« no previous file with comments | « media/cast/receiver/frame_receiver.cc ('k') | media/cast/receiver/video_decoder.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698