| Index: webrtc/media/engine/webrtcvideoengine2_unittest.cc
 | 
| diff --git a/webrtc/media/engine/webrtcvideoengine2_unittest.cc b/webrtc/media/engine/webrtcvideoengine2_unittest.cc
 | 
| index de780296f26eaed6b2500b3e9242e4ac2a63f28d..f72d7ae86c49403eb7f73cc6b23c43b5a44639a2 100644
 | 
| --- a/webrtc/media/engine/webrtcvideoengine2_unittest.cc
 | 
| +++ b/webrtc/media/engine/webrtcvideoengine2_unittest.cc
 | 
| @@ -1227,11 +1227,13 @@
 | 
|    // 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.empty());
 | 
|    EXPECT_EQ(recv_stream->GetConfig().decoders.size(),
 | 
| -            recv_stream->GetConfig().rtp.rtx_payload_types.size())
 | 
| +            recv_stream->GetConfig().rtp.rtx.size())
 | 
|        << "RTX should be mapped for all decoders/payload types.";
 | 
| -  EXPECT_EQ(rtx_ssrcs[0], recv_stream->GetConfig().rtp.rtx_ssrc);
 | 
| +  for (const auto& kv : recv_stream->GetConfig().rtp.rtx) {
 | 
| +    EXPECT_EQ(rtx_ssrcs[0], kv.second.ssrc);
 | 
| +  }
 | 
|  }
 | 
|  
 | 
|  TEST_F(WebRtcVideoChannel2Test, RecvStreamWithRtx) {
 | 
| @@ -1240,7 +1242,8 @@
 | 
|        cricket::StreamParams::CreateLegacy(kSsrcs1[0]);
 | 
|    params.AddFidSsrc(kSsrcs1[0], kRtxSsrcs1[0]);
 | 
|    FakeVideoReceiveStream* recv_stream = AddRecvStream(params);
 | 
| -  EXPECT_EQ(kRtxSsrcs1[0], recv_stream->GetConfig().rtp.rtx_ssrc);
 | 
| +  EXPECT_EQ(kRtxSsrcs1[0],
 | 
| +            recv_stream->GetConfig().rtp.rtx.begin()->second.ssrc);
 | 
|  }
 | 
|  
 | 
|  TEST_F(WebRtcVideoChannel2Test, RecvStreamNoRtx) {
 | 
| @@ -1248,7 +1251,7 @@
 | 
|    cricket::StreamParams params =
 | 
|        cricket::StreamParams::CreateLegacy(kSsrcs1[0]);
 | 
|    FakeVideoReceiveStream* recv_stream = AddRecvStream(params);
 | 
| -  ASSERT_EQ(0U, recv_stream->GetConfig().rtp.rtx_ssrc);
 | 
| +  ASSERT_TRUE(recv_stream->GetConfig().rtp.rtx.empty());
 | 
|  }
 | 
|  
 | 
|  TEST_F(WebRtcVideoChannel2Test, NoHeaderExtesionsByDefault) {
 | 
| @@ -2478,43 +2481,6 @@
 | 
|    }
 | 
|  }
 | 
|  
 | 
| -TEST_F(WebRtcVideoChannel2Test, SetSendCodecsWithChangedRtxPayloadType) {
 | 
| -  const int kUnusedPayloadType1 = 126;
 | 
| -  const int kUnusedPayloadType2 = 127;
 | 
| -  EXPECT_FALSE(FindCodecById(engine_.codecs(), kUnusedPayloadType1));
 | 
| -  EXPECT_FALSE(FindCodecById(engine_.codecs(), kUnusedPayloadType2));
 | 
| -
 | 
| -  // SSRCs for RTX.
 | 
| -  cricket::StreamParams params =
 | 
| -      cricket::StreamParams::CreateLegacy(kSsrcs1[0]);
 | 
| -  params.AddFidSsrc(kSsrcs1[0], kRtxSsrcs1[0]);
 | 
| -  AddSendStream(params);
 | 
| -
 | 
| -  // Original payload type for RTX.
 | 
| -  cricket::VideoSendParameters parameters;
 | 
| -  parameters.codecs.push_back(GetEngineCodec("VP8"));
 | 
| -  cricket::VideoCodec rtx_codec(kUnusedPayloadType1, "rtx");
 | 
| -  rtx_codec.SetParam("apt", GetEngineCodec("VP8").id);
 | 
| -  parameters.codecs.push_back(rtx_codec);
 | 
| -  EXPECT_TRUE(channel_->SetSendParameters(parameters));
 | 
| -  ASSERT_EQ(1U, fake_call_->GetVideoSendStreams().size());
 | 
| -  const webrtc::VideoSendStream::Config& config_before =
 | 
| -      fake_call_->GetVideoSendStreams()[0]->GetConfig();
 | 
| -  EXPECT_EQ(kUnusedPayloadType1, config_before.rtp.rtx.payload_type);
 | 
| -  ASSERT_EQ(1U, config_before.rtp.rtx.ssrcs.size());
 | 
| -  EXPECT_EQ(kRtxSsrcs1[0], config_before.rtp.rtx.ssrcs[0]);
 | 
| -
 | 
| -  // Change payload type for RTX.
 | 
| -  parameters.codecs[1].id = kUnusedPayloadType2;
 | 
| -  EXPECT_TRUE(channel_->SetSendParameters(parameters));
 | 
| -  ASSERT_EQ(1U, fake_call_->GetVideoSendStreams().size());
 | 
| -  const webrtc::VideoSendStream::Config& config_after =
 | 
| -      fake_call_->GetVideoSendStreams()[0]->GetConfig();
 | 
| -  EXPECT_EQ(kUnusedPayloadType2, config_after.rtp.rtx.payload_type);
 | 
| -  ASSERT_EQ(1U, config_after.rtp.rtx.ssrcs.size());
 | 
| -  EXPECT_EQ(kRtxSsrcs1[0], config_after.rtp.rtx.ssrcs[0]);
 | 
| -}
 | 
| -
 | 
|  TEST_F(WebRtcVideoChannel2Test, SetSendCodecsWithoutFecDisablesFec) {
 | 
|    cricket::VideoSendParameters parameters;
 | 
|    parameters.codecs.push_back(GetEngineCodec("VP8"));
 | 
| @@ -2843,49 +2809,6 @@
 | 
|    EXPECT_FALSE(channel_->SetRecvParameters(parameters)) <<
 | 
|        "RTX codec with another RTX as associated payload type should be "
 | 
|        "rejected.";
 | 
| -}
 | 
| -
 | 
| -TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsWithChangedRtxPayloadType) {
 | 
| -  const int kUnusedPayloadType1 = 126;
 | 
| -  const int kUnusedPayloadType2 = 127;
 | 
| -  EXPECT_FALSE(FindCodecById(engine_.codecs(), kUnusedPayloadType1));
 | 
| -  EXPECT_FALSE(FindCodecById(engine_.codecs(), kUnusedPayloadType2));
 | 
| -
 | 
| -  // SSRCs for RTX.
 | 
| -  cricket::StreamParams params =
 | 
| -      cricket::StreamParams::CreateLegacy(kSsrcs1[0]);
 | 
| -  params.AddFidSsrc(kSsrcs1[0], kRtxSsrcs1[0]);
 | 
| -  AddRecvStream(params);
 | 
| -
 | 
| -  // Original payload type for RTX.
 | 
| -  cricket::VideoRecvParameters parameters;
 | 
| -  parameters.codecs.push_back(GetEngineCodec("VP8"));
 | 
| -  cricket::VideoCodec rtx_codec(kUnusedPayloadType1, "rtx");
 | 
| -  rtx_codec.SetParam("apt", GetEngineCodec("VP8").id);
 | 
| -  parameters.codecs.push_back(rtx_codec);
 | 
| -  EXPECT_TRUE(channel_->SetRecvParameters(parameters));
 | 
| -  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(kRtxSsrcs1[0], config_before.rtp.rtx_ssrc);
 | 
| -
 | 
| -  // Change payload type for RTX.
 | 
| -  parameters.codecs[1].id = kUnusedPayloadType2;
 | 
| -  EXPECT_TRUE(channel_->SetRecvParameters(parameters));
 | 
| -  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(kRtxSsrcs1[0], config_after.rtp.rtx_ssrc);
 | 
|  }
 | 
|  
 | 
|  TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsDifferentPayloadType) {
 | 
| @@ -3517,19 +3440,21 @@
 | 
|    ASSERT_EQ(1u, fake_call_->GetVideoReceiveStreams().size())
 | 
|        << "No default receive stream created.";
 | 
|    FakeVideoReceiveStream* recv_stream = fake_call_->GetVideoReceiveStreams()[0];
 | 
| -  EXPECT_EQ(0u, recv_stream->GetConfig().rtp.rtx_ssrc)
 | 
| +  EXPECT_TRUE(recv_stream->GetConfig().rtp.rtx.empty())
 | 
|        << "Default receive stream should not have configured RTX";
 | 
|  
 | 
|    EXPECT_TRUE(channel_->AddRecvStream(
 | 
|        cricket::CreateSimWithRtxStreamParams("cname", ssrcs, rtx_ssrcs)));
 | 
|    ASSERT_EQ(1u, fake_call_->GetVideoReceiveStreams().size())
 | 
| -      << "AddRecvStream should have reconfigured, not added a new receiver.";
 | 
| +      << "AddRecvStream should've 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.empty());
 | 
|    EXPECT_EQ(recv_stream->GetConfig().decoders.size(),
 | 
| -            recv_stream->GetConfig().rtp.rtx_payload_types.size())
 | 
| +            recv_stream->GetConfig().rtp.rtx.size())
 | 
|        << "RTX should be mapped for all decoders/payload types.";
 | 
| -  EXPECT_EQ(rtx_ssrcs[0], recv_stream->GetConfig().rtp.rtx_ssrc);
 | 
| +  for (const auto& kv : recv_stream->GetConfig().rtp.rtx) {
 | 
| +    EXPECT_EQ(rtx_ssrcs[0], kv.second.ssrc);
 | 
| +  }
 | 
|  }
 | 
|  
 | 
|  TEST_F(WebRtcVideoChannel2Test, RejectsAddingStreamsWithMissingSsrcsForRtx) {
 | 
| 
 |