| 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 <string> | 13 #include <string> | 
| 14 #include <utility> | 14 #include <utility> | 
| 15 #include <vector> | 15 #include <vector> | 
| 16 | 16 | 
| 17 #include "testing/gtest/include/gtest/gtest.h" | 17 #include "testing/gtest/include/gtest/gtest.h" | 
| 18 #include "webrtc/base/buffer.h" | 18 #include "webrtc/base/buffer.h" | 
| 19 #include "webrtc/base/checks.h" | 19 #include "webrtc/base/checks.h" | 
|  | 20 #include "webrtc/base/random.h" | 
| 20 #include "webrtc/base/scoped_ptr.h" | 21 #include "webrtc/base/scoped_ptr.h" | 
| 21 #include "webrtc/base/thread.h" | 22 #include "webrtc/base/thread.h" | 
| 22 #include "webrtc/call.h" | 23 #include "webrtc/call.h" | 
| 23 #include "webrtc/call/rtc_event_log.h" | 24 #include "webrtc/call/rtc_event_log.h" | 
| 24 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet.h" | 25 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet.h" | 
| 25 #include "webrtc/modules/rtp_rtcp/source/rtp_sender.h" | 26 #include "webrtc/modules/rtp_rtcp/source/rtp_sender.h" | 
| 26 #include "webrtc/system_wrappers/include/clock.h" | 27 #include "webrtc/system_wrappers/include/clock.h" | 
| 27 #include "webrtc/test/random.h" |  | 
| 28 #include "webrtc/test/test_suite.h" | 28 #include "webrtc/test/test_suite.h" | 
| 29 #include "webrtc/test/testsupport/fileutils.h" | 29 #include "webrtc/test/testsupport/fileutils.h" | 
| 30 #include "webrtc/test/testsupport/gtest_disable.h" | 30 #include "webrtc/test/testsupport/gtest_disable.h" | 
| 31 | 31 | 
| 32 // Files generated at build-time by the protobuf compiler. | 32 // Files generated at build-time by the protobuf compiler. | 
| 33 #ifdef WEBRTC_ANDROID_PLATFORM_BUILD | 33 #ifdef WEBRTC_ANDROID_PLATFORM_BUILD | 
| 34 #include "external/webrtc/webrtc/call/rtc_event_log.pb.h" | 34 #include "external/webrtc/webrtc/call/rtc_event_log.pb.h" | 
| 35 #else | 35 #else | 
| 36 #include "webrtc/call/rtc_event_log.pb.h" | 36 #include "webrtc/call/rtc_event_log.pb.h" | 
| 37 #endif | 37 #endif | 
| (...skipping 256 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 294 | 294 | 
| 295 /* | 295 /* | 
| 296  * Bit number i of extension_bitvector is set to indicate the | 296  * Bit number i of extension_bitvector is set to indicate the | 
| 297  * presence of extension number i from kExtensionTypes / kExtensionNames. | 297  * presence of extension number i from kExtensionTypes / kExtensionNames. | 
| 298  * The least significant bit extension_bitvector has number 0. | 298  * The least significant bit extension_bitvector has number 0. | 
| 299  */ | 299  */ | 
| 300 size_t GenerateRtpPacket(uint32_t extensions_bitvector, | 300 size_t GenerateRtpPacket(uint32_t extensions_bitvector, | 
| 301                          uint32_t csrcs_count, | 301                          uint32_t csrcs_count, | 
| 302                          uint8_t* packet, | 302                          uint8_t* packet, | 
| 303                          size_t packet_size, | 303                          size_t packet_size, | 
| 304                          test::Random* prng) { | 304                          Random* prng) { | 
| 305   RTC_CHECK_GE(packet_size, 16 + 4 * csrcs_count + 4 * kNumExtensions); | 305   RTC_CHECK_GE(packet_size, 16 + 4 * csrcs_count + 4 * kNumExtensions); | 
| 306   Clock* clock = Clock::GetRealTimeClock(); | 306   Clock* clock = Clock::GetRealTimeClock(); | 
| 307 | 307 | 
| 308   RTPSender rtp_sender(false,     // bool audio | 308   RTPSender rtp_sender(false,     // bool audio | 
| 309                        clock,     // Clock* clock | 309                        clock,     // Clock* clock | 
| 310                        nullptr,   // Transport* | 310                        nullptr,   // Transport* | 
| 311                        nullptr,   // RtpAudioFeedback* | 311                        nullptr,   // RtpAudioFeedback* | 
| 312                        nullptr,   // PacedSender* | 312                        nullptr,   // PacedSender* | 
| 313                        nullptr,   // PacketRouter* | 313                        nullptr,   // PacketRouter* | 
| 314                        nullptr,   // SendTimeObserver* | 314                        nullptr,   // SendTimeObserver* | 
| (...skipping 27 matching lines...) Expand all  Loading... | 
| 342       packet, payload_type, marker_bit, capture_timestamp, capture_time_ms, | 342       packet, payload_type, marker_bit, capture_timestamp, capture_time_ms, | 
| 343       timestamp_provided, inc_sequence_number); | 343       timestamp_provided, inc_sequence_number); | 
| 344 | 344 | 
| 345   for (size_t i = header_size; i < packet_size; i++) { | 345   for (size_t i = header_size; i < packet_size; i++) { | 
| 346     packet[i] = prng->Rand<uint8_t>(); | 346     packet[i] = prng->Rand<uint8_t>(); | 
| 347   } | 347   } | 
| 348 | 348 | 
| 349   return header_size; | 349   return header_size; | 
| 350 } | 350 } | 
| 351 | 351 | 
| 352 rtc::scoped_ptr<rtcp::RawPacket> GenerateRtcpPacket(test::Random* prng) { | 352 rtc::scoped_ptr<rtcp::RawPacket> GenerateRtcpPacket(Random* prng) { | 
| 353   rtcp::ReportBlock report_block; | 353   rtcp::ReportBlock report_block; | 
| 354   report_block.To(prng->Rand<uint32_t>());  // Remote SSRC. | 354   report_block.To(prng->Rand<uint32_t>());  // Remote SSRC. | 
| 355   report_block.WithFractionLost(prng->Rand(50)); | 355   report_block.WithFractionLost(prng->Rand(50)); | 
| 356 | 356 | 
| 357   rtcp::SenderReport sender_report; | 357   rtcp::SenderReport sender_report; | 
| 358   sender_report.From(prng->Rand<uint32_t>());  // Sender SSRC. | 358   sender_report.From(prng->Rand<uint32_t>());  // Sender SSRC. | 
| 359   sender_report.WithNtpSec(prng->Rand<uint32_t>()); | 359   sender_report.WithNtpSec(prng->Rand<uint32_t>()); | 
| 360   sender_report.WithNtpFrac(prng->Rand<uint32_t>()); | 360   sender_report.WithNtpFrac(prng->Rand<uint32_t>()); | 
| 361   sender_report.WithPacketCount(prng->Rand<uint32_t>()); | 361   sender_report.WithPacketCount(prng->Rand<uint32_t>()); | 
| 362   sender_report.WithReportBlock(report_block); | 362   sender_report.WithReportBlock(report_block); | 
| 363 | 363 | 
| 364   return sender_report.Build(); | 364   return sender_report.Build(); | 
| 365 } | 365 } | 
| 366 | 366 | 
| 367 void GenerateVideoReceiveConfig(uint32_t extensions_bitvector, | 367 void GenerateVideoReceiveConfig(uint32_t extensions_bitvector, | 
| 368                                 VideoReceiveStream::Config* config, | 368                                 VideoReceiveStream::Config* config, | 
| 369                                 test::Random* prng) { | 369                                 Random* prng) { | 
| 370   // Create a map from a payload type to an encoder name. | 370   // Create a map from a payload type to an encoder name. | 
| 371   VideoReceiveStream::Decoder decoder; | 371   VideoReceiveStream::Decoder decoder; | 
| 372   decoder.payload_type = prng->Rand(0, 127); | 372   decoder.payload_type = prng->Rand(0, 127); | 
| 373   decoder.payload_name = (prng->Rand<bool>() ? "VP8" : "H264"); | 373   decoder.payload_name = (prng->Rand<bool>() ? "VP8" : "H264"); | 
| 374   config->decoders.push_back(decoder); | 374   config->decoders.push_back(decoder); | 
| 375   // Add SSRCs for the stream. | 375   // Add SSRCs for the stream. | 
| 376   config->rtp.remote_ssrc = prng->Rand<uint32_t>(); | 376   config->rtp.remote_ssrc = prng->Rand<uint32_t>(); | 
| 377   config->rtp.local_ssrc = prng->Rand<uint32_t>(); | 377   config->rtp.local_ssrc = prng->Rand<uint32_t>(); | 
| 378   // Add extensions and settings for RTCP. | 378   // Add extensions and settings for RTCP. | 
| 379   config->rtp.rtcp_mode = | 379   config->rtp.rtcp_mode = | 
| 380       prng->Rand<bool>() ? RtcpMode::kCompound : RtcpMode::kReducedSize; | 380       prng->Rand<bool>() ? RtcpMode::kCompound : RtcpMode::kReducedSize; | 
| 381   config->rtp.remb = prng->Rand<bool>(); | 381   config->rtp.remb = prng->Rand<bool>(); | 
| 382   // Add a map from a payload type to a new ssrc and a new payload type for RTX. | 382   // Add a map from a payload type to a new ssrc and a new payload type for RTX. | 
| 383   VideoReceiveStream::Config::Rtp::Rtx rtx_pair; | 383   VideoReceiveStream::Config::Rtp::Rtx rtx_pair; | 
| 384   rtx_pair.ssrc = prng->Rand<uint32_t>(); | 384   rtx_pair.ssrc = prng->Rand<uint32_t>(); | 
| 385   rtx_pair.payload_type = prng->Rand(0, 127); | 385   rtx_pair.payload_type = prng->Rand(0, 127); | 
| 386   config->rtp.rtx.insert(std::make_pair(prng->Rand(0, 127), rtx_pair)); | 386   config->rtp.rtx.insert(std::make_pair(prng->Rand(0, 127), rtx_pair)); | 
| 387   // Add header extensions. | 387   // Add header extensions. | 
| 388   for (unsigned i = 0; i < kNumExtensions; i++) { | 388   for (unsigned i = 0; i < kNumExtensions; i++) { | 
| 389     if (extensions_bitvector & (1u << i)) { | 389     if (extensions_bitvector & (1u << i)) { | 
| 390       config->rtp.extensions.push_back( | 390       config->rtp.extensions.push_back( | 
| 391           RtpExtension(kExtensionNames[i], prng->Rand<int>())); | 391           RtpExtension(kExtensionNames[i], prng->Rand<int>())); | 
| 392     } | 392     } | 
| 393   } | 393   } | 
| 394 } | 394 } | 
| 395 | 395 | 
| 396 void GenerateVideoSendConfig(uint32_t extensions_bitvector, | 396 void GenerateVideoSendConfig(uint32_t extensions_bitvector, | 
| 397                              VideoSendStream::Config* config, | 397                              VideoSendStream::Config* config, | 
| 398                              test::Random* prng) { | 398                              Random* prng) { | 
| 399   // Create a map from a payload type to an encoder name. | 399   // Create a map from a payload type to an encoder name. | 
| 400   config->encoder_settings.payload_type = prng->Rand(0, 127); | 400   config->encoder_settings.payload_type = prng->Rand(0, 127); | 
| 401   config->encoder_settings.payload_name = (prng->Rand<bool>() ? "VP8" : "H264"); | 401   config->encoder_settings.payload_name = (prng->Rand<bool>() ? "VP8" : "H264"); | 
| 402   // Add SSRCs for the stream. | 402   // Add SSRCs for the stream. | 
| 403   config->rtp.ssrcs.push_back(prng->Rand<uint32_t>()); | 403   config->rtp.ssrcs.push_back(prng->Rand<uint32_t>()); | 
| 404   // Add a map from a payload type to new ssrcs and a new payload type for RTX. | 404   // Add a map from a payload type to new ssrcs and a new payload type for RTX. | 
| 405   config->rtp.rtx.ssrcs.push_back(prng->Rand<uint32_t>()); | 405   config->rtp.rtx.ssrcs.push_back(prng->Rand<uint32_t>()); | 
| 406   config->rtp.rtx.payload_type = prng->Rand(0, 127); | 406   config->rtp.rtx.payload_type = prng->Rand(0, 127); | 
| 407   // Add header extensions. | 407   // Add header extensions. | 
| 408   for (unsigned i = 0; i < kNumExtensions; i++) { | 408   for (unsigned i = 0; i < kNumExtensions; i++) { | 
| (...skipping 18 matching lines...) Expand all  Loading... | 
| 427   ASSERT_LE(bwe_loss_count, rtp_count); | 427   ASSERT_LE(bwe_loss_count, rtp_count); | 
| 428   std::vector<rtc::Buffer> rtp_packets; | 428   std::vector<rtc::Buffer> rtp_packets; | 
| 429   std::vector<rtc::scoped_ptr<rtcp::RawPacket> > rtcp_packets; | 429   std::vector<rtc::scoped_ptr<rtcp::RawPacket> > rtcp_packets; | 
| 430   std::vector<size_t> rtp_header_sizes; | 430   std::vector<size_t> rtp_header_sizes; | 
| 431   std::vector<uint32_t> playout_ssrcs; | 431   std::vector<uint32_t> playout_ssrcs; | 
| 432   std::vector<std::pair<int32_t, uint8_t> > bwe_loss_updates; | 432   std::vector<std::pair<int32_t, uint8_t> > bwe_loss_updates; | 
| 433 | 433 | 
| 434   VideoReceiveStream::Config receiver_config(nullptr); | 434   VideoReceiveStream::Config receiver_config(nullptr); | 
| 435   VideoSendStream::Config sender_config(nullptr); | 435   VideoSendStream::Config sender_config(nullptr); | 
| 436 | 436 | 
| 437   test::Random prng(random_seed); | 437   Random prng(random_seed); | 
| 438 | 438 | 
| 439   // Create rtp_count RTP packets containing random data. | 439   // Create rtp_count RTP packets containing random data. | 
| 440   for (size_t i = 0; i < rtp_count; i++) { | 440   for (size_t i = 0; i < rtp_count; i++) { | 
| 441     size_t packet_size = prng.Rand(1000, 1100); | 441     size_t packet_size = prng.Rand(1000, 1100); | 
| 442     rtp_packets.push_back(rtc::Buffer(packet_size)); | 442     rtp_packets.push_back(rtc::Buffer(packet_size)); | 
| 443     size_t header_size = | 443     size_t header_size = | 
| 444         GenerateRtpPacket(extensions_bitvector, csrcs_count, | 444         GenerateRtpPacket(extensions_bitvector, csrcs_count, | 
| 445                           rtp_packets[i].data(), packet_size, &prng); | 445                           rtp_packets[i].data(), packet_size, &prng); | 
| 446     rtp_header_sizes.push_back(header_size); | 446     rtp_header_sizes.push_back(header_size); | 
| 447   } | 447   } | 
| (...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 584 | 584 | 
| 585   // Try all combinations of header extensions and up to 2 CSRCS. | 585   // Try all combinations of header extensions and up to 2 CSRCS. | 
| 586   for (extensions = 0; extensions < (1u << kNumExtensions); extensions++) { | 586   for (extensions = 0; extensions < (1u << kNumExtensions); extensions++) { | 
| 587     for (uint32_t csrcs_count = 0; csrcs_count < 3; csrcs_count++) { | 587     for (uint32_t csrcs_count = 0; csrcs_count < 3; csrcs_count++) { | 
| 588       LogSessionAndReadBack(5 + extensions,   // Number of RTP packets. | 588       LogSessionAndReadBack(5 + extensions,   // Number of RTP packets. | 
| 589                             2 + csrcs_count,  // Number of RTCP packets. | 589                             2 + csrcs_count,  // Number of RTCP packets. | 
| 590                             3 + csrcs_count,  // Number of playout events. | 590                             3 + csrcs_count,  // Number of playout events. | 
| 591                             1 + csrcs_count,  // Number of BWE loss events. | 591                             1 + csrcs_count,  // Number of BWE loss events. | 
| 592                             extensions,       // Bit vector choosing extensions. | 592                             extensions,       // Bit vector choosing extensions. | 
| 593                             csrcs_count,      // Number of contributing sources. | 593                             csrcs_count,      // Number of contributing sources. | 
| 594                             extensions + csrcs_count);  // Random seed. | 594                             extensions * 3 + csrcs_count + 1);  // Random seed. | 
| 595     } | 595     } | 
| 596   } | 596   } | 
| 597 } | 597 } | 
| 598 | 598 | 
| 599 // Tests that the event queue works correctly, i.e. drops old RTP, RTCP and | 599 // Tests that the event queue works correctly, i.e. drops old RTP, RTCP and | 
| 600 // debug events, but keeps config events even if they are older than the limit. | 600 // debug events, but keeps config events even if they are older than the limit. | 
| 601 void DropOldEvents(uint32_t extensions_bitvector, | 601 void DropOldEvents(uint32_t extensions_bitvector, | 
| 602                    uint32_t csrcs_count, | 602                    uint32_t csrcs_count, | 
| 603                    unsigned int random_seed) { | 603                    unsigned int random_seed) { | 
| 604   rtc::Buffer old_rtp_packet; | 604   rtc::Buffer old_rtp_packet; | 
| 605   rtc::Buffer recent_rtp_packet; | 605   rtc::Buffer recent_rtp_packet; | 
| 606   rtc::scoped_ptr<rtcp::RawPacket> old_rtcp_packet; | 606   rtc::scoped_ptr<rtcp::RawPacket> old_rtcp_packet; | 
| 607   rtc::scoped_ptr<rtcp::RawPacket> recent_rtcp_packet; | 607   rtc::scoped_ptr<rtcp::RawPacket> recent_rtcp_packet; | 
| 608 | 608 | 
| 609   VideoReceiveStream::Config receiver_config(nullptr); | 609   VideoReceiveStream::Config receiver_config(nullptr); | 
| 610   VideoSendStream::Config sender_config(nullptr); | 610   VideoSendStream::Config sender_config(nullptr); | 
| 611 | 611 | 
| 612   test::Random prng(random_seed); | 612   Random prng(random_seed); | 
| 613 | 613 | 
| 614   // Create two RTP packets containing random data. | 614   // Create two RTP packets containing random data. | 
| 615   size_t packet_size = prng.Rand(1000, 1100); | 615   size_t packet_size = prng.Rand(1000, 1100); | 
| 616   old_rtp_packet.SetSize(packet_size); | 616   old_rtp_packet.SetSize(packet_size); | 
| 617   GenerateRtpPacket(extensions_bitvector, csrcs_count, old_rtp_packet.data(), | 617   GenerateRtpPacket(extensions_bitvector, csrcs_count, old_rtp_packet.data(), | 
| 618                     packet_size, &prng); | 618                     packet_size, &prng); | 
| 619   packet_size = prng.Rand(1000, 1100); | 619   packet_size = prng.Rand(1000, 1100); | 
| 620   recent_rtp_packet.SetSize(packet_size); | 620   recent_rtp_packet.SetSize(packet_size); | 
| 621   size_t recent_header_size = | 621   size_t recent_header_size = | 
| 622       GenerateRtpPacket(extensions_bitvector, csrcs_count, | 622       GenerateRtpPacket(extensions_bitvector, csrcs_count, | 
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 682   // Enable all header extensions | 682   // Enable all header extensions | 
| 683   uint32_t extensions = (1u << kNumExtensions) - 1; | 683   uint32_t extensions = (1u << kNumExtensions) - 1; | 
| 684   uint32_t csrcs_count = 2; | 684   uint32_t csrcs_count = 2; | 
| 685   DropOldEvents(extensions, csrcs_count, 141421356); | 685   DropOldEvents(extensions, csrcs_count, 141421356); | 
| 686   DropOldEvents(extensions, csrcs_count, 173205080); | 686   DropOldEvents(extensions, csrcs_count, 173205080); | 
| 687 } | 687 } | 
| 688 | 688 | 
| 689 }  // namespace webrtc | 689 }  // namespace webrtc | 
| 690 | 690 | 
| 691 #endif  // ENABLE_RTC_EVENT_LOG | 691 #endif  // ENABLE_RTC_EVENT_LOG | 
| OLD | NEW | 
|---|