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