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