From 8fbc76542118d4a05357b87b8ed8ee8dbf3874df Mon Sep 17 00:00:00 2001 From: terelius Date: Wed, 31 May 2017 02:03:16 -0700 Subject: [PATCH] Ensure the RtcEventLog parser is backwards compatible The old video send stream configs could contain multiple SSRCs and RTX SSRCs (in case of simulcast). To ensure that the RtcEventLog parser is backwards compatible, we have to return one config for every SSRC. Also update the parsing functions for the other config types to return the config instead of passing in an output parameter. BUG=webrtc:7731 Review-Url: https://codereview.webrtc.org/2912113002 Cr-Commit-Position: refs/heads/master@{#18343} --- .../rtc_event_log/rtc_event_log2text.cc | 21 +-- .../rtc_event_log/rtc_event_log_parser.cc | 163 +++++++++--------- .../rtc_event_log/rtc_event_log_parser.h | 31 ++-- .../rtc_event_log_unittest_helper.cc | 17 +- webrtc/tools/event_log_visualizer/analyzer.cc | 32 ++-- 5 files changed, 131 insertions(+), 133 deletions(-) diff --git a/webrtc/logging/rtc_event_log/rtc_event_log2text.cc b/webrtc/logging/rtc_event_log/rtc_event_log2text.cc index ec66810722..26bddf7d82 100644 --- a/webrtc/logging/rtc_event_log/rtc_event_log2text.cc +++ b/webrtc/logging/rtc_event_log/rtc_event_log2text.cc @@ -352,8 +352,8 @@ int main(int argc, char* argv[]) { if (!FLAGS_noconfig && !FLAGS_novideo && !FLAGS_noincoming && parsed_stream.GetEventType(i) == webrtc::ParsedRtcEventLog::VIDEO_RECEIVER_CONFIG_EVENT) { - webrtc::rtclog::StreamConfig config; - parsed_stream.GetVideoReceiveConfig(i, &config); + webrtc::rtclog::StreamConfig config = + parsed_stream.GetVideoReceiveConfig(i); std::cout << parsed_stream.GetTimestamp(i) << "\tVIDEO_RECV_CONFIG" << "\tssrc=" << config.remote_ssrc << "\tfeedback_ssrc=" << config.local_ssrc << std::endl; @@ -361,18 +361,20 @@ int main(int argc, char* argv[]) { if (!FLAGS_noconfig && !FLAGS_novideo && !FLAGS_nooutgoing && parsed_stream.GetEventType(i) == webrtc::ParsedRtcEventLog::VIDEO_SENDER_CONFIG_EVENT) { - webrtc::rtclog::StreamConfig config; - parsed_stream.GetVideoSendConfig(i, &config); + std::vector configs = + parsed_stream.GetVideoSendConfig(i); + for (size_t j = 0; j < configs.size(); j++) { std::cout << parsed_stream.GetTimestamp(i) << "\tVIDEO_SEND_CONFIG"; - std::cout << "\tssrcs=" << config.local_ssrc; - std::cout << "\trtx_ssrcs=" << config.rtx_ssrc; + std::cout << "\tssrcs=" << configs[j].local_ssrc; + std::cout << "\trtx_ssrcs=" << configs[j].rtx_ssrc; std::cout << std::endl; + } } if (!FLAGS_noconfig && !FLAGS_noaudio && !FLAGS_noincoming && parsed_stream.GetEventType(i) == webrtc::ParsedRtcEventLog::AUDIO_RECEIVER_CONFIG_EVENT) { - webrtc::rtclog::StreamConfig config; - parsed_stream.GetAudioReceiveConfig(i, &config); + webrtc::rtclog::StreamConfig config = + parsed_stream.GetAudioReceiveConfig(i); std::cout << parsed_stream.GetTimestamp(i) << "\tAUDIO_RECV_CONFIG" << "\tssrc=" << config.remote_ssrc << "\tfeedback_ssrc=" << config.local_ssrc << std::endl; @@ -380,8 +382,7 @@ int main(int argc, char* argv[]) { if (!FLAGS_noconfig && !FLAGS_noaudio && !FLAGS_nooutgoing && parsed_stream.GetEventType(i) == webrtc::ParsedRtcEventLog::AUDIO_SENDER_CONFIG_EVENT) { - webrtc::rtclog::StreamConfig config; - parsed_stream.GetAudioSendConfig(i, &config); + webrtc::rtclog::StreamConfig config = parsed_stream.GetAudioSendConfig(i); std::cout << parsed_stream.GetTimestamp(i) << "\tAUDIO_SEND_CONFIG" << "\tssrc=" << config.local_ssrc << std::endl; } diff --git a/webrtc/logging/rtc_event_log/rtc_event_log_parser.cc b/webrtc/logging/rtc_event_log/rtc_event_log_parser.cc index f01895af70..d2cdcd5b5d 100644 --- a/webrtc/logging/rtc_event_log/rtc_event_log_parser.cc +++ b/webrtc/logging/rtc_event_log/rtc_event_log_parser.cc @@ -202,8 +202,7 @@ bool ParsedRtcEventLog::ParseStream(std::istream& stream) { EventType type = GetRuntimeEventType(event.type()); switch (type) { case VIDEO_RECEIVER_CONFIG_EVENT: { - rtclog::StreamConfig config; - GetVideoReceiveConfig(event, &config); + rtclog::StreamConfig config = GetVideoReceiveConfig(event); streams_.emplace_back(config.remote_ssrc, MediaType::VIDEO, kIncomingPacket); streams_.emplace_back(config.local_ssrc, MediaType::VIDEO, @@ -211,18 +210,18 @@ bool ParsedRtcEventLog::ParseStream(std::istream& stream) { break; } case VIDEO_SENDER_CONFIG_EVENT: { - rtclog::StreamConfig config; - GetVideoSendConfig(event, &config); - streams_.emplace_back(config.local_ssrc, MediaType::VIDEO, - kOutgoingPacket); + std::vector configs = GetVideoSendConfig(event); + for (size_t i = 0; i < configs.size(); i++) { + streams_.emplace_back(configs[i].local_ssrc, MediaType::VIDEO, + kOutgoingPacket); - streams_.emplace_back(config.rtx_ssrc, MediaType::VIDEO, - kOutgoingPacket); + streams_.emplace_back(configs[i].rtx_ssrc, MediaType::VIDEO, + kOutgoingPacket); + } break; } case AUDIO_RECEIVER_CONFIG_EVENT: { - rtclog::StreamConfig config; - GetAudioReceiveConfig(event, &config); + rtclog::StreamConfig config = GetAudioReceiveConfig(event); streams_.emplace_back(config.remote_ssrc, MediaType::AUDIO, kIncomingPacket); streams_.emplace_back(config.local_ssrc, MediaType::AUDIO, @@ -230,8 +229,7 @@ bool ParsedRtcEventLog::ParseStream(std::istream& stream) { break; } case AUDIO_SENDER_CONFIG_EVENT: { - rtclog::StreamConfig config; - GetAudioSendConfig(event, &config); + rtclog::StreamConfig config = GetAudioSendConfig(event); streams_.emplace_back(config.local_ssrc, MediaType::AUDIO, kOutgoingPacket); break; @@ -330,17 +328,15 @@ void ParsedRtcEventLog::GetRtcpPacket(size_t index, } } -void ParsedRtcEventLog::GetVideoReceiveConfig( - size_t index, - rtclog::StreamConfig* config) const { +rtclog::StreamConfig ParsedRtcEventLog::GetVideoReceiveConfig( + size_t index) const { RTC_CHECK_LT(index, GetNumberOfEvents()); - GetVideoReceiveConfig(events_[index], config); + return GetVideoReceiveConfig(events_[index]); } -void ParsedRtcEventLog::GetVideoReceiveConfig( - const rtclog::Event& event, - rtclog::StreamConfig* config) const { - RTC_CHECK(config != nullptr); +rtclog::StreamConfig ParsedRtcEventLog::GetVideoReceiveConfig( + const rtclog::Event& event) const { + rtclog::StreamConfig config; RTC_CHECK(event.has_type()); RTC_CHECK_EQ(event.type(), rtclog::Event::VIDEO_RECEIVER_CONFIG_EVENT); RTC_CHECK(event.has_video_receiver_config()); @@ -348,15 +344,15 @@ void ParsedRtcEventLog::GetVideoReceiveConfig( event.video_receiver_config(); // Get SSRCs. RTC_CHECK(receiver_config.has_remote_ssrc()); - config->remote_ssrc = receiver_config.remote_ssrc(); + config.remote_ssrc = receiver_config.remote_ssrc(); RTC_CHECK(receiver_config.has_local_ssrc()); - config->local_ssrc = receiver_config.local_ssrc(); - config->rtx_ssrc = 0; + config.local_ssrc = receiver_config.local_ssrc(); + config.rtx_ssrc = 0; // Get RTCP settings. RTC_CHECK(receiver_config.has_rtcp_mode()); - config->rtcp_mode = GetRuntimeRtcpMode(receiver_config.rtcp_mode()); + config.rtcp_mode = GetRuntimeRtcpMode(receiver_config.rtcp_mode()); RTC_CHECK(receiver_config.has_remb()); - config->remb = receiver_config.remb(); + config.remb = receiver_config.remb(); // Get RTX map. std::map rtx_map; @@ -370,10 +366,10 @@ void ParsedRtcEventLog::GetVideoReceiveConfig( } // Get header extensions. - GetHeaderExtensions(&config->rtp_extensions, + GetHeaderExtensions(&config.rtp_extensions, receiver_config.header_extensions()); // Get decoders. - config->codecs.clear(); + config.codecs.clear(); for (int i = 0; i < receiver_config.decoders_size(); i++) { RTC_CHECK(receiver_config.decoders(i).has_name()); RTC_CHECK(receiver_config.decoders(i).has_payload_type()); @@ -381,74 +377,76 @@ void ParsedRtcEventLog::GetVideoReceiveConfig( auto rtx_it = rtx_map.find(receiver_config.decoders(i).payload_type()); if (rtx_it != rtx_map.end()) { rtx_payload_type = rtx_it->second.rtx_payload_type(); - if (config->rtx_ssrc != 0 && - config->rtx_ssrc != rtx_it->second.rtx_ssrc()) { + if (config.rtx_ssrc != 0 && + config.rtx_ssrc != rtx_it->second.rtx_ssrc()) { LOG(LS_WARNING) << "RtcEventLog protobuf contained different SSRCs for " "different received RTX payload types. Will only use " "rtx_ssrc = " - << config->rtx_ssrc << "."; + << config.rtx_ssrc << "."; } else { - config->rtx_ssrc = rtx_it->second.rtx_ssrc(); + config.rtx_ssrc = rtx_it->second.rtx_ssrc(); } } - config->codecs.emplace_back(receiver_config.decoders(i).name(), - receiver_config.decoders(i).payload_type(), - rtx_payload_type); + config.codecs.emplace_back(receiver_config.decoders(i).name(), + receiver_config.decoders(i).payload_type(), + rtx_payload_type); } + return config; } -void ParsedRtcEventLog::GetVideoSendConfig(size_t index, - rtclog::StreamConfig* config) const { +std::vector ParsedRtcEventLog::GetVideoSendConfig( + size_t index) const { RTC_CHECK_LT(index, GetNumberOfEvents()); - GetVideoSendConfig(events_[index], config); + return GetVideoSendConfig(events_[index]); } -void ParsedRtcEventLog::GetVideoSendConfig(const rtclog::Event& event, - rtclog::StreamConfig* config) const { - RTC_CHECK(config != nullptr); + +std::vector ParsedRtcEventLog::GetVideoSendConfig( + const rtclog::Event& event) const { + std::vector configs; RTC_CHECK(event.has_type()); RTC_CHECK_EQ(event.type(), rtclog::Event::VIDEO_SENDER_CONFIG_EVENT); RTC_CHECK(event.has_video_sender_config()); const rtclog::VideoSendConfig& sender_config = event.video_sender_config(); - // Get SSRCs. - if (sender_config.ssrcs_size() > 0) { - config->local_ssrc = sender_config.ssrcs(0); - if (sender_config.ssrcs().size() > 1) { - LOG(WARNING) << "VideoSendConfig contains multiple ssrcs."; - } + if (sender_config.rtx_ssrcs_size() > 0 && + sender_config.ssrcs_size() != sender_config.rtx_ssrcs_size()) { + LOG(WARNING) << "VideoSendConfig is configured for RTX but the number of " + "SSRCs doesn't match the number of RTX SSRCs."; } - if (sender_config.rtx_ssrcs_size() > 0) { - RTC_CHECK(sender_config.has_rtx_payload_type()); - config->rtx_ssrc = sender_config.rtx_ssrcs(0); - if (sender_config.rtx_ssrcs_size() > 1) { - LOG(WARNING) << "VideoSendConfig contains multiple rtx ssrcs."; + configs.resize(sender_config.ssrcs_size()); + for (int i = 0; i < sender_config.ssrcs_size(); i++) { + // Get SSRCs. + configs[i].local_ssrc = sender_config.ssrcs(i); + if (sender_config.rtx_ssrcs_size() > 0 && + i < sender_config.rtx_ssrcs_size()) { + RTC_CHECK(sender_config.has_rtx_payload_type()); + configs[i].rtx_ssrc = sender_config.rtx_ssrcs(i); } - } - // Get header extensions. - GetHeaderExtensions(&config->rtp_extensions, - sender_config.header_extensions()); + // Get header extensions. + GetHeaderExtensions(&configs[i].rtp_extensions, + sender_config.header_extensions()); - // Get the codec. - RTC_CHECK(sender_config.has_encoder()); - RTC_CHECK(sender_config.encoder().has_name()); - RTC_CHECK(sender_config.encoder().has_payload_type()); - config->codecs.emplace_back( - sender_config.encoder().name(), sender_config.encoder().payload_type(), - sender_config.has_rtx_payload_type() ? sender_config.rtx_payload_type() - : 0); + // Get the codec. + RTC_CHECK(sender_config.has_encoder()); + RTC_CHECK(sender_config.encoder().has_name()); + RTC_CHECK(sender_config.encoder().has_payload_type()); + configs[i].codecs.emplace_back( + sender_config.encoder().name(), sender_config.encoder().payload_type(), + sender_config.has_rtx_payload_type() ? sender_config.rtx_payload_type() + : 0); + } + return configs; } -void ParsedRtcEventLog::GetAudioReceiveConfig( - size_t index, - rtclog::StreamConfig* config) const { +rtclog::StreamConfig ParsedRtcEventLog::GetAudioReceiveConfig( + size_t index) const { RTC_CHECK_LT(index, GetNumberOfEvents()); - GetAudioReceiveConfig(events_[index], config); + return GetAudioReceiveConfig(events_[index]); } -void ParsedRtcEventLog::GetAudioReceiveConfig( - const rtclog::Event& event, - rtclog::StreamConfig* config) const { - RTC_CHECK(config != nullptr); +rtclog::StreamConfig ParsedRtcEventLog::GetAudioReceiveConfig( + const rtclog::Event& event) const { + rtclog::StreamConfig config; RTC_CHECK(event.has_type()); RTC_CHECK_EQ(event.type(), rtclog::Event::AUDIO_RECEIVER_CONFIG_EVENT); RTC_CHECK(event.has_audio_receiver_config()); @@ -456,33 +454,34 @@ void ParsedRtcEventLog::GetAudioReceiveConfig( event.audio_receiver_config(); // Get SSRCs. RTC_CHECK(receiver_config.has_remote_ssrc()); - config->remote_ssrc = receiver_config.remote_ssrc(); + config.remote_ssrc = receiver_config.remote_ssrc(); RTC_CHECK(receiver_config.has_local_ssrc()); - config->local_ssrc = receiver_config.local_ssrc(); + config.local_ssrc = receiver_config.local_ssrc(); // Get header extensions. - GetHeaderExtensions(&config->rtp_extensions, + GetHeaderExtensions(&config.rtp_extensions, receiver_config.header_extensions()); + return config; } -void ParsedRtcEventLog::GetAudioSendConfig(size_t index, - rtclog::StreamConfig* config) const { +rtclog::StreamConfig ParsedRtcEventLog::GetAudioSendConfig(size_t index) const { RTC_CHECK_LT(index, GetNumberOfEvents()); - GetAudioSendConfig(events_[index], config); + return GetAudioSendConfig(events_[index]); } -void ParsedRtcEventLog::GetAudioSendConfig(const rtclog::Event& event, - rtclog::StreamConfig* config) const { - RTC_CHECK(config != nullptr); +rtclog::StreamConfig ParsedRtcEventLog::GetAudioSendConfig( + const rtclog::Event& event) const { + rtclog::StreamConfig config; RTC_CHECK(event.has_type()); RTC_CHECK_EQ(event.type(), rtclog::Event::AUDIO_SENDER_CONFIG_EVENT); RTC_CHECK(event.has_audio_sender_config()); const rtclog::AudioSendConfig& sender_config = event.audio_sender_config(); // Get SSRCs. RTC_CHECK(sender_config.has_ssrc()); - config->local_ssrc = sender_config.ssrc(); + config.local_ssrc = sender_config.ssrc(); // Get header extensions. - GetHeaderExtensions(&config->rtp_extensions, + GetHeaderExtensions(&config.rtp_extensions, sender_config.header_extensions()); + return config; } void ParsedRtcEventLog::GetAudioPlayout(size_t index, uint32_t* ssrc) const { diff --git a/webrtc/logging/rtc_event_log/rtc_event_log_parser.h b/webrtc/logging/rtc_event_log/rtc_event_log_parser.h index 9e273ffbab..7a17f32d27 100644 --- a/webrtc/logging/rtc_event_log/rtc_event_log_parser.h +++ b/webrtc/logging/rtc_event_log/rtc_event_log_parser.h @@ -114,21 +114,23 @@ class ParsedRtcEventLog { uint8_t* packet, size_t* length) const; - // Reads a config event to a (non-NULL) StreamConfig struct. + // Reads a video receive config event to a StreamConfig struct. // Only the fields that are stored in the protobuf will be written. - void GetVideoReceiveConfig(size_t index, rtclog::StreamConfig* config) const; + rtclog::StreamConfig GetVideoReceiveConfig(size_t index) const; - // Reads a config event to a (non-NULL) StreamConfig struct. + // Reads a video send config event to a StreamConfig struct. If the proto + // contains multiple SSRCs and RTX SSRCs (this used to be the case for + // simulcast streams) then we return one StreamConfig per SSRC,RTX_SSRC pair. // Only the fields that are stored in the protobuf will be written. - void GetVideoSendConfig(size_t index, rtclog::StreamConfig* config) const; + std::vector GetVideoSendConfig(size_t index) const; - // Reads a config event to a (non-NULL) StreamConfig struct. + // Reads a audio receive config event to a StreamConfig struct. // Only the fields that are stored in the protobuf will be written. - void GetAudioReceiveConfig(size_t index, rtclog::StreamConfig* config) const; + rtclog::StreamConfig GetAudioReceiveConfig(size_t index) const; - // Reads a config event to a (non-NULL) StreamConfig struct. + // Reads a config event to a StreamConfig struct. // Only the fields that are stored in the protobuf will be written. - void GetAudioSendConfig(size_t index, rtclog::StreamConfig* config) const; + rtclog::StreamConfig GetAudioSendConfig(size_t index) const; // Reads the SSRC from the audio playout event at |index|. The SSRC is stored // in the output parameter ssrc. The output parameter can be set to nullptr @@ -165,14 +167,11 @@ class ParsedRtcEventLog { MediaType GetMediaType(uint32_t ssrc, PacketDirection direction) const; private: - void GetVideoReceiveConfig(const rtclog::Event& event, - rtclog::StreamConfig* config) const; - void GetVideoSendConfig(const rtclog::Event& event, - rtclog::StreamConfig* config) const; - void GetAudioReceiveConfig(const rtclog::Event& event, - rtclog::StreamConfig* config) const; - void GetAudioSendConfig(const rtclog::Event& event, - rtclog::StreamConfig* config) const; + rtclog::StreamConfig GetVideoReceiveConfig(const rtclog::Event& event) const; + std::vector GetVideoSendConfig( + const rtclog::Event& event) const; + rtclog::StreamConfig GetAudioReceiveConfig(const rtclog::Event& event) const; + rtclog::StreamConfig GetAudioSendConfig(const rtclog::Event& event) const; std::vector events_; diff --git a/webrtc/logging/rtc_event_log/rtc_event_log_unittest_helper.cc b/webrtc/logging/rtc_event_log/rtc_event_log_unittest_helper.cc index 4147721869..280158dcff 100644 --- a/webrtc/logging/rtc_event_log/rtc_event_log_unittest_helper.cc +++ b/webrtc/logging/rtc_event_log/rtc_event_log_unittest_helper.cc @@ -13,6 +13,7 @@ #include #include +#include #include "webrtc/base/checks.h" #include "webrtc/modules/audio_coding/audio_network_adaptor/include/audio_network_adaptor.h" @@ -237,8 +238,7 @@ void RtcEventLogTestHelper::VerifyVideoReceiveStreamConfig( } // Check consistency of the parser. - rtclog::StreamConfig parsed_config; - parsed_log.GetVideoReceiveConfig(index, &parsed_config); + rtclog::StreamConfig parsed_config = parsed_log.GetVideoReceiveConfig(index); VerifyStreamConfigsAreEqual(config, parsed_config); } @@ -277,9 +277,10 @@ void RtcEventLogTestHelper::VerifyVideoSendStreamConfig( sender_config.rtx_payload_type()); // Check consistency of the parser. - rtclog::StreamConfig parsed_config; - parsed_log.GetVideoSendConfig(index, &parsed_config); - VerifyStreamConfigsAreEqual(config, parsed_config); + std::vector parsed_configs = + parsed_log.GetVideoSendConfig(index); + ASSERT_EQ(1u, parsed_configs.size()); + VerifyStreamConfigsAreEqual(config, parsed_configs[0]); } void RtcEventLogTestHelper::VerifyAudioReceiveStreamConfig( @@ -309,8 +310,7 @@ void RtcEventLogTestHelper::VerifyAudioReceiveStreamConfig( } // Check consistency of the parser. - rtclog::StreamConfig parsed_config; - parsed_log.GetAudioReceiveConfig(index, &parsed_config); + rtclog::StreamConfig parsed_config = parsed_log.GetAudioReceiveConfig(index); EXPECT_EQ(config.remote_ssrc, parsed_config.remote_ssrc); EXPECT_EQ(config.local_ssrc, parsed_config.local_ssrc); // Check header extensions. @@ -345,8 +345,7 @@ void RtcEventLogTestHelper::VerifyAudioSendStreamConfig( } // Check consistency of the parser. - rtclog::StreamConfig parsed_config; - parsed_log.GetAudioSendConfig(index, &parsed_config); + rtclog::StreamConfig parsed_config = parsed_log.GetAudioSendConfig(index); VerifyStreamConfigsAreEqual(config, parsed_config); } diff --git a/webrtc/tools/event_log_visualizer/analyzer.cc b/webrtc/tools/event_log_visualizer/analyzer.cc index f42855fa92..ee41ecc527 100644 --- a/webrtc/tools/event_log_visualizer/analyzer.cc +++ b/webrtc/tools/event_log_visualizer/analyzer.cc @@ -331,8 +331,7 @@ EventLogAnalyzer::EventLogAnalyzer(const ParsedRtcEventLog& log) switch (parsed_log_.GetEventType(i)) { case ParsedRtcEventLog::VIDEO_RECEIVER_CONFIG_EVENT: { - rtclog::StreamConfig config; - parsed_log_.GetVideoReceiveConfig(i, &config); + rtclog::StreamConfig config = parsed_log_.GetVideoReceiveConfig(i); StreamId stream(config.remote_ssrc, kIncomingPacket); extension_maps[stream] = RtpHeaderExtensionMap(config.rtp_extensions); video_ssrcs_.insert(stream); @@ -344,29 +343,30 @@ EventLogAnalyzer::EventLogAnalyzer(const ParsedRtcEventLog& log) break; } case ParsedRtcEventLog::VIDEO_SENDER_CONFIG_EVENT: { - rtclog::StreamConfig config; - parsed_log_.GetVideoSendConfig(i, &config); - StreamId stream(config.local_ssrc, kOutgoingPacket); - extension_maps[stream] = RtpHeaderExtensionMap(config.rtp_extensions); - video_ssrcs_.insert(stream); - StreamId rtx_stream(config.rtx_ssrc, kOutgoingPacket); - extension_maps[rtx_stream] = - RtpHeaderExtensionMap(config.rtp_extensions); - video_ssrcs_.insert(rtx_stream); - rtx_ssrcs_.insert(rtx_stream); + std::vector configs = + parsed_log_.GetVideoSendConfig(i); + for (size_t j = 0; j < configs.size(); j++) { + StreamId stream(configs[i].local_ssrc, kOutgoingPacket); + extension_maps[stream] = + RtpHeaderExtensionMap(configs[i].rtp_extensions); + video_ssrcs_.insert(stream); + StreamId rtx_stream(configs[i].rtx_ssrc, kOutgoingPacket); + extension_maps[rtx_stream] = + RtpHeaderExtensionMap(configs[i].rtp_extensions); + video_ssrcs_.insert(rtx_stream); + rtx_ssrcs_.insert(rtx_stream); + } break; } case ParsedRtcEventLog::AUDIO_RECEIVER_CONFIG_EVENT: { - rtclog::StreamConfig config; - parsed_log_.GetAudioReceiveConfig(i, &config); + rtclog::StreamConfig config = parsed_log_.GetAudioReceiveConfig(i); StreamId stream(config.remote_ssrc, kIncomingPacket); extension_maps[stream] = RtpHeaderExtensionMap(config.rtp_extensions); audio_ssrcs_.insert(stream); break; } case ParsedRtcEventLog::AUDIO_SENDER_CONFIG_EVENT: { - rtclog::StreamConfig config; - parsed_log_.GetAudioSendConfig(i, &config); + rtclog::StreamConfig config = parsed_log_.GetAudioSendConfig(i); StreamId stream(config.local_ssrc, kOutgoingPacket); extension_maps[stream] = RtpHeaderExtensionMap(config.rtp_extensions); audio_ssrcs_.insert(stream);