Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(341)

Unified Diff: webrtc/media/engine/webrtcvideoengine2.cc

Issue 2882433003: Reduce VideoSendStream recreations due to FlexFEC. (Closed)
Patch Set: perkj comments 1. Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: webrtc/media/engine/webrtcvideoengine2.cc
diff --git a/webrtc/media/engine/webrtcvideoengine2.cc b/webrtc/media/engine/webrtcvideoengine2.cc
index 65833873f68c0e1a6f76edf67cba5fede33405d6..ec0bbcf795fd5c275b201d9265504c4c4d5c5f97 100644
--- a/webrtc/media/engine/webrtcvideoengine2.cc
+++ b/webrtc/media/engine/webrtcvideoengine2.cc
@@ -43,14 +43,18 @@ using DegradationPreference = webrtc::VideoSendStream::DegradationPreference;
namespace cricket {
namespace {
// If this field trial is enabled, we will enable sending FlexFEC and disable
-// sending ULPFEC whenever the former has been negotiated.
-// FlexFEC can only be negotiated when the "flexfec-03" SDP codec is enabled,
-// which is done by enabling the "WebRTC-FlexFEC-03-Advertised" field trial; see
-// internalencoderfactory.cc.
+// sending ULPFEC whenever the former has been negotiated in the SDPs.
bool IsFlexfecFieldTrialEnabled() {
return webrtc::field_trial::IsEnabled("WebRTC-FlexFEC-03");
}
+// If this field trial is enabled, the "flexfec-03" codec may have been
+// advertised as being supported in the local SDP. That means that we must be
+// ready to receive FlexFEC packets. See internalencoderfactory.cc.
+bool IsFlexfecAdvertisedFieldTrialEnabled() {
+ return webrtc::field_trial::IsEnabled("WebRTC-FlexFEC-03-Advertised");
+}
+
// If this field trial is enabled, we will report VideoContentType RTP extension
// in capabilities (thus, it will end up in the default SDP and extension will
// be sent for all key-frames).
@@ -643,12 +647,15 @@ WebRtcVideoChannel2::WebRtcVideoChannel2(
external_encoder_factory_(external_encoder_factory),
external_decoder_factory_(external_decoder_factory),
default_send_options_(options),
- last_stats_log_ms_(-1) {
+ last_stats_log_ms_(-1),
+ map_flexfec_recv_(IsFlexfecAdvertisedFieldTrialEnabled()),
+ map_flexfec_send_(IsFlexfecFieldTrialEnabled()) {
RTC_DCHECK(thread_checker_.CalledOnValidThread());
rtcp_receiver_report_ssrc_ = kDefaultRtcpReceiverReportSsrc;
sending_ = false;
- recv_codecs_ = MapCodecs(GetSupportedCodecs(external_encoder_factory));
+ recv_codecs_ = MapCodecs(GetSupportedCodecs(external_encoder_factory),
+ map_flexfec_recv_);
}
WebRtcVideoChannel2::~WebRtcVideoChannel2() {
@@ -710,7 +717,7 @@ bool WebRtcVideoChannel2::GetChangedSendParameters(
// Select one of the remote codecs that will be used as send codec.
const rtc::Optional<VideoCodecSettings> selected_send_codec =
- SelectSendVideoCodec(MapCodecs(params.codecs));
+ SelectSendVideoCodec(MapCodecs(params.codecs, map_flexfec_send_));
if (!selected_send_codec) {
LOG(LS_ERROR) << "No video codecs supported.";
@@ -951,7 +958,7 @@ bool WebRtcVideoChannel2::GetChangedRecvParameters(
// Handle receive codecs.
const std::vector<VideoCodecSettings> mapped_codecs =
- MapCodecs(params.codecs);
+ MapCodecs(params.codecs, map_flexfec_recv_);
if (mapped_codecs.empty()) {
LOG(LS_ERROR) << "SetRecvParameters called without any video codecs.";
return false;
@@ -1121,7 +1128,7 @@ bool WebRtcVideoChannel2::AddSendStream(const StreamParams& sp) {
call_, sp, std::move(config), default_send_options_,
external_encoder_factory_, video_config_.enable_cpu_overuse_detection,
bitrate_config_.max_bitrate_bps, send_codec_, send_rtp_extensions_,
- send_params_);
+ send_params_, map_flexfec_send_);
uint32_t ssrc = sp.first_ssrc();
RTC_DCHECK(ssrc != 0);
@@ -1274,7 +1281,8 @@ void WebRtcVideoChannel2::ConfigureReceiverRtp(
config->rtp.extensions = recv_rtp_extensions_;
// TODO(brandtr): Generalize when we add support for multistream protection.
- if (sp.GetFecFrSsrc(ssrc, &flexfec_config->remote_ssrc)) {
+ if (map_flexfec_recv_ &&
+ sp.GetFecFrSsrc(ssrc, &flexfec_config->remote_ssrc)) {
flexfec_config->protected_media_ssrcs = {ssrc};
flexfec_config->local_ssrc = config->rtp.local_ssrc;
flexfec_config->rtcp_mode = config->rtp.rtcp_mode;
@@ -1572,7 +1580,8 @@ WebRtcVideoChannel2::WebRtcVideoSendStream::WebRtcVideoSendStream(
const rtc::Optional<std::vector<webrtc::RtpExtension>>& rtp_extensions,
// TODO(deadbeef): Don't duplicate information between send_params,
// rtp_extensions, options, etc.
- const VideoSendParameters& send_params)
+ const VideoSendParameters& send_params,
+ bool map_flexfec_send)
: worker_thread_(rtc::Thread::Current()),
ssrcs_(sp.ssrcs),
ssrc_groups_(sp.ssrc_groups),
@@ -1604,13 +1613,13 @@ WebRtcVideoChannel2::WebRtcVideoSendStream::WebRtcVideoSendStream(
// FlexFEC SSRCs.
// TODO(brandtr): This code needs to be generalized when we add support for
// multistream protection.
- if (IsFlexfecFieldTrialEnabled()) {
+ if (map_flexfec_send) {
perkj_webrtc 2017/05/12 12:05:05 rename variable or keep function call. is_flexfec_
brandtr 2017/05/15 12:24:13 Kept function call.
uint32_t flexfec_ssrc;
bool flexfec_enabled = false;
for (uint32_t primary_ssrc : parameters_.config.rtp.ssrcs) {
if (sp.GetFecFrSsrc(primary_ssrc, &flexfec_ssrc)) {
if (flexfec_enabled) {
- LOG(LS_INFO) << "Multiple FlexFEC streams proposed by remote, but "
+ LOG(LS_INFO) << "Multiple FlexFEC streams in local SDP, but "
"our implementation only supports a single FlexFEC "
"stream. Will not enable FlexFEC for proposed "
"stream with SSRC: "
@@ -1785,10 +1794,8 @@ void WebRtcVideoChannel2::WebRtcVideoSendStream::SetCodec(
parameters_.config.encoder_settings.internal_source = false;
}
parameters_.config.rtp.ulpfec = codec_settings.ulpfec;
- if (IsFlexfecFieldTrialEnabled()) {
- parameters_.config.rtp.flexfec.payload_type =
- codec_settings.flexfec_payload_type;
- }
+ parameters_.config.rtp.flexfec.payload_type =
+ codec_settings.flexfec_payload_type;
// Set RTX payload type if RTX is enabled.
if (!parameters_.config.rtp.rtx.ssrcs.empty()) {
@@ -2502,7 +2509,8 @@ bool WebRtcVideoChannel2::VideoCodecSettings::operator!=(
}
std::vector<WebRtcVideoChannel2::VideoCodecSettings>
-WebRtcVideoChannel2::MapCodecs(const std::vector<VideoCodec>& codecs) {
+WebRtcVideoChannel2::MapCodecs(const std::vector<VideoCodec>& codecs,
+ bool map_flexfec) {
perkj_webrtc 2017/05/12 12:05:05 remove and use IsFlexfecFieldTrialEnabled() in her
brandtr 2017/05/15 12:24:13 Done. As was clear from our F2F discussion, howev
RTC_DCHECK(!codecs.empty());
std::vector<VideoCodecSettings> video_codecs;
@@ -2594,7 +2602,13 @@ WebRtcVideoChannel2::MapCodecs(const std::vector<VideoCodec>& codecs) {
for (size_t i = 0; i < video_codecs.size(); ++i) {
video_codecs[i].ulpfec = ulpfec_config;
- video_codecs[i].flexfec_payload_type = flexfec_payload_type;
+ // Only map the FlexFEC payload type if we know that FlexFEC will actually
+ // be used. By doing that, we reduce the number of
+ // VideoReceiveStream/VideoSendStream object recreations during SDP
+ // renegotiation.
+ if (map_flexfec) {
+ video_codecs[i].flexfec_payload_type = flexfec_payload_type;
+ }
if (rtx_mapping[video_codecs[i].codec.id] != 0 &&
rtx_mapping[video_codecs[i].codec.id] !=
ulpfec_config.red_payload_type) {

Powered by Google App Engine
This is Rietveld 408576698