1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "base/memory/ref_counted.h"
6 #include "base/memory/scoped_ptr.h"
7 #include "base/test/simple_test_tick_clock.h"
8 #include "base/time/tick_clock.h"
9 #include "media/cast/cast_environment.h"
10 #include "media/cast/logging/encoding_event_subscriber.h"
11 #include "media/cast/logging/logging_defines.h"
12 #include "media/cast/test/fake_single_thread_task_runner.h"
13 #include "testing/gtest/include/gtest/gtest.h"
15 using media::cast::proto::AggregatedFrameEvent;
16 using media::cast::proto::AggregatedPacketEvent;
17 using media::cast::proto::BasePacketEvent;
18 using media::cast::proto::LogMetadata;
22 int64 InMilliseconds(base::TimeTicks event_time) {
23 return (event_time - base::TimeTicks()).InMilliseconds();
31 class EncodingEventSubscriberTest : public ::testing::Test {
33 EncodingEventSubscriberTest()
34 : testing_clock_(new base::SimpleTestTickClock()),
35 task_runner_(new test::FakeSingleThreadTaskRunner(testing_clock_)),
36 cast_environment_(new CastEnvironment(
37 scoped_ptr<base::TickClock>(testing_clock_).Pass(),
41 first_rtp_timestamp_(0) {}
43 void Init(EventMediaType event_media_type) {
44 DCHECK(!event_subscriber_);
45 event_subscriber_.reset(new EncodingEventSubscriber(event_media_type, 10));
46 cast_environment_->Logging()->AddRawEventSubscriber(
47 event_subscriber_.get());
50 virtual ~EncodingEventSubscriberTest() {
51 if (event_subscriber_) {
52 cast_environment_->Logging()->RemoveRawEventSubscriber(
53 event_subscriber_.get());
57 void GetEventsAndReset() {
58 event_subscriber_->GetEventsAndReset(
59 &metadata_, &frame_events_, &packet_events_);
60 first_rtp_timestamp_ = metadata_.first_rtp_timestamp();
63 base::SimpleTestTickClock* testing_clock_; // Owned by CastEnvironment.
64 scoped_refptr<test::FakeSingleThreadTaskRunner> task_runner_;
65 scoped_refptr<CastEnvironment> cast_environment_;
66 scoped_ptr<EncodingEventSubscriber> event_subscriber_;
67 FrameEventMap frame_events_;
68 PacketEventMap packet_events_;
69 LogMetadata metadata_;
70 RtpTimestamp first_rtp_timestamp_;
73 TEST_F(EncodingEventSubscriberTest, FrameEventTruncating) {
76 base::TimeTicks now(testing_clock_->NowTicks());
78 // Entry with RTP timestamp 0 should get dropped.
79 for (int i = 0; i < 11; i++) {
80 cast_environment_->Logging()->InsertFrameEvent(now,
84 cast_environment_->Logging()->InsertFrameEvent(now,
92 ASSERT_EQ(10u, frame_events_.size());
93 EXPECT_EQ(100u, frame_events_.begin()->first);
94 EXPECT_EQ(1000u, frame_events_.rbegin()->first);
97 TEST_F(EncodingEventSubscriberTest, PacketEventTruncating) {
100 base::TimeTicks now(testing_clock_->NowTicks());
102 // Entry with RTP timestamp 0 should get dropped.
103 for (int i = 0; i < 11; i++) {
104 cast_environment_->Logging()->InsertPacketEvent(now,
105 kAudioPacketReceived,
106 /*rtp_timestamp*/ i * 100,
109 /*max_packet_id*/ 10,
115 ASSERT_EQ(10u, packet_events_.size());
116 EXPECT_EQ(100u, packet_events_.begin()->first);
117 EXPECT_EQ(1000u, packet_events_.rbegin()->first);
120 TEST_F(EncodingEventSubscriberTest, EventFiltering) {
123 base::TimeTicks now(testing_clock_->NowTicks());
124 RtpTimestamp rtp_timestamp = 100;
125 cast_environment_->Logging()->InsertFrameEvent(now,
130 // This is an AUDIO_EVENT and shouldn't be processed by the subscriber.
131 cast_environment_->Logging()->InsertFrameEvent(now,
138 FrameEventMap::iterator frame_it = frame_events_.find(0);
139 ASSERT_TRUE(frame_it != frame_events_.end());
141 linked_ptr<AggregatedFrameEvent> frame_event = frame_it->second;
143 ASSERT_EQ(1, frame_event->event_type_size());
144 EXPECT_EQ(media::cast::proto::VIDEO_FRAME_DECODED,
145 frame_event->event_type(0));
149 EXPECT_TRUE(packet_events_.empty());
152 TEST_F(EncodingEventSubscriberTest, FrameEvent) {
154 base::TimeTicks now(testing_clock_->NowTicks());
155 RtpTimestamp rtp_timestamp = 100;
156 cast_environment_->Logging()->InsertFrameEvent(now, kVideoFrameDecoded,
162 ASSERT_EQ(1u, frame_events_.size());
164 RtpTimestamp relative_rtp_timestamp = rtp_timestamp - first_rtp_timestamp_;
165 FrameEventMap::iterator it = frame_events_.find(relative_rtp_timestamp);
166 ASSERT_TRUE(it != frame_events_.end());
168 linked_ptr<AggregatedFrameEvent> event = it->second;
170 EXPECT_EQ(relative_rtp_timestamp, event->relative_rtp_timestamp());
172 ASSERT_EQ(1, event->event_type_size());
173 EXPECT_EQ(media::cast::proto::VIDEO_FRAME_DECODED, event->event_type(0));
174 ASSERT_EQ(1, event->event_timestamp_ms_size());
175 EXPECT_EQ(InMilliseconds(now), event->event_timestamp_ms(0));
177 EXPECT_EQ(0, event->encoded_frame_size());
178 EXPECT_EQ(0, event->delay_millis());
181 EXPECT_TRUE(frame_events_.empty());
184 TEST_F(EncodingEventSubscriberTest, FrameEventDelay) {
186 base::TimeTicks now(testing_clock_->NowTicks());
187 RtpTimestamp rtp_timestamp = 100;
189 cast_environment_->Logging()->InsertFrameEventWithDelay(
190 now, kAudioPlayoutDelay, rtp_timestamp,
191 /*frame_id*/ 0, base::TimeDelta::FromMilliseconds(delay_ms));
195 ASSERT_EQ(1u, frame_events_.size());
197 RtpTimestamp relative_rtp_timestamp = rtp_timestamp - first_rtp_timestamp_;
198 FrameEventMap::iterator it = frame_events_.find(relative_rtp_timestamp);
199 ASSERT_TRUE(it != frame_events_.end());
201 linked_ptr<AggregatedFrameEvent> event = it->second;
203 EXPECT_EQ(relative_rtp_timestamp, event->relative_rtp_timestamp());
205 ASSERT_EQ(1, event->event_type_size());
206 EXPECT_EQ(media::cast::proto::AUDIO_PLAYOUT_DELAY, event->event_type(0));
207 ASSERT_EQ(1, event->event_timestamp_ms_size());
208 EXPECT_EQ(InMilliseconds(now), event->event_timestamp_ms(0));
210 EXPECT_EQ(0, event->encoded_frame_size());
211 EXPECT_EQ(100, event->delay_millis());
214 TEST_F(EncodingEventSubscriberTest, FrameEventSize) {
216 base::TimeTicks now(testing_clock_->NowTicks());
217 RtpTimestamp rtp_timestamp = 100;
219 cast_environment_->Logging()->InsertFrameEventWithSize(
220 now, kVideoFrameEncoded, rtp_timestamp,
221 /*frame_id*/ 0, size);
225 ASSERT_EQ(1u, frame_events_.size());
227 RtpTimestamp relative_rtp_timestamp = rtp_timestamp - first_rtp_timestamp_;
228 FrameEventMap::iterator it = frame_events_.find(relative_rtp_timestamp);
229 ASSERT_TRUE(it != frame_events_.end());
231 linked_ptr<AggregatedFrameEvent> event = it->second;
233 EXPECT_EQ(relative_rtp_timestamp, event->relative_rtp_timestamp());
235 ASSERT_EQ(1, event->event_type_size());
236 EXPECT_EQ(media::cast::proto::VIDEO_FRAME_ENCODED, event->event_type(0));
237 ASSERT_EQ(1, event->event_timestamp_ms_size());
238 EXPECT_EQ(InMilliseconds(now), event->event_timestamp_ms(0));
240 EXPECT_EQ(size, event->encoded_frame_size());
241 EXPECT_EQ(0, event->delay_millis());
244 TEST_F(EncodingEventSubscriberTest, MultipleFrameEvents) {
246 RtpTimestamp rtp_timestamp1 = 100;
247 RtpTimestamp rtp_timestamp2 = 200;
248 base::TimeTicks now1(testing_clock_->NowTicks());
249 cast_environment_->Logging()->InsertFrameEventWithDelay(
250 now1, kAudioPlayoutDelay, rtp_timestamp1,
251 /*frame_id*/ 0, /*delay*/ base::TimeDelta::FromMilliseconds(100));
253 testing_clock_->Advance(base::TimeDelta::FromMilliseconds(20));
254 base::TimeTicks now2(testing_clock_->NowTicks());
255 cast_environment_->Logging()->InsertFrameEventWithSize(
256 now2, kAudioFrameEncoded, rtp_timestamp2,
257 /*frame_id*/ 0, /*size*/ 123);
259 testing_clock_->Advance(base::TimeDelta::FromMilliseconds(20));
260 base::TimeTicks now3(testing_clock_->NowTicks());
261 cast_environment_->Logging()->InsertFrameEvent(
262 now3, kAudioFrameDecoded, rtp_timestamp1, /*frame_id*/ 0);
266 ASSERT_EQ(2u, frame_events_.size());
268 RtpTimestamp relative_rtp_timestamp = rtp_timestamp1 - first_rtp_timestamp_;
269 FrameEventMap::iterator it = frame_events_.find(relative_rtp_timestamp);
270 ASSERT_TRUE(it != frame_events_.end());
272 linked_ptr<AggregatedFrameEvent> event = it->second;
274 EXPECT_EQ(relative_rtp_timestamp, event->relative_rtp_timestamp());
276 ASSERT_EQ(2, event->event_type_size());
277 EXPECT_EQ(media::cast::proto::AUDIO_PLAYOUT_DELAY, event->event_type(0));
278 EXPECT_EQ(media::cast::proto::AUDIO_FRAME_DECODED, event->event_type(1));
280 ASSERT_EQ(2, event->event_timestamp_ms_size());
281 EXPECT_EQ(InMilliseconds(now1), event->event_timestamp_ms(0));
282 EXPECT_EQ(InMilliseconds(now3), event->event_timestamp_ms(1));
284 relative_rtp_timestamp = rtp_timestamp2 - first_rtp_timestamp_;
285 it = frame_events_.find(relative_rtp_timestamp);
286 ASSERT_TRUE(it != frame_events_.end());
290 EXPECT_EQ(relative_rtp_timestamp, event->relative_rtp_timestamp());
292 ASSERT_EQ(1, event->event_type_size());
293 EXPECT_EQ(media::cast::proto::AUDIO_FRAME_ENCODED, event->event_type(0));
295 ASSERT_EQ(1, event->event_timestamp_ms_size());
296 EXPECT_EQ(InMilliseconds(now2), event->event_timestamp_ms(0));
299 TEST_F(EncodingEventSubscriberTest, PacketEvent) {
301 base::TimeTicks now(testing_clock_->NowTicks());
302 RtpTimestamp rtp_timestamp = 100;
305 cast_environment_->Logging()->InsertPacketEvent(
306 now, kAudioPacketReceived, rtp_timestamp, /*frame_id*/ 0, packet_id,
307 /*max_packet_id*/ 10, size);
311 ASSERT_EQ(1u, packet_events_.size());
313 RtpTimestamp relative_rtp_timestamp = rtp_timestamp - first_rtp_timestamp_;
314 PacketEventMap::iterator it = packet_events_.find(relative_rtp_timestamp);
315 ASSERT_TRUE(it != packet_events_.end());
317 linked_ptr<AggregatedPacketEvent> event = it->second;
319 EXPECT_EQ(relative_rtp_timestamp, event->relative_rtp_timestamp());
321 ASSERT_EQ(1, event->base_packet_event_size());
322 const BasePacketEvent& base_event = event->base_packet_event(0);
323 EXPECT_EQ(packet_id, base_event.packet_id());
324 ASSERT_EQ(1, base_event.event_type_size());
325 EXPECT_EQ(media::cast::proto::AUDIO_PACKET_RECEIVED,
326 base_event.event_type(0));
327 ASSERT_EQ(1, base_event.event_timestamp_ms_size());
328 EXPECT_EQ(InMilliseconds(now), base_event.event_timestamp_ms(0));
331 EXPECT_TRUE(packet_events_.empty());
334 TEST_F(EncodingEventSubscriberTest, MultiplePacketEventsForPacket) {
336 base::TimeTicks now1(testing_clock_->NowTicks());
337 RtpTimestamp rtp_timestamp = 100;
340 cast_environment_->Logging()->InsertPacketEvent(now1,
341 kVideoPacketSentToPacer,
345 /*max_packet_id*/ 10,
348 testing_clock_->Advance(base::TimeDelta::FromMilliseconds(20));
349 base::TimeTicks now2(testing_clock_->NowTicks());
350 cast_environment_->Logging()->InsertPacketEvent(now2,
351 kVideoPacketSentToNetwork,
355 /*max_packet_id*/ 10,
360 ASSERT_EQ(1u, packet_events_.size());
362 RtpTimestamp relative_rtp_timestamp = rtp_timestamp - first_rtp_timestamp_;
363 PacketEventMap::iterator it = packet_events_.find(relative_rtp_timestamp);
364 ASSERT_TRUE(it != packet_events_.end());
366 linked_ptr<AggregatedPacketEvent> event = it->second;
368 EXPECT_EQ(relative_rtp_timestamp, event->relative_rtp_timestamp());
370 ASSERT_EQ(1, event->base_packet_event_size());
371 const BasePacketEvent& base_event = event->base_packet_event(0);
372 EXPECT_EQ(packet_id, base_event.packet_id());
373 ASSERT_EQ(2, base_event.event_type_size());
374 EXPECT_EQ(media::cast::proto::VIDEO_PACKET_SENT_TO_PACER,
375 base_event.event_type(0));
376 EXPECT_EQ(media::cast::proto::VIDEO_PACKET_SENT_TO_NETWORK,
377 base_event.event_type(1));
378 ASSERT_EQ(2, base_event.event_timestamp_ms_size());
379 EXPECT_EQ(InMilliseconds(now1), base_event.event_timestamp_ms(0));
380 EXPECT_EQ(InMilliseconds(now2), base_event.event_timestamp_ms(1));
383 TEST_F(EncodingEventSubscriberTest, MultiplePacketEventsForFrame) {
385 base::TimeTicks now1(testing_clock_->NowTicks());
386 RtpTimestamp rtp_timestamp = 100;
390 cast_environment_->Logging()->InsertPacketEvent(now1,
391 kVideoPacketSentToPacer,
395 /*max_packet_id*/ 10,
398 testing_clock_->Advance(base::TimeDelta::FromMilliseconds(20));
399 base::TimeTicks now2(testing_clock_->NowTicks());
400 cast_environment_->Logging()->InsertPacketEvent(now2,
401 kVideoPacketRetransmitted,
405 /*max_packet_id*/ 10,
410 ASSERT_EQ(1u, packet_events_.size());
412 RtpTimestamp relative_rtp_timestamp = rtp_timestamp - first_rtp_timestamp_;
413 PacketEventMap::iterator it = packet_events_.find(relative_rtp_timestamp);
414 ASSERT_TRUE(it != packet_events_.end());
416 linked_ptr<AggregatedPacketEvent> event = it->second;
418 EXPECT_EQ(relative_rtp_timestamp, event->relative_rtp_timestamp());
420 ASSERT_EQ(2, event->base_packet_event_size());
421 const BasePacketEvent& base_event = event->base_packet_event(0);
422 EXPECT_EQ(packet_id_1, base_event.packet_id());
423 ASSERT_EQ(1, base_event.event_type_size());
424 EXPECT_EQ(media::cast::proto::VIDEO_PACKET_SENT_TO_PACER,
425 base_event.event_type(0));
426 ASSERT_EQ(1, base_event.event_timestamp_ms_size());
427 EXPECT_EQ(InMilliseconds(now1), base_event.event_timestamp_ms(0));
429 const BasePacketEvent& base_event_2 = event->base_packet_event(1);
430 EXPECT_EQ(packet_id_2, base_event_2.packet_id());
431 ASSERT_EQ(1, base_event_2.event_type_size());
432 EXPECT_EQ(media::cast::proto::VIDEO_PACKET_RETRANSMITTED,
433 base_event_2.event_type(0));
434 ASSERT_EQ(1, base_event_2.event_timestamp_ms_size());
435 EXPECT_EQ(InMilliseconds(now2), base_event_2.event_timestamp_ms(0));
438 TEST_F(EncodingEventSubscriberTest, MultiplePacketEvents) {
440 base::TimeTicks now1(testing_clock_->NowTicks());
441 RtpTimestamp rtp_timestamp_1 = 100;
442 RtpTimestamp rtp_timestamp_2 = 200;
446 cast_environment_->Logging()->InsertPacketEvent(now1,
447 kVideoPacketSentToPacer,
451 /*max_packet_id*/ 10,
454 testing_clock_->Advance(base::TimeDelta::FromMilliseconds(20));
455 base::TimeTicks now2(testing_clock_->NowTicks());
456 cast_environment_->Logging()->InsertPacketEvent(now2,
457 kVideoPacketRetransmitted,
461 /*max_packet_id*/ 10,
466 ASSERT_EQ(2u, packet_events_.size());
468 RtpTimestamp relative_rtp_timestamp = rtp_timestamp_1 - first_rtp_timestamp_;
469 PacketEventMap::iterator it = packet_events_.find(relative_rtp_timestamp);
470 ASSERT_TRUE(it != packet_events_.end());
472 linked_ptr<AggregatedPacketEvent> event = it->second;
474 EXPECT_EQ(relative_rtp_timestamp, event->relative_rtp_timestamp());
476 ASSERT_EQ(1, event->base_packet_event_size());
477 const BasePacketEvent& base_event = event->base_packet_event(0);
478 EXPECT_EQ(packet_id_1, base_event.packet_id());
479 ASSERT_EQ(1, base_event.event_type_size());
480 EXPECT_EQ(media::cast::proto::VIDEO_PACKET_SENT_TO_PACER,
481 base_event.event_type(0));
482 ASSERT_EQ(1, base_event.event_timestamp_ms_size());
483 EXPECT_EQ(InMilliseconds(now1), base_event.event_timestamp_ms(0));
485 relative_rtp_timestamp = rtp_timestamp_2 - first_rtp_timestamp_;
486 it = packet_events_.find(relative_rtp_timestamp);
487 ASSERT_TRUE(it != packet_events_.end());
491 EXPECT_EQ(relative_rtp_timestamp, event->relative_rtp_timestamp());
493 ASSERT_EQ(1, event->base_packet_event_size());
494 const BasePacketEvent& base_event_2 = event->base_packet_event(0);
495 EXPECT_EQ(packet_id_2, base_event_2.packet_id());
496 ASSERT_EQ(1, base_event_2.event_type_size());
497 EXPECT_EQ(media::cast::proto::VIDEO_PACKET_RETRANSMITTED,
498 base_event_2.event_type(0));
499 ASSERT_EQ(1, base_event_2.event_timestamp_ms_size());
500 EXPECT_EQ(InMilliseconds(now2), base_event_2.event_timestamp_ms(0));
503 TEST_F(EncodingEventSubscriberTest, FirstRtpTimestamp) {
505 RtpTimestamp rtp_timestamp = 12345;
506 base::TimeTicks now(testing_clock_->NowTicks());
508 cast_environment_->Logging()->InsertFrameEvent(now,
513 cast_environment_->Logging()->InsertFrameEvent(now,
520 EXPECT_EQ(rtp_timestamp, first_rtp_timestamp_);
521 FrameEventMap::iterator it = frame_events_.find(0);
522 ASSERT_NE(frame_events_.end(), it);
524 it = frame_events_.find(30);
525 ASSERT_NE(frame_events_.end(), it);
527 rtp_timestamp = 67890;
529 cast_environment_->Logging()->InsertFrameEvent(now,
535 EXPECT_EQ(rtp_timestamp, first_rtp_timestamp_);
538 TEST_F(EncodingEventSubscriberTest, RelativeRtpTimestampWrapAround) {
540 RtpTimestamp rtp_timestamp = 0xffffffff - 20;
541 base::TimeTicks now(testing_clock_->NowTicks());
543 cast_environment_->Logging()->InsertFrameEvent(now,
548 // RtpTimestamp has now wrapped around.
549 cast_environment_->Logging()->InsertFrameEvent(now,
556 FrameEventMap::iterator it = frame_events_.find(0);
557 ASSERT_NE(frame_events_.end(), it);
559 it = frame_events_.find(30);
560 ASSERT_NE(frame_events_.end(), it);