diff options
Diffstat (limited to 'media')
-rw-r--r-- | media/cast/logging/encoding_event_subscriber.cc | 61 | ||||
-rw-r--r-- | media/cast/logging/encoding_event_subscriber.h | 32 | ||||
-rw-r--r-- | media/cast/logging/encoding_event_subscriber_unittest.cc | 164 |
3 files changed, 182 insertions, 75 deletions
diff --git a/media/cast/logging/encoding_event_subscriber.cc b/media/cast/logging/encoding_event_subscriber.cc index 265e39d..5262e49 100644 --- a/media/cast/logging/encoding_event_subscriber.cc +++ b/media/cast/logging/encoding_event_subscriber.cc @@ -20,8 +20,12 @@ namespace media { namespace cast { EncodingEventSubscriber::EncodingEventSubscriber( - EventMediaType event_media_type, size_t max_frames) - : event_media_type_(event_media_type), max_frames_(max_frames) {} + EventMediaType event_media_type, + size_t max_frames) + : event_media_type_(event_media_type), + max_frames_(max_frames), + seen_first_rtp_timestamp_(false), + first_rtp_timestamp_(0u) {} EncodingEventSubscriber::~EncodingEventSubscriber() { DCHECK(thread_checker_.CalledOnValidThread()); @@ -32,16 +36,17 @@ void EncodingEventSubscriber::OnReceiveFrameEvent( DCHECK(thread_checker_.CalledOnValidThread()); if (ShouldProcessEvent(frame_event.type)) { - FrameEventMap::iterator it = - frame_event_map_.find(frame_event.rtp_timestamp); + RtpTimestamp relative_rtp_timestamp = + GetRelativeRtpTimestamp(frame_event.rtp_timestamp); + FrameEventMap::iterator it = frame_event_map_.find(relative_rtp_timestamp); linked_ptr<AggregatedFrameEvent> event_proto; // Look up existing entry. If not found, create a new entry and add to map. if (it == frame_event_map_.end()) { event_proto.reset(new AggregatedFrameEvent); - event_proto->set_rtp_timestamp(frame_event.rtp_timestamp); + event_proto->set_rtp_timestamp(relative_rtp_timestamp); frame_event_map_.insert( - std::make_pair(frame_event.rtp_timestamp, event_proto)); + std::make_pair(relative_rtp_timestamp, event_proto)); } else { event_proto = it->second; } @@ -69,17 +74,19 @@ void EncodingEventSubscriber::OnReceivePacketEvent( DCHECK(thread_checker_.CalledOnValidThread()); if (ShouldProcessEvent(packet_event.type)) { + RtpTimestamp relative_rtp_timestamp = + GetRelativeRtpTimestamp(packet_event.rtp_timestamp); PacketEventMap::iterator it = - packet_event_map_.find(packet_event.rtp_timestamp); + packet_event_map_.find(relative_rtp_timestamp); linked_ptr<AggregatedPacketEvent> event_proto; BasePacketEvent* base_packet_event_proto = NULL; // Look up existing entry. If not found, create a new entry and add to map. if (it == packet_event_map_.end()) { event_proto.reset(new AggregatedPacketEvent); - event_proto->set_rtp_timestamp(packet_event.rtp_timestamp); + event_proto->set_rtp_timestamp(relative_rtp_timestamp); packet_event_map_.insert( - std::make_pair(packet_event.rtp_timestamp, event_proto)); + std::make_pair(relative_rtp_timestamp, event_proto)); base_packet_event_proto = event_proto->add_base_packet_event(); base_packet_event_proto->set_packet_id(packet_event.packet_id); } else { @@ -120,21 +127,18 @@ void EncodingEventSubscriber::OnReceiveGenericEvent( // Do nothing, there are no generic events we are interested in. } -void EncodingEventSubscriber::GetFrameEventsAndReset( - FrameEventMap* frame_event_map) { +void EncodingEventSubscriber::GetEventsAndReset( + FrameEventMap* frame_events, + PacketEventMap* packet_events, + RtpTimestamp* first_rtp_timestamp) { DCHECK(thread_checker_.CalledOnValidThread()); - frame_event_map->swap(frame_event_map_); - frame_event_map_.clear(); -} -void EncodingEventSubscriber::GetPacketEventsAndReset( - PacketEventMap* packet_event_map) { - DCHECK(thread_checker_.CalledOnValidThread()); - packet_event_map->swap(packet_event_map_); - packet_event_map_.clear(); + frame_events->swap(frame_event_map_); + packet_events->swap(packet_event_map_); + *first_rtp_timestamp = first_rtp_timestamp_; + Reset(); } - bool EncodingEventSubscriber::ShouldProcessEvent(CastLoggingEvent event) { return GetEventMediaType(event) == event_media_type_; } @@ -153,5 +157,22 @@ void EncodingEventSubscriber::TruncatePacketEventMapIfNeeded() { packet_event_map_.erase(packet_event_map_.begin()); } +RtpTimestamp EncodingEventSubscriber::GetRelativeRtpTimestamp( + RtpTimestamp rtp_timestamp) { + if (!seen_first_rtp_timestamp_) { + seen_first_rtp_timestamp_ = true; + first_rtp_timestamp_ = rtp_timestamp; + } + + return rtp_timestamp - first_rtp_timestamp_; +} + +void EncodingEventSubscriber::Reset() { + frame_event_map_.clear(); + packet_event_map_.clear(); + seen_first_rtp_timestamp_ = false; + first_rtp_timestamp_ = 0u; +} + } // namespace cast } // namespace media diff --git a/media/cast/logging/encoding_event_subscriber.h b/media/cast/logging/encoding_event_subscriber.h index acd1d14..5766e7b 100644 --- a/media/cast/logging/encoding_event_subscriber.h +++ b/media/cast/logging/encoding_event_subscriber.h @@ -46,13 +46,18 @@ class EncodingEventSubscriber : public RawEventSubscriber { virtual void OnReceiveGenericEvent(const GenericEvent& generic_event) OVERRIDE; - // Assigns frame events received so far to |frame_events| and clears them - // from this object. - void GetFrameEventsAndReset(FrameEventMap* frame_events); - - // Assigns packet events received so far to |packet_events| and clears them - // from this object. - void GetPacketEventsAndReset(PacketEventMap* packet_events); + // Assigns frame events and packet events received so far to |frame_events| + // and clears them |packet_events| respectively, assigns the first seen RTP + // timestamp (which is used as a reference for all event entries) to + // |first_rtp_timestamp|, and reset this object's internal states. + // All RTP timestamp values returned in the maps are relative to + // |first_rtp_timestamp|, i.e. suppose |first_rtp_timestamp| is X, + // then the first event will be recorded with a relative + // RTP timestamp value of 0. If the next event has original RTP timestamp + // X+20, it will be recorded with a relative RTP timestamp of 20. + void GetEventsAndReset(FrameEventMap* frame_events, + PacketEventMap* packet_events, + RtpTimestamp* first_rtp_timestamp); private: bool ShouldProcessEvent(CastLoggingEvent event); @@ -63,6 +68,13 @@ class EncodingEventSubscriber : public RawEventSubscriber { // Removes oldest entry from |packet_event_map_| (ordered by RTP timestamp). void TruncatePacketEventMapIfNeeded(); + // Returns the difference between |rtp_timestamp| and |first_rtp_timestamp_|. + // Sets |first_rtp_timestamp_| if it is not already set. + RtpTimestamp GetRelativeRtpTimestamp(RtpTimestamp rtp_timestamp); + + // Clears the maps and first RTP timestamp seen. + void Reset(); + const EventMediaType event_media_type_; const size_t max_frames_; @@ -72,6 +84,12 @@ class EncodingEventSubscriber : public RawEventSubscriber { // All functions must be called on the main thread. base::ThreadChecker thread_checker_; + // Set to true on first event encountered after a |Reset()|. + bool seen_first_rtp_timestamp_; + + // Set to RTP timestamp of first event encountered after a |Reset()|. + RtpTimestamp first_rtp_timestamp_; + DISALLOW_COPY_AND_ASSIGN(EncodingEventSubscriber); }; diff --git a/media/cast/logging/encoding_event_subscriber_unittest.cc b/media/cast/logging/encoding_event_subscriber_unittest.cc index 1194ed9..3b45837 100644 --- a/media/cast/logging/encoding_event_subscriber_unittest.cc +++ b/media/cast/logging/encoding_event_subscriber_unittest.cc @@ -32,7 +32,8 @@ class EncodingEventSubscriberTest : public ::testing::Test { task_runner_, task_runner_, task_runner_, - GetLoggingConfigWithRawEventsAndStatsEnabled())) {} + GetLoggingConfigWithRawEventsAndStatsEnabled())), + first_rtp_timestamp(0) {} void Init(EventMediaType event_media_type) { DCHECK(!event_subscriber_); @@ -48,10 +49,18 @@ class EncodingEventSubscriberTest : public ::testing::Test { } } + void GetEventsAndReset() { + event_subscriber_->GetEventsAndReset( + &frame_events, &packet_events, &first_rtp_timestamp); + } + base::SimpleTestTickClock* testing_clock_; // Owned by CastEnvironment. scoped_refptr<test::FakeSingleThreadTaskRunner> task_runner_; scoped_refptr<CastEnvironment> cast_environment_; scoped_ptr<EncodingEventSubscriber> event_subscriber_; + FrameEventMap frame_events; + PacketEventMap packet_events; + RtpTimestamp first_rtp_timestamp; }; TEST_F(EncodingEventSubscriberTest, FrameEventTruncating) { @@ -71,8 +80,7 @@ TEST_F(EncodingEventSubscriberTest, FrameEventTruncating) { /*frame_id*/ 0); } - FrameEventMap frame_events; - event_subscriber_->GetFrameEventsAndReset(&frame_events); + GetEventsAndReset(); ASSERT_EQ(10u, frame_events.size()); EXPECT_EQ(100u, frame_events.begin()->first); @@ -95,8 +103,7 @@ TEST_F(EncodingEventSubscriberTest, PacketEventTruncating) { /*size*/ 123); } - PacketEventMap packet_events; - event_subscriber_->GetPacketEventsAndReset(&packet_events); + GetEventsAndReset(); ASSERT_EQ(10u, packet_events.size()); EXPECT_EQ(100u, packet_events.begin()->first); @@ -119,10 +126,9 @@ TEST_F(EncodingEventSubscriberTest, EventFiltering) { rtp_timestamp, /*frame_id*/ 0); - FrameEventMap frame_events; - event_subscriber_->GetFrameEventsAndReset(&frame_events); + GetEventsAndReset(); - FrameEventMap::iterator frame_it = frame_events.find(rtp_timestamp); + FrameEventMap::iterator frame_it = frame_events.find(0); ASSERT_TRUE(frame_it != frame_events.end()); linked_ptr<AggregatedFrameEvent> frame_event = frame_it->second; @@ -131,8 +137,8 @@ TEST_F(EncodingEventSubscriberTest, EventFiltering) { EXPECT_EQ(media::cast::proto::VIDEO_FRAME_DECODED, frame_event->event_type(0)); - PacketEventMap packet_events; - event_subscriber_->GetPacketEventsAndReset(&packet_events); + GetEventsAndReset(); + EXPECT_TRUE(packet_events.empty()); } @@ -144,17 +150,17 @@ TEST_F(EncodingEventSubscriberTest, FrameEvent) { rtp_timestamp, /*frame_id*/ 0); - FrameEventMap frame_events; - event_subscriber_->GetFrameEventsAndReset(&frame_events); + GetEventsAndReset(); ASSERT_EQ(1u, frame_events.size()); - FrameEventMap::iterator it = frame_events.find(rtp_timestamp); + RtpTimestamp relative_rtp_timestamp = rtp_timestamp - first_rtp_timestamp; + FrameEventMap::iterator it = frame_events.find(relative_rtp_timestamp); ASSERT_TRUE(it != frame_events.end()); linked_ptr<AggregatedFrameEvent> event = it->second; - EXPECT_EQ(rtp_timestamp, event->rtp_timestamp()); + EXPECT_EQ(relative_rtp_timestamp, event->rtp_timestamp()); ASSERT_EQ(1, event->event_type_size()); EXPECT_EQ(media::cast::proto::VIDEO_FRAME_DECODED, event->event_type(0)); @@ -164,7 +170,7 @@ TEST_F(EncodingEventSubscriberTest, FrameEvent) { EXPECT_EQ(0, event->encoded_frame_size()); EXPECT_EQ(0, event->delay_millis()); - event_subscriber_->GetFrameEventsAndReset(&frame_events); + GetEventsAndReset(); EXPECT_TRUE(frame_events.empty()); } @@ -177,17 +183,17 @@ TEST_F(EncodingEventSubscriberTest, FrameEventDelay) { now, kAudioPlayoutDelay, rtp_timestamp, /*frame_id*/ 0, base::TimeDelta::FromMilliseconds(delay_ms)); - FrameEventMap frame_events; - event_subscriber_->GetFrameEventsAndReset(&frame_events); + GetEventsAndReset(); ASSERT_EQ(1u, frame_events.size()); - FrameEventMap::iterator it = frame_events.find(rtp_timestamp); + RtpTimestamp relative_rtp_timestamp = rtp_timestamp - first_rtp_timestamp; + FrameEventMap::iterator it = frame_events.find(relative_rtp_timestamp); ASSERT_TRUE(it != frame_events.end()); linked_ptr<AggregatedFrameEvent> event = it->second; - EXPECT_EQ(rtp_timestamp, event->rtp_timestamp()); + EXPECT_EQ(relative_rtp_timestamp, event->rtp_timestamp()); ASSERT_EQ(1, event->event_type_size()); EXPECT_EQ(media::cast::proto::AUDIO_PLAYOUT_DELAY, event->event_type(0)); @@ -207,17 +213,17 @@ TEST_F(EncodingEventSubscriberTest, FrameEventSize) { now, kVideoFrameEncoded, rtp_timestamp, /*frame_id*/ 0, size); - FrameEventMap frame_events; - event_subscriber_->GetFrameEventsAndReset(&frame_events); + GetEventsAndReset(); ASSERT_EQ(1u, frame_events.size()); - FrameEventMap::iterator it = frame_events.find(rtp_timestamp); + RtpTimestamp relative_rtp_timestamp = rtp_timestamp - first_rtp_timestamp; + FrameEventMap::iterator it = frame_events.find(relative_rtp_timestamp); ASSERT_TRUE(it != frame_events.end()); linked_ptr<AggregatedFrameEvent> event = it->second; - EXPECT_EQ(rtp_timestamp, event->rtp_timestamp()); + EXPECT_EQ(relative_rtp_timestamp, event->rtp_timestamp()); ASSERT_EQ(1, event->event_type_size()); EXPECT_EQ(media::cast::proto::VIDEO_FRAME_ENCODED, event->event_type(0)); @@ -248,17 +254,17 @@ TEST_F(EncodingEventSubscriberTest, MultipleFrameEvents) { cast_environment_->Logging()->InsertFrameEvent( now3, kAudioFrameDecoded, rtp_timestamp1, /*frame_id*/ 0); - FrameEventMap frame_events; - event_subscriber_->GetFrameEventsAndReset(&frame_events); + GetEventsAndReset(); ASSERT_EQ(2u, frame_events.size()); - FrameEventMap::iterator it = frame_events.find(100); + RtpTimestamp relative_rtp_timestamp = rtp_timestamp1 - first_rtp_timestamp; + FrameEventMap::iterator it = frame_events.find(relative_rtp_timestamp); ASSERT_TRUE(it != frame_events.end()); linked_ptr<AggregatedFrameEvent> event = it->second; - EXPECT_EQ(rtp_timestamp1, event->rtp_timestamp()); + EXPECT_EQ(relative_rtp_timestamp, event->rtp_timestamp()); ASSERT_EQ(2, event->event_type_size()); EXPECT_EQ(media::cast::proto::AUDIO_PLAYOUT_DELAY, event->event_type(0)); @@ -268,12 +274,13 @@ TEST_F(EncodingEventSubscriberTest, MultipleFrameEvents) { EXPECT_EQ(now1.ToInternalValue(), event->event_timestamp_micros(0)); EXPECT_EQ(now3.ToInternalValue(), event->event_timestamp_micros(1)); - it = frame_events.find(200); + relative_rtp_timestamp = rtp_timestamp2 - first_rtp_timestamp; + it = frame_events.find(relative_rtp_timestamp); ASSERT_TRUE(it != frame_events.end()); event = it->second; - EXPECT_EQ(rtp_timestamp2, event->rtp_timestamp()); + EXPECT_EQ(relative_rtp_timestamp, event->rtp_timestamp()); ASSERT_EQ(1, event->event_type_size()); EXPECT_EQ(media::cast::proto::AUDIO_FRAME_ENCODED, event->event_type(0)); @@ -292,17 +299,17 @@ TEST_F(EncodingEventSubscriberTest, PacketEvent) { now, kAudioPacketReceived, rtp_timestamp, /*frame_id*/ 0, packet_id, /*max_packet_id*/ 10, size); - PacketEventMap packet_events; - event_subscriber_->GetPacketEventsAndReset(&packet_events); + GetEventsAndReset(); ASSERT_EQ(1u, packet_events.size()); - PacketEventMap::iterator it = packet_events.find(rtp_timestamp); + RtpTimestamp relative_rtp_timestamp = rtp_timestamp - first_rtp_timestamp; + PacketEventMap::iterator it = packet_events.find(relative_rtp_timestamp); ASSERT_TRUE(it != packet_events.end()); linked_ptr<AggregatedPacketEvent> event = it->second; - EXPECT_EQ(rtp_timestamp, event->rtp_timestamp()); + EXPECT_EQ(relative_rtp_timestamp, event->rtp_timestamp()); ASSERT_EQ(1, event->base_packet_event_size()); const BasePacketEvent& base_event = event->base_packet_event(0); @@ -313,7 +320,7 @@ TEST_F(EncodingEventSubscriberTest, PacketEvent) { ASSERT_EQ(1, base_event.event_timestamp_micros_size()); EXPECT_EQ(now.ToInternalValue(), base_event.event_timestamp_micros(0)); - event_subscriber_->GetPacketEventsAndReset(&packet_events); + GetEventsAndReset(); EXPECT_TRUE(packet_events.empty()); } @@ -333,17 +340,17 @@ TEST_F(EncodingEventSubscriberTest, MultiplePacketEventsForPacket) { now2, kPacketSentToNetwork, rtp_timestamp, /*frame_id*/ 0, packet_id, /*max_packet_id*/ 10, size); - PacketEventMap packet_events; - event_subscriber_->GetPacketEventsAndReset(&packet_events); + GetEventsAndReset(); ASSERT_EQ(1u, packet_events.size()); - PacketEventMap::iterator it = packet_events.find(rtp_timestamp); + RtpTimestamp relative_rtp_timestamp = rtp_timestamp - first_rtp_timestamp; + PacketEventMap::iterator it = packet_events.find(relative_rtp_timestamp); ASSERT_TRUE(it != packet_events.end()); linked_ptr<AggregatedPacketEvent> event = it->second; - EXPECT_EQ(rtp_timestamp, event->rtp_timestamp()); + EXPECT_EQ(relative_rtp_timestamp, event->rtp_timestamp()); ASSERT_EQ(1, event->base_packet_event_size()); const BasePacketEvent& base_event = event->base_packet_event(0); @@ -374,17 +381,17 @@ TEST_F(EncodingEventSubscriberTest, MultiplePacketEventsForFrame) { now2, kPacketRetransmitted, rtp_timestamp, /*frame_id*/ 0, packet_id_2, /*max_packet_id*/ 10, size); - PacketEventMap packet_events; - event_subscriber_->GetPacketEventsAndReset(&packet_events); + GetEventsAndReset(); ASSERT_EQ(1u, packet_events.size()); - PacketEventMap::iterator it = packet_events.find(rtp_timestamp); + RtpTimestamp relative_rtp_timestamp = rtp_timestamp - first_rtp_timestamp; + PacketEventMap::iterator it = packet_events.find(relative_rtp_timestamp); ASSERT_TRUE(it != packet_events.end()); linked_ptr<AggregatedPacketEvent> event = it->second; - EXPECT_EQ(rtp_timestamp, event->rtp_timestamp()); + EXPECT_EQ(relative_rtp_timestamp, event->rtp_timestamp()); ASSERT_EQ(2, event->base_packet_event_size()); const BasePacketEvent& base_event = event->base_packet_event(0); @@ -421,17 +428,17 @@ TEST_F(EncodingEventSubscriberTest, MultiplePacketEvents) { now2, kPacketRetransmitted, rtp_timestamp_2, /*frame_id*/ 0, packet_id_2, /*max_packet_id*/ 10, size); - PacketEventMap packet_events; - event_subscriber_->GetPacketEventsAndReset(&packet_events); + GetEventsAndReset(); ASSERT_EQ(2u, packet_events.size()); - PacketEventMap::iterator it = packet_events.find(rtp_timestamp_1); + RtpTimestamp relative_rtp_timestamp = rtp_timestamp_1 - first_rtp_timestamp; + PacketEventMap::iterator it = packet_events.find(relative_rtp_timestamp); ASSERT_TRUE(it != packet_events.end()); linked_ptr<AggregatedPacketEvent> event = it->second; - EXPECT_EQ(rtp_timestamp_1, event->rtp_timestamp()); + EXPECT_EQ(relative_rtp_timestamp, event->rtp_timestamp()); ASSERT_EQ(1, event->base_packet_event_size()); const BasePacketEvent& base_event = event->base_packet_event(0); @@ -441,12 +448,13 @@ TEST_F(EncodingEventSubscriberTest, MultiplePacketEvents) { ASSERT_EQ(1, base_event.event_timestamp_micros_size()); EXPECT_EQ(now1.ToInternalValue(), base_event.event_timestamp_micros(0)); - it = packet_events.find(rtp_timestamp_2); + relative_rtp_timestamp = rtp_timestamp_2 - first_rtp_timestamp; + it = packet_events.find(relative_rtp_timestamp); ASSERT_TRUE(it != packet_events.end()); event = it->second; - EXPECT_EQ(rtp_timestamp_2, event->rtp_timestamp()); + EXPECT_EQ(relative_rtp_timestamp, event->rtp_timestamp()); ASSERT_EQ(1, event->base_packet_event_size()); const BasePacketEvent& base_event_2 = event->base_packet_event(0); @@ -458,5 +466,65 @@ TEST_F(EncodingEventSubscriberTest, MultiplePacketEvents) { EXPECT_EQ(now2.ToInternalValue(), base_event_2.event_timestamp_micros(0)); } +TEST_F(EncodingEventSubscriberTest, FirstRtpTimestamp) { + Init(VIDEO_EVENT); + RtpTimestamp rtp_timestamp = 12345; + base::TimeTicks now(testing_clock_->NowTicks()); + + cast_environment_->Logging()->InsertFrameEvent(now, + kVideoFrameCaptured, + rtp_timestamp, + /*frame_id*/ 0); + + cast_environment_->Logging()->InsertFrameEvent(now, + kVideoFrameReceived, + rtp_timestamp + 30, + /*frame_id*/ 1); + + GetEventsAndReset(); + + EXPECT_EQ(rtp_timestamp, first_rtp_timestamp); + FrameEventMap::iterator it = frame_events.find(0); + ASSERT_NE(frame_events.end(), it); + + it = frame_events.find(30); + ASSERT_NE(frame_events.end(), it); + + rtp_timestamp = 67890; + + cast_environment_->Logging()->InsertFrameEvent(now, + kVideoFrameCaptured, + rtp_timestamp, + /*frame_id*/ 0); + GetEventsAndReset(); + + EXPECT_EQ(rtp_timestamp, first_rtp_timestamp); +} + +TEST_F(EncodingEventSubscriberTest, RelativeRtpTimestampWrapAround) { + Init(VIDEO_EVENT); + RtpTimestamp rtp_timestamp = 0xffffffff - 20; + base::TimeTicks now(testing_clock_->NowTicks()); + + cast_environment_->Logging()->InsertFrameEvent(now, + kVideoFrameCaptured, + rtp_timestamp, + /*frame_id*/ 0); + + // RtpTimestamp has now wrapped around. + cast_environment_->Logging()->InsertFrameEvent(now, + kVideoFrameReceived, + rtp_timestamp + 30, + /*frame_id*/ 1); + + GetEventsAndReset(); + + FrameEventMap::iterator it = frame_events.find(0); + ASSERT_NE(frame_events.end(), it); + + it = frame_events.find(30); + ASSERT_NE(frame_events.end(), it); +} + } // namespace cast } // namespace media |