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);