15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// found in the LICENSE file.
45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/memory/ref_counted.h"
65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/test/simple_test_tick_clock.h"
85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/time/tick_clock.h"
95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "media/cast/cast_environment.h"
105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "media/cast/logging/encoding_event_subscriber.h"
115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "media/cast/logging/logging_defines.h"
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "media/cast/test/fake_single_thread_task_runner.h"
135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using media::cast::proto::AggregatedFrameEvent;
165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using media::cast::proto::AggregatedPacketEvent;
175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using media::cast::proto::BasePacketEvent;
18a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)using media::cast::proto::LogMetadata;
195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
20effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochnamespace {
21effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
22effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochint64 InMilliseconds(base::TimeTicks event_time) {
23effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  return (event_time - base::TimeTicks()).InMilliseconds();
24effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
25effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
26effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
27effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace media {
295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace cast {
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class EncodingEventSubscriberTest : public ::testing::Test {
325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) protected:
335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EncodingEventSubscriberTest()
345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      : testing_clock_(new base::SimpleTestTickClock()),
355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        task_runner_(new test::FakeSingleThreadTaskRunner(testing_clock_)),
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        cast_environment_(new CastEnvironment(
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            scoped_ptr<base::TickClock>(testing_clock_).Pass(),
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            task_runner_,
395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            task_runner_,
40effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            task_runner_)),
41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        first_rtp_timestamp_(0) {}
425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void Init(EventMediaType event_media_type) {
445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    DCHECK(!event_subscriber_);
455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    event_subscriber_.reset(new EncodingEventSubscriber(event_media_type, 10));
465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    cast_environment_->Logging()->AddRawEventSubscriber(
475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        event_subscriber_.get());
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual ~EncodingEventSubscriberTest() {
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (event_subscriber_) {
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      cast_environment_->Logging()->RemoveRawEventSubscriber(
535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          event_subscriber_.get());
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
57a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void GetEventsAndReset() {
58a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    event_subscriber_->GetEventsAndReset(
59a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        &metadata_, &frame_events_, &packet_events_);
60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    first_rtp_timestamp_ = metadata_.first_rtp_timestamp();
61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::SimpleTestTickClock* testing_clock_;  // Owned by CastEnvironment.
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_refptr<test::FakeSingleThreadTaskRunner> task_runner_;
655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_refptr<CastEnvironment> cast_environment_;
665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<EncodingEventSubscriber> event_subscriber_;
675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  FrameEventList frame_events_;
685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  PacketEventList packet_events_;
69a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  LogMetadata metadata_;
70a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RtpTimestamp first_rtp_timestamp_;
715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(EncodingEventSubscriberTest, FrameEventTruncating) {
745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Init(VIDEO_EVENT);
755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::TimeTicks now(testing_clock_->NowTicks());
775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Entry with RTP timestamp 0 should get dropped.
795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  for (int i = 0; i < 11; i++) {
805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    cast_environment_->Logging()->InsertFrameEvent(now,
81cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                                   FRAME_CAPTURE_BEGIN,
82cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                                   VIDEO_EVENT,
835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                   i * 100,
845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                   /*frame_id*/ 0);
855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    cast_environment_->Logging()->InsertFrameEvent(now,
86cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                                   FRAME_DECODED,
87cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                                   VIDEO_EVENT,
885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                   i * 100,
895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                   /*frame_id*/ 0);
905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
92a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  GetEventsAndReset();
935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
94a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ASSERT_EQ(10u, frame_events_.size());
955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(100u, frame_events_.front()->relative_rtp_timestamp());
965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(1000u, frame_events_.back()->relative_rtp_timestamp());
975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(EncodingEventSubscriberTest, PacketEventTruncating) {
1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Init(AUDIO_EVENT);
1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::TimeTicks now(testing_clock_->NowTicks());
1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Entry with RTP timestamp 0 should get dropped.
1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  for (int i = 0; i < 11; i++) {
1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    cast_environment_->Logging()->InsertPacketEvent(now,
107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                                    PACKET_RECEIVED,
108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                                    AUDIO_EVENT,
1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                    /*rtp_timestamp*/ i * 100,
1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                    /*frame_id*/ 0,
1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                    /*packet_id*/ i,
1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                    /*max_packet_id*/ 10,
1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                    /*size*/ 123);
1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
116a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  GetEventsAndReset();
1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
118a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ASSERT_EQ(10u, packet_events_.size());
1195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(100u, packet_events_.front()->relative_rtp_timestamp());
1205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(1000u, packet_events_.back()->relative_rtp_timestamp());
1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(EncodingEventSubscriberTest, EventFiltering) {
1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Init(VIDEO_EVENT);
1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::TimeTicks now(testing_clock_->NowTicks());
1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  RtpTimestamp rtp_timestamp = 100;
1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  cast_environment_->Logging()->InsertFrameEvent(now,
129cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                                 FRAME_DECODED,
130cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                                 VIDEO_EVENT,
1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                 rtp_timestamp,
1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                 /*frame_id*/ 0);
1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // This is an AUDIO_EVENT and shouldn't be processed by the subscriber.
1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  cast_environment_->Logging()->InsertFrameEvent(now,
136cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                                 FRAME_DECODED,
137cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                                 AUDIO_EVENT,
1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                 rtp_timestamp,
1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                 /*frame_id*/ 0);
1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
141a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  GetEventsAndReset();
1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_EQ(1u, frame_events_.size());
1445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  FrameEventList::iterator it = frame_events_.begin();
1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  linked_ptr<AggregatedFrameEvent> frame_event = *it;
1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(1, frame_event->event_type_size());
149cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(media::cast::proto::FRAME_DECODED,
1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            frame_event->event_type(0));
1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
152a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  GetEventsAndReset();
153a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
154a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(packet_events_.empty());
1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(EncodingEventSubscriberTest, FrameEvent) {
1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Init(VIDEO_EVENT);
1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::TimeTicks now(testing_clock_->NowTicks());
1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  RtpTimestamp rtp_timestamp = 100;
161cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  cast_environment_->Logging()->InsertFrameEvent(now, FRAME_DECODED,
162cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                                 VIDEO_EVENT,
1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                 rtp_timestamp,
1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                 /*frame_id*/ 0);
1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
166a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  GetEventsAndReset();
1675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
168a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ASSERT_EQ(1u, frame_events_.size());
1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
170a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RtpTimestamp relative_rtp_timestamp = rtp_timestamp - first_rtp_timestamp_;
1715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  FrameEventList::iterator it = frame_events_.begin();
1725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  linked_ptr<AggregatedFrameEvent> event = *it;
1745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
175a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(relative_rtp_timestamp, event->relative_rtp_timestamp());
1765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(1, event->event_type_size());
178cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(media::cast::proto::FRAME_DECODED, event->event_type(0));
179effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ASSERT_EQ(1, event->event_timestamp_ms_size());
180effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(InMilliseconds(now), event->event_timestamp_ms(0));
1815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0, event->encoded_frame_size());
1835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0, event->delay_millis());
1845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
185a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  GetEventsAndReset();
186a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(frame_events_.empty());
1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(EncodingEventSubscriberTest, FrameEventDelay) {
1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Init(AUDIO_EVENT);
1915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::TimeTicks now(testing_clock_->NowTicks());
1925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  RtpTimestamp rtp_timestamp = 100;
1935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int delay_ms = 100;
1945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  cast_environment_->Logging()->InsertFrameEventWithDelay(
195cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      now, FRAME_PLAYOUT, AUDIO_EVENT, rtp_timestamp,
1965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      /*frame_id*/ 0, base::TimeDelta::FromMilliseconds(delay_ms));
1975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
198a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  GetEventsAndReset();
1995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
200a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ASSERT_EQ(1u, frame_events_.size());
2015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
202a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RtpTimestamp relative_rtp_timestamp = rtp_timestamp - first_rtp_timestamp_;
2035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  FrameEventList::iterator it = frame_events_.begin();
2045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  linked_ptr<AggregatedFrameEvent> event = *it;
2065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
207a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(relative_rtp_timestamp, event->relative_rtp_timestamp());
2085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(1, event->event_type_size());
210cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(media::cast::proto::FRAME_PLAYOUT, event->event_type(0));
211effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ASSERT_EQ(1, event->event_timestamp_ms_size());
212effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(InMilliseconds(now), event->event_timestamp_ms(0));
2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0, event->encoded_frame_size());
2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(100, event->delay_millis());
216a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_FALSE(event->has_key_frame());
2175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(EncodingEventSubscriberTest, FrameEventSize) {
2205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Init(VIDEO_EVENT);
2215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::TimeTicks now(testing_clock_->NowTicks());
2225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  RtpTimestamp rtp_timestamp = 100;
2235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int size = 123;
224a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  bool key_frame = true;
2250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  int target_bitrate = 1024;
226a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  cast_environment_->Logging()->InsertEncodedFrameEvent(
227cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      now, FRAME_ENCODED, VIDEO_EVENT, rtp_timestamp,
2280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      /*frame_id*/ 0, size, key_frame, target_bitrate);
2295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
230a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  GetEventsAndReset();
2315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
232a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ASSERT_EQ(1u, frame_events_.size());
2335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
234a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RtpTimestamp relative_rtp_timestamp = rtp_timestamp - first_rtp_timestamp_;
2355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  FrameEventList::iterator it = frame_events_.begin();
2365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  linked_ptr<AggregatedFrameEvent> event = *it;
2385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
239a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(relative_rtp_timestamp, event->relative_rtp_timestamp());
2405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(1, event->event_type_size());
242cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(media::cast::proto::FRAME_ENCODED, event->event_type(0));
243effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ASSERT_EQ(1, event->event_timestamp_ms_size());
244effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(InMilliseconds(now), event->event_timestamp_ms(0));
2455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(size, event->encoded_frame_size());
2475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0, event->delay_millis());
248a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_TRUE(event->has_key_frame());
249a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_EQ(key_frame, event->key_frame());
2500529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_EQ(target_bitrate, event->target_bitrate());
2515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(EncodingEventSubscriberTest, MultipleFrameEvents) {
2545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Init(AUDIO_EVENT);
2555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  RtpTimestamp rtp_timestamp1 = 100;
2565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  RtpTimestamp rtp_timestamp2 = 200;
2575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::TimeTicks now1(testing_clock_->NowTicks());
2585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  cast_environment_->Logging()->InsertFrameEventWithDelay(
259cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      now1, FRAME_PLAYOUT, AUDIO_EVENT, rtp_timestamp1,
2605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      /*frame_id*/ 0, /*delay*/ base::TimeDelta::FromMilliseconds(100));
2615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  testing_clock_->Advance(base::TimeDelta::FromMilliseconds(20));
2635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::TimeTicks now2(testing_clock_->NowTicks());
264a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  cast_environment_->Logging()->InsertEncodedFrameEvent(
265cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      now2, FRAME_ENCODED, AUDIO_EVENT, rtp_timestamp2,
2660529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      /*frame_id*/ 0, /*size*/ 123, /* key_frame - unused */ false,
2670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      /*target_bitrate - unused*/ 0);
2685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  testing_clock_->Advance(base::TimeDelta::FromMilliseconds(20));
2705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::TimeTicks now3(testing_clock_->NowTicks());
2715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  cast_environment_->Logging()->InsertFrameEvent(
272cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      now3, FRAME_DECODED, AUDIO_EVENT, rtp_timestamp1, /*frame_id*/ 0);
2735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
274a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  GetEventsAndReset();
2755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
276a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ASSERT_EQ(2u, frame_events_.size());
2775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
278a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RtpTimestamp relative_rtp_timestamp = rtp_timestamp1 - first_rtp_timestamp_;
2795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  FrameEventList::iterator it = frame_events_.begin();
2805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  linked_ptr<AggregatedFrameEvent> event = *it;
2825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
283a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(relative_rtp_timestamp, event->relative_rtp_timestamp());
2845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(2, event->event_type_size());
286cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(media::cast::proto::FRAME_PLAYOUT, event->event_type(0));
287cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(media::cast::proto::FRAME_DECODED, event->event_type(1));
2885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
289effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ASSERT_EQ(2, event->event_timestamp_ms_size());
290effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(InMilliseconds(now1), event->event_timestamp_ms(0));
291effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(InMilliseconds(now3), event->event_timestamp_ms(1));
2925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
293a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_FALSE(event->has_key_frame());
294a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
295a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  relative_rtp_timestamp = rtp_timestamp2 - first_rtp_timestamp_;
2965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ++it;
2975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  event = *it;
2995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
300a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(relative_rtp_timestamp, event->relative_rtp_timestamp());
3015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(1, event->event_type_size());
303cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(media::cast::proto::FRAME_ENCODED, event->event_type(0));
3045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
305effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ASSERT_EQ(1, event->event_timestamp_ms_size());
306effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(InMilliseconds(now2), event->event_timestamp_ms(0));
307a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
308a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_FALSE(event->has_key_frame());
3095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(EncodingEventSubscriberTest, PacketEvent) {
3125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Init(AUDIO_EVENT);
3135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::TimeTicks now(testing_clock_->NowTicks());
3145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  RtpTimestamp rtp_timestamp = 100;
3155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int packet_id = 2;
3165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int size = 100;
3175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  cast_environment_->Logging()->InsertPacketEvent(
318cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      now, PACKET_RECEIVED, AUDIO_EVENT,
319cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      rtp_timestamp, /*frame_id*/ 0, packet_id,
3205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      /*max_packet_id*/ 10, size);
3215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
322a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  GetEventsAndReset();
3235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
324a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ASSERT_EQ(1u, packet_events_.size());
3255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
326a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RtpTimestamp relative_rtp_timestamp = rtp_timestamp - first_rtp_timestamp_;
3275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  PacketEventList::iterator it = packet_events_.begin();
3285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  linked_ptr<AggregatedPacketEvent> event = *it;
3305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
331a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(relative_rtp_timestamp, event->relative_rtp_timestamp());
3325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(1, event->base_packet_event_size());
3345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const BasePacketEvent& base_event = event->base_packet_event(0);
3355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(packet_id, base_event.packet_id());
3365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(1, base_event.event_type_size());
337cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(media::cast::proto::PACKET_RECEIVED,
3385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            base_event.event_type(0));
339effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ASSERT_EQ(1, base_event.event_timestamp_ms_size());
340effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(InMilliseconds(now), base_event.event_timestamp_ms(0));
3415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(size, base_event.size());
3425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
343a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  GetEventsAndReset();
344a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(packet_events_.empty());
3455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(EncodingEventSubscriberTest, MultiplePacketEventsForPacket) {
348a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  Init(VIDEO_EVENT);
3495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::TimeTicks now1(testing_clock_->NowTicks());
3505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  RtpTimestamp rtp_timestamp = 100;
3515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int packet_id = 2;
3525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int size = 100;
353a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  cast_environment_->Logging()->InsertPacketEvent(now1,
354cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                                  PACKET_SENT_TO_NETWORK,
355cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                                  VIDEO_EVENT,
356a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                                  rtp_timestamp,
357a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                                  /*frame_id*/ 0,
358a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                                  packet_id,
359a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                                  /*max_packet_id*/ 10,
360a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                                  size);
3615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  testing_clock_->Advance(base::TimeDelta::FromMilliseconds(20));
3635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::TimeTicks now2(testing_clock_->NowTicks());
364a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  cast_environment_->Logging()->InsertPacketEvent(now2,
365cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                                  PACKET_RETRANSMITTED,
366cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                                  VIDEO_EVENT,
367a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                                  rtp_timestamp,
368a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                                  /*frame_id*/ 0,
369a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                                  packet_id,
370a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                                  /*max_packet_id*/ 10,
371a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                                  size);
3725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
373a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  GetEventsAndReset();
3745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
375a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ASSERT_EQ(1u, packet_events_.size());
3765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
377a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RtpTimestamp relative_rtp_timestamp = rtp_timestamp - first_rtp_timestamp_;
3785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  PacketEventList::iterator it = packet_events_.begin();
3795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  linked_ptr<AggregatedPacketEvent> event = *it;
3815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
382a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(relative_rtp_timestamp, event->relative_rtp_timestamp());
3835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(1, event->base_packet_event_size());
3855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const BasePacketEvent& base_event = event->base_packet_event(0);
3865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(packet_id, base_event.packet_id());
3875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(2, base_event.event_type_size());
388cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(media::cast::proto::PACKET_SENT_TO_NETWORK,
3895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu            base_event.event_type(0));
390cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(media::cast::proto::PACKET_RETRANSMITTED,
3915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            base_event.event_type(1));
392effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ASSERT_EQ(2, base_event.event_timestamp_ms_size());
393effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(InMilliseconds(now1), base_event.event_timestamp_ms(0));
394effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(InMilliseconds(now2), base_event.event_timestamp_ms(1));
3955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(EncodingEventSubscriberTest, MultiplePacketEventsForFrame) {
398a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  Init(VIDEO_EVENT);
3995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::TimeTicks now1(testing_clock_->NowTicks());
4005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  RtpTimestamp rtp_timestamp = 100;
4015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int packet_id_1 = 2;
4025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int packet_id_2 = 3;
4035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int size = 100;
404a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  cast_environment_->Logging()->InsertPacketEvent(now1,
405cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                                  PACKET_SENT_TO_NETWORK,
406cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                                  VIDEO_EVENT,
407a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                                  rtp_timestamp,
408a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                                  /*frame_id*/ 0,
409a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                                  packet_id_1,
410a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                                  /*max_packet_id*/ 10,
411a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                                  size);
4125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  testing_clock_->Advance(base::TimeDelta::FromMilliseconds(20));
4145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::TimeTicks now2(testing_clock_->NowTicks());
415a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  cast_environment_->Logging()->InsertPacketEvent(now2,
416cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                                  PACKET_RETRANSMITTED,
417cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                                  VIDEO_EVENT,
418a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                                  rtp_timestamp,
419a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                                  /*frame_id*/ 0,
420a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                                  packet_id_2,
421a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                                  /*max_packet_id*/ 10,
422a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                                  size);
4235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
424a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  GetEventsAndReset();
4255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
426a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ASSERT_EQ(1u, packet_events_.size());
4275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
428a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RtpTimestamp relative_rtp_timestamp = rtp_timestamp - first_rtp_timestamp_;
4295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  PacketEventList::iterator it = packet_events_.begin();
4305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  linked_ptr<AggregatedPacketEvent> event = *it;
4325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
433a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(relative_rtp_timestamp, event->relative_rtp_timestamp());
4345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(2, event->base_packet_event_size());
4365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const BasePacketEvent& base_event = event->base_packet_event(0);
4375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(packet_id_1, base_event.packet_id());
4385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(1, base_event.event_type_size());
439cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(media::cast::proto::PACKET_SENT_TO_NETWORK,
440a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            base_event.event_type(0));
441effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ASSERT_EQ(1, base_event.event_timestamp_ms_size());
442effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(InMilliseconds(now1), base_event.event_timestamp_ms(0));
4435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const BasePacketEvent& base_event_2 = event->base_packet_event(1);
4455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(packet_id_2, base_event_2.packet_id());
4465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(1, base_event_2.event_type_size());
447cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(media::cast::proto::PACKET_RETRANSMITTED,
4485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            base_event_2.event_type(0));
449effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ASSERT_EQ(1, base_event_2.event_timestamp_ms_size());
450effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(InMilliseconds(now2), base_event_2.event_timestamp_ms(0));
4515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
4525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(EncodingEventSubscriberTest, MultiplePacketEvents) {
454a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  Init(VIDEO_EVENT);
4555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::TimeTicks now1(testing_clock_->NowTicks());
4565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  RtpTimestamp rtp_timestamp_1 = 100;
4575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  RtpTimestamp rtp_timestamp_2 = 200;
4585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int packet_id_1 = 2;
4595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int packet_id_2 = 3;
4605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int size = 100;
461a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  cast_environment_->Logging()->InsertPacketEvent(now1,
462cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                                  PACKET_SENT_TO_NETWORK,
463cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                                  VIDEO_EVENT,
464a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                                  rtp_timestamp_1,
465a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                                  /*frame_id*/ 0,
466a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                                  packet_id_1,
467a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                                  /*max_packet_id*/ 10,
468a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                                  size);
4695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  testing_clock_->Advance(base::TimeDelta::FromMilliseconds(20));
4715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::TimeTicks now2(testing_clock_->NowTicks());
472a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  cast_environment_->Logging()->InsertPacketEvent(now2,
473cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                                  PACKET_RETRANSMITTED,
474cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                                  VIDEO_EVENT,
475a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                                  rtp_timestamp_2,
476a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                                  /*frame_id*/ 0,
477a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                                  packet_id_2,
478a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                                  /*max_packet_id*/ 10,
479a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                                  size);
4805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
481a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  GetEventsAndReset();
4825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
483a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ASSERT_EQ(2u, packet_events_.size());
4845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
485a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RtpTimestamp relative_rtp_timestamp = rtp_timestamp_1 - first_rtp_timestamp_;
4865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  PacketEventList::iterator it = packet_events_.begin();
4875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  linked_ptr<AggregatedPacketEvent> event = *it;
4895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
490a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(relative_rtp_timestamp, event->relative_rtp_timestamp());
4915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(1, event->base_packet_event_size());
4935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const BasePacketEvent& base_event = event->base_packet_event(0);
4945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(packet_id_1, base_event.packet_id());
4955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(1, base_event.event_type_size());
496cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(media::cast::proto::PACKET_SENT_TO_NETWORK,
497a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            base_event.event_type(0));
498effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ASSERT_EQ(1, base_event.event_timestamp_ms_size());
499effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(InMilliseconds(now1), base_event.event_timestamp_ms(0));
5005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
501a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  relative_rtp_timestamp = rtp_timestamp_2 - first_rtp_timestamp_;
5025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ++it;
503a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ASSERT_TRUE(it != packet_events_.end());
5045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  event = *it;
506a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(relative_rtp_timestamp, event->relative_rtp_timestamp());
5075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(1, event->base_packet_event_size());
5095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const BasePacketEvent& base_event_2 = event->base_packet_event(0);
5105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(packet_id_2, base_event_2.packet_id());
5115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(1, base_event_2.event_type_size());
512cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(media::cast::proto::PACKET_RETRANSMITTED,
5135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            base_event_2.event_type(0));
514effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ASSERT_EQ(1, base_event_2.event_timestamp_ms_size());
515effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(InMilliseconds(now2), base_event_2.event_timestamp_ms(0));
5165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
5175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
518a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(EncodingEventSubscriberTest, FirstRtpTimestamp) {
519a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  Init(VIDEO_EVENT);
520a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RtpTimestamp rtp_timestamp = 12345;
521a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  base::TimeTicks now(testing_clock_->NowTicks());
522a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
523a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  cast_environment_->Logging()->InsertFrameEvent(now,
524cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                                 FRAME_CAPTURE_BEGIN,
525cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                                 VIDEO_EVENT,
526a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                                 rtp_timestamp,
527a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                                 /*frame_id*/ 0);
528a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
529a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  cast_environment_->Logging()->InsertFrameEvent(now,
530cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                                 FRAME_CAPTURE_END,
531cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                                 VIDEO_EVENT,
532a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                                 rtp_timestamp + 30,
533a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                                 /*frame_id*/ 1);
534a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
535a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  GetEventsAndReset();
536a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
537a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(rtp_timestamp, first_rtp_timestamp_);
5385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  FrameEventList::iterator it = frame_events_.begin();
539a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ASSERT_NE(frame_events_.end(), it);
5405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(0u, (*it)->relative_rtp_timestamp());
541a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
5425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ++it;
543a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ASSERT_NE(frame_events_.end(), it);
5445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(30u, (*it)->relative_rtp_timestamp());
545a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
546a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  rtp_timestamp = 67890;
547a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
548a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  cast_environment_->Logging()->InsertFrameEvent(now,
549cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                                 FRAME_CAPTURE_BEGIN,
550cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                                 VIDEO_EVENT,
551a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                                 rtp_timestamp,
552a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                                 /*frame_id*/ 0);
553a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  GetEventsAndReset();
554a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
555a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(rtp_timestamp, first_rtp_timestamp_);
556a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
557a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
558a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(EncodingEventSubscriberTest, RelativeRtpTimestampWrapAround) {
559a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  Init(VIDEO_EVENT);
560a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RtpTimestamp rtp_timestamp = 0xffffffff - 20;
561a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  base::TimeTicks now(testing_clock_->NowTicks());
562a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
563a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  cast_environment_->Logging()->InsertFrameEvent(now,
564cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                                 FRAME_CAPTURE_BEGIN,
565cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                                 VIDEO_EVENT,
566a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                                 rtp_timestamp,
567a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                                 /*frame_id*/ 0);
568a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
569a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // RtpTimestamp has now wrapped around.
570a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  cast_environment_->Logging()->InsertFrameEvent(now,
571cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                                 FRAME_CAPTURE_END,
572cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                                 VIDEO_EVENT,
573a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                                 rtp_timestamp + 30,
574a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                                 /*frame_id*/ 1);
575a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
576a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  GetEventsAndReset();
577a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
5785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  FrameEventList::iterator it = frame_events_.begin();
579a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ASSERT_NE(frame_events_.end(), it);
5805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(0u, (*it)->relative_rtp_timestamp());
581a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
5825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ++it;
583a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ASSERT_NE(frame_events_.end(), it);
5845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(30u, (*it)->relative_rtp_timestamp());
5855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
5865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
5875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuTEST_F(EncodingEventSubscriberTest, MaxEventsPerProto) {
5885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  Init(VIDEO_EVENT);
5895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  RtpTimestamp rtp_timestamp = 100;
5905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  for (int i = 0; i < kMaxEventsPerProto + 1; i++) {
5915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    cast_environment_->Logging()->InsertFrameEvent(testing_clock_->NowTicks(),
592cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                                   FRAME_ACK_RECEIVED,
593cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                                   VIDEO_EVENT,
5945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                                   rtp_timestamp,
5955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                                   /*frame_id*/ 0);
5965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    testing_clock_->Advance(base::TimeDelta::FromMilliseconds(30));
5975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
5985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
5995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  GetEventsAndReset();
6005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
6015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_EQ(2u, frame_events_.size());
6025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  FrameEventList::iterator frame_it = frame_events_.begin();
6035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(frame_it != frame_events_.end());
6045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
6055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  linked_ptr<AggregatedFrameEvent> frame_event = *frame_it;
6065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
6075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(kMaxEventsPerProto, frame_event->event_type_size());
6085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
6095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  for (int i = 0; i < kMaxPacketsPerFrame + 1; i++) {
6105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    cast_environment_->Logging()->InsertPacketEvent(
6115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        testing_clock_->NowTicks(),
612cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        PACKET_SENT_TO_NETWORK,
613cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        VIDEO_EVENT,
6145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        rtp_timestamp,
6155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        /*frame_id*/ 0,
6165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        i,
6175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        kMaxPacketsPerFrame,
6185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        123);
6195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    testing_clock_->Advance(base::TimeDelta::FromMilliseconds(30));
6205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
6215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
6225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  GetEventsAndReset();
6235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
6245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(2u, packet_events_.size());
6255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
6265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  PacketEventList::iterator packet_it = packet_events_.begin();
6275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(packet_it != packet_events_.end());
6285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
6295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  linked_ptr<AggregatedPacketEvent> packet_event = *packet_it;
6305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
6315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(kMaxPacketsPerFrame,
6325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      packet_event->base_packet_event_size());
6335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
6345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ++packet_it;
6355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  packet_event = *packet_it;
6365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(1, packet_event->base_packet_event_size());
6375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
6385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  for (int j = 0; j < kMaxEventsPerProto + 1; j++) {
6395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    cast_environment_->Logging()->InsertPacketEvent(
6405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        testing_clock_->NowTicks(),
641cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        PACKET_SENT_TO_NETWORK,
642cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        VIDEO_EVENT,
6435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        rtp_timestamp,
6445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        /*frame_id*/ 0,
6455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        0,
6465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        0,
6475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        123);
6485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    testing_clock_->Advance(base::TimeDelta::FromMilliseconds(30));
6495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
6505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
6515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  GetEventsAndReset();
6525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
6535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(2u, packet_events_.size());
6545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  packet_it = packet_events_.begin();
6555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ASSERT_TRUE(packet_it != packet_events_.end());
6565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
6575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  packet_event = *packet_it;
6585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
6595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(kMaxEventsPerProto,
6605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      packet_event->base_packet_event(0).event_type_size());
6615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
6625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ++packet_it;
6635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  packet_event = *packet_it;
6645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(1, packet_event->base_packet_event(0).event_type_size());
665a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
666a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
6675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}  // namespace cast
6685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}  // namespace media
669