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 <ostream> |
13 #include <string> | 14 #include <string> |
14 #include <utility> | 15 #include <utility> |
15 #include <vector> | 16 #include <vector> |
16 | 17 |
17 #include "call/call.h" | 18 #include "call/call.h" |
18 #include "logging/rtc_event_log/rtc_event_log.h" | 19 #include "logging/rtc_event_log/rtc_event_log.h" |
19 #include "logging/rtc_event_log/rtc_event_log_parser.h" | 20 #include "logging/rtc_event_log/rtc_event_log_parser.h" |
20 #include "logging/rtc_event_log/rtc_event_log_unittest_helper.h" | 21 #include "logging/rtc_event_log/rtc_event_log_unittest_helper.h" |
21 #include "logging/rtc_event_log/rtc_stream_config.h" | 22 #include "logging/rtc_event_log/rtc_stream_config.h" |
22 #include "modules/audio_coding/audio_network_adaptor/include/audio_network_adapt
or.h" | 23 #include "modules/audio_coding/audio_network_adaptor/include/audio_network_adapt
or.h" |
23 #include "modules/remote_bitrate_estimator/include/bwe_defines.h" | 24 #include "modules/remote_bitrate_estimator/include/bwe_defines.h" |
24 #include "modules/rtp_rtcp/include/rtp_header_extension_map.h" | 25 #include "modules/rtp_rtcp/include/rtp_header_extension_map.h" |
25 #include "modules/rtp_rtcp/source/rtcp_packet.h" | 26 #include "modules/rtp_rtcp/source/rtcp_packet.h" |
26 #include "modules/rtp_rtcp/source/rtcp_packet/sender_report.h" | 27 #include "modules/rtp_rtcp/source/rtcp_packet/sender_report.h" |
27 #include "modules/rtp_rtcp/source/rtp_header_extensions.h" | 28 #include "modules/rtp_rtcp/source/rtp_header_extensions.h" |
| 29 #include "modules/rtp_rtcp/source/rtp_packet_received.h" |
28 #include "modules/rtp_rtcp/source/rtp_packet_to_send.h" | 30 #include "modules/rtp_rtcp/source/rtp_packet_to_send.h" |
29 #include "rtc_base/buffer.h" | 31 #include "rtc_base/buffer.h" |
30 #include "rtc_base/checks.h" | 32 #include "rtc_base/checks.h" |
31 #include "rtc_base/fakeclock.h" | 33 #include "rtc_base/fakeclock.h" |
| 34 #include "rtc_base/ptr_util.h" |
32 #include "rtc_base/random.h" | 35 #include "rtc_base/random.h" |
| 36 #include "system_wrappers/include/sleep.h" // TODO(terelius): Remove this. |
33 #include "test/gtest.h" | 37 #include "test/gtest.h" |
34 #include "test/testsupport/fileutils.h" | 38 #include "test/testsupport/fileutils.h" |
35 | 39 |
36 // Files generated at build-time by the protobuf compiler. | 40 // Files generated at build-time by the protobuf compiler. |
37 #ifdef WEBRTC_ANDROID_PLATFORM_BUILD | 41 #ifdef WEBRTC_ANDROID_PLATFORM_BUILD |
38 #include "external/webrtc/webrtc/logging/rtc_event_log/rtc_event_log.pb.h" | 42 #include "external/webrtc/webrtc/logging/rtc_event_log/rtc_event_log.pb.h" |
39 #else | 43 #else |
40 #include "logging/rtc_event_log/rtc_event_log.pb.h" | 44 #include "logging/rtc_event_log/rtc_event_log.pb.h" |
41 #endif | 45 #endif |
42 | 46 |
43 namespace webrtc { | 47 namespace webrtc { |
44 | 48 |
45 namespace { | 49 namespace { |
46 | 50 |
| 51 const uint8_t kTransmissionTimeOffsetExtensionId = 1; |
| 52 const uint8_t kAbsoluteSendTimeExtensionId = 14; |
| 53 const uint8_t kTransportSequenceNumberExtensionId = 13; |
| 54 const uint8_t kAudioLevelExtensionId = 9; |
| 55 const uint8_t kVideoRotationExtensionId = 5; |
| 56 |
| 57 const uint8_t kExtensionIds[] = { |
| 58 kTransmissionTimeOffsetExtensionId, kAbsoluteSendTimeExtensionId, |
| 59 kTransportSequenceNumberExtensionId, kAudioLevelExtensionId, |
| 60 kVideoRotationExtensionId}; |
47 const RTPExtensionType kExtensionTypes[] = { | 61 const RTPExtensionType kExtensionTypes[] = { |
48 RTPExtensionType::kRtpExtensionTransmissionTimeOffset, | 62 RTPExtensionType::kRtpExtensionTransmissionTimeOffset, |
| 63 RTPExtensionType::kRtpExtensionAbsoluteSendTime, |
| 64 RTPExtensionType::kRtpExtensionTransportSequenceNumber, |
49 RTPExtensionType::kRtpExtensionAudioLevel, | 65 RTPExtensionType::kRtpExtensionAudioLevel, |
50 RTPExtensionType::kRtpExtensionAbsoluteSendTime, | 66 RTPExtensionType::kRtpExtensionVideoRotation}; |
51 RTPExtensionType::kRtpExtensionVideoRotation, | |
52 RTPExtensionType::kRtpExtensionTransportSequenceNumber}; | |
53 const char* kExtensionNames[] = { | 67 const char* kExtensionNames[] = { |
54 RtpExtension::kTimestampOffsetUri, RtpExtension::kAudioLevelUri, | 68 RtpExtension::kTimestampOffsetUri, RtpExtension::kAbsSendTimeUri, |
55 RtpExtension::kAbsSendTimeUri, RtpExtension::kVideoRotationUri, | 69 RtpExtension::kTransportSequenceNumberUri, RtpExtension::kAudioLevelUri, |
56 RtpExtension::kTransportSequenceNumberUri}; | 70 RtpExtension::kVideoRotationUri}; |
| 71 |
57 const size_t kNumExtensions = 5; | 72 const size_t kNumExtensions = 5; |
58 | 73 |
59 void PrintActualEvents(const ParsedRtcEventLog& parsed_log) { | 74 struct BweLossEvent { |
60 std::map<int, size_t> actual_event_counts; | 75 int32_t bitrate_bps; |
61 for (size_t i = 0; i < parsed_log.GetNumberOfEvents(); i++) { | 76 uint8_t fraction_loss; |
62 actual_event_counts[parsed_log.GetEventType(i)]++; | 77 int32_t total_packets; |
63 } | 78 }; |
64 printf("Actual events: "); | |
65 for (auto kv : actual_event_counts) { | |
66 printf("%d_count = %zu, ", kv.first, kv.second); | |
67 } | |
68 printf("\n"); | |
69 for (size_t i = 0; i < parsed_log.GetNumberOfEvents(); i++) { | |
70 printf("%4d ", parsed_log.GetEventType(i)); | |
71 } | |
72 printf("\n"); | |
73 } | |
74 | 79 |
75 void PrintExpectedEvents(size_t rtp_count, | 80 // TODO(terelius): Merge with event type in parser once updated? |
76 size_t rtcp_count, | 81 enum class EventType { |
77 size_t playout_count, | 82 kIncomingRtp, |
78 size_t bwe_loss_count) { | 83 kOutgoingRtp, |
79 printf( | 84 kIncomingRtcp, |
80 "Expected events: rtp_count = %zu, rtcp_count = %zu," | 85 kOutgoingRtcp, |
81 "playout_count = %zu, bwe_loss_count = %zu\n", | 86 kAudioPlayout, |
82 rtp_count, rtcp_count, playout_count, bwe_loss_count); | 87 kBweLossUpdate, |
83 size_t rtcp_index = 1, playout_index = 1, bwe_loss_index = 1; | 88 kBweDelayUpdate, |
84 printf("strt cfg cfg "); | 89 kVideoRecvConfig, |
85 for (size_t i = 1; i <= rtp_count; i++) { | 90 kVideoSendConfig, |
86 printf(" rtp "); | 91 kAudioRecvConfig, |
87 if (i * rtcp_count >= rtcp_index * rtp_count) { | 92 kAudioSendConfig, |
88 printf("rtcp "); | 93 kAudioNetworkAdaptation, |
89 rtcp_index++; | 94 kBweProbeClusterCreated, |
90 } | 95 kBweProbeResult, |
91 if (i * playout_count >= playout_index * rtp_count) { | 96 }; |
92 printf("play "); | 97 |
93 playout_index++; | 98 const std::map<EventType, std::string> event_type_to_string( |
94 } | 99 {{EventType::kIncomingRtp, "RTP(in)"}, |
95 if (i * bwe_loss_count >= bwe_loss_index * rtp_count) { | 100 {EventType::kOutgoingRtp, "RTP(out)"}, |
96 printf("loss "); | 101 {EventType::kIncomingRtcp, "RTCP(in)"}, |
97 bwe_loss_index++; | 102 {EventType::kOutgoingRtcp, "RTCP(out)"}, |
98 } | 103 {EventType::kAudioPlayout, "PLAYOUT"}, |
99 } | 104 {EventType::kBweLossUpdate, "BWE_LOSS"}, |
100 printf("end \n"); | 105 {EventType::kBweDelayUpdate, "BWE_DELAY"}, |
101 } | 106 {EventType::kVideoRecvConfig, "VIDEO_RECV_CONFIG"}, |
| 107 {EventType::kVideoSendConfig, "VIDEO_SEND_CONFIG"}, |
| 108 {EventType::kAudioRecvConfig, "AUDIO_RECV_CONFIG"}, |
| 109 {EventType::kAudioSendConfig, "AUDIO_SEND_CONFIG"}, |
| 110 {EventType::kAudioNetworkAdaptation, "AUDIO_NETWORK_ADAPTATION"}, |
| 111 {EventType::kBweProbeClusterCreated, "BWE_PROBE_CREATED"}, |
| 112 {EventType::kBweProbeResult, "BWE_PROBE_RESULT"}}); |
| 113 |
| 114 const std::map<ParsedRtcEventLog::EventType, std::string> |
| 115 parsed_event_type_to_string( |
| 116 {{ParsedRtcEventLog::EventType::UNKNOWN_EVENT, "UNKNOWN_EVENT"}, |
| 117 {ParsedRtcEventLog::EventType::LOG_START, "LOG_START"}, |
| 118 {ParsedRtcEventLog::EventType::LOG_END, "LOG_END"}, |
| 119 {ParsedRtcEventLog::EventType::RTP_EVENT, "RTP"}, |
| 120 {ParsedRtcEventLog::EventType::RTCP_EVENT, "RTCP"}, |
| 121 {ParsedRtcEventLog::EventType::AUDIO_PLAYOUT_EVENT, "AUDIO_PLAYOUT"}, |
| 122 {ParsedRtcEventLog::EventType::LOSS_BASED_BWE_UPDATE, |
| 123 "LOSS_BASED_BWE_UPDATE"}, |
| 124 {ParsedRtcEventLog::EventType::DELAY_BASED_BWE_UPDATE, |
| 125 "DELAY_BASED_BWE_UPDATE"}, |
| 126 {ParsedRtcEventLog::EventType::VIDEO_RECEIVER_CONFIG_EVENT, |
| 127 "VIDEO_RECV_CONFIG"}, |
| 128 {ParsedRtcEventLog::EventType::VIDEO_SENDER_CONFIG_EVENT, |
| 129 "VIDEO_SEND_CONFIG"}, |
| 130 {ParsedRtcEventLog::EventType::AUDIO_RECEIVER_CONFIG_EVENT, |
| 131 "AUDIO_RECV_CONFIG"}, |
| 132 {ParsedRtcEventLog::EventType::AUDIO_SENDER_CONFIG_EVENT, |
| 133 "AUDIO_SEND_CONFIG"}, |
| 134 {ParsedRtcEventLog::EventType::AUDIO_NETWORK_ADAPTATION_EVENT, |
| 135 "AUDIO_NETWORK_ADAPTATION"}, |
| 136 {ParsedRtcEventLog::EventType::BWE_PROBE_CLUSTER_CREATED_EVENT, |
| 137 "BWE_PROBE_CREATED"}, |
| 138 {ParsedRtcEventLog::EventType::BWE_PROBE_RESULT_EVENT, |
| 139 "BWE_PROBE_RESULT"}}); |
102 } // namespace | 140 } // namespace |
103 | 141 |
104 /* | 142 void PrintActualEvents(const ParsedRtcEventLog& parsed_log, |
105 * Bit number i of extension_bitvector is set to indicate the | 143 std::ostream& stream); |
106 * presence of extension number i from kExtensionTypes / kExtensionNames. | 144 |
107 * The least significant bit extension_bitvector has number 0. | 145 RtpPacketToSend GenerateOutgoingRtpPacket( |
108 */ | 146 const RtpHeaderExtensionMap* extensions, |
109 RtpPacketToSend GenerateRtpPacket(const RtpHeaderExtensionMap* extensions, | 147 uint32_t csrcs_count, |
110 uint32_t csrcs_count, | 148 size_t packet_size, |
111 size_t packet_size, | 149 Random* prng) { |
112 Random* prng) { | |
113 RTC_CHECK_GE(packet_size, 16 + 4 * csrcs_count + 4 * kNumExtensions); | 150 RTC_CHECK_GE(packet_size, 16 + 4 * csrcs_count + 4 * kNumExtensions); |
114 | 151 |
115 std::vector<uint32_t> csrcs; | 152 std::vector<uint32_t> csrcs; |
116 for (unsigned i = 0; i < csrcs_count; i++) { | 153 for (unsigned i = 0; i < csrcs_count; i++) { |
117 csrcs.push_back(prng->Rand<uint32_t>()); | 154 csrcs.push_back(prng->Rand<uint32_t>()); |
118 } | 155 } |
119 | 156 |
120 RtpPacketToSend rtp_packet(extensions, packet_size); | 157 RtpPacketToSend rtp_packet(extensions, packet_size); |
121 rtp_packet.SetPayloadType(prng->Rand(127)); | 158 rtp_packet.SetPayloadType(prng->Rand(127)); |
122 rtp_packet.SetMarker(prng->Rand<bool>()); | 159 rtp_packet.SetMarker(prng->Rand<bool>()); |
123 rtp_packet.SetSequenceNumber(prng->Rand<uint16_t>()); | 160 rtp_packet.SetSequenceNumber(prng->Rand<uint16_t>()); |
124 rtp_packet.SetSsrc(prng->Rand<uint32_t>()); | 161 rtp_packet.SetSsrc(prng->Rand<uint32_t>()); |
125 rtp_packet.SetTimestamp(prng->Rand<uint32_t>()); | 162 rtp_packet.SetTimestamp(prng->Rand<uint32_t>()); |
126 rtp_packet.SetCsrcs(csrcs); | 163 rtp_packet.SetCsrcs(csrcs); |
127 | 164 |
128 rtp_packet.SetExtension<TransmissionOffset>(prng->Rand(0x00ffffff)); | 165 rtp_packet.SetExtension<TransmissionOffset>(prng->Rand(0x00ffffff)); |
129 rtp_packet.SetExtension<AudioLevel>(prng->Rand<bool>(), prng->Rand(127)); | 166 rtp_packet.SetExtension<AudioLevel>(prng->Rand<bool>(), prng->Rand(127)); |
130 rtp_packet.SetExtension<AbsoluteSendTime>(prng->Rand(0x00ffffff)); | 167 rtp_packet.SetExtension<AbsoluteSendTime>(prng->Rand(0x00ffffff)); |
131 rtp_packet.SetExtension<VideoOrientation>(prng->Rand(2)); | 168 rtp_packet.SetExtension<VideoOrientation>(prng->Rand(2)); |
132 rtp_packet.SetExtension<TransportSequenceNumber>(prng->Rand<uint16_t>()); | 169 rtp_packet.SetExtension<TransportSequenceNumber>(prng->Rand<uint16_t>()); |
133 | 170 |
134 size_t payload_size = packet_size - rtp_packet.headers_size(); | 171 size_t payload_size = packet_size - rtp_packet.headers_size(); |
135 uint8_t* payload = rtp_packet.AllocatePayload(payload_size); | 172 uint8_t* payload = rtp_packet.AllocatePayload(payload_size); |
136 for (size_t i = 0; i < payload_size; i++) { | 173 for (size_t i = 0; i < payload_size; i++) { |
137 payload[i] = prng->Rand<uint8_t>(); | 174 payload[i] = prng->Rand<uint8_t>(); |
138 } | 175 } |
139 return rtp_packet; | 176 return rtp_packet; |
140 } | 177 } |
141 | 178 |
| 179 RtpPacketReceived GenerateIncomingRtpPacket( |
| 180 const RtpHeaderExtensionMap* extensions, |
| 181 uint32_t csrcs_count, |
| 182 size_t packet_size, |
| 183 Random* prng) { |
| 184 RtpPacketToSend packet_out = |
| 185 GenerateOutgoingRtpPacket(extensions, csrcs_count, packet_size, prng); |
| 186 RtpPacketReceived packet_in(extensions); |
| 187 packet_in.Parse(packet_out.data(), packet_out.size()); |
| 188 return packet_in; |
| 189 } |
| 190 |
142 rtc::Buffer GenerateRtcpPacket(Random* prng) { | 191 rtc::Buffer GenerateRtcpPacket(Random* prng) { |
143 rtcp::ReportBlock report_block; | 192 rtcp::ReportBlock report_block; |
144 report_block.SetMediaSsrc(prng->Rand<uint32_t>()); // Remote SSRC. | 193 report_block.SetMediaSsrc(prng->Rand<uint32_t>()); // Remote SSRC. |
145 report_block.SetFractionLost(prng->Rand(50)); | 194 report_block.SetFractionLost(prng->Rand(50)); |
146 | 195 |
147 rtcp::SenderReport sender_report; | 196 rtcp::SenderReport sender_report; |
148 sender_report.SetSenderSsrc(prng->Rand<uint32_t>()); | 197 sender_report.SetSenderSsrc(prng->Rand<uint32_t>()); |
149 sender_report.SetNtp(NtpTime(prng->Rand<uint32_t>(), prng->Rand<uint32_t>())); | 198 sender_report.SetNtp(NtpTime(prng->Rand<uint32_t>(), prng->Rand<uint32_t>())); |
150 sender_report.SetPacketCount(prng->Rand<uint32_t>()); | 199 sender_report.SetPacketCount(prng->Rand<uint32_t>()); |
151 sender_report.AddReportBlock(report_block); | 200 sender_report.AddReportBlock(report_block); |
152 | 201 |
153 return sender_report.Build(); | 202 return sender_report.Build(); |
154 } | 203 } |
155 | 204 |
156 void GenerateVideoReceiveConfig(uint32_t extensions_bitvector, | 205 void GenerateVideoReceiveConfig(const RtpHeaderExtensionMap& extensions, |
157 rtclog::StreamConfig* config, | 206 rtclog::StreamConfig* config, |
158 Random* prng) { | 207 Random* prng) { |
159 // Add SSRCs for the stream. | 208 // Add SSRCs for the stream. |
160 config->remote_ssrc = prng->Rand<uint32_t>(); | 209 config->remote_ssrc = prng->Rand<uint32_t>(); |
161 config->local_ssrc = prng->Rand<uint32_t>(); | 210 config->local_ssrc = prng->Rand<uint32_t>(); |
162 // Add extensions and settings for RTCP. | 211 // Add extensions and settings for RTCP. |
163 config->rtcp_mode = | 212 config->rtcp_mode = |
164 prng->Rand<bool>() ? RtcpMode::kCompound : RtcpMode::kReducedSize; | 213 prng->Rand<bool>() ? RtcpMode::kCompound : RtcpMode::kReducedSize; |
165 config->remb = prng->Rand<bool>(); | 214 config->remb = prng->Rand<bool>(); |
166 config->rtx_ssrc = prng->Rand<uint32_t>(); | 215 config->rtx_ssrc = prng->Rand<uint32_t>(); |
167 config->codecs.emplace_back(prng->Rand<bool>() ? "VP8" : "H264", | 216 config->codecs.emplace_back(prng->Rand<bool>() ? "VP8" : "H264", |
168 prng->Rand(1, 127), prng->Rand(1, 127)); | 217 prng->Rand(1, 127), prng->Rand(1, 127)); |
169 // Add header extensions. | 218 // Add header extensions. |
170 for (unsigned i = 0; i < kNumExtensions; i++) { | 219 for (unsigned i = 0; i < kNumExtensions; i++) { |
171 if (extensions_bitvector & (1u << i)) { | 220 uint8_t id = extensions.GetId(kExtensionTypes[i]); |
172 config->rtp_extensions.emplace_back(kExtensionNames[i], | 221 if (id != RtpHeaderExtensionMap::kInvalidId) { |
173 prng->Rand<int>()); | 222 config->rtp_extensions.emplace_back(kExtensionNames[i], id); |
174 } | 223 } |
175 } | 224 } |
176 } | 225 } |
177 | 226 |
178 void GenerateVideoSendConfig(uint32_t extensions_bitvector, | 227 void GenerateVideoSendConfig(const RtpHeaderExtensionMap& extensions, |
179 rtclog::StreamConfig* config, | 228 rtclog::StreamConfig* config, |
180 Random* prng) { | 229 Random* prng) { |
181 config->codecs.emplace_back(prng->Rand<bool>() ? "VP8" : "H264", | 230 config->codecs.emplace_back(prng->Rand<bool>() ? "VP8" : "H264", |
182 prng->Rand(1, 127), prng->Rand(1, 127)); | 231 prng->Rand(1, 127), prng->Rand(1, 127)); |
183 config->local_ssrc = prng->Rand<uint32_t>(); | 232 config->local_ssrc = prng->Rand<uint32_t>(); |
184 config->rtx_ssrc = prng->Rand<uint32_t>(); | 233 config->rtx_ssrc = prng->Rand<uint32_t>(); |
185 // Add header extensions. | 234 // Add header extensions. |
186 for (unsigned i = 0; i < kNumExtensions; i++) { | 235 for (unsigned i = 0; i < kNumExtensions; i++) { |
187 if (extensions_bitvector & (1u << i)) { | 236 uint8_t id = extensions.GetId(kExtensionTypes[i]); |
188 config->rtp_extensions.push_back( | 237 if (id != RtpHeaderExtensionMap::kInvalidId) { |
189 RtpExtension(kExtensionNames[i], prng->Rand<int>())); | 238 config->rtp_extensions.emplace_back(kExtensionNames[i], id); |
190 } | 239 } |
191 } | 240 } |
192 } | 241 } |
193 | 242 |
194 void GenerateAudioReceiveConfig(uint32_t extensions_bitvector, | 243 void GenerateAudioReceiveConfig(const RtpHeaderExtensionMap& extensions, |
195 rtclog::StreamConfig* config, | 244 rtclog::StreamConfig* config, |
196 Random* prng) { | 245 Random* prng) { |
197 // Add SSRCs for the stream. | 246 // Add SSRCs for the stream. |
198 config->remote_ssrc = prng->Rand<uint32_t>(); | 247 config->remote_ssrc = prng->Rand<uint32_t>(); |
199 config->local_ssrc = prng->Rand<uint32_t>(); | 248 config->local_ssrc = prng->Rand<uint32_t>(); |
200 // Add header extensions. | 249 // Add header extensions. |
201 for (unsigned i = 0; i < kNumExtensions; i++) { | 250 for (unsigned i = 0; i < kNumExtensions; i++) { |
202 if (extensions_bitvector & (1u << i)) { | 251 uint8_t id = extensions.GetId(kExtensionTypes[i]); |
203 config->rtp_extensions.push_back( | 252 if (id != RtpHeaderExtensionMap::kInvalidId) { |
204 RtpExtension(kExtensionNames[i], prng->Rand<int>())); | 253 config->rtp_extensions.emplace_back(kExtensionNames[i], id); |
205 } | 254 } |
206 } | 255 } |
207 } | 256 } |
208 | 257 |
209 void GenerateAudioSendConfig(uint32_t extensions_bitvector, | 258 void GenerateAudioSendConfig(const RtpHeaderExtensionMap& extensions, |
210 rtclog::StreamConfig* config, | 259 rtclog::StreamConfig* config, |
211 Random* prng) { | 260 Random* prng) { |
212 // Add SSRC to the stream. | 261 // Add SSRC to the stream. |
213 config->local_ssrc = prng->Rand<uint32_t>(); | 262 config->local_ssrc = prng->Rand<uint32_t>(); |
214 // Add header extensions. | 263 // Add header extensions. |
215 for (unsigned i = 0; i < kNumExtensions; i++) { | 264 for (unsigned i = 0; i < kNumExtensions; i++) { |
216 if (extensions_bitvector & (1u << i)) { | 265 uint8_t id = extensions.GetId(kExtensionTypes[i]); |
217 config->rtp_extensions.push_back( | 266 if (id != RtpHeaderExtensionMap::kInvalidId) { |
218 RtpExtension(kExtensionNames[i], prng->Rand<int>())); | 267 config->rtp_extensions.emplace_back(kExtensionNames[i], id); |
219 } | 268 } |
220 } | 269 } |
221 } | 270 } |
222 | 271 |
223 void GenerateAudioNetworkAdaptation(uint32_t extensions_bitvector, | 272 // BweLossEvent GenerateBweLossEvent(Random* prng) { |
| 273 // BweLossEvent loss_event; |
| 274 // loss_event.bitrate_bps = prng->Rand(6000, 10000000); |
| 275 // loss_event.fraction_loss = prng->Rand<uint8_t>(); |
| 276 // loss_event.total_packets = prng->Rand(1, 1000); |
| 277 // return loss_event; |
| 278 // } |
| 279 |
| 280 void GenerateAudioNetworkAdaptation(const RtpHeaderExtensionMap& extensions, |
224 AudioEncoderRuntimeConfig* config, | 281 AudioEncoderRuntimeConfig* config, |
225 Random* prng) { | 282 Random* prng) { |
226 config->bitrate_bps = rtc::Optional<int>(prng->Rand(0, 3000000)); | 283 config->bitrate_bps = rtc::Optional<int>(prng->Rand(0, 3000000)); |
227 config->enable_fec = rtc::Optional<bool>(prng->Rand<bool>()); | 284 config->enable_fec = rtc::Optional<bool>(prng->Rand<bool>()); |
228 config->enable_dtx = rtc::Optional<bool>(prng->Rand<bool>()); | 285 config->enable_dtx = rtc::Optional<bool>(prng->Rand<bool>()); |
229 config->frame_length_ms = rtc::Optional<int>(prng->Rand(10, 120)); | 286 config->frame_length_ms = rtc::Optional<int>(prng->Rand(10, 120)); |
230 config->num_channels = rtc::Optional<size_t>(prng->Rand(1, 2)); | 287 config->num_channels = rtc::Optional<size_t>(prng->Rand(1, 2)); |
231 config->uplink_packet_loss_fraction = | 288 config->uplink_packet_loss_fraction = |
232 rtc::Optional<float>(prng->Rand<float>()); | 289 rtc::Optional<float>(prng->Rand<float>()); |
233 } | 290 } |
234 | 291 |
235 // Test for the RtcEventLog class. Dumps some RTP packets and other events | 292 class SessionDescription { |
236 // to disk, then reads them back to see if they match. | 293 public: |
237 void LogSessionAndReadBack(size_t rtp_count, | 294 explicit SessionDescription(unsigned int random_seed) : prng(random_seed) {} |
238 size_t rtcp_count, | 295 void GenerateSessionDescription(size_t incoming_rtp_count, |
239 size_t playout_count, | 296 size_t outgoing_rtp_count, |
240 size_t bwe_loss_count, | 297 size_t incoming_rtcp_count, |
241 uint32_t extensions_bitvector, | 298 size_t outgoing_rtcp_count, |
242 uint32_t csrcs_count, | 299 size_t playout_count, |
243 unsigned int random_seed) { | 300 size_t bwe_loss_count, |
244 ASSERT_LE(rtcp_count, rtp_count); | 301 size_t bwe_delay_count, |
245 ASSERT_LE(playout_count, rtp_count); | 302 const RtpHeaderExtensionMap& extensions, |
246 ASSERT_LE(bwe_loss_count, rtp_count); | 303 uint32_t csrcs_count); |
247 std::vector<RtpPacketToSend> rtp_packets; | 304 void WriteSession(); |
248 std::vector<rtc::Buffer> rtcp_packets; | 305 void ReadAndVerifySession(); |
249 std::vector<uint32_t> playout_ssrcs; | 306 void PrintExpectedEvents(std::ostream& stream); |
250 std::vector<std::pair<int32_t, uint8_t> > bwe_loss_updates; | 307 |
251 | 308 private: |
252 rtclog::StreamConfig receiver_config; | 309 // std::vector<RtpPacketReceived> incoming_rtp_packets; |
253 rtclog::StreamConfig sender_config; | 310 // std::vector<RtpPacketToSend> outgoing_rtp_packets; |
254 | 311 // std::vector<rtc::Buffer> incoming_rtcp_packets; |
255 Random prng(random_seed); | 312 // std::vector<rtc::Buffer> outgoing_rtcp_packets; |
256 | 313 // std::vector<uint32_t> playout_ssrcs; |
257 // Initialize rtp header extensions to be used in generated rtp packets. | 314 // std::vector<BweLossEvent> bwe_loss_updates; |
| 315 std::vector<std::pair<int32_t, BandwidthUsage> > bwe_delay_updates; |
| 316 // std::vector<rtclog::StreamConfig> receiver_configs; |
| 317 // std::vector<rtclog::StreamConfig> sender_configs; |
| 318 // std::vector<EventType> event_types; |
| 319 Random prng; |
| 320 }; |
| 321 |
| 322 void SessionDescription::GenerateSessionDescription( |
| 323 size_t incoming_rtp_count, |
| 324 size_t outgoing_rtp_count, |
| 325 size_t incoming_rtcp_count, |
| 326 size_t outgoing_rtcp_count, |
| 327 size_t playout_count, |
| 328 size_t bwe_loss_count, |
| 329 size_t bwe_delay_count, |
| 330 const RtpHeaderExtensionMap& extensions, |
| 331 uint32_t csrcs_count) { |
| 332 // // Create configuration for the video receive stream. |
| 333 // receiver_configs.push_back(rtclog::StreamConfig()); |
| 334 // GenerateVideoReceiveConfig(extensions, &receiver_configs.back(), &prng); |
| 335 // event_types.push_back(EventType::kVideoRecvConfig); |
| 336 |
| 337 // // Create configuration for the video send stream. |
| 338 // sender_configs.push_back(rtclog::StreamConfig()); |
| 339 // GenerateVideoSendConfig(extensions, &sender_configs.back(), &prng); |
| 340 // event_types.push_back(EventType::kVideoSendConfig); |
| 341 // const size_t config_count = 2; |
| 342 |
| 343 // // Create incoming and outgoing RTP packets containing random data. |
| 344 // for (size_t i = 0; i < incoming_rtp_count; i++) { |
| 345 // size_t packet_size = prng.Rand(1000, 1100); |
| 346 // incoming_rtp_packets.push_back(GenerateIncomingRtpPacket( |
| 347 // &extensions, csrcs_count, packet_size, &prng)); |
| 348 // event_types.push_back(EventType::kIncomingRtp); |
| 349 // } |
| 350 // for (size_t i = 0; i < outgoing_rtp_count; i++) { |
| 351 // size_t packet_size = prng.Rand(1000, 1100); |
| 352 // outgoing_rtp_packets.push_back(GenerateOutgoingRtpPacket( |
| 353 // &extensions, csrcs_count, packet_size, &prng)); |
| 354 // event_types.push_back(EventType::kOutgoingRtp); |
| 355 // } |
| 356 // // Create incoming and outgoing RTCP packets containing random data. |
| 357 // for (size_t i = 0; i < incoming_rtcp_count; i++) { |
| 358 // incoming_rtcp_packets.push_back(GenerateRtcpPacket(&prng)); |
| 359 // event_types.push_back(EventType::kIncomingRtcp); |
| 360 // } |
| 361 // for (size_t i = 0; i < outgoing_rtcp_count; i++) { |
| 362 // outgoing_rtcp_packets.push_back(GenerateRtcpPacket(&prng)); |
| 363 // event_types.push_back(EventType::kOutgoingRtcp); |
| 364 // } |
| 365 // // Create random SSRCs to use when logging AudioPlayout events. |
| 366 // for (size_t i = 0; i < playout_count; i++) { |
| 367 // playout_ssrcs.push_back(prng.Rand<uint32_t>()); |
| 368 // event_types.push_back(EventType::kAudioPlayout); |
| 369 // } |
| 370 // // Create random bitrate updates for LossBasedBwe. |
| 371 // for (size_t i = 0; i < bwe_loss_count; i++) { |
| 372 // bwe_loss_updates.push_back(GenerateBweLossEvent(&prng)); |
| 373 // event_types.push_back(EventType::kBweLossUpdate); |
| 374 // } |
| 375 // // Create random bitrate updates for DelayBasedBwe. |
| 376 // for (size_t i = 0; i < bwe_delay_count; i++) { |
| 377 // bwe_delay_updates.push_back(std::make_pair( |
| 378 // prng.Rand(6000, 10000000), prng.Rand<bool>() |
| 379 // ? BandwidthUsage::kBwOverusing |
| 380 // : BandwidthUsage::kBwUnderusing)); |
| 381 // event_types.push_back(EventType::kBweDelayUpdate); |
| 382 // } |
| 383 |
| 384 // // Order the events randomly. The configurations are stored in a separate |
| 385 // // buffer, so they might be written before any othe events. Hence, we can't |
| 386 // // mix the config events with other events. |
| 387 // for (size_t i = config_count; i < event_types.size(); i++) { |
| 388 // size_t other = prng.Rand(static_cast<uint32_t>(i), |
| 389 // static_cast<uint32_t>(event_types.size() - 1)); |
| 390 // RTC_CHECK(i <= other && other < event_types.size()); |
| 391 // std::swap(event_types[i], event_types[other]); |
| 392 // } |
| 393 } |
| 394 |
| 395 void SessionDescription::WriteSession() { |
| 396 // // Find the name of the current test, in order to use it as a temporary |
| 397 // // filename. |
| 398 // auto test_info = ::testing::UnitTest::GetInstance()->current_test_info(); |
| 399 // const std::string temp_filename = |
| 400 // test::OutputPath() + test_info->test_case_name() + test_info->name(); |
| 401 |
| 402 // rtc::ScopedFakeClock fake_clock; |
| 403 // fake_clock.SetTimeMicros(prng.Rand<uint32_t>()); |
| 404 |
| 405 // // When log_dumper goes out of scope, it causes the log file to be flushed |
| 406 // // to disk. |
| 407 // std::unique_ptr<RtcEventLog> log_dumper(RtcEventLog::Create()); |
| 408 |
| 409 // size_t incoming_rtp_written = 0; |
| 410 // size_t outgoing_rtp_written = 0; |
| 411 // size_t incoming_rtcp_written = 0; |
| 412 // size_t outgoing_rtcp_written = 0; |
| 413 // size_t playouts_written = 0; |
| 414 // size_t bwe_loss_written = 0; |
| 415 // size_t bwe_delay_written = 0; |
| 416 // size_t recv_configs_written = 0; |
| 417 // size_t send_configs_written = 0; |
| 418 |
| 419 // for (size_t i = 0; i < event_types.size(); i++) { |
| 420 // fake_clock.AdvanceTimeMicros(prng.Rand(1, 1000)); |
| 421 // if (i == event_types.size() / 2) |
| 422 // log_dumper->StartLogging(temp_filename, 10000000); |
| 423 // switch (event_types[i]) { |
| 424 // case EventType::kIncomingRtp: |
| 425 // RTC_CHECK(incoming_rtp_written < incoming_rtp_packets.size()); |
| 426 // log_dumper->LogIncomingRtpHeader( |
| 427 // incoming_rtp_packets[incoming_rtp_written++]); |
| 428 // break; |
| 429 // case EventType::kOutgoingRtp: |
| 430 // RTC_CHECK(outgoing_rtp_written < outgoing_rtp_packets.size()); |
| 431 // log_dumper->LogOutgoingRtpHeader( |
| 432 // outgoing_rtp_packets[outgoing_rtp_written++], |
| 433 // PacedPacketInfo::kNotAProbe); |
| 434 // break; |
| 435 // case EventType::kIncomingRtcp: |
| 436 // RTC_CHECK(incoming_rtcp_written < incoming_rtcp_packets.size()); |
| 437 // log_dumper->LogIncomingRtcpPacket( |
| 438 // incoming_rtcp_packets[incoming_rtcp_written++]); |
| 439 // break; |
| 440 // case EventType::kOutgoingRtcp: |
| 441 // RTC_CHECK(outgoing_rtcp_written < outgoing_rtcp_packets.size()); |
| 442 // log_dumper->LogOutgoingRtcpPacket( |
| 443 // outgoing_rtcp_packets[outgoing_rtcp_written++]); |
| 444 // break; |
| 445 // case EventType::kAudioPlayout: |
| 446 // RTC_CHECK(playouts_written < playout_ssrcs.size()); |
| 447 // log_dumper->LogAudioPlayout(playout_ssrcs[playouts_written++]); |
| 448 // break; |
| 449 // case EventType::kBweLossUpdate: |
| 450 // RTC_CHECK(bwe_loss_written < bwe_loss_updates.size()); |
| 451 // log_dumper->LogLossBasedBweUpdate( |
| 452 // bwe_loss_updates[bwe_loss_written].bitrate_bps, |
| 453 // bwe_loss_updates[bwe_loss_written].fraction_loss, |
| 454 // bwe_loss_updates[bwe_loss_written].total_packets); |
| 455 // bwe_loss_written++; |
| 456 // break; |
| 457 // case EventType::kBweDelayUpdate: |
| 458 // RTC_CHECK(bwe_delay_written < bwe_delay_updates.size()); |
| 459 // log_dumper->LogDelayBasedBweUpdate( |
| 460 // bwe_delay_updates[bwe_delay_written].first, |
| 461 // bwe_delay_updates[bwe_delay_written].second); |
| 462 // bwe_delay_written++; |
| 463 // break; |
| 464 // case EventType::kVideoRecvConfig: |
| 465 // RTC_CHECK(recv_configs_written < receiver_configs.size()); |
| 466 // log_dumper->LogVideoReceiveStreamConfig( |
| 467 // receiver_configs[recv_configs_written++]); |
| 468 // break; |
| 469 // case EventType::kVideoSendConfig: |
| 470 // RTC_CHECK(send_configs_written < sender_configs.size()); |
| 471 // log_dumper->LogVideoSendStreamConfig( |
| 472 // sender_configs[send_configs_written++]); |
| 473 // break; |
| 474 // case EventType::kAudioRecvConfig: |
| 475 // // Not implemented |
| 476 // RTC_NOTREACHED(); |
| 477 // break; |
| 478 // case EventType::kAudioSendConfig: |
| 479 // // Not implemented |
| 480 // RTC_NOTREACHED(); |
| 481 // break; |
| 482 // case EventType::kAudioNetworkAdaptation: |
| 483 // // Not implemented |
| 484 // RTC_NOTREACHED(); |
| 485 // break; |
| 486 // case EventType::kBweProbeClusterCreated: |
| 487 // // Not implemented |
| 488 // RTC_NOTREACHED(); |
| 489 // break; |
| 490 // case EventType::kBweProbeResult: |
| 491 // // Not implemented |
| 492 // RTC_NOTREACHED(); |
| 493 // break; |
| 494 // } |
| 495 // } |
| 496 |
| 497 // log_dumper->StopLogging(); |
| 498 } |
| 499 |
| 500 // Read the file and verify that what we read back from the event log is the |
| 501 // same as what we wrote down. |
| 502 void SessionDescription::ReadAndVerifySession() { |
| 503 // // Find the name of the current test, in order to use it as a temporary |
| 504 // // filename. |
| 505 // auto test_info = ::testing::UnitTest::GetInstance()->current_test_info(); |
| 506 // const std::string temp_filename = |
| 507 // test::OutputPath() + test_info->test_case_name() + test_info->name(); |
| 508 |
| 509 // // Read the generated file from disk. |
| 510 // ParsedRtcEventLog parsed_log; |
| 511 // ASSERT_TRUE(parsed_log.ParseFile(temp_filename)); |
| 512 // EXPECT_GE(1000u, event_types.size() + |
| 513 // 2); // The events must fit in the message queue. |
| 514 // EXPECT_EQ(event_types.size() + 2, parsed_log.GetNumberOfEvents()); |
| 515 |
| 516 // size_t incoming_rtp_read = 0; |
| 517 // size_t outgoing_rtp_read = 0; |
| 518 // size_t incoming_rtcp_read = 0; |
| 519 // size_t outgoing_rtcp_read = 0; |
| 520 // size_t playouts_read = 0; |
| 521 // size_t bwe_loss_read = 0; |
| 522 // size_t bwe_delay_read = 0; |
| 523 // size_t recv_configs_read = 0; |
| 524 // size_t send_configs_read = 0; |
| 525 |
| 526 // RtcEventLogTestHelper::VerifyLogStartEvent(parsed_log, 0); |
| 527 |
| 528 // for (size_t i = 0; i < event_types.size(); i++) { |
| 529 // switch (event_types[i]) { |
| 530 // case EventType::kIncomingRtp: |
| 531 // RTC_CHECK(incoming_rtp_read < incoming_rtp_packets.size()); |
| 532 // RtcEventLogTestHelper::VerifyRtpEvent( |
| 533 // parsed_log, i + 1, kIncomingPacket, |
| 534 // incoming_rtp_packets[incoming_rtp_read++]); |
| 535 // break; |
| 536 // case EventType::kOutgoingRtp: |
| 537 // RTC_CHECK(outgoing_rtp_read < outgoing_rtp_packets.size()); |
| 538 // RtcEventLogTestHelper::VerifyRtpEvent( |
| 539 // parsed_log, i + 1, kOutgoingPacket, |
| 540 // outgoing_rtp_packets[outgoing_rtp_read++]); |
| 541 // break; |
| 542 // case EventType::kIncomingRtcp: |
| 543 // RTC_CHECK(incoming_rtcp_read < incoming_rtcp_packets.size()); |
| 544 // RtcEventLogTestHelper::VerifyRtcpEvent( |
| 545 // parsed_log, i + 1, kIncomingPacket, |
| 546 // incoming_rtcp_packets[incoming_rtcp_read].data(), |
| 547 // incoming_rtcp_packets[incoming_rtcp_read].size()); |
| 548 // incoming_rtcp_read++; |
| 549 // break; |
| 550 // case EventType::kOutgoingRtcp: |
| 551 // RTC_CHECK(outgoing_rtcp_read < outgoing_rtcp_packets.size()); |
| 552 // RtcEventLogTestHelper::VerifyRtcpEvent( |
| 553 // parsed_log, i + 1, kOutgoingPacket, |
| 554 // outgoing_rtcp_packets[outgoing_rtcp_read].data(), |
| 555 // outgoing_rtcp_packets[outgoing_rtcp_read].size()); |
| 556 // outgoing_rtcp_read++; |
| 557 // break; |
| 558 // case EventType::kAudioPlayout: |
| 559 // RTC_CHECK(playouts_read < playout_ssrcs.size()); |
| 560 // RtcEventLogTestHelper::VerifyPlayoutEvent( |
| 561 // parsed_log, i + 1, playout_ssrcs[playouts_read++]); |
| 562 // break; |
| 563 // case EventType::kBweLossUpdate: |
| 564 // RTC_CHECK(bwe_loss_read < bwe_loss_updates.size()); |
| 565 // RtcEventLogTestHelper::VerifyBweLossEvent( |
| 566 // parsed_log, i + 1, bwe_loss_updates[bwe_loss_read].bitrate_bps, |
| 567 // bwe_loss_updates[bwe_loss_read].fraction_loss, |
| 568 // bwe_loss_updates[bwe_loss_read].total_packets); |
| 569 // bwe_loss_read++; |
| 570 // break; |
| 571 // case EventType::kBweDelayUpdate: |
| 572 // RTC_CHECK(bwe_delay_read < bwe_delay_updates.size()); |
| 573 // RtcEventLogTestHelper::VerifyBweDelayEvent( |
| 574 // parsed_log, i + 1, bwe_delay_updates[bwe_delay_read].first, |
| 575 // bwe_delay_updates[bwe_delay_read].second); |
| 576 // bwe_delay_read++; |
| 577 // break; |
| 578 // case EventType::kVideoRecvConfig: |
| 579 // RTC_CHECK(recv_configs_read < receiver_configs.size()); |
| 580 // RtcEventLogTestHelper::VerifyVideoReceiveStreamConfig( |
| 581 // parsed_log, i + 1, receiver_configs[recv_configs_read++]); |
| 582 // break; |
| 583 // case EventType::kVideoSendConfig: |
| 584 // RTC_CHECK(send_configs_read < sender_configs.size()); |
| 585 // RtcEventLogTestHelper::VerifyVideoSendStreamConfig( |
| 586 // parsed_log, i + 1, sender_configs[send_configs_read++]); |
| 587 // break; |
| 588 // case EventType::kAudioRecvConfig: |
| 589 // // Not implemented |
| 590 // RTC_NOTREACHED(); |
| 591 // break; |
| 592 // case EventType::kAudioSendConfig: |
| 593 // // Not implemented |
| 594 // RTC_NOTREACHED(); |
| 595 // break; |
| 596 // case EventType::kAudioNetworkAdaptation: |
| 597 // // Not implemented |
| 598 // RTC_NOTREACHED(); |
| 599 // break; |
| 600 // case EventType::kBweProbeClusterCreated: |
| 601 // // Not implemented |
| 602 // RTC_NOTREACHED(); |
| 603 // break; |
| 604 // case EventType::kBweProbeResult: |
| 605 // // Not implemented |
| 606 // RTC_NOTREACHED(); |
| 607 // break; |
| 608 // } |
| 609 // } |
| 610 |
| 611 // RtcEventLogTestHelper::VerifyLogEndEvent(parsed_log, |
| 612 // parsed_log.GetNumberOfEvents() - |
| 613 // 1); |
| 614 |
| 615 // // Clean up temporary file - can be pretty slow. |
| 616 // remove(temp_filename.c_str()); |
| 617 } |
| 618 |
| 619 void SessionDescription::PrintExpectedEvents(std::ostream& stream) { |
| 620 // for (size_t i = 0; i < event_types.size(); i++) { |
| 621 // auto it = event_type_to_string.find(event_types[i]); |
| 622 // RTC_CHECK(it != event_type_to_string.end()); |
| 623 // stream << it->second << " "; |
| 624 // } |
| 625 // stream << std::endl; |
| 626 } |
| 627 |
| 628 void PrintActualEvents(const ParsedRtcEventLog& parsed_log, |
| 629 std::ostream& stream) { |
| 630 // for (size_t i = 0; i < parsed_log.GetNumberOfEvents(); i++) { |
| 631 // auto it = parsed_event_type_to_string.find(parsed_log.GetEventType(i)); |
| 632 // RTC_CHECK(it != parsed_event_type_to_string.end()); |
| 633 // stream << it->second << " "; |
| 634 // } |
| 635 // stream << std::endl; |
| 636 } |
| 637 |
| 638 TEST(RtcEventLogTest, LogSessionAndReadBack) { |
258 RtpHeaderExtensionMap extensions; | 639 RtpHeaderExtensionMap extensions; |
259 for (unsigned i = 0; i < kNumExtensions; i++) { | 640 SessionDescription session(321 /*Random seed*/); |
260 if (extensions_bitvector & (1u << i)) { | 641 // session.GenerateSessionDescription(3, // Number of incoming RTP packets. |
261 extensions.Register(kExtensionTypes[i], i + 1); | 642 // 2, // Number of outgoing RTP packets. |
262 } | 643 // 1, // Number of incoming RTCP packets. |
263 } | 644 // 1, // Number of outgoing RTCP packets. |
264 // Create rtp_count RTP packets containing random data. | 645 // 0, // Number of playout events. |
265 for (size_t i = 0; i < rtp_count; i++) { | 646 // 0, // Number of BWE loss events. |
266 size_t packet_size = prng.Rand(1000, 1100); | 647 // 0, // Number of BWE delay events. |
267 rtp_packets.push_back( | 648 // extensions, // No extensions. |
268 GenerateRtpPacket(&extensions, csrcs_count, packet_size, &prng)); | 649 // 0); // Number of contributing sources. |
269 } | 650 // session.WriteSession(); |
270 // Create rtcp_count RTCP packets containing random data. | 651 // session.ReadAndVerifySession(); |
271 for (size_t i = 0; i < rtcp_count; i++) { | 652 |
272 rtcp_packets.push_back(GenerateRtcpPacket(&prng)); | 653 printf("Test finished - sleeping\n"); |
273 } | 654 fflush(stdout); |
274 // Create playout_count random SSRCs to use when logging AudioPlayout events. | 655 SleepMs(1000); |
275 for (size_t i = 0; i < playout_count; i++) { | 656 printf("Waking up and leaving test\n"); |
276 playout_ssrcs.push_back(prng.Rand<uint32_t>()); | 657 fflush(stdout); |
277 } | 658 } |
278 // Create bwe_loss_count random bitrate updates for LossBasedBwe. | 659 |
279 for (size_t i = 0; i < bwe_loss_count; i++) { | 660 // TEST(RtcEventLogTest, LogSessionAndReadBackWith2Extensions) { |
280 bwe_loss_updates.push_back( | 661 // RtpHeaderExtensionMap extensions; |
281 std::make_pair(prng.Rand<int32_t>(), prng.Rand<uint8_t>())); | 662 // extensions.Register(kRtpExtensionAbsoluteSendTime, |
282 } | 663 // kAbsoluteSendTimeExtensionId); |
283 // Create configurations for the video streams. | 664 // extensions.Register(kRtpExtensionTransportSequenceNumber, |
284 GenerateVideoReceiveConfig(extensions_bitvector, &receiver_config, &prng); | 665 // kTransportSequenceNumberExtensionId); |
285 GenerateVideoSendConfig(extensions_bitvector, &sender_config, &prng); | 666 // SessionDescription session(3141592653u /*Random seed*/); |
286 const int config_count = 2; | 667 // session.GenerateSessionDescription(4, 4, 1, 1, 0, 0, 0, extensions, 0); |
287 | 668 // session.WriteSession(); |
288 // Find the name of the current test, in order to use it as a temporary | 669 // session.ReadAndVerifySession(); |
289 // filename. | 670 // } |
290 auto test_info = ::testing::UnitTest::GetInstance()->current_test_info(); | 671 |
291 const std::string temp_filename = | 672 // TEST(RtcEventLogTest, LogSessionAndReadBackWithAllExtensions) { |
292 test::OutputPath() + test_info->test_case_name() + test_info->name(); | 673 // RtpHeaderExtensionMap extensions; |
293 | 674 // for (uint32_t i = 0; i < kNumExtensions; i++) { |
294 // When log_dumper goes out of scope, it causes the log file to be flushed | 675 // extensions.Register(kExtensionTypes[i], kExtensionIds[i]); |
295 // to disk. | 676 // } |
296 { | 677 // SessionDescription session(2718281828u /*Random seed*/); |
297 rtc::ScopedFakeClock fake_clock; | 678 // session.GenerateSessionDescription(5, 4, 1, 1, 3, 2, 2, extensions, 2); |
298 fake_clock.SetTimeMicros(prng.Rand<uint32_t>()); | 679 // session.WriteSession(); |
299 std::unique_ptr<RtcEventLog> log_dumper(RtcEventLog::Create()); | 680 // session.ReadAndVerifySession(); |
300 log_dumper->LogVideoReceiveStreamConfig(receiver_config); | 681 // } |
301 fake_clock.AdvanceTimeMicros(prng.Rand(1, 1000)); | 682 |
302 log_dumper->LogVideoSendStreamConfig(sender_config); | 683 // TEST(RtcEventLogTest, LogSessionAndReadBackAllCombinations) { |
303 fake_clock.AdvanceTimeMicros(prng.Rand(1, 1000)); | 684 // // Try all combinations of header extensions and up to 2 CSRCS. |
304 size_t rtcp_index = 1; | 685 // for (uint32_t extension_selection = 0; |
305 size_t playout_index = 1; | 686 // extension_selection < (1u << kNumExtensions); extension_selection++) { |
306 size_t bwe_loss_index = 1; | 687 // RtpHeaderExtensionMap extensions; |
307 for (size_t i = 1; i <= rtp_count; i++) { | 688 // for (uint32_t i = 0; i < kNumExtensions; i++) { |
308 log_dumper->LogRtpHeader( | 689 // if (extension_selection & (1u << i)) { |
309 (i % 2 == 0) ? kIncomingPacket : kOutgoingPacket, | 690 // extensions.Register(kExtensionTypes[i], kExtensionIds[i]); |
310 rtp_packets[i - 1].data(), rtp_packets[i - 1].size()); | 691 // } |
311 fake_clock.AdvanceTimeMicros(prng.Rand(1, 1000)); | 692 // } |
312 if (i * rtcp_count >= rtcp_index * rtp_count) { | 693 // for (uint32_t csrcs_count = 0; csrcs_count < 3; csrcs_count++) { |
313 log_dumper->LogRtcpPacket( | 694 // SessionDescription session(extension_selection * 3 + csrcs_count + |
314 (rtcp_index % 2 == 0) ? kIncomingPacket : kOutgoingPacket, | 695 // 1 /*Random seed*/); |
315 rtcp_packets[rtcp_index - 1].data(), | 696 // session.GenerateSessionDescription( |
316 rtcp_packets[rtcp_index - 1].size()); | 697 // 2 + extension_selection, // Number of incoming RTP packets. |
317 rtcp_index++; | 698 // 2 + extension_selection, // Number of outgoing RTP packets. |
318 fake_clock.AdvanceTimeMicros(prng.Rand(1, 1000)); | 699 // 1 + csrcs_count, // Number of incoming RTCP packets. |
319 } | 700 // 1 + csrcs_count, // Number of outgoing RTCP packets. |
320 if (i * playout_count >= playout_index * rtp_count) { | 701 // 3 + csrcs_count, // Number of playout events. |
321 log_dumper->LogAudioPlayout(playout_ssrcs[playout_index - 1]); | 702 // 1 + csrcs_count, // Number of BWE loss events. |
322 playout_index++; | 703 // 2 + csrcs_count, // Number of BWE delay events. |
323 fake_clock.AdvanceTimeMicros(prng.Rand(1, 1000)); | 704 // extensions, // Bit vector choosing extensions. |
324 } | 705 // csrcs_count); // Number of contributing sources. |
325 if (i * bwe_loss_count >= bwe_loss_index * rtp_count) { | 706 // session.WriteSession(); |
326 log_dumper->LogLossBasedBweUpdate( | 707 // session.ReadAndVerifySession(); |
327 bwe_loss_updates[bwe_loss_index - 1].first, | 708 // } |
328 bwe_loss_updates[bwe_loss_index - 1].second, i); | 709 // } |
329 bwe_loss_index++; | 710 // } |
330 fake_clock.AdvanceTimeMicros(prng.Rand(1, 1000)); | |
331 } | |
332 if (i == rtp_count / 2) { | |
333 log_dumper->StartLogging(temp_filename, 10000000); | |
334 fake_clock.AdvanceTimeMicros(prng.Rand(1, 1000)); | |
335 } | |
336 } | |
337 log_dumper->StopLogging(); | |
338 } | |
339 | |
340 // Read the generated file from disk. | |
341 ParsedRtcEventLog parsed_log; | |
342 | |
343 ASSERT_TRUE(parsed_log.ParseFile(temp_filename)); | |
344 | |
345 // Verify that what we read back from the event log is the same as | |
346 // what we wrote down. For RTCP we log the full packets, but for | |
347 // RTP we should only log the header. | |
348 const size_t event_count = config_count + playout_count + bwe_loss_count + | |
349 rtcp_count + rtp_count + 2; | |
350 EXPECT_GE(1000u, event_count); // The events must fit in the message queue. | |
351 EXPECT_EQ(event_count, parsed_log.GetNumberOfEvents()); | |
352 if (event_count != parsed_log.GetNumberOfEvents()) { | |
353 // Print the expected and actual event types for easier debugging. | |
354 PrintActualEvents(parsed_log); | |
355 PrintExpectedEvents(rtp_count, rtcp_count, playout_count, bwe_loss_count); | |
356 } | |
357 RtcEventLogTestHelper::VerifyLogStartEvent(parsed_log, 0); | |
358 RtcEventLogTestHelper::VerifyVideoReceiveStreamConfig(parsed_log, 1, | |
359 receiver_config); | |
360 RtcEventLogTestHelper::VerifyVideoSendStreamConfig(parsed_log, 2, | |
361 sender_config); | |
362 size_t event_index = config_count + 1; | |
363 size_t rtcp_index = 1; | |
364 size_t playout_index = 1; | |
365 size_t bwe_loss_index = 1; | |
366 for (size_t i = 1; i <= rtp_count; i++) { | |
367 RtcEventLogTestHelper::VerifyRtpEvent( | |
368 parsed_log, event_index, | |
369 (i % 2 == 0) ? kIncomingPacket : kOutgoingPacket, | |
370 rtp_packets[i - 1].data(), rtp_packets[i - 1].headers_size(), | |
371 rtp_packets[i - 1].size()); | |
372 event_index++; | |
373 if (i * rtcp_count >= rtcp_index * rtp_count) { | |
374 RtcEventLogTestHelper::VerifyRtcpEvent( | |
375 parsed_log, event_index, | |
376 rtcp_index % 2 == 0 ? kIncomingPacket : kOutgoingPacket, | |
377 rtcp_packets[rtcp_index - 1].data(), | |
378 rtcp_packets[rtcp_index - 1].size()); | |
379 event_index++; | |
380 rtcp_index++; | |
381 } | |
382 if (i * playout_count >= playout_index * rtp_count) { | |
383 RtcEventLogTestHelper::VerifyPlayoutEvent( | |
384 parsed_log, event_index, playout_ssrcs[playout_index - 1]); | |
385 event_index++; | |
386 playout_index++; | |
387 } | |
388 if (i * bwe_loss_count >= bwe_loss_index * rtp_count) { | |
389 RtcEventLogTestHelper::VerifyBweLossEvent( | |
390 parsed_log, event_index, bwe_loss_updates[bwe_loss_index - 1].first, | |
391 bwe_loss_updates[bwe_loss_index - 1].second, i); | |
392 event_index++; | |
393 bwe_loss_index++; | |
394 } | |
395 } | |
396 | |
397 // Clean up temporary file - can be pretty slow. | |
398 remove(temp_filename.c_str()); | |
399 } | |
400 | |
401 TEST(RtcEventLogTest, LogSessionAndReadBack) { | |
402 // Log 5 RTP, 2 RTCP, 0 playout events and 0 BWE events | |
403 // with no header extensions or CSRCS. | |
404 LogSessionAndReadBack(5, 2, 0, 0, 0, 0, 321); | |
405 | |
406 // Enable AbsSendTime and TransportSequenceNumbers. | |
407 uint32_t extensions = 0; | |
408 for (uint32_t i = 0; i < kNumExtensions; i++) { | |
409 if (kExtensionTypes[i] == RTPExtensionType::kRtpExtensionAbsoluteSendTime || | |
410 kExtensionTypes[i] == | |
411 RTPExtensionType::kRtpExtensionTransportSequenceNumber) { | |
412 extensions |= 1u << i; | |
413 } | |
414 } | |
415 LogSessionAndReadBack(8, 2, 0, 0, extensions, 0, 3141592653u); | |
416 | |
417 extensions = (1u << kNumExtensions) - 1; // Enable all header extensions. | |
418 LogSessionAndReadBack(9, 2, 3, 2, extensions, 2, 2718281828u); | |
419 | |
420 // Try all combinations of header extensions and up to 2 CSRCS. | |
421 for (extensions = 0; extensions < (1u << kNumExtensions); extensions++) { | |
422 for (uint32_t csrcs_count = 0; csrcs_count < 3; csrcs_count++) { | |
423 LogSessionAndReadBack(5 + extensions, // Number of RTP packets. | |
424 2 + csrcs_count, // Number of RTCP packets. | |
425 3 + csrcs_count, // Number of playout events. | |
426 1 + csrcs_count, // Number of BWE loss events. | |
427 extensions, // Bit vector choosing extensions. | |
428 csrcs_count, // Number of contributing sources. | |
429 extensions * 3 + csrcs_count + 1); // Random seed. | |
430 } | |
431 } | |
432 } | |
433 | 711 |
434 TEST(RtcEventLogTest, LogEventAndReadBack) { | 712 TEST(RtcEventLogTest, LogEventAndReadBack) { |
435 Random prng(987654321); | 713 Random prng(987654321); |
436 | 714 |
437 // Create one RTP and one RTCP packet containing random data. | 715 // Create one RTP and one RTCP packet containing random data. |
438 size_t packet_size = prng.Rand(1000, 1100); | 716 size_t packet_size = prng.Rand(1000, 1100); |
439 RtpPacketToSend rtp_packet = | 717 RtpPacketReceived rtp_packet = |
440 GenerateRtpPacket(nullptr, 0, packet_size, &prng); | 718 GenerateIncomingRtpPacket(nullptr, 0, packet_size, &prng); |
441 rtc::Buffer rtcp_packet = GenerateRtcpPacket(&prng); | 719 rtc::Buffer rtcp_packet = GenerateRtcpPacket(&prng); |
442 | 720 |
443 // Find the name of the current test, in order to use it as a temporary | 721 // Find the name of the current test, in order to use it as a temporary |
444 // filename. | 722 // filename. |
445 auto test_info = ::testing::UnitTest::GetInstance()->current_test_info(); | 723 auto test_info = ::testing::UnitTest::GetInstance()->current_test_info(); |
446 const std::string temp_filename = | 724 const std::string temp_filename = |
447 test::OutputPath() + test_info->test_case_name() + test_info->name(); | 725 test::OutputPath() + test_info->test_case_name() + test_info->name(); |
448 | 726 |
449 // Add RTP, start logging, add RTCP and then stop logging | 727 // Add RTP, start logging, add RTCP and then stop logging |
450 rtc::ScopedFakeClock fake_clock; | 728 rtc::ScopedFakeClock fake_clock; |
451 fake_clock.SetTimeMicros(prng.Rand<uint32_t>()); | 729 fake_clock.SetTimeMicros(prng.Rand<uint32_t>()); |
452 std::unique_ptr<RtcEventLog> log_dumper(RtcEventLog::Create()); | 730 std::unique_ptr<RtcEventLog> log_dumper(RtcEventLog::Create()); |
453 | 731 |
454 log_dumper->LogRtpHeader(kIncomingPacket, rtp_packet.data(), | 732 log_dumper->LogIncomingRtpHeader(rtp_packet); |
455 rtp_packet.size()); | |
456 fake_clock.AdvanceTimeMicros(prng.Rand(1, 1000)); | 733 fake_clock.AdvanceTimeMicros(prng.Rand(1, 1000)); |
457 | 734 |
458 log_dumper->StartLogging(temp_filename, 10000000); | 735 log_dumper->StartLogging(temp_filename, 10000000); |
459 fake_clock.AdvanceTimeMicros(prng.Rand(1, 1000)); | 736 fake_clock.AdvanceTimeMicros(prng.Rand(1, 1000)); |
460 | 737 |
461 log_dumper->LogRtcpPacket(kOutgoingPacket, rtcp_packet.data(), | 738 log_dumper->LogOutgoingRtcpPacket(rtcp_packet); |
462 rtcp_packet.size()); | |
463 fake_clock.AdvanceTimeMicros(prng.Rand(1, 1000)); | 739 fake_clock.AdvanceTimeMicros(prng.Rand(1, 1000)); |
464 | 740 |
465 log_dumper->StopLogging(); | 741 log_dumper->StopLogging(); |
466 | 742 |
467 // Read the generated file from disk. | 743 // Read the generated file from disk. |
468 ParsedRtcEventLog parsed_log; | 744 ParsedRtcEventLog parsed_log; |
469 ASSERT_TRUE(parsed_log.ParseFile(temp_filename)); | 745 ASSERT_TRUE(parsed_log.ParseFile(temp_filename)); |
470 | 746 |
471 // Verify that what we read back from the event log is the same as | 747 // Verify that what we read back from the event log is the same as |
472 // what we wrote down. | 748 // what we wrote down. |
473 EXPECT_EQ(4u, parsed_log.GetNumberOfEvents()); | 749 EXPECT_EQ(4u, parsed_log.GetNumberOfEvents()); |
474 | 750 |
475 RtcEventLogTestHelper::VerifyLogStartEvent(parsed_log, 0); | 751 RtcEventLogTestHelper::VerifyLogStartEvent(parsed_log, 0); |
476 | 752 |
477 RtcEventLogTestHelper::VerifyRtpEvent( | 753 RtcEventLogTestHelper::VerifyIncomingRtpEvent(parsed_log, 1, rtp_packet); |
478 parsed_log, 1, kIncomingPacket, rtp_packet.data(), | |
479 rtp_packet.headers_size(), rtp_packet.size()); | |
480 | 754 |
481 RtcEventLogTestHelper::VerifyRtcpEvent( | 755 RtcEventLogTestHelper::VerifyRtcpEvent( |
482 parsed_log, 2, kOutgoingPacket, rtcp_packet.data(), rtcp_packet.size()); | 756 parsed_log, 2, kOutgoingPacket, rtcp_packet.data(), rtcp_packet.size()); |
483 | 757 |
484 RtcEventLogTestHelper::VerifyLogEndEvent(parsed_log, 3); | 758 RtcEventLogTestHelper::VerifyLogEndEvent(parsed_log, 3); |
485 | 759 |
486 // Clean up temporary file - can be pretty slow. | 760 // Clean up temporary file - can be pretty slow. |
487 remove(temp_filename.c_str()); | 761 remove(temp_filename.c_str()); |
488 } | 762 } |
489 | 763 |
(...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
714 RtcEventLogTestHelper::VerifyLogEndEvent(parsed_log, 4); | 988 RtcEventLogTestHelper::VerifyLogEndEvent(parsed_log, 4); |
715 | 989 |
716 // Clean up temporary file - can be pretty slow. | 990 // Clean up temporary file - can be pretty slow. |
717 remove(temp_filename.c_str()); | 991 remove(temp_filename.c_str()); |
718 } | 992 } |
719 | 993 |
720 class ConfigReadWriteTest { | 994 class ConfigReadWriteTest { |
721 public: | 995 public: |
722 ConfigReadWriteTest() : prng(987654321) {} | 996 ConfigReadWriteTest() : prng(987654321) {} |
723 virtual ~ConfigReadWriteTest() {} | 997 virtual ~ConfigReadWriteTest() {} |
724 virtual void GenerateConfig(uint32_t extensions_bitvector) = 0; | 998 virtual void GenerateConfig(const RtpHeaderExtensionMap& extensions) = 0; |
725 virtual void VerifyConfig(const ParsedRtcEventLog& parsed_log, | 999 virtual void VerifyConfig(const ParsedRtcEventLog& parsed_log, |
726 size_t index) = 0; | 1000 size_t index) = 0; |
727 virtual void LogConfig(RtcEventLog* event_log) = 0; | 1001 virtual void LogConfig(RtcEventLog* event_log) = 0; |
728 | 1002 |
729 void DoTest() { | 1003 void DoTest() { |
730 // Find the name of the current test, in order to use it as a temporary | 1004 // Find the name of the current test, in order to use it as a temporary |
731 // filename. | 1005 // filename. |
732 auto test_info = ::testing::UnitTest::GetInstance()->current_test_info(); | 1006 auto test_info = ::testing::UnitTest::GetInstance()->current_test_info(); |
733 const std::string temp_filename = | 1007 const std::string temp_filename = |
734 test::OutputPath() + test_info->test_case_name() + test_info->name(); | 1008 test::OutputPath() + test_info->test_case_name() + test_info->name(); |
735 | 1009 |
736 // Use all extensions. | 1010 // Use all extensions. |
737 uint32_t extensions_bitvector = (1u << kNumExtensions) - 1; | 1011 RtpHeaderExtensionMap extensions; |
738 GenerateConfig(extensions_bitvector); | 1012 for (uint32_t i = 0; i < kNumExtensions; i++) { |
| 1013 extensions.Register(kExtensionTypes[i], kExtensionIds[i]); |
| 1014 } |
| 1015 GenerateConfig(extensions); |
739 | 1016 |
740 // Log a single config event and stop logging. | 1017 // Log a single config event and stop logging. |
741 rtc::ScopedFakeClock fake_clock; | 1018 rtc::ScopedFakeClock fake_clock; |
742 fake_clock.SetTimeMicros(prng.Rand<uint32_t>()); | 1019 fake_clock.SetTimeMicros(prng.Rand<uint32_t>()); |
743 std::unique_ptr<RtcEventLog> log_dumper(RtcEventLog::Create()); | 1020 std::unique_ptr<RtcEventLog> log_dumper(RtcEventLog::Create()); |
744 | 1021 |
745 log_dumper->StartLogging(temp_filename, 10000000); | 1022 log_dumper->StartLogging(temp_filename, 10000000); |
746 LogConfig(log_dumper.get()); | 1023 LogConfig(log_dumper.get()); |
747 log_dumper->StopLogging(); | 1024 log_dumper->StopLogging(); |
748 | 1025 |
(...skipping 12 matching lines...) Expand all Loading... |
761 RtcEventLogTestHelper::VerifyLogEndEvent(parsed_log, 2); | 1038 RtcEventLogTestHelper::VerifyLogEndEvent(parsed_log, 2); |
762 | 1039 |
763 // Clean up temporary file - can be pretty slow. | 1040 // Clean up temporary file - can be pretty slow. |
764 remove(temp_filename.c_str()); | 1041 remove(temp_filename.c_str()); |
765 } | 1042 } |
766 Random prng; | 1043 Random prng; |
767 }; | 1044 }; |
768 | 1045 |
769 class AudioReceiveConfigReadWriteTest : public ConfigReadWriteTest { | 1046 class AudioReceiveConfigReadWriteTest : public ConfigReadWriteTest { |
770 public: | 1047 public: |
771 void GenerateConfig(uint32_t extensions_bitvector) override { | 1048 void GenerateConfig(const RtpHeaderExtensionMap& extensions) override { |
772 GenerateAudioReceiveConfig(extensions_bitvector, &config, &prng); | 1049 GenerateAudioReceiveConfig(extensions, &config, &prng); |
773 } | 1050 } |
774 void LogConfig(RtcEventLog* event_log) override { | 1051 void LogConfig(RtcEventLog* event_log) override { |
775 event_log->LogAudioReceiveStreamConfig(config); | 1052 event_log->LogAudioReceiveStreamConfig(config); |
776 } | 1053 } |
777 void VerifyConfig(const ParsedRtcEventLog& parsed_log, | 1054 void VerifyConfig(const ParsedRtcEventLog& parsed_log, |
778 size_t index) override { | 1055 size_t index) override { |
779 RtcEventLogTestHelper::VerifyAudioReceiveStreamConfig(parsed_log, index, | 1056 RtcEventLogTestHelper::VerifyAudioReceiveStreamConfig(parsed_log, index, |
780 config); | 1057 config); |
781 } | 1058 } |
782 rtclog::StreamConfig config; | 1059 rtclog::StreamConfig config; |
783 }; | 1060 }; |
784 | 1061 |
785 class AudioSendConfigReadWriteTest : public ConfigReadWriteTest { | 1062 class AudioSendConfigReadWriteTest : public ConfigReadWriteTest { |
786 public: | 1063 public: |
787 AudioSendConfigReadWriteTest() {} | 1064 AudioSendConfigReadWriteTest() {} |
788 void GenerateConfig(uint32_t extensions_bitvector) override { | 1065 void GenerateConfig(const RtpHeaderExtensionMap& extensions) override { |
789 GenerateAudioSendConfig(extensions_bitvector, &config, &prng); | 1066 GenerateAudioSendConfig(extensions, &config, &prng); |
790 } | 1067 } |
791 void LogConfig(RtcEventLog* event_log) override { | 1068 void LogConfig(RtcEventLog* event_log) override { |
792 event_log->LogAudioSendStreamConfig(config); | 1069 event_log->LogAudioSendStreamConfig(config); |
793 } | 1070 } |
794 void VerifyConfig(const ParsedRtcEventLog& parsed_log, | 1071 void VerifyConfig(const ParsedRtcEventLog& parsed_log, |
795 size_t index) override { | 1072 size_t index) override { |
796 RtcEventLogTestHelper::VerifyAudioSendStreamConfig(parsed_log, index, | 1073 RtcEventLogTestHelper::VerifyAudioSendStreamConfig(parsed_log, index, |
797 config); | 1074 config); |
798 } | 1075 } |
799 rtclog::StreamConfig config; | 1076 rtclog::StreamConfig config; |
800 }; | 1077 }; |
801 | 1078 |
802 class VideoReceiveConfigReadWriteTest : public ConfigReadWriteTest { | 1079 class VideoReceiveConfigReadWriteTest : public ConfigReadWriteTest { |
803 public: | 1080 public: |
804 VideoReceiveConfigReadWriteTest() {} | 1081 VideoReceiveConfigReadWriteTest() {} |
805 void GenerateConfig(uint32_t extensions_bitvector) override { | 1082 void GenerateConfig(const RtpHeaderExtensionMap& extensions) override { |
806 GenerateVideoReceiveConfig(extensions_bitvector, &config, &prng); | 1083 GenerateVideoReceiveConfig(extensions, &config, &prng); |
807 } | 1084 } |
808 void LogConfig(RtcEventLog* event_log) override { | 1085 void LogConfig(RtcEventLog* event_log) override { |
809 event_log->LogVideoReceiveStreamConfig(config); | 1086 event_log->LogVideoReceiveStreamConfig(config); |
810 } | 1087 } |
811 void VerifyConfig(const ParsedRtcEventLog& parsed_log, | 1088 void VerifyConfig(const ParsedRtcEventLog& parsed_log, |
812 size_t index) override { | 1089 size_t index) override { |
813 RtcEventLogTestHelper::VerifyVideoReceiveStreamConfig(parsed_log, index, | 1090 RtcEventLogTestHelper::VerifyVideoReceiveStreamConfig(parsed_log, index, |
814 config); | 1091 config); |
815 } | 1092 } |
816 rtclog::StreamConfig config; | 1093 rtclog::StreamConfig config; |
817 }; | 1094 }; |
818 | 1095 |
819 class VideoSendConfigReadWriteTest : public ConfigReadWriteTest { | 1096 class VideoSendConfigReadWriteTest : public ConfigReadWriteTest { |
820 public: | 1097 public: |
821 VideoSendConfigReadWriteTest() {} | 1098 VideoSendConfigReadWriteTest() {} |
822 void GenerateConfig(uint32_t extensions_bitvector) override { | 1099 void GenerateConfig(const RtpHeaderExtensionMap& extensions) override { |
823 GenerateVideoSendConfig(extensions_bitvector, &config, &prng); | 1100 GenerateVideoSendConfig(extensions, &config, &prng); |
824 } | 1101 } |
825 void LogConfig(RtcEventLog* event_log) override { | 1102 void LogConfig(RtcEventLog* event_log) override { |
826 event_log->LogVideoSendStreamConfig(config); | 1103 event_log->LogVideoSendStreamConfig(config); |
827 } | 1104 } |
828 void VerifyConfig(const ParsedRtcEventLog& parsed_log, | 1105 void VerifyConfig(const ParsedRtcEventLog& parsed_log, |
829 size_t index) override { | 1106 size_t index) override { |
830 RtcEventLogTestHelper::VerifyVideoSendStreamConfig(parsed_log, index, | 1107 RtcEventLogTestHelper::VerifyVideoSendStreamConfig(parsed_log, index, |
831 config); | 1108 config); |
832 } | 1109 } |
833 rtclog::StreamConfig config; | 1110 rtclog::StreamConfig config; |
834 }; | 1111 }; |
835 | 1112 |
836 class AudioNetworkAdaptationReadWriteTest : public ConfigReadWriteTest { | 1113 class AudioNetworkAdaptationReadWriteTest : public ConfigReadWriteTest { |
837 public: | 1114 public: |
838 void GenerateConfig(uint32_t extensions_bitvector) override { | 1115 void GenerateConfig(const RtpHeaderExtensionMap& extensions) override { |
839 GenerateAudioNetworkAdaptation(extensions_bitvector, &config, &prng); | 1116 GenerateAudioNetworkAdaptation(extensions, &config, &prng); |
840 } | 1117 } |
841 void LogConfig(RtcEventLog* event_log) override { | 1118 void LogConfig(RtcEventLog* event_log) override { |
842 event_log->LogAudioNetworkAdaptation(config); | 1119 event_log->LogAudioNetworkAdaptation(config); |
843 } | 1120 } |
844 void VerifyConfig(const ParsedRtcEventLog& parsed_log, | 1121 void VerifyConfig(const ParsedRtcEventLog& parsed_log, |
845 size_t index) override { | 1122 size_t index) override { |
846 RtcEventLogTestHelper::VerifyAudioNetworkAdaptation(parsed_log, index, | 1123 RtcEventLogTestHelper::VerifyAudioNetworkAdaptation(parsed_log, index, |
847 config); | 1124 config); |
848 } | 1125 } |
849 AudioEncoderRuntimeConfig config; | 1126 AudioEncoderRuntimeConfig config; |
(...skipping 18 matching lines...) Expand all Loading... |
868 VideoSendConfigReadWriteTest test; | 1145 VideoSendConfigReadWriteTest test; |
869 test.DoTest(); | 1146 test.DoTest(); |
870 } | 1147 } |
871 | 1148 |
872 TEST(RtcEventLogTest, LogAudioNetworkAdaptation) { | 1149 TEST(RtcEventLogTest, LogAudioNetworkAdaptation) { |
873 AudioNetworkAdaptationReadWriteTest test; | 1150 AudioNetworkAdaptationReadWriteTest test; |
874 test.DoTest(); | 1151 test.DoTest(); |
875 } | 1152 } |
876 | 1153 |
877 } // namespace webrtc | 1154 } // namespace webrtc |
OLD | NEW |