OLD | NEW |
(Empty) | |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #include "base/memory/ref_counted.h" |
| 6 #include "base/memory/scoped_ptr.h" |
| 7 #include "base/test/simple_test_tick_clock.h" |
| 8 #include "base/time/tick_clock.h" |
| 9 #include "media/cast/cast_environment.h" |
| 10 #include "media/cast/logging/encoding_event_subscriber.h" |
| 11 #include "media/cast/logging/logging_defines.h" |
| 12 #include "media/cast/test/fake_single_thread_task_runner.h" |
| 13 #include "testing/gtest/include/gtest/gtest.h" |
| 14 |
| 15 using media::cast::proto::AggregatedFrameEvent; |
| 16 using media::cast::proto::AggregatedGenericEvent; |
| 17 using media::cast::proto::AggregatedPacketEvent; |
| 18 using media::cast::proto::BasePacketEvent; |
| 19 |
| 20 namespace media { |
| 21 namespace cast { |
| 22 |
| 23 class EncodingEventSubscriberTest : public ::testing::Test { |
| 24 protected: |
| 25 EncodingEventSubscriberTest() |
| 26 : testing_clock_(new base::SimpleTestTickClock()), |
| 27 task_runner_(new test::FakeSingleThreadTaskRunner(testing_clock_)), |
| 28 cast_environment_(new CastEnvironment( |
| 29 scoped_ptr<base::TickClock>(testing_clock_).Pass(), task_runner_, |
| 30 task_runner_, task_runner_, task_runner_, task_runner_, |
| 31 task_runner_, GetLoggingConfigWithRawEventsAndStatsEnabled())), |
| 32 event_subscriber_(task_runner_) { |
| 33 cast_environment_->Logging()->AddRawEventSubscriber(&event_subscriber_); |
| 34 } |
| 35 |
| 36 virtual ~EncodingEventSubscriberTest() { |
| 37 cast_environment_->Logging()->RemoveRawEventSubscriber(&event_subscriber_); |
| 38 } |
| 39 |
| 40 base::SimpleTestTickClock* testing_clock_; // Owned by CastEnvironment. |
| 41 scoped_refptr<test::FakeSingleThreadTaskRunner> task_runner_; |
| 42 scoped_refptr<CastEnvironment> cast_environment_; |
| 43 EncodingEventSubscriber event_subscriber_; |
| 44 }; |
| 45 |
| 46 TEST_F(EncodingEventSubscriberTest, FrameEvent) { |
| 47 base::TimeTicks now(testing_clock_->NowTicks()); |
| 48 RtpTimestamp rtp_timestamp = 100; |
| 49 cast_environment_->Logging()->InsertFrameEvent(now, kVideoFrameDecoded, |
| 50 rtp_timestamp, |
| 51 /*frame_id*/ 0); |
| 52 |
| 53 FrameEventMap frame_events; |
| 54 event_subscriber_.GetFrameEventsAndReset(&frame_events); |
| 55 |
| 56 ASSERT_EQ(1u, frame_events.size()); |
| 57 |
| 58 FrameEventMap::iterator it = frame_events.find(rtp_timestamp); |
| 59 ASSERT_TRUE(it != frame_events.end()); |
| 60 |
| 61 linked_ptr<AggregatedFrameEvent> event = it->second; |
| 62 |
| 63 EXPECT_EQ(rtp_timestamp, event->rtp_timestamp()); |
| 64 |
| 65 ASSERT_EQ(1, event->event_type_size()); |
| 66 EXPECT_EQ(media::cast::proto::VIDEO_FRAME_DECODED, event->event_type(0)); |
| 67 ASSERT_EQ(1, event->event_timestamp_micros_size()); |
| 68 EXPECT_EQ(now.ToInternalValue(), event->event_timestamp_micros(0)); |
| 69 |
| 70 EXPECT_EQ(0, event->encoded_frame_size()); |
| 71 EXPECT_EQ(0, event->delay_millis()); |
| 72 |
| 73 event_subscriber_.GetFrameEventsAndReset(&frame_events); |
| 74 EXPECT_TRUE(frame_events.empty()); |
| 75 } |
| 76 |
| 77 TEST_F(EncodingEventSubscriberTest, FrameEventDelay) { |
| 78 base::TimeTicks now(testing_clock_->NowTicks()); |
| 79 RtpTimestamp rtp_timestamp = 100; |
| 80 int delay_ms = 100; |
| 81 cast_environment_->Logging()->InsertFrameEventWithDelay( |
| 82 now, kAudioPlayoutDelay, rtp_timestamp, |
| 83 /*frame_id*/ 0, base::TimeDelta::FromMilliseconds(delay_ms)); |
| 84 |
| 85 FrameEventMap frame_events; |
| 86 event_subscriber_.GetFrameEventsAndReset(&frame_events); |
| 87 |
| 88 ASSERT_EQ(1u, frame_events.size()); |
| 89 |
| 90 FrameEventMap::iterator it = frame_events.find(rtp_timestamp); |
| 91 ASSERT_TRUE(it != frame_events.end()); |
| 92 |
| 93 linked_ptr<AggregatedFrameEvent> event = it->second; |
| 94 |
| 95 EXPECT_EQ(rtp_timestamp, event->rtp_timestamp()); |
| 96 |
| 97 ASSERT_EQ(1, event->event_type_size()); |
| 98 EXPECT_EQ(media::cast::proto::AUDIO_PLAYOUT_DELAY, event->event_type(0)); |
| 99 ASSERT_EQ(1, event->event_timestamp_micros_size()); |
| 100 EXPECT_EQ(now.ToInternalValue(), event->event_timestamp_micros(0)); |
| 101 |
| 102 EXPECT_EQ(0, event->encoded_frame_size()); |
| 103 EXPECT_EQ(100, event->delay_millis()); |
| 104 } |
| 105 |
| 106 TEST_F(EncodingEventSubscriberTest, FrameEventSize) { |
| 107 base::TimeTicks now(testing_clock_->NowTicks()); |
| 108 RtpTimestamp rtp_timestamp = 100; |
| 109 int size = 123; |
| 110 cast_environment_->Logging()->InsertFrameEventWithSize( |
| 111 now, kVideoFrameEncoded, rtp_timestamp, |
| 112 /*frame_id*/ 0, size); |
| 113 |
| 114 FrameEventMap frame_events; |
| 115 event_subscriber_.GetFrameEventsAndReset(&frame_events); |
| 116 |
| 117 ASSERT_EQ(1u, frame_events.size()); |
| 118 |
| 119 FrameEventMap::iterator it = frame_events.find(rtp_timestamp); |
| 120 ASSERT_TRUE(it != frame_events.end()); |
| 121 |
| 122 linked_ptr<AggregatedFrameEvent> event = it->second; |
| 123 |
| 124 EXPECT_EQ(rtp_timestamp, event->rtp_timestamp()); |
| 125 |
| 126 ASSERT_EQ(1, event->event_type_size()); |
| 127 EXPECT_EQ(media::cast::proto::VIDEO_FRAME_ENCODED, event->event_type(0)); |
| 128 ASSERT_EQ(1, event->event_timestamp_micros_size()); |
| 129 EXPECT_EQ(now.ToInternalValue(), event->event_timestamp_micros(0)); |
| 130 |
| 131 EXPECT_EQ(size, event->encoded_frame_size()); |
| 132 EXPECT_EQ(0, event->delay_millis()); |
| 133 } |
| 134 |
| 135 TEST_F(EncodingEventSubscriberTest, MultipleFrameEvents) { |
| 136 RtpTimestamp rtp_timestamp1 = 100; |
| 137 RtpTimestamp rtp_timestamp2 = 200; |
| 138 base::TimeTicks now1(testing_clock_->NowTicks()); |
| 139 cast_environment_->Logging()->InsertFrameEventWithDelay( |
| 140 now1, kAudioPlayoutDelay, rtp_timestamp1, |
| 141 /*frame_id*/ 0, /*delay*/ base::TimeDelta::FromMilliseconds(100)); |
| 142 |
| 143 testing_clock_->Advance(base::TimeDelta::FromMilliseconds(20)); |
| 144 base::TimeTicks now2(testing_clock_->NowTicks()); |
| 145 cast_environment_->Logging()->InsertFrameEventWithSize( |
| 146 now2, kAudioFrameEncoded, rtp_timestamp2, |
| 147 /*frame_id*/ 0, /*size*/ 123); |
| 148 |
| 149 testing_clock_->Advance(base::TimeDelta::FromMilliseconds(20)); |
| 150 base::TimeTicks now3(testing_clock_->NowTicks()); |
| 151 cast_environment_->Logging()->InsertFrameEvent( |
| 152 now3, kAudioFrameDecoded, rtp_timestamp1, /*frame_id*/ 0); |
| 153 |
| 154 FrameEventMap frame_events; |
| 155 event_subscriber_.GetFrameEventsAndReset(&frame_events); |
| 156 |
| 157 ASSERT_EQ(2u, frame_events.size()); |
| 158 |
| 159 FrameEventMap::iterator it = frame_events.find(100); |
| 160 ASSERT_TRUE(it != frame_events.end()); |
| 161 |
| 162 linked_ptr<AggregatedFrameEvent> event = it->second; |
| 163 |
| 164 EXPECT_EQ(rtp_timestamp1, event->rtp_timestamp()); |
| 165 |
| 166 ASSERT_EQ(2, event->event_type_size()); |
| 167 EXPECT_EQ(media::cast::proto::AUDIO_PLAYOUT_DELAY, event->event_type(0)); |
| 168 EXPECT_EQ(media::cast::proto::AUDIO_FRAME_DECODED, event->event_type(1)); |
| 169 |
| 170 ASSERT_EQ(2, event->event_timestamp_micros_size()); |
| 171 EXPECT_EQ(now1.ToInternalValue(), event->event_timestamp_micros(0)); |
| 172 EXPECT_EQ(now3.ToInternalValue(), event->event_timestamp_micros(1)); |
| 173 |
| 174 it = frame_events.find(200); |
| 175 ASSERT_TRUE(it != frame_events.end()); |
| 176 |
| 177 event = it->second; |
| 178 |
| 179 EXPECT_EQ(rtp_timestamp2, event->rtp_timestamp()); |
| 180 |
| 181 ASSERT_EQ(1, event->event_type_size()); |
| 182 EXPECT_EQ(media::cast::proto::AUDIO_FRAME_ENCODED, event->event_type(0)); |
| 183 |
| 184 ASSERT_EQ(1, event->event_timestamp_micros_size()); |
| 185 EXPECT_EQ(now2.ToInternalValue(), event->event_timestamp_micros(0)); |
| 186 } |
| 187 |
| 188 TEST_F(EncodingEventSubscriberTest, PacketEvent) { |
| 189 base::TimeTicks now(testing_clock_->NowTicks()); |
| 190 RtpTimestamp rtp_timestamp = 100; |
| 191 int packet_id = 2; |
| 192 int size = 100; |
| 193 cast_environment_->Logging()->InsertPacketEvent( |
| 194 now, kAudioPacketReceived, rtp_timestamp, /*frame_id*/ 0, packet_id, |
| 195 /*max_packet_id*/ 10, size); |
| 196 |
| 197 PacketEventMap packet_events; |
| 198 event_subscriber_.GetPacketEventsAndReset(&packet_events); |
| 199 |
| 200 ASSERT_EQ(1u, packet_events.size()); |
| 201 |
| 202 PacketEventMap::iterator it = packet_events.find(rtp_timestamp); |
| 203 ASSERT_TRUE(it != packet_events.end()); |
| 204 |
| 205 linked_ptr<AggregatedPacketEvent> event = it->second; |
| 206 |
| 207 EXPECT_EQ(rtp_timestamp, event->rtp_timestamp()); |
| 208 |
| 209 ASSERT_EQ(1, event->base_packet_event_size()); |
| 210 const BasePacketEvent& base_event = event->base_packet_event(0); |
| 211 EXPECT_EQ(packet_id, base_event.packet_id()); |
| 212 ASSERT_EQ(1, base_event.event_type_size()); |
| 213 EXPECT_EQ(media::cast::proto::AUDIO_PACKET_RECEIVED, |
| 214 base_event.event_type(0)); |
| 215 ASSERT_EQ(1, base_event.event_timestamp_micros_size()); |
| 216 EXPECT_EQ(now.ToInternalValue(), base_event.event_timestamp_micros(0)); |
| 217 |
| 218 event_subscriber_.GetPacketEventsAndReset(&packet_events); |
| 219 EXPECT_TRUE(packet_events.empty()); |
| 220 } |
| 221 |
| 222 TEST_F(EncodingEventSubscriberTest, MultiplePacketEventsForPacket) { |
| 223 base::TimeTicks now1(testing_clock_->NowTicks()); |
| 224 RtpTimestamp rtp_timestamp = 100; |
| 225 int packet_id = 2; |
| 226 int size = 100; |
| 227 cast_environment_->Logging()->InsertPacketEvent( |
| 228 now1, kPacketSentToPacer, rtp_timestamp, /*frame_id*/ 0, packet_id, |
| 229 /*max_packet_id*/ 10, size); |
| 230 |
| 231 testing_clock_->Advance(base::TimeDelta::FromMilliseconds(20)); |
| 232 base::TimeTicks now2(testing_clock_->NowTicks()); |
| 233 cast_environment_->Logging()->InsertPacketEvent( |
| 234 now2, kPacketSentToNetwork, rtp_timestamp, /*frame_id*/ 0, packet_id, |
| 235 /*max_packet_id*/ 10, size); |
| 236 |
| 237 PacketEventMap packet_events; |
| 238 event_subscriber_.GetPacketEventsAndReset(&packet_events); |
| 239 |
| 240 ASSERT_EQ(1u, packet_events.size()); |
| 241 |
| 242 PacketEventMap::iterator it = packet_events.find(rtp_timestamp); |
| 243 ASSERT_TRUE(it != packet_events.end()); |
| 244 |
| 245 linked_ptr<AggregatedPacketEvent> event = it->second; |
| 246 |
| 247 EXPECT_EQ(rtp_timestamp, event->rtp_timestamp()); |
| 248 |
| 249 ASSERT_EQ(1, event->base_packet_event_size()); |
| 250 const BasePacketEvent& base_event = event->base_packet_event(0); |
| 251 EXPECT_EQ(packet_id, base_event.packet_id()); |
| 252 ASSERT_EQ(2, base_event.event_type_size()); |
| 253 EXPECT_EQ(media::cast::proto::PACKET_SENT_TO_PACER, base_event.event_type(0)); |
| 254 EXPECT_EQ(media::cast::proto::PACKET_SENT_TO_NETWORK, |
| 255 base_event.event_type(1)); |
| 256 ASSERT_EQ(2, base_event.event_timestamp_micros_size()); |
| 257 EXPECT_EQ(now1.ToInternalValue(), base_event.event_timestamp_micros(0)); |
| 258 EXPECT_EQ(now2.ToInternalValue(), base_event.event_timestamp_micros(1)); |
| 259 } |
| 260 |
| 261 TEST_F(EncodingEventSubscriberTest, MultiplePacketEventsForFrame) { |
| 262 base::TimeTicks now1(testing_clock_->NowTicks()); |
| 263 RtpTimestamp rtp_timestamp = 100; |
| 264 int packet_id_1 = 2; |
| 265 int packet_id_2 = 3; |
| 266 int size = 100; |
| 267 cast_environment_->Logging()->InsertPacketEvent( |
| 268 now1, kPacketSentToPacer, rtp_timestamp, /*frame_id*/ 0, packet_id_1, |
| 269 /*max_packet_id*/ 10, size); |
| 270 |
| 271 testing_clock_->Advance(base::TimeDelta::FromMilliseconds(20)); |
| 272 base::TimeTicks now2(testing_clock_->NowTicks()); |
| 273 cast_environment_->Logging()->InsertPacketEvent( |
| 274 now2, kPacketRetransmitted, rtp_timestamp, /*frame_id*/ 0, packet_id_2, |
| 275 /*max_packet_id*/ 10, size); |
| 276 |
| 277 PacketEventMap packet_events; |
| 278 event_subscriber_.GetPacketEventsAndReset(&packet_events); |
| 279 |
| 280 ASSERT_EQ(1u, packet_events.size()); |
| 281 |
| 282 PacketEventMap::iterator it = packet_events.find(rtp_timestamp); |
| 283 ASSERT_TRUE(it != packet_events.end()); |
| 284 |
| 285 linked_ptr<AggregatedPacketEvent> event = it->second; |
| 286 |
| 287 EXPECT_EQ(rtp_timestamp, event->rtp_timestamp()); |
| 288 |
| 289 ASSERT_EQ(2, event->base_packet_event_size()); |
| 290 const BasePacketEvent& base_event = event->base_packet_event(0); |
| 291 EXPECT_EQ(packet_id_1, base_event.packet_id()); |
| 292 ASSERT_EQ(1, base_event.event_type_size()); |
| 293 EXPECT_EQ(media::cast::proto::PACKET_SENT_TO_PACER, base_event.event_type(0)); |
| 294 ASSERT_EQ(1, base_event.event_timestamp_micros_size()); |
| 295 EXPECT_EQ(now1.ToInternalValue(), base_event.event_timestamp_micros(0)); |
| 296 |
| 297 const BasePacketEvent& base_event_2 = event->base_packet_event(1); |
| 298 EXPECT_EQ(packet_id_2, base_event_2.packet_id()); |
| 299 ASSERT_EQ(1, base_event_2.event_type_size()); |
| 300 EXPECT_EQ(media::cast::proto::PACKET_RETRANSMITTED, |
| 301 base_event_2.event_type(0)); |
| 302 ASSERT_EQ(1, base_event_2.event_timestamp_micros_size()); |
| 303 EXPECT_EQ(now2.ToInternalValue(), base_event_2.event_timestamp_micros(0)); |
| 304 } |
| 305 |
| 306 TEST_F(EncodingEventSubscriberTest, MultiplePacketEvents) { |
| 307 base::TimeTicks now1(testing_clock_->NowTicks()); |
| 308 RtpTimestamp rtp_timestamp_1 = 100; |
| 309 RtpTimestamp rtp_timestamp_2 = 200; |
| 310 int packet_id_1 = 2; |
| 311 int packet_id_2 = 3; |
| 312 int size = 100; |
| 313 cast_environment_->Logging()->InsertPacketEvent( |
| 314 now1, kPacketSentToPacer, rtp_timestamp_1, /*frame_id*/ 0, packet_id_1, |
| 315 /*max_packet_id*/ 10, size); |
| 316 |
| 317 testing_clock_->Advance(base::TimeDelta::FromMilliseconds(20)); |
| 318 base::TimeTicks now2(testing_clock_->NowTicks()); |
| 319 cast_environment_->Logging()->InsertPacketEvent( |
| 320 now2, kPacketRetransmitted, rtp_timestamp_2, /*frame_id*/ 0, packet_id_2, |
| 321 /*max_packet_id*/ 10, size); |
| 322 |
| 323 PacketEventMap packet_events; |
| 324 event_subscriber_.GetPacketEventsAndReset(&packet_events); |
| 325 |
| 326 ASSERT_EQ(2u, packet_events.size()); |
| 327 |
| 328 PacketEventMap::iterator it = packet_events.find(rtp_timestamp_1); |
| 329 ASSERT_TRUE(it != packet_events.end()); |
| 330 |
| 331 linked_ptr<AggregatedPacketEvent> event = it->second; |
| 332 |
| 333 EXPECT_EQ(rtp_timestamp_1, event->rtp_timestamp()); |
| 334 |
| 335 ASSERT_EQ(1, event->base_packet_event_size()); |
| 336 const BasePacketEvent& base_event = event->base_packet_event(0); |
| 337 EXPECT_EQ(packet_id_1, base_event.packet_id()); |
| 338 ASSERT_EQ(1, base_event.event_type_size()); |
| 339 EXPECT_EQ(media::cast::proto::PACKET_SENT_TO_PACER, base_event.event_type(0)); |
| 340 ASSERT_EQ(1, base_event.event_timestamp_micros_size()); |
| 341 EXPECT_EQ(now1.ToInternalValue(), base_event.event_timestamp_micros(0)); |
| 342 |
| 343 it = packet_events.find(rtp_timestamp_2); |
| 344 ASSERT_TRUE(it != packet_events.end()); |
| 345 |
| 346 event = it->second; |
| 347 |
| 348 EXPECT_EQ(rtp_timestamp_2, event->rtp_timestamp()); |
| 349 |
| 350 ASSERT_EQ(1, event->base_packet_event_size()); |
| 351 const BasePacketEvent& base_event_2 = event->base_packet_event(0); |
| 352 EXPECT_EQ(packet_id_2, base_event_2.packet_id()); |
| 353 ASSERT_EQ(1, base_event_2.event_type_size()); |
| 354 EXPECT_EQ(media::cast::proto::PACKET_RETRANSMITTED, |
| 355 base_event_2.event_type(0)); |
| 356 ASSERT_EQ(1, base_event_2.event_timestamp_micros_size()); |
| 357 EXPECT_EQ(now2.ToInternalValue(), base_event_2.event_timestamp_micros(0)); |
| 358 } |
| 359 |
| 360 TEST_F(EncodingEventSubscriberTest, GenericEvent) { |
| 361 base::TimeTicks now(testing_clock_->NowTicks()); |
| 362 int value = 123; |
| 363 cast_environment_->Logging()->InsertGenericEvent(now, kJitterMs, value); |
| 364 |
| 365 GenericEventMap generic_events; |
| 366 event_subscriber_.GetGenericEventsAndReset(&generic_events); |
| 367 |
| 368 ASSERT_EQ(1u, generic_events.size()); |
| 369 |
| 370 GenericEventMap::iterator it = generic_events.find(kJitterMs); |
| 371 ASSERT_TRUE(it != generic_events.end()); |
| 372 |
| 373 linked_ptr<AggregatedGenericEvent> event = it->second; |
| 374 |
| 375 ASSERT_EQ(media::cast::proto::JITTER_MS, event->event_type()); |
| 376 ASSERT_EQ(1, event->event_timestamp_micros_size()); |
| 377 EXPECT_EQ(now.ToInternalValue(), event->event_timestamp_micros(0)); |
| 378 ASSERT_EQ(1, event->value_size()); |
| 379 EXPECT_EQ(value, event->value(0)); |
| 380 |
| 381 event_subscriber_.GetGenericEventsAndReset(&generic_events); |
| 382 EXPECT_TRUE(generic_events.empty()); |
| 383 } |
| 384 |
| 385 TEST_F(EncodingEventSubscriberTest, MultipleGenericEventsForType) { |
| 386 base::TimeTicks now1(testing_clock_->NowTicks()); |
| 387 int value1 = 123; |
| 388 cast_environment_->Logging()->InsertGenericEvent(now1, kJitterMs, value1); |
| 389 |
| 390 testing_clock_->Advance(base::TimeDelta::FromMilliseconds(20)); |
| 391 base::TimeTicks now2(testing_clock_->NowTicks()); |
| 392 int value2 = 456; |
| 393 cast_environment_->Logging()->InsertGenericEvent(now2, kJitterMs, value2); |
| 394 |
| 395 GenericEventMap generic_events; |
| 396 event_subscriber_.GetGenericEventsAndReset(&generic_events); |
| 397 |
| 398 ASSERT_EQ(1u, generic_events.size()); |
| 399 |
| 400 GenericEventMap::iterator it = generic_events.find(kJitterMs); |
| 401 ASSERT_TRUE(it != generic_events.end()); |
| 402 |
| 403 linked_ptr<AggregatedGenericEvent> event = it->second; |
| 404 |
| 405 ASSERT_EQ(media::cast::proto::JITTER_MS, event->event_type()); |
| 406 ASSERT_EQ(2, event->event_timestamp_micros_size()); |
| 407 EXPECT_EQ(now1.ToInternalValue(), event->event_timestamp_micros(0)); |
| 408 EXPECT_EQ(now2.ToInternalValue(), event->event_timestamp_micros(1)); |
| 409 ASSERT_EQ(2, event->value_size()); |
| 410 EXPECT_EQ(value1, event->value(0)); |
| 411 EXPECT_EQ(value2, event->value(1)); |
| 412 } |
| 413 |
| 414 } // namespace cast |
| 415 } // namespace media |
OLD | NEW |