diff --git a/media/webrtc/signaling/src/media-conduit/VideoConduit.cpp b/media/webrtc/signaling/src/media-conduit/VideoConduit.cpp index e95ff3ee957c..01ba45ed8a2a 100755 --- a/media/webrtc/signaling/src/media-conduit/VideoConduit.cpp +++ b/media/webrtc/signaling/src/media-conduit/VideoConduit.cpp @@ -578,6 +578,7 @@ WebrtcVideoConduit::ConfigureSendMediaCodec(const VideoCodecConfig* codecConfig) video_stream.max_qp = kQpMax; simulcast_config.jsScaleDownBy = simulcastEncoding.constraints.scaleDownBy; simulcast_config.jsMaxBitrate = simulcastEncoding.constraints.maxBr; // bps + mSendStreamConfig.rtp.rids.push_back(simulcastEncoding.rid); if (codecConfig->mName == "H264") { if (codecConfig->mEncodingConstraints.maxMbps > 0) { diff --git a/media/webrtc/trunk/webrtc/modules/rtp_rtcp/source/rtp_sender.cc b/media/webrtc/trunk/webrtc/modules/rtp_rtcp/source/rtp_sender.cc index 3072a512ab97..01cf0a6bee22 100644 --- a/media/webrtc/trunk/webrtc/modules/rtp_rtcp/source/rtp_sender.cc +++ b/media/webrtc/trunk/webrtc/modules/rtp_rtcp/source/rtp_sender.cc @@ -204,6 +204,10 @@ RTPSender::~RTPSender() { delete it->second; payload_type_map_.erase(it); } + + if (rid_) { + delete[] rid_; + } } void RTPSender::SetTargetBitrate(uint32_t bitrate) { diff --git a/media/webrtc/trunk/webrtc/video/video_send_stream.cc b/media/webrtc/trunk/webrtc/video/video_send_stream.cc index fd7c8079ef43..ae75d38b0464 100644 --- a/media/webrtc/trunk/webrtc/video/video_send_stream.cc +++ b/media/webrtc/trunk/webrtc/video/video_send_stream.cc @@ -185,7 +185,8 @@ VideoSendStream::VideoSendStream( } else if (extension == RtpExtension::kTransportSequenceNumber) { RTC_CHECK_EQ(0, vie_channel_->SetSendTransportSequenceNumber(true, id)); } else if (extension == RtpExtension::kRtpStreamId) { - RTC_CHECK_EQ(0, vie_channel_->SetSendRtpStreamId(true,id)); + RTC_CHECK_EQ(ssrcs.size(), config_.rtp.rids.size()); + RTC_CHECK_EQ(0, vie_channel_->SetSendRtpStreamId(true,id,config_.rtp.rids)); } else { RTC_NOTREACHED() << "Registering unsupported RTP extension."; } diff --git a/media/webrtc/trunk/webrtc/video/vie_channel.cc b/media/webrtc/trunk/webrtc/video/vie_channel.cc index 03527a2f07b9..4b7d72e54f56 100644 --- a/media/webrtc/trunk/webrtc/video/vie_channel.cc +++ b/media/webrtc/trunk/webrtc/video/vie_channel.cc @@ -655,23 +655,24 @@ int ViEChannel::SetReceiveTransportSequenceNumber(bool enable, int id) { return vie_receiver_.SetReceiveTransportSequenceNumber(enable, id) ? 0 : -1; } -int ViEChannel::SetSendRtpStreamId(bool enable, int id) { //}, const char *rid) - CriticalSectionScoped cs(crit_.get()); +int ViEChannel::SetSendRtpStreamId(bool enable, int id, + std::vector rids) { + for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_) { + rtp_rtcp->DeregisterSendRtpHeaderExtension( + kRtpExtensionRtpStreamId); + } + if (!enable) { + return 0; + } int error = 0; - if (enable) { - // Enable the extension, but disable possible old id to avoid errors. - for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_) { - rtp_rtcp->DeregisterSendRtpHeaderExtension( - kRtpExtensionRtpStreamId); - error = rtp_rtcp->RegisterSendRtpHeaderExtension( - kRtpExtensionRtpStreamId, id); - } - // NOTE: simulcast streams must be set via the SetSendCodec() API - } else { - // Disable the extension. - for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_) { - rtp_rtcp->DeregisterSendRtpHeaderExtension( - kRtpExtensionRtpStreamId); + unsigned long i = 0; + // Enable the extension + // NOTE: simulcast streams must be set via the SetSendCodec() API + for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_) { + error |= rtp_rtcp->RegisterSendRtpHeaderExtension( + kRtpExtensionRtpStreamId, id); + if (rids.size() > i) { + rtp_rtcp->SetRID(rids[i++].c_str()); } } return error; diff --git a/media/webrtc/trunk/webrtc/video/vie_channel.h b/media/webrtc/trunk/webrtc/video/vie_channel.h index a1102760851c..c75a8d5c8edd 100644 --- a/media/webrtc/trunk/webrtc/video/vie_channel.h +++ b/media/webrtc/trunk/webrtc/video/vie_channel.h @@ -113,8 +113,8 @@ class ViEChannel : public VCMFrameTypeCallback, int SetReceiveVideoRotationStatus(bool enable, int id); int SetSendTransportSequenceNumber(bool enable, int id); int SetReceiveTransportSequenceNumber(bool enable, int id); - int SetSendRtpStreamId(bool enable, int id); // RtpStreamId (RID) - int SetReceiveRtpStreamId(bool enable, int id); // RtpStreamId (RID) + int SetSendRtpStreamId(bool enable, int id, std::vector rids); + int SetReceiveRtpStreamId(bool enable, int id); void SetRtcpXrRrtrStatus(bool enable); void EnableTMMBR(bool enable); diff --git a/media/webrtc/trunk/webrtc/video_send_stream.h b/media/webrtc/trunk/webrtc/video_send_stream.h index 0d9fa57bef13..03c0c716f5fe 100644 --- a/media/webrtc/trunk/webrtc/video_send_stream.h +++ b/media/webrtc/trunk/webrtc/video_send_stream.h @@ -130,6 +130,8 @@ class VideoSendStream : public SendStream { // RTCP CNAME, see RFC 3550. std::string c_name; + + std::vector rids; } rtp; // Transport for outgoing packets.