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 FrameEventList frame_events_;
68 PacketEventList 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,
81 kVideoFrameCaptureBegin,
84 cast_environment_->Logging()->InsertFrameEvent(now,
92 ASSERT_EQ(10u, frame_events_.size());
93 EXPECT_EQ(100u, frame_events_.front()->relative_rtp_timestamp());
94 EXPECT_EQ(1000u, frame_events_.back()->relative_rtp_timestamp());
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_.front()->relative_rtp_timestamp());
117 EXPECT_EQ(1000u, packet_events_.back()->relative_rtp_timestamp());
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 ASSERT_EQ(1u, frame_events_.size());
139 FrameEventList::iterator it = frame_events_.begin();
141 linked_ptr<AggregatedFrameEvent> frame_event = *it;
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 FrameEventList::iterator it = frame_events_.begin();
167 linked_ptr<AggregatedFrameEvent> event = *it;
169 EXPECT_EQ(relative_rtp_timestamp, event->relative_rtp_timestamp());
171 ASSERT_EQ(1, event->event_type_size());
172 EXPECT_EQ(media::cast::proto::VIDEO_FRAME_DECODED, event->event_type(0));
173 ASSERT_EQ(1, event->event_timestamp_ms_size());
174 EXPECT_EQ(InMilliseconds(now), event->event_timestamp_ms(0));
176 EXPECT_EQ(0, event->encoded_frame_size());
177 EXPECT_EQ(0, event->delay_millis());
180 EXPECT_TRUE(frame_events_.empty());
183 TEST_F(EncodingEventSubscriberTest, FrameEventDelay) {
185 base::TimeTicks now(testing_clock_->NowTicks());
186 RtpTimestamp rtp_timestamp = 100;
188 cast_environment_->Logging()->InsertFrameEventWithDelay(
189 now, kAudioPlayoutDelay, rtp_timestamp,
190 /*frame_id*/ 0, base::TimeDelta::FromMilliseconds(delay_ms));
194 ASSERT_EQ(1u, frame_events_.size());
196 RtpTimestamp relative_rtp_timestamp = rtp_timestamp - first_rtp_timestamp_;
197 FrameEventList::iterator it = frame_events_.begin();
199 linked_ptr<AggregatedFrameEvent> event = *it;
201 EXPECT_EQ(relative_rtp_timestamp, event->relative_rtp_timestamp());
203 ASSERT_EQ(1, event->event_type_size());
204 EXPECT_EQ(media::cast::proto::AUDIO_PLAYOUT_DELAY, event->event_type(0));
205 ASSERT_EQ(1, event->event_timestamp_ms_size());
206 EXPECT_EQ(InMilliseconds(now), event->event_timestamp_ms(0));
208 EXPECT_EQ(0, event->encoded_frame_size());
209 EXPECT_EQ(100, event->delay_millis());
210 EXPECT_FALSE(event->has_key_frame());
213 TEST_F(EncodingEventSubscriberTest, FrameEventSize) {
215 base::TimeTicks now(testing_clock_->NowTicks());
216 RtpTimestamp rtp_timestamp = 100;
218 bool key_frame = true;
219 int target_bitrate = 1024;
220 cast_environment_->Logging()->InsertEncodedFrameEvent(
221 now, kVideoFrameEncoded, rtp_timestamp,
222 /*frame_id*/ 0, size, key_frame, target_bitrate);
226 ASSERT_EQ(1u, frame_events_.size());
228 RtpTimestamp relative_rtp_timestamp = rtp_timestamp - first_rtp_timestamp_;
229 FrameEventList::iterator it = frame_events_.begin();
231 linked_ptr<AggregatedFrameEvent> event = *it;
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());
242 EXPECT_TRUE(event->has_key_frame());
243 EXPECT_EQ(key_frame, event->key_frame());
244 EXPECT_EQ(target_bitrate, event->target_bitrate());
247 TEST_F(EncodingEventSubscriberTest, MultipleFrameEvents) {
249 RtpTimestamp rtp_timestamp1 = 100;
250 RtpTimestamp rtp_timestamp2 = 200;
251 base::TimeTicks now1(testing_clock_->NowTicks());
252 cast_environment_->Logging()->InsertFrameEventWithDelay(
253 now1, kAudioPlayoutDelay, rtp_timestamp1,
254 /*frame_id*/ 0, /*delay*/ base::TimeDelta::FromMilliseconds(100));
256 testing_clock_->Advance(base::TimeDelta::FromMilliseconds(20));
257 base::TimeTicks now2(testing_clock_->NowTicks());
258 cast_environment_->Logging()->InsertEncodedFrameEvent(
259 now2, kAudioFrameEncoded, rtp_timestamp2,
260 /*frame_id*/ 0, /*size*/ 123, /* key_frame - unused */ false,
261 /*target_bitrate - unused*/ 0);
263 testing_clock_->Advance(base::TimeDelta::FromMilliseconds(20));
264 base::TimeTicks now3(testing_clock_->NowTicks());
265 cast_environment_->Logging()->InsertFrameEvent(
266 now3, kAudioFrameDecoded, rtp_timestamp1, /*frame_id*/ 0);
270 ASSERT_EQ(2u, frame_events_.size());
272 RtpTimestamp relative_rtp_timestamp = rtp_timestamp1 - first_rtp_timestamp_;
273 FrameEventList::iterator it = frame_events_.begin();
275 linked_ptr<AggregatedFrameEvent> event = *it;
277 EXPECT_EQ(relative_rtp_timestamp, event->relative_rtp_timestamp());
279 ASSERT_EQ(2, event->event_type_size());
280 EXPECT_EQ(media::cast::proto::AUDIO_PLAYOUT_DELAY, event->event_type(0));
281 EXPECT_EQ(media::cast::proto::AUDIO_FRAME_DECODED, event->event_type(1));
283 ASSERT_EQ(2, event->event_timestamp_ms_size());
284 EXPECT_EQ(InMilliseconds(now1), event->event_timestamp_ms(0));
285 EXPECT_EQ(InMilliseconds(now3), event->event_timestamp_ms(1));
287 EXPECT_FALSE(event->has_key_frame());
289 relative_rtp_timestamp = rtp_timestamp2 - first_rtp_timestamp_;
294 EXPECT_EQ(relative_rtp_timestamp, event->relative_rtp_timestamp());
296 ASSERT_EQ(1, event->event_type_size());
297 EXPECT_EQ(media::cast::proto::AUDIO_FRAME_ENCODED, event->event_type(0));
299 ASSERT_EQ(1, event->event_timestamp_ms_size());
300 EXPECT_EQ(InMilliseconds(now2), event->event_timestamp_ms(0));
302 EXPECT_FALSE(event->has_key_frame());
305 TEST_F(EncodingEventSubscriberTest, PacketEvent) {
307 base::TimeTicks now(testing_clock_->NowTicks());
308 RtpTimestamp rtp_timestamp = 100;
311 cast_environment_->Logging()->InsertPacketEvent(
312 now, kAudioPacketReceived, rtp_timestamp, /*frame_id*/ 0, packet_id,
313 /*max_packet_id*/ 10, size);
317 ASSERT_EQ(1u, packet_events_.size());
319 RtpTimestamp relative_rtp_timestamp = rtp_timestamp - first_rtp_timestamp_;
320 PacketEventList::iterator it = packet_events_.begin();
322 linked_ptr<AggregatedPacketEvent> event = *it;
324 EXPECT_EQ(relative_rtp_timestamp, event->relative_rtp_timestamp());
326 ASSERT_EQ(1, event->base_packet_event_size());
327 const BasePacketEvent& base_event = event->base_packet_event(0);
328 EXPECT_EQ(packet_id, base_event.packet_id());
329 ASSERT_EQ(1, base_event.event_type_size());
330 EXPECT_EQ(media::cast::proto::AUDIO_PACKET_RECEIVED,
331 base_event.event_type(0));
332 ASSERT_EQ(1, base_event.event_timestamp_ms_size());
333 EXPECT_EQ(InMilliseconds(now), base_event.event_timestamp_ms(0));
334 EXPECT_EQ(size, base_event.size());
337 EXPECT_TRUE(packet_events_.empty());
340 TEST_F(EncodingEventSubscriberTest, MultiplePacketEventsForPacket) {
342 base::TimeTicks now1(testing_clock_->NowTicks());
343 RtpTimestamp rtp_timestamp = 100;
346 cast_environment_->Logging()->InsertPacketEvent(now1,
347 kVideoPacketSentToNetwork,
351 /*max_packet_id*/ 10,
354 testing_clock_->Advance(base::TimeDelta::FromMilliseconds(20));
355 base::TimeTicks now2(testing_clock_->NowTicks());
356 cast_environment_->Logging()->InsertPacketEvent(now2,
357 kVideoPacketRetransmitted,
361 /*max_packet_id*/ 10,
366 ASSERT_EQ(1u, packet_events_.size());
368 RtpTimestamp relative_rtp_timestamp = rtp_timestamp - first_rtp_timestamp_;
369 PacketEventList::iterator it = packet_events_.begin();
371 linked_ptr<AggregatedPacketEvent> event = *it;
373 EXPECT_EQ(relative_rtp_timestamp, event->relative_rtp_timestamp());
375 ASSERT_EQ(1, event->base_packet_event_size());
376 const BasePacketEvent& base_event = event->base_packet_event(0);
377 EXPECT_EQ(packet_id, base_event.packet_id());
378 ASSERT_EQ(2, base_event.event_type_size());
379 EXPECT_EQ(media::cast::proto::VIDEO_PACKET_SENT_TO_NETWORK,
380 base_event.event_type(0));
381 EXPECT_EQ(media::cast::proto::VIDEO_PACKET_RETRANSMITTED,
382 base_event.event_type(1));
383 ASSERT_EQ(2, base_event.event_timestamp_ms_size());
384 EXPECT_EQ(InMilliseconds(now1), base_event.event_timestamp_ms(0));
385 EXPECT_EQ(InMilliseconds(now2), base_event.event_timestamp_ms(1));
388 TEST_F(EncodingEventSubscriberTest, MultiplePacketEventsForFrame) {
390 base::TimeTicks now1(testing_clock_->NowTicks());
391 RtpTimestamp rtp_timestamp = 100;
395 cast_environment_->Logging()->InsertPacketEvent(now1,
396 kVideoPacketSentToNetwork,
400 /*max_packet_id*/ 10,
403 testing_clock_->Advance(base::TimeDelta::FromMilliseconds(20));
404 base::TimeTicks now2(testing_clock_->NowTicks());
405 cast_environment_->Logging()->InsertPacketEvent(now2,
406 kVideoPacketRetransmitted,
410 /*max_packet_id*/ 10,
415 ASSERT_EQ(1u, packet_events_.size());
417 RtpTimestamp relative_rtp_timestamp = rtp_timestamp - first_rtp_timestamp_;
418 PacketEventList::iterator it = packet_events_.begin();
420 linked_ptr<AggregatedPacketEvent> event = *it;
422 EXPECT_EQ(relative_rtp_timestamp, event->relative_rtp_timestamp());
424 ASSERT_EQ(2, event->base_packet_event_size());
425 const BasePacketEvent& base_event = event->base_packet_event(0);
426 EXPECT_EQ(packet_id_1, base_event.packet_id());
427 ASSERT_EQ(1, base_event.event_type_size());
428 EXPECT_EQ(media::cast::proto::VIDEO_PACKET_SENT_TO_NETWORK,
429 base_event.event_type(0));
430 ASSERT_EQ(1, base_event.event_timestamp_ms_size());
431 EXPECT_EQ(InMilliseconds(now1), base_event.event_timestamp_ms(0));
433 const BasePacketEvent& base_event_2 = event->base_packet_event(1);
434 EXPECT_EQ(packet_id_2, base_event_2.packet_id());
435 ASSERT_EQ(1, base_event_2.event_type_size());
436 EXPECT_EQ(media::cast::proto::VIDEO_PACKET_RETRANSMITTED,
437 base_event_2.event_type(0));
438 ASSERT_EQ(1, base_event_2.event_timestamp_ms_size());
439 EXPECT_EQ(InMilliseconds(now2), base_event_2.event_timestamp_ms(0));
442 TEST_F(EncodingEventSubscriberTest, MultiplePacketEvents) {
444 base::TimeTicks now1(testing_clock_->NowTicks());
445 RtpTimestamp rtp_timestamp_1 = 100;
446 RtpTimestamp rtp_timestamp_2 = 200;
450 cast_environment_->Logging()->InsertPacketEvent(now1,
451 kVideoPacketSentToNetwork,
455 /*max_packet_id*/ 10,
458 testing_clock_->Advance(base::TimeDelta::FromMilliseconds(20));
459 base::TimeTicks now2(testing_clock_->NowTicks());
460 cast_environment_->Logging()->InsertPacketEvent(now2,
461 kVideoPacketRetransmitted,
465 /*max_packet_id*/ 10,
470 ASSERT_EQ(2u, packet_events_.size());
472 RtpTimestamp relative_rtp_timestamp = rtp_timestamp_1 - first_rtp_timestamp_;
473 PacketEventList::iterator it = packet_events_.begin();
475 linked_ptr<AggregatedPacketEvent> event = *it;
477 EXPECT_EQ(relative_rtp_timestamp, event->relative_rtp_timestamp());
479 ASSERT_EQ(1, event->base_packet_event_size());
480 const BasePacketEvent& base_event = event->base_packet_event(0);
481 EXPECT_EQ(packet_id_1, base_event.packet_id());
482 ASSERT_EQ(1, base_event.event_type_size());
483 EXPECT_EQ(media::cast::proto::VIDEO_PACKET_SENT_TO_NETWORK,
484 base_event.event_type(0));
485 ASSERT_EQ(1, base_event.event_timestamp_ms_size());
486 EXPECT_EQ(InMilliseconds(now1), base_event.event_timestamp_ms(0));
488 relative_rtp_timestamp = rtp_timestamp_2 - first_rtp_timestamp_;
490 ASSERT_TRUE(it != packet_events_.end());
493 EXPECT_EQ(relative_rtp_timestamp, event->relative_rtp_timestamp());
495 ASSERT_EQ(1, event->base_packet_event_size());
496 const BasePacketEvent& base_event_2 = event->base_packet_event(0);
497 EXPECT_EQ(packet_id_2, base_event_2.packet_id());
498 ASSERT_EQ(1, base_event_2.event_type_size());
499 EXPECT_EQ(media::cast::proto::VIDEO_PACKET_RETRANSMITTED,
500 base_event_2.event_type(0));
501 ASSERT_EQ(1, base_event_2.event_timestamp_ms_size());
502 EXPECT_EQ(InMilliseconds(now2), base_event_2.event_timestamp_ms(0));
505 TEST_F(EncodingEventSubscriberTest, FirstRtpTimestamp) {
507 RtpTimestamp rtp_timestamp = 12345;
508 base::TimeTicks now(testing_clock_->NowTicks());
510 cast_environment_->Logging()->InsertFrameEvent(now,
511 kVideoFrameCaptureBegin,
515 cast_environment_->Logging()->InsertFrameEvent(now,
516 kVideoFrameCaptureEnd,
522 EXPECT_EQ(rtp_timestamp, first_rtp_timestamp_);
523 FrameEventList::iterator it = frame_events_.begin();
524 ASSERT_NE(frame_events_.end(), it);
525 EXPECT_EQ(0u, (*it)->relative_rtp_timestamp());
528 ASSERT_NE(frame_events_.end(), it);
529 EXPECT_EQ(30u, (*it)->relative_rtp_timestamp());
531 rtp_timestamp = 67890;
533 cast_environment_->Logging()->InsertFrameEvent(now,
534 kVideoFrameCaptureBegin,
539 EXPECT_EQ(rtp_timestamp, first_rtp_timestamp_);
542 TEST_F(EncodingEventSubscriberTest, RelativeRtpTimestampWrapAround) {
544 RtpTimestamp rtp_timestamp = 0xffffffff - 20;
545 base::TimeTicks now(testing_clock_->NowTicks());
547 cast_environment_->Logging()->InsertFrameEvent(now,
548 kVideoFrameCaptureBegin,
552 // RtpTimestamp has now wrapped around.
553 cast_environment_->Logging()->InsertFrameEvent(now,
554 kVideoFrameCaptureEnd,
560 FrameEventList::iterator it = frame_events_.begin();
561 ASSERT_NE(frame_events_.end(), it);
562 EXPECT_EQ(0u, (*it)->relative_rtp_timestamp());
565 ASSERT_NE(frame_events_.end(), it);
566 EXPECT_EQ(30u, (*it)->relative_rtp_timestamp());
569 TEST_F(EncodingEventSubscriberTest, MaxEventsPerProto) {
571 RtpTimestamp rtp_timestamp = 100;
572 for (int i = 0; i < kMaxEventsPerProto + 1; i++) {
573 cast_environment_->Logging()->InsertFrameEvent(testing_clock_->NowTicks(),
577 testing_clock_->Advance(base::TimeDelta::FromMilliseconds(30));
582 ASSERT_EQ(2u, frame_events_.size());
583 FrameEventList::iterator frame_it = frame_events_.begin();
584 ASSERT_TRUE(frame_it != frame_events_.end());
586 linked_ptr<AggregatedFrameEvent> frame_event = *frame_it;
588 EXPECT_EQ(kMaxEventsPerProto, frame_event->event_type_size());
590 for (int i = 0; i < kMaxPacketsPerFrame + 1; i++) {
591 cast_environment_->Logging()->InsertPacketEvent(
592 testing_clock_->NowTicks(),
593 kVideoPacketRetransmitted,
599 testing_clock_->Advance(base::TimeDelta::FromMilliseconds(30));
604 EXPECT_EQ(2u, packet_events_.size());
606 PacketEventList::iterator packet_it = packet_events_.begin();
607 ASSERT_TRUE(packet_it != packet_events_.end());
609 linked_ptr<AggregatedPacketEvent> packet_event = *packet_it;
611 EXPECT_EQ(kMaxPacketsPerFrame,
612 packet_event->base_packet_event_size());
615 packet_event = *packet_it;
616 EXPECT_EQ(1, packet_event->base_packet_event_size());
618 for (int j = 0; j < kMaxEventsPerProto + 1; j++) {
619 cast_environment_->Logging()->InsertPacketEvent(
620 testing_clock_->NowTicks(),
621 kVideoPacketRetransmitted,
627 testing_clock_->Advance(base::TimeDelta::FromMilliseconds(30));
632 EXPECT_EQ(2u, packet_events_.size());
633 packet_it = packet_events_.begin();
634 ASSERT_TRUE(packet_it != packet_events_.end());
636 packet_event = *packet_it;
638 EXPECT_EQ(kMaxEventsPerProto,
639 packet_event->base_packet_event(0).event_type_size());
642 packet_event = *packet_it;
643 EXPECT_EQ(1, packet_event->base_packet_event(0).event_type_size());