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