diff --git a/webrtc/call/call.cc b/webrtc/call/call.cc index cee0036822..b1f56d3886 100644 --- a/webrtc/call/call.cc +++ b/webrtc/call/call.cc @@ -86,6 +86,14 @@ bool UseSendSideBwe(const FlexfecReceiveStream::Config& config) { return UseSendSideBwe(config.rtp_header_extensions, config.transport_cc); } +const int* FindKeyByValue(const std::map& m, int v) { + for (const auto& kv : m) { + if (kv.second == v) + return &kv.first; + } + return nullptr; +} + rtclog::StreamConfig CreateRtcLogStreamConfig( const VideoReceiveStream::Config& config) { rtclog::StreamConfig rtclog_config; @@ -97,10 +105,10 @@ rtclog::StreamConfig CreateRtcLogStreamConfig( rtclog_config.rtp_extensions = config.rtp.extensions; for (const auto& d : config.decoders) { - auto search = config.rtp.rtx_payload_types.find(d.payload_type); - rtclog_config.codecs.emplace_back( - d.payload_name, d.payload_type, - search != config.rtp.rtx_payload_types.end() ? search->second : 0); + const int* search = + FindKeyByValue(config.rtp.rtx_associated_payload_types, d.payload_type); + rtclog_config.codecs.emplace_back(d.payload_name, d.payload_type, + search ? *search : 0); } return rtclog_config; } diff --git a/webrtc/call/rampup_tests.cc b/webrtc/call/rampup_tests.cc index cfb511755f..ed44dad5e5 100644 --- a/webrtc/call/rampup_tests.cc +++ b/webrtc/call/rampup_tests.cc @@ -215,8 +215,8 @@ void RampUpTester::ModifyVideoConfigs( if (rtx_) { recv_config.rtp.rtx_ssrc = video_rtx_ssrcs_[i]; recv_config.rtp - .rtx_payload_types[send_config->encoder_settings.payload_type] = - send_config->rtp.rtx.payload_type; + .rtx_associated_payload_types[send_config->rtp.rtx.payload_type] = + send_config->encoder_settings.payload_type; } ++i; } diff --git a/webrtc/call/video_receive_stream.cc b/webrtc/call/video_receive_stream.cc index bc65869f91..ef6c6084de 100644 --- a/webrtc/call/video_receive_stream.cc +++ b/webrtc/call/video_receive_stream.cc @@ -113,8 +113,8 @@ std::string VideoReceiveStream::Config::Rtp::ToString() const { ss << ", ulpfec: " << ulpfec.ToString(); ss << ", rtx_ssrc: " << rtx_ssrc; ss << ", rtx_payload_types: {"; - for (auto& kv : rtx_payload_types) { - ss << kv.first << " (apt) -> " << kv.second << " (pt), "; + for (auto& kv : rtx_associated_payload_types) { + ss << kv.first << " (pt) -> " << kv.second << " (apt), "; } ss << '}'; ss << ", extensions: ["; diff --git a/webrtc/call/video_receive_stream.h b/webrtc/call/video_receive_stream.h index bd4b9976f6..18e904d076 100644 --- a/webrtc/call/video_receive_stream.h +++ b/webrtc/call/video_receive_stream.h @@ -168,14 +168,15 @@ class VideoReceiveStream { // Set if the stream is protected using FlexFEC. bool protected_by_flexfec = false; - // Map from video payload type (apt) -> RTX payload type (pt). + // Map from rtx payload type -> media payload type. // For RTX to be enabled, both an SSRC and this mapping are needed. - std::map rtx_payload_types; + std::map rtx_associated_payload_types; // TODO(nisse): This is a temporary accessor function to enable // reversing and renaming of the rtx_payload_types mapping. void AddRtxBinding(int rtx_payload_type, int media_payload_type) { - rtx_payload_types[media_payload_type] = rtx_payload_type; + rtx_associated_payload_types[rtx_payload_type] = media_payload_type; } + // RTP header extensions used for the received stream. std::vector extensions; } rtp; diff --git a/webrtc/media/engine/webrtcvideoengine.cc b/webrtc/media/engine/webrtcvideoengine.cc index 8a23ae8b44..6808f2c59a 100644 --- a/webrtc/media/engine/webrtcvideoengine.cc +++ b/webrtc/media/engine/webrtcvideoengine.cc @@ -2219,10 +2219,10 @@ void WebRtcVideoChannel::WebRtcVideoReceiveStream::ConfigureCodecs( config_.decoders.push_back(decoder); } - config_.rtp.rtx_payload_types.clear(); + config_.rtp.rtx_associated_payload_types.clear(); for (const VideoCodecSettings& recv_codec : recv_codecs) { - config_.rtp.rtx_payload_types[recv_codec.codec.id] = - recv_codec.rtx_payload_type; + config_.rtp.rtx_associated_payload_types[recv_codec.rtx_payload_type] = + recv_codec.codec.id; } config_.rtp.ulpfec = recv_codecs.front().ulpfec; diff --git a/webrtc/media/engine/webrtcvideoengine_unittest.cc b/webrtc/media/engine/webrtcvideoengine_unittest.cc index 3af7ef4162..c6adfd3976 100644 --- a/webrtc/media/engine/webrtcvideoengine_unittest.cc +++ b/webrtc/media/engine/webrtcvideoengine_unittest.cc @@ -111,6 +111,16 @@ cricket::MediaConfig GetMediaConfig() { media_config.video.enable_cpu_overuse_detection = false; return media_config; } + +// TODO(nisse): Duplicated in call.cc. +const int* FindKeyByValue(const std::map& m, int v) { + for (const auto& kv : m) { + if (kv.second == v) + return &kv.first; + } + return nullptr; +} + } // namespace namespace cricket { @@ -1304,9 +1314,10 @@ TEST_F(WebRtcVideoChannelTest, RecvStreamWithSimAndRtx) { // Receiver side. FakeVideoReceiveStream* recv_stream = AddRecvStream( cricket::CreateSimWithRtxStreamParams("cname", ssrcs, rtx_ssrcs)); - EXPECT_FALSE(recv_stream->GetConfig().rtp.rtx_payload_types.empty()); + EXPECT_FALSE( + recv_stream->GetConfig().rtp.rtx_associated_payload_types.empty()); EXPECT_EQ(recv_stream->GetConfig().decoders.size(), - recv_stream->GetConfig().rtp.rtx_payload_types.size()) + recv_stream->GetConfig().rtp.rtx_associated_payload_types.size()) << "RTX should be mapped for all decoders/payload types."; EXPECT_EQ(rtx_ssrcs[0], recv_stream->GetConfig().rtp.rtx_ssrc); } @@ -3142,11 +3153,11 @@ TEST_F(WebRtcVideoChannelTest, SetRecvCodecsWithChangedRtxPayloadType) { ASSERT_EQ(1U, fake_call_->GetVideoReceiveStreams().size()); const webrtc::VideoReceiveStream::Config& config_before = fake_call_->GetVideoReceiveStreams()[0]->GetConfig(); - EXPECT_EQ(1U, config_before.rtp.rtx_payload_types.size()); - auto it_before = - config_before.rtp.rtx_payload_types.find(GetEngineCodec("VP8").id); - ASSERT_NE(it_before, config_before.rtp.rtx_payload_types.end()); - EXPECT_EQ(kUnusedPayloadType1, it_before->second); + EXPECT_EQ(1U, config_before.rtp.rtx_associated_payload_types.size()); + const int* payload_type_before = FindKeyByValue( + config_before.rtp.rtx_associated_payload_types, GetEngineCodec("VP8").id); + ASSERT_NE(payload_type_before, nullptr); + EXPECT_EQ(kUnusedPayloadType1, *payload_type_before); EXPECT_EQ(kRtxSsrcs1[0], config_before.rtp.rtx_ssrc); // Change payload type for RTX. @@ -3155,11 +3166,11 @@ TEST_F(WebRtcVideoChannelTest, SetRecvCodecsWithChangedRtxPayloadType) { ASSERT_EQ(1U, fake_call_->GetVideoReceiveStreams().size()); const webrtc::VideoReceiveStream::Config& config_after = fake_call_->GetVideoReceiveStreams()[0]->GetConfig(); - EXPECT_EQ(1U, config_after.rtp.rtx_payload_types.size()); - auto it_after = - config_after.rtp.rtx_payload_types.find(GetEngineCodec("VP8").id); - ASSERT_NE(it_after, config_after.rtp.rtx_payload_types.end()); - EXPECT_EQ(kUnusedPayloadType2, it_after->second); + EXPECT_EQ(1U, config_after.rtp.rtx_associated_payload_types.size()); + const int* payload_type_after = FindKeyByValue( + config_after.rtp.rtx_associated_payload_types, GetEngineCodec("VP8").id); + ASSERT_NE(payload_type_after, nullptr); + EXPECT_EQ(kUnusedPayloadType2, *payload_type_after); EXPECT_EQ(kRtxSsrcs1[0], config_after.rtp.rtx_ssrc); } @@ -3783,9 +3794,10 @@ TEST_F(WebRtcVideoChannelTest, DefaultReceiveStreamReconfiguresToUseRtx) { ASSERT_EQ(1u, fake_call_->GetVideoReceiveStreams().size()) << "AddRecvStream should have reconfigured, not added a new receiver."; recv_stream = fake_call_->GetVideoReceiveStreams()[0]; - EXPECT_FALSE(recv_stream->GetConfig().rtp.rtx_payload_types.empty()); + EXPECT_FALSE( + recv_stream->GetConfig().rtp.rtx_associated_payload_types.empty()); EXPECT_EQ(recv_stream->GetConfig().decoders.size(), - recv_stream->GetConfig().rtp.rtx_payload_types.size()) + recv_stream->GetConfig().rtp.rtx_associated_payload_types.size()) << "RTX should be mapped for all decoders/payload types."; EXPECT_EQ(rtx_ssrcs[0], recv_stream->GetConfig().rtp.rtx_ssrc); } diff --git a/webrtc/video/end_to_end_tests.cc b/webrtc/video/end_to_end_tests.cc index 7e62f6da0d..fbc852fcee 100644 --- a/webrtc/video/end_to_end_tests.cc +++ b/webrtc/video/end_to_end_tests.cc @@ -865,8 +865,9 @@ class FlexfecRenderObserver : public test::EndToEndTest, (*receive_configs)[0].rtp.rtx_ssrc = test::CallTest::kSendRtxSsrcs[0]; (*receive_configs)[0] - .rtp.rtx_payload_types[test::CallTest::kVideoSendPayloadType] = - test::CallTest::kSendRtxPayloadType; + .rtp + .rtx_associated_payload_types[test::CallTest::kSendRtxPayloadType] = + test::CallTest::kVideoSendPayloadType; } } @@ -1182,8 +1183,9 @@ void EndToEndTest::DecodesRetransmittedFrame(bool enable_rtx, bool enable_red) { send_config->rtp.rtx.ssrcs.push_back(kSendRtxSsrcs[0]); send_config->rtp.rtx.payload_type = kSendRtxPayloadType; (*receive_configs)[0].rtp.rtx_ssrc = kSendRtxSsrcs[0]; - (*receive_configs)[0].rtp.rtx_payload_types[payload_type_] = - kSendRtxPayloadType; + (*receive_configs)[0] + .rtp.rtx_associated_payload_types[kSendRtxPayloadType] = + payload_type_; } // Configure encoding and decoding with VP8, since generic packetization // doesn't support FEC with NACK. @@ -2773,8 +2775,9 @@ void EndToEndTest::VerifyHistogramStats(bool use_rtx, send_config->rtp.rtx.ssrcs.push_back(kSendRtxSsrcs[0]); send_config->rtp.rtx.payload_type = kSendRtxPayloadType; (*receive_configs)[0].rtp.rtx_ssrc = kSendRtxSsrcs[0]; - (*receive_configs)[0].rtp.rtx_payload_types[kFakeVideoSendPayloadType] = - kSendRtxPayloadType; + (*receive_configs)[0] + .rtp.rtx_associated_payload_types[kSendRtxPayloadType] = + kFakeVideoSendPayloadType; } // RTT needed for RemoteNtpTimeEstimator for the receive stream. (*receive_configs)[0].rtp.rtcp_xr.receiver_reference_time_report = true; @@ -3540,8 +3543,9 @@ TEST_F(EndToEndTest, GetStats) { (*receive_configs)[i].rtp.nack.rtp_history_ms = kNackRtpHistoryMs; (*receive_configs)[i].rtp.rtx_ssrc = kSendRtxSsrcs[i]; - (*receive_configs)[i].rtp.rtx_payload_types[kFakeVideoSendPayloadType] = - kSendRtxPayloadType; + (*receive_configs)[i] + .rtp.rtx_associated_payload_types[kSendRtxPayloadType] = + kFakeVideoSendPayloadType; } for (size_t i = 0; i < kNumSsrcs; ++i) @@ -4323,8 +4327,9 @@ TEST_F(EndToEndTest, MAYBE_TestFlexfecRtpStatePreservation) { CreateMatchingReceiveConfigs(receive_transport.get()); video_receive_configs_[0].rtp.nack.rtp_history_ms = kNackRtpHistoryMs; video_receive_configs_[0].rtp.rtx_ssrc = kSendRtxSsrcs[0]; - video_receive_configs_[0].rtp.rtx_payload_types[kVideoSendPayloadType] = - kSendRtxPayloadType; + video_receive_configs_[0] + .rtp.rtx_associated_payload_types[kSendRtxPayloadType] = + kVideoSendPayloadType; // The matching FlexFEC receive config is not created by // CreateMatchingReceiveConfigs since this is not a test::BaseTest. @@ -4824,7 +4829,7 @@ TEST_F(EndToEndTest, VerifyDefaultVideoReceiveConfigParameters) { << "RTCP XR settings require rtcp-xr to be negotiated."; EXPECT_EQ(0U, default_receive_config.rtp.rtx_ssrc) << "Enabling RTX requires ssrc-group: FID negotiation"; - EXPECT_TRUE(default_receive_config.rtp.rtx_payload_types.empty()) + EXPECT_TRUE(default_receive_config.rtp.rtx_associated_payload_types.empty()) << "Enabling RTX requires rtpmap: rtx negotiation."; EXPECT_TRUE(default_receive_config.rtp.extensions.empty()) << "Enabling RTP extensions require negotiation."; diff --git a/webrtc/video/replay.cc b/webrtc/video/replay.cc index 736db449cc..b1e7f3bca6 100644 --- a/webrtc/video/replay.cc +++ b/webrtc/video/replay.cc @@ -238,8 +238,8 @@ void RtpReplay() { receive_config.rtp.remote_ssrc = flags::Ssrc(); receive_config.rtp.local_ssrc = kReceiverLocalSsrc; receive_config.rtp.rtx_ssrc = flags::SsrcRtx(); - receive_config.rtp.rtx_payload_types[flags::PayloadType()] = - flags::PayloadTypeRtx(); + receive_config.rtp.rtx_associated_payload_types[flags::PayloadTypeRtx()] = + flags::PayloadType(); receive_config.rtp.ulpfec.ulpfec_payload_type = flags::FecPayloadType(); receive_config.rtp.ulpfec.red_payload_type = flags::RedPayloadType(); receive_config.rtp.nack.rtp_history_ms = 1000; diff --git a/webrtc/video/rtp_video_stream_receiver.cc b/webrtc/video/rtp_video_stream_receiver.cc index 01cb4dcc2f..4678b8f0af 100644 --- a/webrtc/video/rtp_video_stream_receiver.cc +++ b/webrtc/video/rtp_video_stream_receiver.cc @@ -148,9 +148,9 @@ RtpVideoStreamReceiver::RtpVideoStreamReceiver( if (config_.rtp.rtx_ssrc) { rtp_payload_registry_.SetRtxSsrc(config_.rtp.rtx_ssrc); - for (const auto& kv : config_.rtp.rtx_payload_types) { - RTC_DCHECK(kv.second != 0); - rtp_payload_registry_.SetRtxPayloadType(kv.second, kv.first); + for (const auto& kv : config_.rtp.rtx_associated_payload_types) { + RTC_DCHECK_NE(kv.first, 0); + rtp_payload_registry_.SetRtxPayloadType(kv.first, kv.second); } } diff --git a/webrtc/video/video_quality_test.cc b/webrtc/video/video_quality_test.cc index 7cacf297ef..3882f71273 100644 --- a/webrtc/video/video_quality_test.cc +++ b/webrtc/video/video_quality_test.cc @@ -1484,8 +1484,8 @@ void VideoQualityTest::SetupVideo(Transport* send_transport, for (size_t i = 0; i < num_video_streams; ++i) { video_receive_configs_[i].rtp.nack.rtp_history_ms = kNackRtpHistoryMs; video_receive_configs_[i].rtp.rtx_ssrc = kSendRtxSsrcs[i]; - video_receive_configs_[i].rtp.rtx_payload_types[payload_type] = - kSendRtxPayloadType; + video_receive_configs_[i] + .rtp.rtx_associated_payload_types[kSendRtxPayloadType] = payload_type; video_receive_configs_[i].rtp.transport_cc = params_.call.send_side_bwe; video_receive_configs_[i].rtp.remb = !params_.call.send_side_bwe; // Enable RTT calculation so NTP time estimator will work. @@ -1627,8 +1627,8 @@ void VideoQualityTest::SetupThumbnails(Transport* send_transport, thumbnail_receive_config.rtp.nack.rtp_history_ms = kNackRtpHistoryMs; thumbnail_receive_config.rtp.rtx_ssrc = kThumbnailRtxSsrcStart + i; - thumbnail_receive_config.rtp.rtx_payload_types[kPayloadTypeVP8] = - kSendRtxPayloadType; + thumbnail_receive_config.rtp + .rtx_associated_payload_types[kSendRtxPayloadType] = kPayloadTypeVP8; thumbnail_receive_config.rtp.transport_cc = params_.call.send_side_bwe; thumbnail_receive_config.rtp.remb = !params_.call.send_side_bwe;