diff --git a/talk/app/webrtc/peerconnectionfactory.cc b/talk/app/webrtc/peerconnectionfactory.cc index ee89e09fc..3628c5905 100644 --- a/talk/app/webrtc/peerconnectionfactory.cc +++ b/talk/app/webrtc/peerconnectionfactory.cc @@ -247,6 +247,7 @@ bool PeerConnectionFactory::Initialize_s() { channel_manager_.reset(new cricket::ChannelManager( webrtc_media_engine, device_manager, worker_thread_)); + channel_manager_->SetVideoRtxEnabled(true); if (!channel_manager_->Init()) { return false; } diff --git a/talk/app/webrtc/webrtcsdp.cc b/talk/app/webrtc/webrtcsdp.cc index 31578930e..b2d8a30ec 100644 --- a/talk/app/webrtc/webrtcsdp.cc +++ b/talk/app/webrtc/webrtcsdp.cc @@ -71,6 +71,7 @@ using cricket::kCodecParamUseInbandFec; using cricket::kCodecParamSctpProtocol; using cricket::kCodecParamSctpStreams; using cricket::kCodecParamMaxAverageBitrate; +using cricket::kCodecParamAssociatedPayloadType; using cricket::kWildcardPayloadType; using cricket::MediaContentDescription; using cricket::MediaType; @@ -1512,7 +1513,7 @@ bool IsFmtpParam(const std::string& name) { kCodecParamStereo, kCodecParamUseInbandFec, kCodecParamStartBitrate, kCodecParamMaxBitrate, kCodecParamMinBitrate, kCodecParamMaxQuantization, kCodecParamSctpProtocol, kCodecParamSctpStreams, - kCodecParamMaxAverageBitrate + kCodecParamMaxAverageBitrate, kCodecParamAssociatedPayloadType }; for (size_t i = 0; i < ARRAY_SIZE(kFmtpParams); ++i) { if (_stricmp(name.c_str(), kFmtpParams[i]) == 0) { diff --git a/talk/app/webrtc/webrtcsdp_unittest.cc b/talk/app/webrtc/webrtcsdp_unittest.cc index e02b11f74..64776e29e 100644 --- a/talk/app/webrtc/webrtcsdp_unittest.cc +++ b/talk/app/webrtc/webrtcsdp_unittest.cc @@ -1153,6 +1153,15 @@ class WebRtcSdpTest : public testing::Test { << "a=maxptime:" << params.max_ptime << "\r\n"; sdp += os.str(); + os.clear(); + os.str(""); + // Pl type 100 preferred. + os << "m=video 1 RTP/SAVPF 99 95\r\n" + << "a=rtpmap:99 VP8/90000\r\n" + << "a=rtpmap:95 RTX/90000\r\n" + << "a=fmtp:95 apt=99;rtx-time=1000\r\n"; + sdp += os.str(); + // Deserialize SdpParseError error; EXPECT_TRUE(webrtc::SdpDeserialize(sdp, jdesc_output, &error)); @@ -1183,6 +1192,19 @@ class WebRtcSdpTest : public testing::Test { } } } + + const ContentInfo* vc = GetFirstVideoContent(jdesc_output->description()); + ASSERT_TRUE(vc != NULL); + const VideoContentDescription* vcd = + static_cast(vc->description); + ASSERT_FALSE(vcd->codecs().empty()); + cricket::VideoCodec vp8 = vcd->codecs()[0]; + EXPECT_EQ("VP8", vp8.name); + EXPECT_EQ(99, vp8.id); + cricket::VideoCodec rtx = vcd->codecs()[1]; + EXPECT_EQ("RTX", rtx.name); + EXPECT_EQ(95, rtx.id); + VerifyCodecParameter(rtx.params, "apt", vp8.id); } void TestDeserializeRtcpFb(JsepSessionDescription* jdesc_output,