Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
| 5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
| 6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
| 7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
| 8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
| 9 */ | 9 */ |
| 10 | 10 |
| 11 #ifdef ENABLE_RTC_EVENT_LOG | 11 #ifdef ENABLE_RTC_EVENT_LOG |
| 12 | 12 |
| 13 #include <map> | 13 #include <map> |
| 14 #include <memory> | 14 #include <memory> |
| 15 #include <string> | 15 #include <string> |
| 16 #include <utility> | 16 #include <utility> |
| 17 #include <vector> | 17 #include <vector> |
| 18 | 18 |
| 19 #include "testing/gtest/include/gtest/gtest.h" | 19 #include "testing/gtest/include/gtest/gtest.h" |
| 20 #include "webrtc/base/buffer.h" | 20 #include "webrtc/base/buffer.h" |
| 21 #include "webrtc/base/checks.h" | 21 #include "webrtc/base/checks.h" |
| 22 #include "webrtc/base/random.h" | 22 #include "webrtc/base/random.h" |
| 23 #include "webrtc/base/rate_limiter.h" | |
| 24 #include "webrtc/call.h" | 23 #include "webrtc/call.h" |
| 25 #include "webrtc/call/rtc_event_log.h" | 24 #include "webrtc/call/rtc_event_log.h" |
| 26 #include "webrtc/call/rtc_event_log_parser.h" | 25 #include "webrtc/call/rtc_event_log_parser.h" |
| 27 #include "webrtc/call/rtc_event_log_unittest_helper.h" | 26 #include "webrtc/call/rtc_event_log_unittest_helper.h" |
| 28 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet.h" | 27 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet.h" |
| 29 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/sender_report.h" | 28 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/sender_report.h" |
| 30 #include "webrtc/modules/rtp_rtcp/source/rtp_sender.h" | 29 #include "webrtc/modules/rtp_rtcp/source/rtp_header_extension.h" |
| 30 #include "webrtc/modules/rtp_rtcp/source/rtp_header_extensions.h" | |
| 31 #include "webrtc/modules/rtp_rtcp/source/rtp_packet_to_send.h" | |
| 31 #include "webrtc/system_wrappers/include/clock.h" | 32 #include "webrtc/system_wrappers/include/clock.h" |
| 32 #include "webrtc/test/test_suite.h" | 33 #include "webrtc/test/test_suite.h" |
| 33 #include "webrtc/test/testsupport/fileutils.h" | 34 #include "webrtc/test/testsupport/fileutils.h" |
| 34 | 35 |
| 35 // Files generated at build-time by the protobuf compiler. | 36 // Files generated at build-time by the protobuf compiler. |
| 36 #ifdef WEBRTC_ANDROID_PLATFORM_BUILD | 37 #ifdef WEBRTC_ANDROID_PLATFORM_BUILD |
| 37 #include "external/webrtc/webrtc/call/rtc_event_log.pb.h" | 38 #include "external/webrtc/webrtc/call/rtc_event_log.pb.h" |
| 38 #else | 39 #else |
| 39 #include "webrtc/call/rtc_event_log.pb.h" | 40 #include "webrtc/call/rtc_event_log.pb.h" |
| 40 #endif | 41 #endif |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 98 } | 99 } |
| 99 printf("end \n"); | 100 printf("end \n"); |
| 100 } | 101 } |
| 101 } // namespace | 102 } // namespace |
| 102 | 103 |
| 103 /* | 104 /* |
| 104 * Bit number i of extension_bitvector is set to indicate the | 105 * Bit number i of extension_bitvector is set to indicate the |
| 105 * presence of extension number i from kExtensionTypes / kExtensionNames. | 106 * presence of extension number i from kExtensionTypes / kExtensionNames. |
| 106 * The least significant bit extension_bitvector has number 0. | 107 * The least significant bit extension_bitvector has number 0. |
| 107 */ | 108 */ |
| 108 size_t GenerateRtpPacket(uint32_t extensions_bitvector, | 109 RtpPacketToSend GenerateRtpPacket(const RtpHeaderExtensionMap* extensions, |
| 109 uint32_t csrcs_count, | 110 uint32_t csrcs_count, |
| 110 uint8_t* packet, | 111 size_t packet_size, |
| 111 size_t packet_size, | 112 Random* prng) { |
| 112 Random* prng) { | |
| 113 RTC_CHECK_GE(packet_size, 16 + 4 * csrcs_count + 4 * kNumExtensions); | 113 RTC_CHECK_GE(packet_size, 16 + 4 * csrcs_count + 4 * kNumExtensions); |
| 114 Clock* clock = Clock::GetRealTimeClock(); | |
| 115 RateLimiter retranmission_rate_limiter(clock, 1000); | |
| 116 | |
| 117 RTPSender rtp_sender(false, // bool audio | |
| 118 clock, // Clock* clock | |
| 119 nullptr, // Transport* | |
| 120 nullptr, // PacedSender* | |
| 121 nullptr, // PacketRouter* | |
| 122 nullptr, // SendTimeObserver* | |
| 123 nullptr, // BitrateStatisticsObserver* | |
| 124 nullptr, // FrameCountObserver* | |
| 125 nullptr, // SendSideDelayObserver* | |
| 126 nullptr, // RtcEventLog* | |
| 127 nullptr, // SendPacketObserver* | |
| 128 &retranmission_rate_limiter); | |
| 129 | 114 |
| 130 std::vector<uint32_t> csrcs; | 115 std::vector<uint32_t> csrcs; |
| 131 for (unsigned i = 0; i < csrcs_count; i++) { | 116 for (unsigned i = 0; i < csrcs_count; i++) { |
| 132 csrcs.push_back(prng->Rand<uint32_t>()); | 117 csrcs.push_back(prng->Rand<uint32_t>()); |
| 133 } | 118 } |
| 134 rtp_sender.SetCsrcs(csrcs); | |
| 135 rtp_sender.SetSSRC(prng->Rand<uint32_t>()); | |
| 136 rtp_sender.SetStartTimestamp(prng->Rand<uint32_t>(), true); | |
| 137 rtp_sender.SetSequenceNumber(prng->Rand<uint16_t>()); | |
| 138 | 119 |
| 139 for (unsigned i = 0; i < kNumExtensions; i++) { | 120 RtpPacketToSend rtp_packet(extensions, packet_size); |
| 140 if (extensions_bitvector & (1u << i)) { | 121 rtp_packet.SetPayloadType(prng->Rand(127)); |
| 141 rtp_sender.RegisterRtpHeaderExtension(kExtensionTypes[i], i + 1); | 122 rtp_packet.SetMarker(prng->Rand<bool>()); |
| 142 } | 123 rtp_packet.SetSequenceNumber(prng->Rand<uint16_t>()); |
| 124 rtp_packet.SetSsrc(prng->Rand<uint32_t>()); | |
| 125 rtp_packet.SetTimestamp(prng->Rand<uint32_t>()); | |
| 126 rtp_packet.SetCsrcs(csrcs); | |
| 127 | |
| 128 rtp_packet.SetExtension<TransmissionOffset>(prng->Rand(0x00ffffff)); | |
|
terelius
2016/08/09 11:43:00
These functions set the extension if and only if t
danilchap
2016/08/09 12:49:23
In this case (calling functions before setting pay
terelius
2016/08/09 13:31:32
So you can only set new extensions before payload,
| |
| 129 rtp_packet.SetExtension<AudioLevel>(prng->Rand<bool>(), prng->Rand(127)); | |
| 130 rtp_packet.SetExtension<AbsoluteSendTime>(prng->Rand<int32_t>()); | |
| 131 rtp_packet.SetExtension<VideoOrientation>(prng->Rand(2)); | |
| 132 rtp_packet.SetExtension<TransportSequenceNumber>(prng->Rand<uint16_t>()); | |
| 133 | |
| 134 size_t payload_size = packet_size - rtp_packet.headers_size(); | |
| 135 uint8_t* payload = rtp_packet.AllocatePayload(payload_size); | |
| 136 for (size_t i = 0; i < payload_size; i++) { | |
| 137 payload[i] = prng->Rand<uint8_t>(); | |
| 143 } | 138 } |
| 144 | 139 return rtp_packet; |
| 145 int8_t payload_type = prng->Rand(0, 127); | |
| 146 bool marker_bit = prng->Rand<bool>(); | |
| 147 uint32_t capture_timestamp = prng->Rand<uint32_t>(); | |
| 148 int64_t capture_time_ms = prng->Rand<uint32_t>(); | |
| 149 | |
| 150 size_t header_size = rtp_sender.BuildRtpHeader( | |
| 151 packet, payload_type, marker_bit, capture_timestamp, capture_time_ms); | |
| 152 for (size_t i = header_size; i < packet_size; i++) { | |
| 153 packet[i] = prng->Rand<uint8_t>(); | |
| 154 } | |
| 155 | |
| 156 return header_size; | |
| 157 } | 140 } |
| 158 | 141 |
| 159 rtc::Buffer GenerateRtcpPacket(Random* prng) { | 142 rtc::Buffer GenerateRtcpPacket(Random* prng) { |
| 160 rtcp::ReportBlock report_block; | 143 rtcp::ReportBlock report_block; |
| 161 report_block.To(prng->Rand<uint32_t>()); // Remote SSRC. | 144 report_block.To(prng->Rand<uint32_t>()); // Remote SSRC. |
| 162 report_block.WithFractionLost(prng->Rand(50)); | 145 report_block.WithFractionLost(prng->Rand(50)); |
| 163 | 146 |
| 164 rtcp::SenderReport sender_report; | 147 rtcp::SenderReport sender_report; |
| 165 sender_report.From(prng->Rand<uint32_t>()); // Sender SSRC. | 148 sender_report.From(prng->Rand<uint32_t>()); // Sender SSRC. |
| 166 sender_report.WithNtp( | 149 sender_report.WithNtp( |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 225 void LogSessionAndReadBack(size_t rtp_count, | 208 void LogSessionAndReadBack(size_t rtp_count, |
| 226 size_t rtcp_count, | 209 size_t rtcp_count, |
| 227 size_t playout_count, | 210 size_t playout_count, |
| 228 size_t bwe_loss_count, | 211 size_t bwe_loss_count, |
| 229 uint32_t extensions_bitvector, | 212 uint32_t extensions_bitvector, |
| 230 uint32_t csrcs_count, | 213 uint32_t csrcs_count, |
| 231 unsigned int random_seed) { | 214 unsigned int random_seed) { |
| 232 ASSERT_LE(rtcp_count, rtp_count); | 215 ASSERT_LE(rtcp_count, rtp_count); |
| 233 ASSERT_LE(playout_count, rtp_count); | 216 ASSERT_LE(playout_count, rtp_count); |
| 234 ASSERT_LE(bwe_loss_count, rtp_count); | 217 ASSERT_LE(bwe_loss_count, rtp_count); |
| 235 std::vector<rtc::Buffer> rtp_packets; | 218 std::vector<RtpPacketToSend> rtp_packets; |
| 236 std::vector<rtc::Buffer> rtcp_packets; | 219 std::vector<rtc::Buffer> rtcp_packets; |
| 237 std::vector<size_t> rtp_header_sizes; | |
| 238 std::vector<uint32_t> playout_ssrcs; | 220 std::vector<uint32_t> playout_ssrcs; |
| 239 std::vector<std::pair<int32_t, uint8_t> > bwe_loss_updates; | 221 std::vector<std::pair<int32_t, uint8_t> > bwe_loss_updates; |
| 240 | 222 |
| 241 VideoReceiveStream::Config receiver_config(nullptr); | 223 VideoReceiveStream::Config receiver_config(nullptr); |
| 242 VideoSendStream::Config sender_config(nullptr); | 224 VideoSendStream::Config sender_config(nullptr); |
| 243 | 225 |
| 244 Random prng(random_seed); | 226 Random prng(random_seed); |
| 245 | 227 |
| 228 // Initialize rtp header extensions to be used in generated rtp packets. | |
| 229 RtpHeaderExtensionMap extensions; | |
| 230 for (unsigned i = 0; i < kNumExtensions; i++) { | |
| 231 if (extensions_bitvector & (1u << i)) { | |
| 232 extensions.Register(kExtensionTypes[i], i + 1); | |
| 233 } | |
| 234 } | |
| 246 // Create rtp_count RTP packets containing random data. | 235 // Create rtp_count RTP packets containing random data. |
| 247 for (size_t i = 0; i < rtp_count; i++) { | 236 for (size_t i = 0; i < rtp_count; i++) { |
| 248 size_t packet_size = prng.Rand(1000, 1100); | 237 size_t packet_size = prng.Rand(1000, 1100); |
| 249 rtp_packets.push_back(rtc::Buffer(packet_size)); | 238 rtp_packets.push_back( |
| 250 size_t header_size = | 239 GenerateRtpPacket(&extensions, csrcs_count, packet_size, &prng)); |
| 251 GenerateRtpPacket(extensions_bitvector, csrcs_count, | |
| 252 rtp_packets[i].data(), packet_size, &prng); | |
| 253 rtp_header_sizes.push_back(header_size); | |
| 254 } | 240 } |
| 255 // Create rtcp_count RTCP packets containing random data. | 241 // Create rtcp_count RTCP packets containing random data. |
| 256 for (size_t i = 0; i < rtcp_count; i++) { | 242 for (size_t i = 0; i < rtcp_count; i++) { |
| 257 rtcp_packets.push_back(GenerateRtcpPacket(&prng)); | 243 rtcp_packets.push_back(GenerateRtcpPacket(&prng)); |
| 258 } | 244 } |
| 259 // Create playout_count random SSRCs to use when logging AudioPlayout events. | 245 // Create playout_count random SSRCs to use when logging AudioPlayout events. |
| 260 for (size_t i = 0; i < playout_count; i++) { | 246 for (size_t i = 0; i < playout_count; i++) { |
| 261 playout_ssrcs.push_back(prng.Rand<uint32_t>()); | 247 playout_ssrcs.push_back(prng.Rand<uint32_t>()); |
| 262 } | 248 } |
| 263 // Create bwe_loss_count random bitrate updates for BwePacketLoss. | 249 // Create bwe_loss_count random bitrate updates for BwePacketLoss. |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 346 RtcEventLogTestHelper::VerifySendStreamConfig(parsed_log, 2, sender_config); | 332 RtcEventLogTestHelper::VerifySendStreamConfig(parsed_log, 2, sender_config); |
| 347 size_t event_index = config_count + 1; | 333 size_t event_index = config_count + 1; |
| 348 size_t rtcp_index = 1; | 334 size_t rtcp_index = 1; |
| 349 size_t playout_index = 1; | 335 size_t playout_index = 1; |
| 350 size_t bwe_loss_index = 1; | 336 size_t bwe_loss_index = 1; |
| 351 for (size_t i = 1; i <= rtp_count; i++) { | 337 for (size_t i = 1; i <= rtp_count; i++) { |
| 352 RtcEventLogTestHelper::VerifyRtpEvent( | 338 RtcEventLogTestHelper::VerifyRtpEvent( |
| 353 parsed_log, event_index, | 339 parsed_log, event_index, |
| 354 (i % 2 == 0) ? kIncomingPacket : kOutgoingPacket, | 340 (i % 2 == 0) ? kIncomingPacket : kOutgoingPacket, |
| 355 (i % 3 == 0) ? MediaType::AUDIO : MediaType::VIDEO, | 341 (i % 3 == 0) ? MediaType::AUDIO : MediaType::VIDEO, |
| 356 rtp_packets[i - 1].data(), rtp_header_sizes[i - 1], | 342 rtp_packets[i - 1].data(), rtp_packets[i - 1].headers_size(), |
| 357 rtp_packets[i - 1].size()); | 343 rtp_packets[i - 1].size()); |
| 358 event_index++; | 344 event_index++; |
| 359 if (i * rtcp_count >= rtcp_index * rtp_count) { | 345 if (i * rtcp_count >= rtcp_index * rtp_count) { |
| 360 RtcEventLogTestHelper::VerifyRtcpEvent( | 346 RtcEventLogTestHelper::VerifyRtcpEvent( |
| 361 parsed_log, event_index, | 347 parsed_log, event_index, |
| 362 rtcp_index % 2 == 0 ? kIncomingPacket : kOutgoingPacket, | 348 rtcp_index % 2 == 0 ? kIncomingPacket : kOutgoingPacket, |
| 363 rtcp_index % 3 == 0 ? MediaType::AUDIO : MediaType::VIDEO, | 349 rtcp_index % 3 == 0 ? MediaType::AUDIO : MediaType::VIDEO, |
| 364 rtcp_packets[rtcp_index - 1].data(), | 350 rtcp_packets[rtcp_index - 1].data(), |
| 365 rtcp_packets[rtcp_index - 1].size()); | 351 rtcp_packets[rtcp_index - 1].size()); |
| 366 event_index++; | 352 event_index++; |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 416 extensions * 3 + csrcs_count + 1); // Random seed. | 402 extensions * 3 + csrcs_count + 1); // Random seed. |
| 417 } | 403 } |
| 418 } | 404 } |
| 419 } | 405 } |
| 420 | 406 |
| 421 TEST(RtcEventLogTest, LogEventAndReadBack) { | 407 TEST(RtcEventLogTest, LogEventAndReadBack) { |
| 422 Random prng(987654321); | 408 Random prng(987654321); |
| 423 | 409 |
| 424 // Create one RTP and one RTCP packet containing random data. | 410 // Create one RTP and one RTCP packet containing random data. |
| 425 size_t packet_size = prng.Rand(1000, 1100); | 411 size_t packet_size = prng.Rand(1000, 1100); |
| 426 rtc::Buffer rtp_packet(packet_size); | 412 RtpPacketToSend rtp_packet = |
| 427 size_t header_size = | 413 GenerateRtpPacket(nullptr, 0, packet_size, &prng); |
| 428 GenerateRtpPacket(0, 0, rtp_packet.data(), packet_size, &prng); | |
| 429 rtc::Buffer rtcp_packet = GenerateRtcpPacket(&prng); | 414 rtc::Buffer rtcp_packet = GenerateRtcpPacket(&prng); |
| 430 | 415 |
| 431 // Find the name of the current test, in order to use it as a temporary | 416 // Find the name of the current test, in order to use it as a temporary |
| 432 // filename. | 417 // filename. |
| 433 auto test_info = ::testing::UnitTest::GetInstance()->current_test_info(); | 418 auto test_info = ::testing::UnitTest::GetInstance()->current_test_info(); |
| 434 const std::string temp_filename = | 419 const std::string temp_filename = |
| 435 test::OutputPath() + test_info->test_case_name() + test_info->name(); | 420 test::OutputPath() + test_info->test_case_name() + test_info->name(); |
| 436 | 421 |
| 437 // Add RTP, start logging, add RTCP and then stop logging | 422 // Add RTP, start logging, add RTCP and then stop logging |
| 438 SimulatedClock fake_clock(prng.Rand<uint32_t>()); | 423 SimulatedClock fake_clock(prng.Rand<uint32_t>()); |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 454 // Read the generated file from disk. | 439 // Read the generated file from disk. |
| 455 ParsedRtcEventLog parsed_log; | 440 ParsedRtcEventLog parsed_log; |
| 456 ASSERT_TRUE(parsed_log.ParseFile(temp_filename)); | 441 ASSERT_TRUE(parsed_log.ParseFile(temp_filename)); |
| 457 | 442 |
| 458 // Verify that what we read back from the event log is the same as | 443 // Verify that what we read back from the event log is the same as |
| 459 // what we wrote down. | 444 // what we wrote down. |
| 460 EXPECT_EQ(4u, parsed_log.GetNumberOfEvents()); | 445 EXPECT_EQ(4u, parsed_log.GetNumberOfEvents()); |
| 461 | 446 |
| 462 RtcEventLogTestHelper::VerifyLogStartEvent(parsed_log, 0); | 447 RtcEventLogTestHelper::VerifyLogStartEvent(parsed_log, 0); |
| 463 | 448 |
| 464 RtcEventLogTestHelper::VerifyRtpEvent(parsed_log, 1, kIncomingPacket, | 449 RtcEventLogTestHelper::VerifyRtpEvent( |
| 465 MediaType::VIDEO, rtp_packet.data(), | 450 parsed_log, 1, kIncomingPacket, MediaType::VIDEO, rtp_packet.data(), |
| 466 header_size, rtp_packet.size()); | 451 rtp_packet.headers_size(), rtp_packet.size()); |
| 467 | 452 |
| 468 RtcEventLogTestHelper::VerifyRtcpEvent(parsed_log, 2, kOutgoingPacket, | 453 RtcEventLogTestHelper::VerifyRtcpEvent(parsed_log, 2, kOutgoingPacket, |
| 469 MediaType::VIDEO, rtcp_packet.data(), | 454 MediaType::VIDEO, rtcp_packet.data(), |
| 470 rtcp_packet.size()); | 455 rtcp_packet.size()); |
| 471 | 456 |
| 472 RtcEventLogTestHelper::VerifyLogEndEvent(parsed_log, 3); | 457 RtcEventLogTestHelper::VerifyLogEndEvent(parsed_log, 3); |
| 473 | 458 |
| 474 // Clean up temporary file - can be pretty slow. | 459 // Clean up temporary file - can be pretty slow. |
| 475 remove(temp_filename.c_str()); | 460 remove(temp_filename.c_str()); |
| 476 } | 461 } |
| 477 } // namespace webrtc | 462 } // namespace webrtc |
| 478 | 463 |
| 479 #endif // ENABLE_RTC_EVENT_LOG | 464 #endif // ENABLE_RTC_EVENT_LOG |
| OLD | NEW |