Support GenericPacketReceived/Sent/AckReceived event logs.

This change does not include receive_timestamps for ACKs, because there is 1 problem.
That problem will be resolved in a separate change.

I am getting receive_timestamp errors that have to do with delta compression with optional fields.
Two failure modes that I noticed:
1) the base event does not have the timestamp: it crashes with length validation
# Check failed: base <= MaxUnsignedValueOfBitWidth(params_.value_width_bits()) (1820716 vs. 131071)
2) all events are null, it crashes with assert that X events were expected, but no events were deserialized.


Bug: webrtc:9719
Change-Id: I5d1bbb95dfd15ca7321667aad5e4d89c085e9c06
Reviewed-on: https://webrtc-review.googlesource.com/c/122360
Commit-Queue: Peter Slatala <psla@webrtc.org>
Reviewed-by: Björn Terelius <terelius@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#26668}
This commit is contained in:
Piotr (Peter) Slatala
2019-02-13 07:49:30 -08:00
committed by Commit Bot
parent 975a899ad0
commit 5e2aad1c95
17 changed files with 838 additions and 21 deletions

View File

@ -26,6 +26,9 @@
#include "logging/rtc_event_log/events/rtc_event_bwe_update_loss_based.h"
#include "logging/rtc_event_log/events/rtc_event_dtls_transport_state.h"
#include "logging/rtc_event_log/events/rtc_event_dtls_writable_state.h"
#include "logging/rtc_event_log/events/rtc_event_generic_ack_received.h"
#include "logging/rtc_event_log/events/rtc_event_generic_packet_received.h"
#include "logging/rtc_event_log/events/rtc_event_generic_packet_sent.h"
#include "logging/rtc_event_log/events/rtc_event_probe_cluster_created.h"
#include "logging/rtc_event_log/events/rtc_event_probe_result_failure.h"
#include "logging/rtc_event_log/events/rtc_event_probe_result_success.h"
@ -73,13 +76,18 @@ struct EventCounts {
size_t outgoing_rtp_packets = 0;
size_t incoming_rtcp_packets = 0;
size_t outgoing_rtcp_packets = 0;
size_t generic_packets_sent = 0;
size_t generic_packets_received = 0;
size_t generic_acks_received = 0;
size_t total_nonconfig_events() const {
return alr_states + audio_playouts + ana_configs + bwe_loss_events +
bwe_delay_events + dtls_transport_states + dtls_writable_states +
probe_creations + probe_successes + probe_failures + ice_configs +
ice_events + incoming_rtp_packets + outgoing_rtp_packets +
incoming_rtcp_packets + outgoing_rtcp_packets;
incoming_rtcp_packets + outgoing_rtcp_packets +
generic_packets_sent + generic_packets_received +
generic_acks_received;
}
size_t total_config_events() const {
@ -120,6 +128,10 @@ class RtcEventLogSession
void WriteLog(EventCounts count, size_t num_events_before_log_start);
void ReadAndVerifyLog();
bool IsNewFormat() {
return encoding_type_ == RtcEventLog::EncodingType::NewFormat;
}
private:
void WriteAudioRecvConfigs(size_t audio_recv_streams, RtcEventLog* event_log);
void WriteAudioSendConfigs(size_t audio_send_streams, RtcEventLog* event_log);
@ -163,6 +175,11 @@ class RtcEventLogSession
outgoing_rtp_map_; // Groups outgoing RTP by SSRC.
std::vector<std::unique_ptr<RtcEventRtcpPacketIncoming>> incoming_rtcp_list_;
std::vector<std::unique_ptr<RtcEventRtcpPacketOutgoing>> outgoing_rtcp_list_;
std::vector<std::unique_ptr<RtcEventGenericPacketSent>> generic_packets_sent_;
std::vector<std::unique_ptr<RtcEventGenericPacketReceived>>
generic_packets_received_;
std::vector<std::unique_ptr<RtcEventGenericAckReceived>>
generic_acks_received_;
int64_t start_time_us_;
int64_t utc_start_time_us_;
@ -471,6 +488,33 @@ void RtcEventLogSession::WriteLog(EventCounts count,
}
selection -= count.outgoing_rtcp_packets;
if (selection < count.generic_packets_sent) {
auto event = gen_.NewGenericPacketSent();
generic_packets_sent_.push_back(event->Copy());
event_log->Log(std::move(event));
count.generic_packets_sent--;
continue;
}
selection -= count.generic_packets_sent;
if (selection < count.generic_packets_received) {
auto event = gen_.NewGenericPacketReceived();
generic_packets_received_.push_back(event->Copy());
event_log->Log(std::move(event));
count.generic_packets_received--;
continue;
}
selection -= count.generic_packets_received;
if (selection < count.generic_acks_received) {
auto event = gen_.NewGenericAckReceived();
generic_acks_received_.push_back(event->Copy());
event_log->Log(std::move(event));
count.generic_acks_received--;
continue;
}
selection -= count.generic_acks_received;
RTC_NOTREACHED();
}
@ -648,6 +692,28 @@ void RtcEventLogSession::ReadAndVerifyLog() {
parsed_video_send_configs[i]);
}
auto& parsed_generic_packets_received = parsed_log.generic_packets_received();
ASSERT_EQ(parsed_generic_packets_received.size(),
generic_packets_received_.size());
for (size_t i = 0; i < parsed_generic_packets_received.size(); i++) {
verifier_.VerifyLoggedGenericPacketReceived(
*generic_packets_received_[i], parsed_generic_packets_received[i]);
}
auto& parsed_generic_packets_sent = parsed_log.generic_packets_sent();
ASSERT_EQ(parsed_generic_packets_sent.size(), generic_packets_sent_.size());
for (size_t i = 0; i < parsed_generic_packets_sent.size(); i++) {
verifier_.VerifyLoggedGenericPacketSent(*generic_packets_sent_[i],
parsed_generic_packets_sent[i]);
}
auto& parsed_generic_acks_received = parsed_log.generic_acks_received();
ASSERT_EQ(parsed_generic_acks_received.size(), generic_acks_received_.size());
for (size_t i = 0; i < parsed_generic_acks_received.size(); i++) {
verifier_.VerifyLoggedGenericAckReceived(*generic_acks_received_[i],
parsed_generic_acks_received[i]);
}
EXPECT_EQ(first_timestamp_ms_, parsed_log.first_timestamp() / 1000);
EXPECT_EQ(last_timestamp_ms_, parsed_log.last_timestamp() / 1000);
@ -679,6 +745,11 @@ TEST_P(RtcEventLogSession, StartLoggingFromBeginning) {
count.outgoing_rtp_packets = 100;
count.incoming_rtcp_packets = 20;
count.outgoing_rtcp_packets = 20;
if (IsNewFormat()) {
count.generic_packets_sent = 100;
count.generic_packets_received = 100;
count.generic_acks_received = 20;
}
WriteLog(count, 0);
ReadAndVerifyLog();
@ -706,6 +777,11 @@ TEST_P(RtcEventLogSession, StartLoggingInTheMiddle) {
count.outgoing_rtp_packets = 500;
count.incoming_rtcp_packets = 50;
count.outgoing_rtcp_packets = 50;
if (IsNewFormat()) {
count.generic_packets_sent = 500;
count.generic_packets_received = 500;
count.generic_acks_received = 50;
}
WriteLog(count, 500);
ReadAndVerifyLog();