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 #include <map> | 11 #include <map> |
| 12 #include <memory> | 12 #include <memory> |
| 13 #include <string> | 13 #include <string> |
| 14 #include <utility> | 14 #include <utility> |
| 15 #include <vector> | 15 #include <vector> |
| 16 | 16 |
| 17 #include "webrtc/call/call.h" | 17 #include "webrtc/call/call.h" |
| 18 #include "webrtc/logging/rtc_event_log/rtc_event_log.h" | 18 #include "webrtc/logging/rtc_event_log/rtc_event_log.h" |
| 19 #include "webrtc/logging/rtc_event_log/rtc_event_log_parser.h" | 19 #include "webrtc/logging/rtc_event_log/rtc_event_log_parser.h" |
| 20 #include "webrtc/logging/rtc_event_log/rtc_event_log_unittest_helper.h" | 20 #include "webrtc/logging/rtc_event_log/rtc_event_log_unittest_helper.h" |
| 21 #include "webrtc/modules/audio_coding/audio_network_adaptor/include/audio_networ k_adaptor.h" | 21 #include "webrtc/modules/audio_coding/audio_network_adaptor/include/audio_networ k_adaptor.h" |
| 22 #include "webrtc/modules/remote_bitrate_estimator/include/bwe_defines.h" | 22 #include "webrtc/modules/remote_bitrate_estimator/include/bwe_defines.h" |
| 23 #include "webrtc/modules/rtp_rtcp/include/rtp_header_extension_map.h" | 23 #include "webrtc/modules/rtp_rtcp/include/rtp_header_extension_map.h" |
| 24 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet.h" | 24 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet.h" |
| 25 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/sender_report.h" | 25 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/sender_report.h" |
| 26 #include "webrtc/modules/rtp_rtcp/source/rtp_header_extensions.h" | 26 #include "webrtc/modules/rtp_rtcp/source/rtp_header_extensions.h" |
| 27 #include "webrtc/modules/rtp_rtcp/source/rtp_packet_received.h" | |
| 27 #include "webrtc/modules/rtp_rtcp/source/rtp_packet_to_send.h" | 28 #include "webrtc/modules/rtp_rtcp/source/rtp_packet_to_send.h" |
| 28 #include "webrtc/rtc_base/buffer.h" | 29 #include "webrtc/rtc_base/buffer.h" |
| 29 #include "webrtc/rtc_base/checks.h" | 30 #include "webrtc/rtc_base/checks.h" |
| 30 #include "webrtc/rtc_base/fakeclock.h" | 31 #include "webrtc/rtc_base/fakeclock.h" |
| 31 #include "webrtc/rtc_base/random.h" | 32 #include "webrtc/rtc_base/random.h" |
| 32 #include "webrtc/test/gtest.h" | 33 #include "webrtc/test/gtest.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/logging/rtc_event_log/rtc_event_log.pb.h" | 38 #include "external/webrtc/webrtc/logging/rtc_event_log/rtc_event_log.pb.h" |
| 38 #else | 39 #else |
| 39 #include "webrtc/logging/rtc_event_log/rtc_event_log.pb.h" | 40 #include "webrtc/logging/rtc_event_log/rtc_event_log.pb.h" |
| 40 #endif | 41 #endif |
| 41 | 42 |
| 42 namespace webrtc { | 43 namespace webrtc { |
| 43 | 44 |
| 44 namespace { | 45 namespace { |
| 45 | 46 |
| 47 const uint8_t kTransmissionTimeOffsetExtensionId = 1; | |
| 48 const uint8_t kAbsoluteSendTimeExtensionId = 14; | |
| 49 const uint8_t kTransportSequenceNumberExtensionId = 13; | |
| 50 const uint8_t kAudioLevelExtensionId = 9; | |
| 51 const uint8_t kVideoRotationExtensionId = 5; | |
| 52 | |
| 53 const uint8_t kExtensionIds[] = { | |
| 54 kTransmissionTimeOffsetExtensionId, kAbsoluteSendTimeExtensionId, | |
| 55 kTransportSequenceNumberExtensionId, kAudioLevelExtensionId, | |
| 56 kVideoRotationExtensionId}; | |
| 46 const RTPExtensionType kExtensionTypes[] = { | 57 const RTPExtensionType kExtensionTypes[] = { |
| 47 RTPExtensionType::kRtpExtensionTransmissionTimeOffset, | 58 RTPExtensionType::kRtpExtensionTransmissionTimeOffset, |
| 59 RTPExtensionType::kRtpExtensionAbsoluteSendTime, | |
| 60 RTPExtensionType::kRtpExtensionTransportSequenceNumber, | |
| 48 RTPExtensionType::kRtpExtensionAudioLevel, | 61 RTPExtensionType::kRtpExtensionAudioLevel, |
| 49 RTPExtensionType::kRtpExtensionAbsoluteSendTime, | 62 RTPExtensionType::kRtpExtensionVideoRotation}; |
| 50 RTPExtensionType::kRtpExtensionVideoRotation, | |
| 51 RTPExtensionType::kRtpExtensionTransportSequenceNumber}; | |
| 52 const char* kExtensionNames[] = { | 63 const char* kExtensionNames[] = { |
| 53 RtpExtension::kTimestampOffsetUri, RtpExtension::kAudioLevelUri, | 64 RtpExtension::kTimestampOffsetUri, RtpExtension::kAbsSendTimeUri, |
| 54 RtpExtension::kAbsSendTimeUri, RtpExtension::kVideoRotationUri, | 65 RtpExtension::kTransportSequenceNumberUri, RtpExtension::kAudioLevelUri, |
| 55 RtpExtension::kTransportSequenceNumberUri}; | 66 RtpExtension::kVideoRotationUri}; |
| 67 | |
| 56 const size_t kNumExtensions = 5; | 68 const size_t kNumExtensions = 5; |
| 57 | 69 |
| 58 void PrintActualEvents(const ParsedRtcEventLog& parsed_log) { | 70 struct BweLossEvent { |
| 59 std::map<int, size_t> actual_event_counts; | 71 int32_t bitrate_bps; |
| 60 for (size_t i = 0; i < parsed_log.GetNumberOfEvents(); i++) { | 72 uint8_t fraction_loss; |
| 61 actual_event_counts[parsed_log.GetEventType(i)]++; | 73 int32_t total_packets; |
| 62 } | 74 }; |
| 63 printf("Actual events: "); | |
| 64 for (auto kv : actual_event_counts) { | |
| 65 printf("%d_count = %zu, ", kv.first, kv.second); | |
| 66 } | |
| 67 printf("\n"); | |
| 68 for (size_t i = 0; i < parsed_log.GetNumberOfEvents(); i++) { | |
| 69 printf("%4d ", parsed_log.GetEventType(i)); | |
| 70 } | |
| 71 printf("\n"); | |
| 72 } | |
| 73 | 75 |
| 74 void PrintExpectedEvents(size_t rtp_count, | |
| 75 size_t rtcp_count, | |
| 76 size_t playout_count, | |
| 77 size_t bwe_loss_count) { | |
| 78 printf( | |
| 79 "Expected events: rtp_count = %zu, rtcp_count = %zu," | |
| 80 "playout_count = %zu, bwe_loss_count = %zu\n", | |
| 81 rtp_count, rtcp_count, playout_count, bwe_loss_count); | |
| 82 size_t rtcp_index = 1, playout_index = 1, bwe_loss_index = 1; | |
| 83 printf("strt cfg cfg "); | |
| 84 for (size_t i = 1; i <= rtp_count; i++) { | |
| 85 printf(" rtp "); | |
| 86 if (i * rtcp_count >= rtcp_index * rtp_count) { | |
| 87 printf("rtcp "); | |
| 88 rtcp_index++; | |
| 89 } | |
| 90 if (i * playout_count >= playout_index * rtp_count) { | |
| 91 printf("play "); | |
| 92 playout_index++; | |
| 93 } | |
| 94 if (i * bwe_loss_count >= bwe_loss_index * rtp_count) { | |
| 95 printf("loss "); | |
| 96 bwe_loss_index++; | |
| 97 } | |
| 98 } | |
| 99 printf("end \n"); | |
| 100 } | |
| 101 } // namespace | 76 } // namespace |
| 102 | 77 |
| 103 /* | 78 RtpPacketToSend GenerateOutgoingRtpPacket( |
| 104 * Bit number i of extension_bitvector is set to indicate the | 79 const RtpHeaderExtensionMap* extensions, |
| 105 * presence of extension number i from kExtensionTypes / kExtensionNames. | 80 uint32_t csrcs_count, |
| 106 * The least significant bit extension_bitvector has number 0. | 81 size_t packet_size, |
| 107 */ | 82 Random* prng) { |
| 108 RtpPacketToSend GenerateRtpPacket(const RtpHeaderExtensionMap* extensions, | |
| 109 uint32_t csrcs_count, | |
| 110 size_t packet_size, | |
| 111 Random* prng) { | |
| 112 RTC_CHECK_GE(packet_size, 16 + 4 * csrcs_count + 4 * kNumExtensions); | 83 RTC_CHECK_GE(packet_size, 16 + 4 * csrcs_count + 4 * kNumExtensions); |
| 113 | 84 |
| 114 std::vector<uint32_t> csrcs; | 85 std::vector<uint32_t> csrcs; |
| 115 for (unsigned i = 0; i < csrcs_count; i++) { | 86 for (unsigned i = 0; i < csrcs_count; i++) { |
| 116 csrcs.push_back(prng->Rand<uint32_t>()); | 87 csrcs.push_back(prng->Rand<uint32_t>()); |
| 117 } | 88 } |
| 118 | 89 |
| 119 RtpPacketToSend rtp_packet(extensions, packet_size); | 90 RtpPacketToSend rtp_packet(extensions, packet_size); |
| 120 rtp_packet.SetPayloadType(prng->Rand(127)); | 91 rtp_packet.SetPayloadType(prng->Rand(127)); |
| 121 rtp_packet.SetMarker(prng->Rand<bool>()); | 92 rtp_packet.SetMarker(prng->Rand<bool>()); |
| 122 rtp_packet.SetSequenceNumber(prng->Rand<uint16_t>()); | 93 rtp_packet.SetSequenceNumber(prng->Rand<uint16_t>()); |
| 123 rtp_packet.SetSsrc(prng->Rand<uint32_t>()); | 94 rtp_packet.SetSsrc(prng->Rand<uint32_t>()); |
| 124 rtp_packet.SetTimestamp(prng->Rand<uint32_t>()); | 95 rtp_packet.SetTimestamp(prng->Rand<uint32_t>()); |
| 125 rtp_packet.SetCsrcs(csrcs); | 96 rtp_packet.SetCsrcs(csrcs); |
| 126 | 97 |
| 127 rtp_packet.SetExtension<TransmissionOffset>(prng->Rand(0x00ffffff)); | 98 rtp_packet.SetExtension<TransmissionOffset>(prng->Rand(0x00ffffff)); |
| 128 rtp_packet.SetExtension<AudioLevel>(prng->Rand<bool>(), prng->Rand(127)); | 99 rtp_packet.SetExtension<AudioLevel>(prng->Rand<bool>(), prng->Rand(127)); |
| 129 rtp_packet.SetExtension<AbsoluteSendTime>(prng->Rand(0x00ffffff)); | 100 rtp_packet.SetExtension<AbsoluteSendTime>(prng->Rand(0x00ffffff)); |
| 130 rtp_packet.SetExtension<VideoOrientation>(prng->Rand(2)); | 101 rtp_packet.SetExtension<VideoOrientation>(prng->Rand(2)); |
| 131 rtp_packet.SetExtension<TransportSequenceNumber>(prng->Rand<uint16_t>()); | 102 rtp_packet.SetExtension<TransportSequenceNumber>(prng->Rand<uint16_t>()); |
| 132 | 103 |
| 133 size_t payload_size = packet_size - rtp_packet.headers_size(); | 104 size_t payload_size = packet_size - rtp_packet.headers_size(); |
| 134 uint8_t* payload = rtp_packet.AllocatePayload(payload_size); | 105 uint8_t* payload = rtp_packet.AllocatePayload(payload_size); |
| 135 for (size_t i = 0; i < payload_size; i++) { | 106 for (size_t i = 0; i < payload_size; i++) { |
| 136 payload[i] = prng->Rand<uint8_t>(); | 107 payload[i] = prng->Rand<uint8_t>(); |
| 137 } | 108 } |
| 138 return rtp_packet; | 109 return rtp_packet; |
| 139 } | 110 } |
| 140 | 111 |
| 112 RtpPacketReceived GenerateIncomingRtpPacket( | |
| 113 const RtpHeaderExtensionMap* extensions, | |
| 114 uint32_t csrcs_count, | |
| 115 size_t packet_size, | |
| 116 Random* prng) { | |
| 117 RtpPacketToSend packet_out = | |
| 118 GenerateOutgoingRtpPacket(extensions, csrcs_count, packet_size, prng); | |
| 119 RtpPacketReceived packet_in(extensions); | |
| 120 packet_in.Parse(packet_out.data(), packet_out.size()); | |
| 121 return packet_in; | |
| 122 } | |
| 123 | |
| 141 rtc::Buffer GenerateRtcpPacket(Random* prng) { | 124 rtc::Buffer GenerateRtcpPacket(Random* prng) { |
| 142 rtcp::ReportBlock report_block; | 125 rtcp::ReportBlock report_block; |
| 143 report_block.SetMediaSsrc(prng->Rand<uint32_t>()); // Remote SSRC. | 126 report_block.SetMediaSsrc(prng->Rand<uint32_t>()); // Remote SSRC. |
| 144 report_block.SetFractionLost(prng->Rand(50)); | 127 report_block.SetFractionLost(prng->Rand(50)); |
| 145 | 128 |
| 146 rtcp::SenderReport sender_report; | 129 rtcp::SenderReport sender_report; |
| 147 sender_report.SetSenderSsrc(prng->Rand<uint32_t>()); | 130 sender_report.SetSenderSsrc(prng->Rand<uint32_t>()); |
| 148 sender_report.SetNtp(NtpTime(prng->Rand<uint32_t>(), prng->Rand<uint32_t>())); | 131 sender_report.SetNtp(NtpTime(prng->Rand<uint32_t>(), prng->Rand<uint32_t>())); |
| 149 sender_report.SetPacketCount(prng->Rand<uint32_t>()); | 132 sender_report.SetPacketCount(prng->Rand<uint32_t>()); |
| 150 sender_report.AddReportBlock(report_block); | 133 sender_report.AddReportBlock(report_block); |
| 151 | 134 |
| 152 return sender_report.Build(); | 135 return sender_report.Build(); |
| 153 } | 136 } |
| 154 | 137 |
| 155 void GenerateVideoReceiveConfig(uint32_t extensions_bitvector, | 138 void GenerateVideoReceiveConfig(const RtpHeaderExtensionMap& extensions, |
| 156 rtclog::StreamConfig* config, | 139 rtclog::StreamConfig* config, |
| 157 Random* prng) { | 140 Random* prng) { |
| 158 // Add SSRCs for the stream. | 141 // Add SSRCs for the stream. |
| 159 config->remote_ssrc = prng->Rand<uint32_t>(); | 142 config->remote_ssrc = prng->Rand<uint32_t>(); |
| 160 config->local_ssrc = prng->Rand<uint32_t>(); | 143 config->local_ssrc = prng->Rand<uint32_t>(); |
| 161 // Add extensions and settings for RTCP. | 144 // Add extensions and settings for RTCP. |
| 162 config->rtcp_mode = | 145 config->rtcp_mode = |
| 163 prng->Rand<bool>() ? RtcpMode::kCompound : RtcpMode::kReducedSize; | 146 prng->Rand<bool>() ? RtcpMode::kCompound : RtcpMode::kReducedSize; |
| 164 config->remb = prng->Rand<bool>(); | 147 config->remb = prng->Rand<bool>(); |
| 165 config->rtx_ssrc = prng->Rand<uint32_t>(); | 148 config->rtx_ssrc = prng->Rand<uint32_t>(); |
| 166 config->codecs.emplace_back(prng->Rand<bool>() ? "VP8" : "H264", | 149 config->codecs.emplace_back(prng->Rand<bool>() ? "VP8" : "H264", |
| 167 prng->Rand(1, 127), prng->Rand(1, 127)); | 150 prng->Rand(1, 127), prng->Rand(1, 127)); |
| 168 // Add header extensions. | 151 // Add header extensions. |
| 169 for (unsigned i = 0; i < kNumExtensions; i++) { | 152 for (unsigned i = 0; i < kNumExtensions; i++) { |
| 170 if (extensions_bitvector & (1u << i)) { | 153 uint8_t id = extensions.GetId(kExtensionTypes[i]); |
| 171 config->rtp_extensions.emplace_back(kExtensionNames[i], | 154 if (id != RtpHeaderExtensionMap::kInvalidId) { |
| 172 prng->Rand<int>()); | 155 config->rtp_extensions.emplace_back(kExtensionNames[i], id); |
| 173 } | 156 } |
| 174 } | 157 } |
| 175 } | 158 } |
| 176 | 159 |
| 177 void GenerateVideoSendConfig(uint32_t extensions_bitvector, | 160 void GenerateVideoSendConfig(const RtpHeaderExtensionMap& extensions, |
| 178 rtclog::StreamConfig* config, | 161 rtclog::StreamConfig* config, |
| 179 Random* prng) { | 162 Random* prng) { |
| 180 config->codecs.emplace_back(prng->Rand<bool>() ? "VP8" : "H264", | 163 config->codecs.emplace_back(prng->Rand<bool>() ? "VP8" : "H264", |
| 181 prng->Rand(1, 127), prng->Rand(1, 127)); | 164 prng->Rand(1, 127), prng->Rand(1, 127)); |
| 182 config->local_ssrc = prng->Rand<uint32_t>(); | 165 config->local_ssrc = prng->Rand<uint32_t>(); |
| 183 config->rtx_ssrc = prng->Rand<uint32_t>(); | 166 config->rtx_ssrc = prng->Rand<uint32_t>(); |
| 184 // Add header extensions. | 167 // Add header extensions. |
| 185 for (unsigned i = 0; i < kNumExtensions; i++) { | 168 for (unsigned i = 0; i < kNumExtensions; i++) { |
| 186 if (extensions_bitvector & (1u << i)) { | 169 uint8_t id = extensions.GetId(kExtensionTypes[i]); |
| 187 config->rtp_extensions.push_back( | 170 if (id != RtpHeaderExtensionMap::kInvalidId) { |
| 188 RtpExtension(kExtensionNames[i], prng->Rand<int>())); | 171 config->rtp_extensions.emplace_back(kExtensionNames[i], id); |
| 189 } | 172 } |
| 190 } | 173 } |
| 191 } | 174 } |
| 192 | 175 |
| 193 void GenerateAudioReceiveConfig(uint32_t extensions_bitvector, | 176 void GenerateAudioReceiveConfig(const RtpHeaderExtensionMap& extensions, |
| 194 rtclog::StreamConfig* config, | 177 rtclog::StreamConfig* config, |
| 195 Random* prng) { | 178 Random* prng) { |
| 196 // Add SSRCs for the stream. | 179 // Add SSRCs for the stream. |
| 197 config->remote_ssrc = prng->Rand<uint32_t>(); | 180 config->remote_ssrc = prng->Rand<uint32_t>(); |
| 198 config->local_ssrc = prng->Rand<uint32_t>(); | 181 config->local_ssrc = prng->Rand<uint32_t>(); |
| 199 // Add header extensions. | 182 // Add header extensions. |
| 200 for (unsigned i = 0; i < kNumExtensions; i++) { | 183 for (unsigned i = 0; i < kNumExtensions; i++) { |
| 201 if (extensions_bitvector & (1u << i)) { | 184 uint8_t id = extensions.GetId(kExtensionTypes[i]); |
| 202 config->rtp_extensions.push_back( | 185 if (id != RtpHeaderExtensionMap::kInvalidId) { |
| 203 RtpExtension(kExtensionNames[i], prng->Rand<int>())); | 186 config->rtp_extensions.emplace_back(kExtensionNames[i], id); |
| 204 } | 187 } |
| 205 } | 188 } |
| 206 } | 189 } |
| 207 | 190 |
| 208 void GenerateAudioSendConfig(uint32_t extensions_bitvector, | 191 void GenerateAudioSendConfig(const RtpHeaderExtensionMap& extensions, |
| 209 rtclog::StreamConfig* config, | 192 rtclog::StreamConfig* config, |
| 210 Random* prng) { | 193 Random* prng) { |
| 211 // Add SSRC to the stream. | 194 // Add SSRC to the stream. |
| 212 config->local_ssrc = prng->Rand<uint32_t>(); | 195 config->local_ssrc = prng->Rand<uint32_t>(); |
| 213 // Add header extensions. | 196 // Add header extensions. |
| 214 for (unsigned i = 0; i < kNumExtensions; i++) { | 197 for (unsigned i = 0; i < kNumExtensions; i++) { |
| 215 if (extensions_bitvector & (1u << i)) { | 198 uint8_t id = extensions.GetId(kExtensionTypes[i]); |
| 216 config->rtp_extensions.push_back( | 199 if (id != RtpHeaderExtensionMap::kInvalidId) { |
| 217 RtpExtension(kExtensionNames[i], prng->Rand<int>())); | 200 config->rtp_extensions.emplace_back(kExtensionNames[i], id); |
| 218 } | 201 } |
| 219 } | 202 } |
| 220 } | 203 } |
| 221 | 204 |
| 222 void GenerateAudioNetworkAdaptation(uint32_t extensions_bitvector, | 205 BweLossEvent GenerateBweLossEvent(Random* prng) { |
| 206 BweLossEvent loss_event; | |
| 207 loss_event.bitrate_bps = prng->Rand(6000, 10000000); | |
| 208 loss_event.fraction_loss = prng->Rand<uint8_t>(); | |
| 209 loss_event.total_packets = prng->Rand(1, 1000); | |
| 210 return loss_event; | |
| 211 } | |
| 212 | |
| 213 void GenerateAudioNetworkAdaptation(const RtpHeaderExtensionMap& extensions, | |
| 223 AudioEncoderRuntimeConfig* config, | 214 AudioEncoderRuntimeConfig* config, |
| 224 Random* prng) { | 215 Random* prng) { |
| 225 config->bitrate_bps = rtc::Optional<int>(prng->Rand(0, 3000000)); | 216 config->bitrate_bps = rtc::Optional<int>(prng->Rand(0, 3000000)); |
| 226 config->enable_fec = rtc::Optional<bool>(prng->Rand<bool>()); | 217 config->enable_fec = rtc::Optional<bool>(prng->Rand<bool>()); |
| 227 config->enable_dtx = rtc::Optional<bool>(prng->Rand<bool>()); | 218 config->enable_dtx = rtc::Optional<bool>(prng->Rand<bool>()); |
| 228 config->frame_length_ms = rtc::Optional<int>(prng->Rand(10, 120)); | 219 config->frame_length_ms = rtc::Optional<int>(prng->Rand(10, 120)); |
| 229 config->num_channels = rtc::Optional<size_t>(prng->Rand(1, 2)); | 220 config->num_channels = rtc::Optional<size_t>(prng->Rand(1, 2)); |
| 230 config->uplink_packet_loss_fraction = | 221 config->uplink_packet_loss_fraction = |
| 231 rtc::Optional<float>(prng->Rand<float>()); | 222 rtc::Optional<float>(prng->Rand<float>()); |
| 232 } | 223 } |
| 233 | 224 |
| 234 // Test for the RtcEventLog class. Dumps some RTP packets and other events | 225 // Test for the RtcEventLog class. Dumps some RTP packets and other events |
| 235 // to disk, then reads them back to see if they match. | 226 // to disk, then reads them back to see if they match. |
| 236 void LogSessionAndReadBack(size_t rtp_count, | 227 void LogSessionAndReadBack(size_t incoming_rtp_count, |
|
eladalon
2017/09/05 11:57:01
IMHO, it would be good to break this function down
terelius
2017/09/07 12:53:55
Done. Created a class SessionDescription that keep
| |
| 237 size_t rtcp_count, | 228 size_t outgoing_rtp_count, |
| 229 size_t incoming_rtcp_count, | |
| 230 size_t outgoing_rtcp_count, | |
| 238 size_t playout_count, | 231 size_t playout_count, |
| 239 size_t bwe_loss_count, | 232 size_t bwe_loss_count, |
| 240 uint32_t extensions_bitvector, | 233 size_t bwe_delay_count, |
| 234 const RtpHeaderExtensionMap& extensions, | |
| 241 uint32_t csrcs_count, | 235 uint32_t csrcs_count, |
| 242 unsigned int random_seed) { | 236 unsigned int random_seed) { |
| 243 ASSERT_LE(rtcp_count, rtp_count); | 237 std::vector<RtpPacketReceived> incoming_rtp_packets; |
| 244 ASSERT_LE(playout_count, rtp_count); | 238 std::vector<RtpPacketToSend> outgoing_rtp_packets; |
| 245 ASSERT_LE(bwe_loss_count, rtp_count); | 239 std::vector<rtc::Buffer> incoming_rtcp_packets; |
| 246 std::vector<RtpPacketToSend> rtp_packets; | 240 std::vector<rtc::Buffer> outgoing_rtcp_packets; |
| 247 std::vector<rtc::Buffer> rtcp_packets; | |
| 248 std::vector<uint32_t> playout_ssrcs; | 241 std::vector<uint32_t> playout_ssrcs; |
| 249 std::vector<std::pair<int32_t, uint8_t> > bwe_loss_updates; | 242 std::vector<BweLossEvent> bwe_loss_updates; |
| 243 std::vector<std::pair<int32_t, BandwidthUsage> > bwe_delay_updates; | |
| 250 | 244 |
| 251 rtclog::StreamConfig receiver_config; | 245 rtclog::StreamConfig receiver_config; |
| 252 rtclog::StreamConfig sender_config; | 246 rtclog::StreamConfig sender_config; |
| 253 | 247 |
| 254 Random prng(random_seed); | 248 { |
| 255 | 249 Random prng(random_seed); |
| 256 // Initialize rtp header extensions to be used in generated rtp packets. | 250 // Create incoming and outgoing RTP packets containing random data. |
| 257 RtpHeaderExtensionMap extensions; | 251 for (size_t i = 0; i < incoming_rtp_count; i++) { |
| 258 for (unsigned i = 0; i < kNumExtensions; i++) { | 252 size_t packet_size = prng.Rand(1000, 1100); |
| 259 if (extensions_bitvector & (1u << i)) { | 253 incoming_rtp_packets.push_back(GenerateIncomingRtpPacket( |
| 260 extensions.Register(kExtensionTypes[i], i + 1); | 254 &extensions, csrcs_count, packet_size, &prng)); |
| 261 } | 255 } |
| 256 for (size_t i = 0; i < outgoing_rtp_count; i++) { | |
| 257 size_t packet_size = prng.Rand(1000, 1100); | |
| 258 outgoing_rtp_packets.push_back(GenerateOutgoingRtpPacket( | |
| 259 &extensions, csrcs_count, packet_size, &prng)); | |
| 260 } | |
| 261 // Create incoming and outgoing RTCP packets containing random data. | |
| 262 for (size_t i = 0; i < incoming_rtcp_count; i++) { | |
| 263 incoming_rtcp_packets.push_back(GenerateRtcpPacket(&prng)); | |
| 264 } | |
| 265 for (size_t i = 0; i < outgoing_rtcp_count; i++) { | |
| 266 outgoing_rtcp_packets.push_back(GenerateRtcpPacket(&prng)); | |
| 267 } | |
| 268 // Create random SSRCs to use when logging AudioPlayout events. | |
| 269 for (size_t i = 0; i < playout_count; i++) { | |
| 270 playout_ssrcs.push_back(prng.Rand<uint32_t>()); | |
| 271 } | |
| 272 // Create random bitrate updates for LossBasedBwe. | |
| 273 for (size_t i = 0; i < bwe_loss_count; i++) { | |
| 274 bwe_loss_updates.push_back(GenerateBweLossEvent(&prng)); | |
| 275 } | |
| 276 // Create random bitrate updates for DelayBasedBwe. | |
| 277 for (size_t i = 0; i < bwe_delay_count; i++) { | |
| 278 bwe_delay_updates.push_back(std::make_pair( | |
| 279 prng.Rand(6000, 10000000), prng.Rand<bool>() | |
| 280 ? BandwidthUsage::kBwOverusing | |
| 281 : BandwidthUsage::kBwUnderusing)); | |
| 282 } | |
| 283 // Create configurations for the video streams. | |
| 284 GenerateVideoReceiveConfig(extensions, &receiver_config, &prng); | |
| 285 GenerateVideoSendConfig(extensions, &sender_config, &prng); | |
| 262 } | 286 } |
| 263 // Create rtp_count RTP packets containing random data. | |
| 264 for (size_t i = 0; i < rtp_count; i++) { | |
| 265 size_t packet_size = prng.Rand(1000, 1100); | |
| 266 rtp_packets.push_back( | |
| 267 GenerateRtpPacket(&extensions, csrcs_count, packet_size, &prng)); | |
| 268 } | |
| 269 // Create rtcp_count RTCP packets containing random data. | |
| 270 for (size_t i = 0; i < rtcp_count; i++) { | |
| 271 rtcp_packets.push_back(GenerateRtcpPacket(&prng)); | |
| 272 } | |
| 273 // Create playout_count random SSRCs to use when logging AudioPlayout events. | |
| 274 for (size_t i = 0; i < playout_count; i++) { | |
| 275 playout_ssrcs.push_back(prng.Rand<uint32_t>()); | |
| 276 } | |
| 277 // Create bwe_loss_count random bitrate updates for LossBasedBwe. | |
| 278 for (size_t i = 0; i < bwe_loss_count; i++) { | |
| 279 bwe_loss_updates.push_back( | |
| 280 std::make_pair(prng.Rand<int32_t>(), prng.Rand<uint8_t>())); | |
| 281 } | |
| 282 // Create configurations for the video streams. | |
| 283 GenerateVideoReceiveConfig(extensions_bitvector, &receiver_config, &prng); | |
| 284 GenerateVideoSendConfig(extensions_bitvector, &sender_config, &prng); | |
| 285 const int config_count = 2; | |
| 286 | 287 |
| 287 // Find the name of the current test, in order to use it as a temporary | 288 // Find the name of the current test, in order to use it as a temporary |
| 288 // filename. | 289 // filename. |
| 289 auto test_info = ::testing::UnitTest::GetInstance()->current_test_info(); | 290 auto test_info = ::testing::UnitTest::GetInstance()->current_test_info(); |
| 290 const std::string temp_filename = | 291 const std::string temp_filename = |
| 291 test::OutputPath() + test_info->test_case_name() + test_info->name(); | 292 test::OutputPath() + test_info->test_case_name() + test_info->name(); |
| 292 | 293 |
| 293 // When log_dumper goes out of scope, it causes the log file to be flushed | 294 // When log_dumper goes out of scope, it causes the log file to be flushed |
| 294 // to disk. | 295 // to disk. |
| 295 { | 296 { |
| 297 Random prng(random_seed); | |
| 296 rtc::ScopedFakeClock fake_clock; | 298 rtc::ScopedFakeClock fake_clock; |
| 297 fake_clock.SetTimeMicros(prng.Rand<uint32_t>()); | 299 fake_clock.SetTimeMicros(prng.Rand<uint32_t>()); |
| 298 std::unique_ptr<RtcEventLog> log_dumper(RtcEventLog::Create()); | 300 std::unique_ptr<RtcEventLog> log_dumper(RtcEventLog::Create()); |
| 299 log_dumper->LogVideoReceiveStreamConfig(receiver_config); | 301 log_dumper->LogVideoReceiveStreamConfig(receiver_config); |
| 300 fake_clock.AdvanceTimeMicros(prng.Rand(1, 1000)); | 302 fake_clock.AdvanceTimeMicros(prng.Rand(1, 1000)); |
| 301 log_dumper->LogVideoSendStreamConfig(sender_config); | 303 log_dumper->LogVideoSendStreamConfig(sender_config); |
| 304 size_t events_remaining = incoming_rtp_count + outgoing_rtp_count + | |
| 305 incoming_rtcp_count + outgoing_rtcp_count + | |
| 306 playout_count + bwe_loss_count + bwe_delay_count; | |
| 307 size_t remaining_incoming_rtp = incoming_rtp_count; | |
| 308 size_t remaining_outgoing_rtp = outgoing_rtp_count; | |
| 309 size_t remaining_incoming_rtcp = incoming_rtcp_count; | |
| 310 size_t remaining_outgoing_rtcp = outgoing_rtcp_count; | |
| 311 size_t remaining_playouts = playout_count; | |
| 312 size_t remaining_bwe_loss = bwe_loss_count; | |
| 313 size_t remaining_bwe_delay = bwe_delay_count; | |
| 314 for (; events_remaining; events_remaining--) { | |
| 315 fake_clock.AdvanceTimeMicros(prng.Rand(1, 1000)); | |
| 316 if (events_remaining == (incoming_rtp_count + outgoing_rtp_count) / 2) { | |
| 317 log_dumper->StartLogging(temp_filename, 10000000); | |
| 318 } | |
| 319 size_t event_type = prng.Rand(0u, events_remaining - 1); | |
| 320 if (event_type < remaining_incoming_rtp) { | |
| 321 log_dumper->LogIncomingRtpHeader( | |
| 322 incoming_rtp_packets[remaining_incoming_rtp - 1]); | |
| 323 remaining_incoming_rtp--; | |
| 324 continue; | |
| 325 } | |
| 326 event_type -= remaining_incoming_rtp; | |
| 327 if (event_type < remaining_outgoing_rtp) { | |
| 328 log_dumper->LogOutgoingRtpHeader( | |
| 329 outgoing_rtp_packets[remaining_outgoing_rtp - 1], | |
| 330 PacedPacketInfo::kNotAProbe); | |
| 331 remaining_outgoing_rtp--; | |
| 332 continue; | |
| 333 } | |
| 334 event_type -= remaining_outgoing_rtp; | |
| 335 if (event_type < remaining_incoming_rtcp) { | |
| 336 log_dumper->LogIncomingRtcpPacket(rtc::ArrayView<const uint8_t>( | |
|
danilchap
2017/09/05 08:47:16
suggestion:
log_dumper->LogIncomingRtcpPacket(inco
terelius
2017/09/07 12:53:55
Done.
| |
| 337 incoming_rtcp_packets[remaining_incoming_rtcp - 1].data(), | |
| 338 incoming_rtcp_packets[remaining_incoming_rtcp - 1].size())); | |
| 339 remaining_incoming_rtcp--; | |
| 340 continue; | |
| 341 } | |
| 342 event_type -= remaining_incoming_rtcp; | |
| 343 if (event_type < remaining_outgoing_rtcp) { | |
| 344 log_dumper->LogOutgoingRtcpPacket(rtc::ArrayView<const uint8_t>( | |
| 345 outgoing_rtcp_packets[remaining_outgoing_rtcp - 1].data(), | |
| 346 outgoing_rtcp_packets[remaining_outgoing_rtcp - 1].size())); | |
| 347 remaining_outgoing_rtcp--; | |
| 348 continue; | |
| 349 } | |
| 350 event_type -= remaining_outgoing_rtcp; | |
| 351 if (event_type < remaining_playouts) { | |
| 352 log_dumper->LogAudioPlayout(playout_ssrcs[remaining_playouts - 1]); | |
| 353 remaining_playouts--; | |
| 354 continue; | |
| 355 } | |
| 356 event_type -= remaining_playouts; | |
| 357 if (event_type < remaining_bwe_loss) { | |
| 358 log_dumper->LogLossBasedBweUpdate( | |
| 359 bwe_loss_updates[remaining_bwe_loss - 1].bitrate_bps, | |
| 360 bwe_loss_updates[remaining_bwe_loss - 1].fraction_loss, | |
| 361 bwe_loss_updates[remaining_bwe_loss - 1].total_packets); | |
| 362 remaining_bwe_loss--; | |
| 363 continue; | |
| 364 } | |
| 365 event_type -= remaining_bwe_loss; | |
| 366 if (event_type < remaining_bwe_delay) { | |
| 367 log_dumper->LogDelayBasedBweUpdate( | |
| 368 bwe_delay_updates[remaining_bwe_delay - 1].first, | |
| 369 bwe_delay_updates[remaining_bwe_delay - 1].second); | |
| 370 remaining_bwe_delay--; | |
| 371 continue; | |
| 372 } | |
| 373 event_type -= remaining_bwe_delay; | |
| 374 RTC_NOTREACHED(); | |
| 375 } | |
| 376 log_dumper->StopLogging(); | |
| 377 } | |
| 378 | |
| 379 // Read the file and verify that what we read back from the event log is the | |
| 380 // same as what we wrote down. | |
| 381 { | |
| 382 // Read the generated file from disk. | |
| 383 ParsedRtcEventLog parsed_log; | |
| 384 ASSERT_TRUE(parsed_log.ParseFile(temp_filename)); | |
| 385 const int config_count = 2; | |
| 386 const size_t event_count = config_count + incoming_rtp_count + | |
| 387 outgoing_rtp_count + incoming_rtcp_count + | |
| 388 outgoing_rtcp_count + playout_count + | |
| 389 bwe_loss_count + bwe_delay_count + 2; | |
| 390 EXPECT_GE(1000u, event_count); // The events must fit in the message queue. | |
| 391 EXPECT_EQ(event_count, parsed_log.GetNumberOfEvents()); | |
| 392 | |
| 393 Random prng(random_seed); | |
| 394 rtc::ScopedFakeClock fake_clock; | |
| 395 fake_clock.SetTimeMicros(prng.Rand<uint32_t>()); | |
| 396 RtcEventLogTestHelper::VerifyLogStartEvent(parsed_log, 0); | |
| 397 RtcEventLogTestHelper::VerifyVideoReceiveStreamConfig(parsed_log, 1, | |
| 398 receiver_config); | |
| 302 fake_clock.AdvanceTimeMicros(prng.Rand(1, 1000)); | 399 fake_clock.AdvanceTimeMicros(prng.Rand(1, 1000)); |
| 303 size_t rtcp_index = 1; | 400 RtcEventLogTestHelper::VerifyVideoSendStreamConfig(parsed_log, 2, |
| 304 size_t playout_index = 1; | 401 sender_config); |
| 305 size_t bwe_loss_index = 1; | 402 size_t events_remaining = incoming_rtp_count + outgoing_rtp_count + |
| 306 for (size_t i = 1; i <= rtp_count; i++) { | 403 incoming_rtcp_count + outgoing_rtcp_count + |
| 307 log_dumper->LogRtpHeader( | 404 playout_count + bwe_loss_count + bwe_delay_count; |
| 308 (i % 2 == 0) ? kIncomingPacket : kOutgoingPacket, | 405 size_t remaining_incoming_rtp = incoming_rtp_count; |
| 309 rtp_packets[i - 1].data(), rtp_packets[i - 1].size()); | 406 size_t remaining_outgoing_rtp = outgoing_rtp_count; |
| 407 size_t remaining_incoming_rtcp = incoming_rtcp_count; | |
| 408 size_t remaining_outgoing_rtcp = outgoing_rtcp_count; | |
| 409 size_t remaining_playouts = playout_count; | |
| 410 size_t remaining_bwe_loss = bwe_loss_count; | |
| 411 size_t remaining_bwe_delay = bwe_delay_count; | |
| 412 for (; events_remaining; events_remaining--) { | |
| 310 fake_clock.AdvanceTimeMicros(prng.Rand(1, 1000)); | 413 fake_clock.AdvanceTimeMicros(prng.Rand(1, 1000)); |
| 311 if (i * rtcp_count >= rtcp_index * rtp_count) { | 414 size_t event_type = prng.Rand(0u, events_remaining - 1); |
| 312 log_dumper->LogRtcpPacket( | 415 if (event_type < remaining_incoming_rtp) { |
| 313 (rtcp_index % 2 == 0) ? kIncomingPacket : kOutgoingPacket, | 416 RtcEventLogTestHelper::VerifyRtpEvent( |
| 314 rtcp_packets[rtcp_index - 1].data(), | 417 parsed_log, event_count - events_remaining - 1, kIncomingPacket, |
| 315 rtcp_packets[rtcp_index - 1].size()); | 418 incoming_rtp_packets[remaining_incoming_rtp - 1]); |
| 316 rtcp_index++; | 419 remaining_incoming_rtp--; |
| 317 fake_clock.AdvanceTimeMicros(prng.Rand(1, 1000)); | 420 continue; |
| 318 } | 421 } |
| 319 if (i * playout_count >= playout_index * rtp_count) { | 422 event_type -= remaining_incoming_rtp; |
| 320 log_dumper->LogAudioPlayout(playout_ssrcs[playout_index - 1]); | 423 if (event_type < remaining_outgoing_rtp) { |
| 321 playout_index++; | 424 RtcEventLogTestHelper::VerifyRtpEvent( |
| 322 fake_clock.AdvanceTimeMicros(prng.Rand(1, 1000)); | 425 parsed_log, event_count - events_remaining - 1, kOutgoingPacket, |
| 323 } | 426 outgoing_rtp_packets[remaining_outgoing_rtp - 1]); |
| 324 if (i * bwe_loss_count >= bwe_loss_index * rtp_count) { | 427 remaining_outgoing_rtp--; |
| 325 log_dumper->LogLossBasedBweUpdate( | 428 continue; |
| 326 bwe_loss_updates[bwe_loss_index - 1].first, | 429 } |
| 327 bwe_loss_updates[bwe_loss_index - 1].second, i); | 430 event_type -= remaining_outgoing_rtp; |
| 328 bwe_loss_index++; | 431 if (event_type < remaining_incoming_rtcp) { |
| 329 fake_clock.AdvanceTimeMicros(prng.Rand(1, 1000)); | 432 RtcEventLogTestHelper::VerifyRtcpEvent( |
| 330 } | 433 parsed_log, event_count - events_remaining - 1, kIncomingPacket, |
| 331 if (i == rtp_count / 2) { | 434 incoming_rtcp_packets[remaining_incoming_rtcp - 1].data(), |
| 332 log_dumper->StartLogging(temp_filename, 10000000); | 435 incoming_rtcp_packets[remaining_incoming_rtcp - 1].size()); |
| 333 fake_clock.AdvanceTimeMicros(prng.Rand(1, 1000)); | 436 remaining_incoming_rtcp--; |
| 334 } | 437 continue; |
| 335 } | 438 } |
| 336 log_dumper->StopLogging(); | 439 event_type -= remaining_incoming_rtcp; |
| 337 } | 440 if (event_type < remaining_outgoing_rtcp) { |
| 338 | 441 RtcEventLogTestHelper::VerifyRtcpEvent( |
| 339 // Read the generated file from disk. | 442 parsed_log, event_count - events_remaining - 1, kOutgoingPacket, |
| 340 ParsedRtcEventLog parsed_log; | 443 outgoing_rtcp_packets[remaining_outgoing_rtcp - 1].data(), |
| 341 | 444 outgoing_rtcp_packets[remaining_outgoing_rtcp - 1].size()); |
| 342 ASSERT_TRUE(parsed_log.ParseFile(temp_filename)); | 445 remaining_outgoing_rtcp--; |
| 343 | 446 continue; |
| 344 // Verify that what we read back from the event log is the same as | 447 } |
| 345 // what we wrote down. For RTCP we log the full packets, but for | 448 event_type -= remaining_outgoing_rtcp; |
| 346 // RTP we should only log the header. | 449 if (event_type < remaining_playouts) { |
| 347 const size_t event_count = config_count + playout_count + bwe_loss_count + | 450 RtcEventLogTestHelper::VerifyPlayoutEvent( |
| 348 rtcp_count + rtp_count + 2; | 451 parsed_log, event_count - events_remaining - 1, |
| 349 EXPECT_GE(1000u, event_count); // The events must fit in the message queue. | 452 playout_ssrcs[remaining_playouts - 1]); |
| 350 EXPECT_EQ(event_count, parsed_log.GetNumberOfEvents()); | 453 remaining_playouts--; |
| 351 if (event_count != parsed_log.GetNumberOfEvents()) { | 454 continue; |
| 352 // Print the expected and actual event types for easier debugging. | 455 } |
| 353 PrintActualEvents(parsed_log); | 456 event_type -= remaining_playouts; |
| 354 PrintExpectedEvents(rtp_count, rtcp_count, playout_count, bwe_loss_count); | 457 if (event_type < remaining_bwe_loss) { |
| 355 } | 458 RtcEventLogTestHelper::VerifyBweLossEvent( |
| 356 RtcEventLogTestHelper::VerifyLogStartEvent(parsed_log, 0); | 459 parsed_log, event_count - events_remaining - 1, |
| 357 RtcEventLogTestHelper::VerifyVideoReceiveStreamConfig(parsed_log, 1, | 460 bwe_loss_updates[remaining_bwe_loss - 1].bitrate_bps, |
| 358 receiver_config); | 461 bwe_loss_updates[remaining_bwe_loss - 1].fraction_loss, |
| 359 RtcEventLogTestHelper::VerifyVideoSendStreamConfig(parsed_log, 2, | 462 bwe_loss_updates[remaining_bwe_loss - 1].total_packets); |
| 360 sender_config); | 463 remaining_bwe_loss--; |
| 361 size_t event_index = config_count + 1; | 464 continue; |
| 362 size_t rtcp_index = 1; | 465 } |
| 363 size_t playout_index = 1; | 466 event_type -= remaining_bwe_loss; |
| 364 size_t bwe_loss_index = 1; | 467 if (event_type < remaining_bwe_delay) { |
| 365 for (size_t i = 1; i <= rtp_count; i++) { | 468 RtcEventLogTestHelper::VerifyBweDelayEvent( |
| 366 RtcEventLogTestHelper::VerifyRtpEvent( | 469 parsed_log, event_count - events_remaining - 1, |
| 367 parsed_log, event_index, | 470 bwe_delay_updates[remaining_bwe_delay - 1].first, |
| 368 (i % 2 == 0) ? kIncomingPacket : kOutgoingPacket, | 471 bwe_delay_updates[remaining_bwe_delay - 1].second); |
| 369 rtp_packets[i - 1].data(), rtp_packets[i - 1].headers_size(), | 472 remaining_bwe_delay--; |
| 370 rtp_packets[i - 1].size()); | 473 continue; |
| 371 event_index++; | 474 } |
| 372 if (i * rtcp_count >= rtcp_index * rtp_count) { | 475 event_type -= remaining_bwe_delay; |
| 373 RtcEventLogTestHelper::VerifyRtcpEvent( | 476 RTC_NOTREACHED(); |
| 374 parsed_log, event_index, | 477 } |
| 375 rtcp_index % 2 == 0 ? kIncomingPacket : kOutgoingPacket, | 478 RtcEventLogTestHelper::VerifyLogEndEvent(parsed_log, event_count - 1); |
| 376 rtcp_packets[rtcp_index - 1].data(), | 479 |
| 377 rtcp_packets[rtcp_index - 1].size()); | 480 // Clean up temporary file - can be pretty slow. |
| 378 event_index++; | 481 remove(temp_filename.c_str()); |
| 379 rtcp_index++; | 482 } |
| 380 } | |
| 381 if (i * playout_count >= playout_index * rtp_count) { | |
| 382 RtcEventLogTestHelper::VerifyPlayoutEvent( | |
| 383 parsed_log, event_index, playout_ssrcs[playout_index - 1]); | |
| 384 event_index++; | |
| 385 playout_index++; | |
| 386 } | |
| 387 if (i * bwe_loss_count >= bwe_loss_index * rtp_count) { | |
| 388 RtcEventLogTestHelper::VerifyBweLossEvent( | |
| 389 parsed_log, event_index, bwe_loss_updates[bwe_loss_index - 1].first, | |
| 390 bwe_loss_updates[bwe_loss_index - 1].second, i); | |
| 391 event_index++; | |
| 392 bwe_loss_index++; | |
| 393 } | |
| 394 } | |
| 395 | |
| 396 // Clean up temporary file - can be pretty slow. | |
| 397 remove(temp_filename.c_str()); | |
| 398 } | 483 } |
| 399 | 484 |
| 400 TEST(RtcEventLogTest, LogSessionAndReadBack) { | 485 TEST(RtcEventLogTest, LogSessionAndReadBack) { |
| 401 // Log 5 RTP, 2 RTCP, 0 playout events and 0 BWE events | 486 RtpHeaderExtensionMap extensions; |
| 402 // with no header extensions or CSRCS. | 487 LogSessionAndReadBack(3, // Number of incoming RTP packets. |
|
eladalon
2017/09/05 11:57:01
One hack you could employ would be to define enums
terelius
2017/09/07 12:53:55
Seems like overkill imo.
| |
| 403 LogSessionAndReadBack(5, 2, 0, 0, 0, 0, 321); | 488 2, // Number of outgoing RTP packets. |
| 404 | 489 1, // Number of incoming RTCP packets. |
| 405 // Enable AbsSendTime and TransportSequenceNumbers. | 490 1, // Number of outgoing RTCP packets. |
| 406 uint32_t extensions = 0; | 491 0, // Number of playout events. |
| 492 0, // Number of BWE loss events. | |
| 493 0, // Number of BWE delay events. | |
| 494 extensions, // No extensions. | |
| 495 0, // Number of contributing sources. | |
| 496 321); // Random seed. | |
| 497 } | |
| 498 | |
| 499 TEST(RtcEventLogTest, LogSessionAndReadBackWith2Extensions) { | |
| 500 RtpHeaderExtensionMap extensions; | |
| 501 extensions.Register(kRtpExtensionAbsoluteSendTime, | |
| 502 kAbsoluteSendTimeExtensionId); | |
| 503 extensions.Register(kRtpExtensionTransportSequenceNumber, | |
| 504 kTransportSequenceNumberExtensionId); | |
| 505 LogSessionAndReadBack(4, 4, 1, 1, 0, 0, 0, extensions, 0, 3141592653u); | |
| 506 } | |
| 507 | |
| 508 TEST(RtcEventLogTest, LogSessionAndReadBackWithAllExtensions) { | |
| 509 RtpHeaderExtensionMap extensions; | |
| 407 for (uint32_t i = 0; i < kNumExtensions; i++) { | 510 for (uint32_t i = 0; i < kNumExtensions; i++) { |
| 408 if (kExtensionTypes[i] == RTPExtensionType::kRtpExtensionAbsoluteSendTime || | 511 extensions.Register(kExtensionTypes[i], kExtensionIds[i]); |
| 409 kExtensionTypes[i] == | 512 } |
| 410 RTPExtensionType::kRtpExtensionTransportSequenceNumber) { | 513 LogSessionAndReadBack(5, 4, 1, 1, 3, 2, 2, extensions, 2, 2718281828u); |
| 411 extensions |= 1u << i; | 514 } |
| 412 } | 515 |
| 413 } | 516 TEST(RtcEventLogTest, LogSessionAndReadBackAllCombinations) { |
| 414 LogSessionAndReadBack(8, 2, 0, 0, extensions, 0, 3141592653u); | |
| 415 | |
| 416 extensions = (1u << kNumExtensions) - 1; // Enable all header extensions. | |
| 417 LogSessionAndReadBack(9, 2, 3, 2, extensions, 2, 2718281828u); | |
| 418 | |
| 419 // Try all combinations of header extensions and up to 2 CSRCS. | 517 // Try all combinations of header extensions and up to 2 CSRCS. |
| 420 for (extensions = 0; extensions < (1u << kNumExtensions); extensions++) { | 518 for (uint32_t extension_selection = 0; |
| 519 extension_selection < (1u << kNumExtensions); extension_selection++) { | |
| 520 RtpHeaderExtensionMap extensions; | |
| 521 for (uint32_t i = 0; i < kNumExtensions; i++) { | |
| 522 if (extension_selection & (1u << i)) { | |
| 523 extensions.Register(kExtensionTypes[i], kExtensionIds[i]); | |
| 524 } | |
| 525 } | |
| 421 for (uint32_t csrcs_count = 0; csrcs_count < 3; csrcs_count++) { | 526 for (uint32_t csrcs_count = 0; csrcs_count < 3; csrcs_count++) { |
| 422 LogSessionAndReadBack(5 + extensions, // Number of RTP packets. | 527 LogSessionAndReadBack( |
| 423 2 + csrcs_count, // Number of RTCP packets. | 528 2 + extension_selection, // Number of incoming RTP packets. |
| 424 3 + csrcs_count, // Number of playout events. | 529 2 + extension_selection, // Number of outgoing RTP packets. |
| 425 1 + csrcs_count, // Number of BWE loss events. | 530 1 + csrcs_count, // Number of incoming RTCP packets. |
| 426 extensions, // Bit vector choosing extensions. | 531 1 + csrcs_count, // Number of outgoing RTCP packets. |
| 427 csrcs_count, // Number of contributing sources. | 532 3 + csrcs_count, // Number of playout events. |
| 428 extensions * 3 + csrcs_count + 1); // Random seed. | 533 1 + csrcs_count, // Number of BWE loss events. |
| 429 } | 534 2 + csrcs_count, // Number of BWE delay events. |
| 430 } | 535 extensions, // Bit vector choosing extensions. |
| 431 } | 536 csrcs_count, // Number of contributing sources. |
| 537 extension_selection * 3 + csrcs_count + 1); // Random seed. | |
| 538 } | |
| 539 } | |
| 540 } | |
| 432 | 541 |
| 433 TEST(RtcEventLogTest, LogEventAndReadBack) { | 542 TEST(RtcEventLogTest, LogEventAndReadBack) { |
| 434 Random prng(987654321); | 543 Random prng(987654321); |
| 435 | 544 |
| 436 // Create one RTP and one RTCP packet containing random data. | 545 // Create one RTP and one RTCP packet containing random data. |
| 437 size_t packet_size = prng.Rand(1000, 1100); | 546 size_t packet_size = prng.Rand(1000, 1100); |
| 438 RtpPacketToSend rtp_packet = | 547 RtpPacketReceived rtp_packet = |
| 439 GenerateRtpPacket(nullptr, 0, packet_size, &prng); | 548 GenerateIncomingRtpPacket(nullptr, 0, packet_size, &prng); |
| 440 rtc::Buffer rtcp_packet = GenerateRtcpPacket(&prng); | 549 rtc::Buffer rtcp_packet = GenerateRtcpPacket(&prng); |
| 441 | 550 |
| 442 // Find the name of the current test, in order to use it as a temporary | 551 // Find the name of the current test, in order to use it as a temporary |
| 443 // filename. | 552 // filename. |
| 444 auto test_info = ::testing::UnitTest::GetInstance()->current_test_info(); | 553 auto test_info = ::testing::UnitTest::GetInstance()->current_test_info(); |
| 445 const std::string temp_filename = | 554 const std::string temp_filename = |
| 446 test::OutputPath() + test_info->test_case_name() + test_info->name(); | 555 test::OutputPath() + test_info->test_case_name() + test_info->name(); |
| 447 | 556 |
| 448 // Add RTP, start logging, add RTCP and then stop logging | 557 // Add RTP, start logging, add RTCP and then stop logging |
| 449 rtc::ScopedFakeClock fake_clock; | 558 rtc::ScopedFakeClock fake_clock; |
| 450 fake_clock.SetTimeMicros(prng.Rand<uint32_t>()); | 559 fake_clock.SetTimeMicros(prng.Rand<uint32_t>()); |
| 451 std::unique_ptr<RtcEventLog> log_dumper(RtcEventLog::Create()); | 560 std::unique_ptr<RtcEventLog> log_dumper(RtcEventLog::Create()); |
| 452 | 561 |
| 453 log_dumper->LogRtpHeader(kIncomingPacket, rtp_packet.data(), | 562 log_dumper->LogIncomingRtpHeader(rtp_packet); |
| 454 rtp_packet.size()); | |
| 455 fake_clock.AdvanceTimeMicros(prng.Rand(1, 1000)); | 563 fake_clock.AdvanceTimeMicros(prng.Rand(1, 1000)); |
| 456 | 564 |
| 457 log_dumper->StartLogging(temp_filename, 10000000); | 565 log_dumper->StartLogging(temp_filename, 10000000); |
| 458 fake_clock.AdvanceTimeMicros(prng.Rand(1, 1000)); | 566 fake_clock.AdvanceTimeMicros(prng.Rand(1, 1000)); |
| 459 | 567 |
| 460 log_dumper->LogRtcpPacket(kOutgoingPacket, rtcp_packet.data(), | 568 log_dumper->LogOutgoingRtcpPacket( |
| 461 rtcp_packet.size()); | 569 rtc::ArrayView<const uint8_t>(rtcp_packet.data(), rtcp_packet.size())); |
|
danilchap
2017/09/05 08:47:16
rtc::Buffer is implicitly convertable to rtc::Arra
terelius
2017/09/07 12:53:55
Done.
| |
| 462 fake_clock.AdvanceTimeMicros(prng.Rand(1, 1000)); | 570 fake_clock.AdvanceTimeMicros(prng.Rand(1, 1000)); |
| 463 | 571 |
| 464 log_dumper->StopLogging(); | 572 log_dumper->StopLogging(); |
| 465 | 573 |
| 466 // Read the generated file from disk. | 574 // Read the generated file from disk. |
| 467 ParsedRtcEventLog parsed_log; | 575 ParsedRtcEventLog parsed_log; |
| 468 ASSERT_TRUE(parsed_log.ParseFile(temp_filename)); | 576 ASSERT_TRUE(parsed_log.ParseFile(temp_filename)); |
| 469 | 577 |
| 470 // Verify that what we read back from the event log is the same as | 578 // Verify that what we read back from the event log is the same as |
| 471 // what we wrote down. | 579 // what we wrote down. |
| (...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 713 RtcEventLogTestHelper::VerifyLogEndEvent(parsed_log, 4); | 821 RtcEventLogTestHelper::VerifyLogEndEvent(parsed_log, 4); |
| 714 | 822 |
| 715 // Clean up temporary file - can be pretty slow. | 823 // Clean up temporary file - can be pretty slow. |
| 716 remove(temp_filename.c_str()); | 824 remove(temp_filename.c_str()); |
| 717 } | 825 } |
| 718 | 826 |
| 719 class ConfigReadWriteTest { | 827 class ConfigReadWriteTest { |
| 720 public: | 828 public: |
| 721 ConfigReadWriteTest() : prng(987654321) {} | 829 ConfigReadWriteTest() : prng(987654321) {} |
| 722 virtual ~ConfigReadWriteTest() {} | 830 virtual ~ConfigReadWriteTest() {} |
| 723 virtual void GenerateConfig(uint32_t extensions_bitvector) = 0; | 831 virtual void GenerateConfig(const RtpHeaderExtensionMap& extensions) = 0; |
| 724 virtual void VerifyConfig(const ParsedRtcEventLog& parsed_log, | 832 virtual void VerifyConfig(const ParsedRtcEventLog& parsed_log, |
| 725 size_t index) = 0; | 833 size_t index) = 0; |
| 726 virtual void LogConfig(RtcEventLog* event_log) = 0; | 834 virtual void LogConfig(RtcEventLog* event_log) = 0; |
| 727 | 835 |
| 728 void DoTest() { | 836 void DoTest() { |
| 729 // Find the name of the current test, in order to use it as a temporary | 837 // Find the name of the current test, in order to use it as a temporary |
| 730 // filename. | 838 // filename. |
| 731 auto test_info = ::testing::UnitTest::GetInstance()->current_test_info(); | 839 auto test_info = ::testing::UnitTest::GetInstance()->current_test_info(); |
| 732 const std::string temp_filename = | 840 const std::string temp_filename = |
| 733 test::OutputPath() + test_info->test_case_name() + test_info->name(); | 841 test::OutputPath() + test_info->test_case_name() + test_info->name(); |
| 734 | 842 |
| 735 // Use all extensions. | 843 // Use all extensions. |
| 736 uint32_t extensions_bitvector = (1u << kNumExtensions) - 1; | 844 RtpHeaderExtensionMap extensions; |
| 737 GenerateConfig(extensions_bitvector); | 845 for (uint32_t i = 0; i < kNumExtensions; i++) { |
| 846 extensions.Register(kExtensionTypes[i], kExtensionIds[i]); | |
| 847 } | |
| 848 GenerateConfig(extensions); | |
| 738 | 849 |
| 739 // Log a single config event and stop logging. | 850 // Log a single config event and stop logging. |
| 740 rtc::ScopedFakeClock fake_clock; | 851 rtc::ScopedFakeClock fake_clock; |
| 741 fake_clock.SetTimeMicros(prng.Rand<uint32_t>()); | 852 fake_clock.SetTimeMicros(prng.Rand<uint32_t>()); |
| 742 std::unique_ptr<RtcEventLog> log_dumper(RtcEventLog::Create()); | 853 std::unique_ptr<RtcEventLog> log_dumper(RtcEventLog::Create()); |
| 743 | 854 |
| 744 log_dumper->StartLogging(temp_filename, 10000000); | 855 log_dumper->StartLogging(temp_filename, 10000000); |
| 745 LogConfig(log_dumper.get()); | 856 LogConfig(log_dumper.get()); |
| 746 log_dumper->StopLogging(); | 857 log_dumper->StopLogging(); |
| 747 | 858 |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 760 RtcEventLogTestHelper::VerifyLogEndEvent(parsed_log, 2); | 871 RtcEventLogTestHelper::VerifyLogEndEvent(parsed_log, 2); |
| 761 | 872 |
| 762 // Clean up temporary file - can be pretty slow. | 873 // Clean up temporary file - can be pretty slow. |
| 763 remove(temp_filename.c_str()); | 874 remove(temp_filename.c_str()); |
| 764 } | 875 } |
| 765 Random prng; | 876 Random prng; |
| 766 }; | 877 }; |
| 767 | 878 |
| 768 class AudioReceiveConfigReadWriteTest : public ConfigReadWriteTest { | 879 class AudioReceiveConfigReadWriteTest : public ConfigReadWriteTest { |
| 769 public: | 880 public: |
| 770 void GenerateConfig(uint32_t extensions_bitvector) override { | 881 void GenerateConfig(const RtpHeaderExtensionMap& extensions) override { |
| 771 GenerateAudioReceiveConfig(extensions_bitvector, &config, &prng); | 882 GenerateAudioReceiveConfig(extensions, &config, &prng); |
| 772 } | 883 } |
| 773 void LogConfig(RtcEventLog* event_log) override { | 884 void LogConfig(RtcEventLog* event_log) override { |
| 774 event_log->LogAudioReceiveStreamConfig(config); | 885 event_log->LogAudioReceiveStreamConfig(config); |
| 775 } | 886 } |
| 776 void VerifyConfig(const ParsedRtcEventLog& parsed_log, | 887 void VerifyConfig(const ParsedRtcEventLog& parsed_log, |
| 777 size_t index) override { | 888 size_t index) override { |
| 778 RtcEventLogTestHelper::VerifyAudioReceiveStreamConfig(parsed_log, index, | 889 RtcEventLogTestHelper::VerifyAudioReceiveStreamConfig(parsed_log, index, |
| 779 config); | 890 config); |
| 780 } | 891 } |
| 781 rtclog::StreamConfig config; | 892 rtclog::StreamConfig config; |
| 782 }; | 893 }; |
| 783 | 894 |
| 784 class AudioSendConfigReadWriteTest : public ConfigReadWriteTest { | 895 class AudioSendConfigReadWriteTest : public ConfigReadWriteTest { |
| 785 public: | 896 public: |
| 786 AudioSendConfigReadWriteTest() {} | 897 AudioSendConfigReadWriteTest() {} |
| 787 void GenerateConfig(uint32_t extensions_bitvector) override { | 898 void GenerateConfig(const RtpHeaderExtensionMap& extensions) override { |
| 788 GenerateAudioSendConfig(extensions_bitvector, &config, &prng); | 899 GenerateAudioSendConfig(extensions, &config, &prng); |
| 789 } | 900 } |
| 790 void LogConfig(RtcEventLog* event_log) override { | 901 void LogConfig(RtcEventLog* event_log) override { |
| 791 event_log->LogAudioSendStreamConfig(config); | 902 event_log->LogAudioSendStreamConfig(config); |
| 792 } | 903 } |
| 793 void VerifyConfig(const ParsedRtcEventLog& parsed_log, | 904 void VerifyConfig(const ParsedRtcEventLog& parsed_log, |
| 794 size_t index) override { | 905 size_t index) override { |
| 795 RtcEventLogTestHelper::VerifyAudioSendStreamConfig(parsed_log, index, | 906 RtcEventLogTestHelper::VerifyAudioSendStreamConfig(parsed_log, index, |
| 796 config); | 907 config); |
| 797 } | 908 } |
| 798 rtclog::StreamConfig config; | 909 rtclog::StreamConfig config; |
| 799 }; | 910 }; |
| 800 | 911 |
| 801 class VideoReceiveConfigReadWriteTest : public ConfigReadWriteTest { | 912 class VideoReceiveConfigReadWriteTest : public ConfigReadWriteTest { |
| 802 public: | 913 public: |
| 803 VideoReceiveConfigReadWriteTest() {} | 914 VideoReceiveConfigReadWriteTest() {} |
| 804 void GenerateConfig(uint32_t extensions_bitvector) override { | 915 void GenerateConfig(const RtpHeaderExtensionMap& extensions) override { |
| 805 GenerateVideoReceiveConfig(extensions_bitvector, &config, &prng); | 916 GenerateVideoReceiveConfig(extensions, &config, &prng); |
| 806 } | 917 } |
| 807 void LogConfig(RtcEventLog* event_log) override { | 918 void LogConfig(RtcEventLog* event_log) override { |
| 808 event_log->LogVideoReceiveStreamConfig(config); | 919 event_log->LogVideoReceiveStreamConfig(config); |
| 809 } | 920 } |
| 810 void VerifyConfig(const ParsedRtcEventLog& parsed_log, | 921 void VerifyConfig(const ParsedRtcEventLog& parsed_log, |
| 811 size_t index) override { | 922 size_t index) override { |
| 812 RtcEventLogTestHelper::VerifyVideoReceiveStreamConfig(parsed_log, index, | 923 RtcEventLogTestHelper::VerifyVideoReceiveStreamConfig(parsed_log, index, |
| 813 config); | 924 config); |
| 814 } | 925 } |
| 815 rtclog::StreamConfig config; | 926 rtclog::StreamConfig config; |
| 816 }; | 927 }; |
| 817 | 928 |
| 818 class VideoSendConfigReadWriteTest : public ConfigReadWriteTest { | 929 class VideoSendConfigReadWriteTest : public ConfigReadWriteTest { |
| 819 public: | 930 public: |
| 820 VideoSendConfigReadWriteTest() {} | 931 VideoSendConfigReadWriteTest() {} |
| 821 void GenerateConfig(uint32_t extensions_bitvector) override { | 932 void GenerateConfig(const RtpHeaderExtensionMap& extensions) override { |
| 822 GenerateVideoSendConfig(extensions_bitvector, &config, &prng); | 933 GenerateVideoSendConfig(extensions, &config, &prng); |
| 823 } | 934 } |
| 824 void LogConfig(RtcEventLog* event_log) override { | 935 void LogConfig(RtcEventLog* event_log) override { |
| 825 event_log->LogVideoSendStreamConfig(config); | 936 event_log->LogVideoSendStreamConfig(config); |
| 826 } | 937 } |
| 827 void VerifyConfig(const ParsedRtcEventLog& parsed_log, | 938 void VerifyConfig(const ParsedRtcEventLog& parsed_log, |
| 828 size_t index) override { | 939 size_t index) override { |
| 829 RtcEventLogTestHelper::VerifyVideoSendStreamConfig(parsed_log, index, | 940 RtcEventLogTestHelper::VerifyVideoSendStreamConfig(parsed_log, index, |
| 830 config); | 941 config); |
| 831 } | 942 } |
| 832 rtclog::StreamConfig config; | 943 rtclog::StreamConfig config; |
| 833 }; | 944 }; |
| 834 | 945 |
| 835 class AudioNetworkAdaptationReadWriteTest : public ConfigReadWriteTest { | 946 class AudioNetworkAdaptationReadWriteTest : public ConfigReadWriteTest { |
| 836 public: | 947 public: |
| 837 void GenerateConfig(uint32_t extensions_bitvector) override { | 948 void GenerateConfig(const RtpHeaderExtensionMap& extensions) override { |
| 838 GenerateAudioNetworkAdaptation(extensions_bitvector, &config, &prng); | 949 GenerateAudioNetworkAdaptation(extensions, &config, &prng); |
| 839 } | 950 } |
| 840 void LogConfig(RtcEventLog* event_log) override { | 951 void LogConfig(RtcEventLog* event_log) override { |
| 841 event_log->LogAudioNetworkAdaptation(config); | 952 event_log->LogAudioNetworkAdaptation(config); |
| 842 } | 953 } |
| 843 void VerifyConfig(const ParsedRtcEventLog& parsed_log, | 954 void VerifyConfig(const ParsedRtcEventLog& parsed_log, |
| 844 size_t index) override { | 955 size_t index) override { |
| 845 RtcEventLogTestHelper::VerifyAudioNetworkAdaptation(parsed_log, index, | 956 RtcEventLogTestHelper::VerifyAudioNetworkAdaptation(parsed_log, index, |
| 846 config); | 957 config); |
| 847 } | 958 } |
| 848 AudioEncoderRuntimeConfig config; | 959 AudioEncoderRuntimeConfig config; |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 867 VideoSendConfigReadWriteTest test; | 978 VideoSendConfigReadWriteTest test; |
| 868 test.DoTest(); | 979 test.DoTest(); |
| 869 } | 980 } |
| 870 | 981 |
| 871 TEST(RtcEventLogTest, LogAudioNetworkAdaptation) { | 982 TEST(RtcEventLogTest, LogAudioNetworkAdaptation) { |
| 872 AudioNetworkAdaptationReadWriteTest test; | 983 AudioNetworkAdaptationReadWriteTest test; |
| 873 test.DoTest(); | 984 test.DoTest(); |
| 874 } | 985 } |
| 875 | 986 |
| 876 } // namespace webrtc | 987 } // namespace webrtc |
| OLD | NEW |