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

Side by Side Diff: webrtc/video/video_send_stream.cc

Issue 1687303002: Don't send FEC for H.264 with NACK enabled. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: add log warning Created 4 years, 10 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 unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source 5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
103 ss << ", render_delay_ms: " << render_delay_ms; 103 ss << ", render_delay_ms: " << render_delay_ms;
104 ss << ", target_delay_ms: " << target_delay_ms; 104 ss << ", target_delay_ms: " << target_delay_ms;
105 ss << ", suspend_below_min_bitrate: " << (suspend_below_min_bitrate ? "on" 105 ss << ", suspend_below_min_bitrate: " << (suspend_below_min_bitrate ? "on"
106 : "off"); 106 : "off");
107 ss << '}'; 107 ss << '}';
108 return ss.str(); 108 return ss.str();
109 } 109 }
110 110
111 namespace { 111 namespace {
112 112
113 VideoCodecType PayloadNameToCodecType(const std::string& payload_name) {
114 if (payload_name == "VP8")
115 return kVideoCodecVP8;
116 if (payload_name == "VP9")
117 return kVideoCodecVP9;
118 if (payload_name == "H264")
119 return kVideoCodecH264;
120 return kVideoCodecGeneric;
121 }
122
123 bool PayloadTypeSupportsSkippingFecPackets(const std::string& payload_name) {
124 switch (PayloadNameToCodecType(payload_name)) {
125 case kVideoCodecVP8:
126 case kVideoCodecVP9:
127 return true;
128 case kVideoCodecH264:
129 case kVideoCodecGeneric:
130 return false;
131 case kVideoCodecI420:
132 case kVideoCodecRED:
133 case kVideoCodecULPFEC:
134 case kVideoCodecUnknown:
135 RTC_NOTREACHED();
136 return false;
137 }
138 RTC_NOTREACHED();
139 return false;
140 }
141
113 CpuOveruseOptions GetCpuOveruseOptions(bool full_overuse_time) { 142 CpuOveruseOptions GetCpuOveruseOptions(bool full_overuse_time) {
114 CpuOveruseOptions options; 143 CpuOveruseOptions options;
115 if (full_overuse_time) { 144 if (full_overuse_time) {
116 options.low_encode_usage_threshold_percent = 100; 145 options.low_encode_usage_threshold_percent = 100;
117 options.high_encode_usage_threshold_percent = 120; 146 options.high_encode_usage_threshold_percent = 120;
118 } 147 }
119 return options; 148 return options;
120 } 149 }
121 } // namespace 150 } // namespace
122 151
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
213 RTC_NOTREACHED() << "Registering unsupported RTP extension."; 242 RTC_NOTREACHED() << "Registering unsupported RTP extension.";
214 } 243 }
215 } 244 }
216 245
217 RtpRtcp* rtp_module = vie_channel_->rtp_rtcp(); 246 RtpRtcp* rtp_module = vie_channel_->rtp_rtcp();
218 remb_->AddRembSender(rtp_module); 247 remb_->AddRembSender(rtp_module);
219 rtp_module->SetREMBStatus(true); 248 rtp_module->SetREMBStatus(true);
220 249
221 // Enable NACK, FEC or both. 250 // Enable NACK, FEC or both.
222 const bool enable_protection_nack = config_.rtp.nack.rtp_history_ms > 0; 251 const bool enable_protection_nack = config_.rtp.nack.rtp_history_ms > 0;
223 const bool enable_protection_fec = config_.rtp.fec.red_payload_type != -1; 252 bool enable_protection_fec = config_.rtp.fec.red_payload_type != -1;
253 // Payload types without picture ID cannot determine that a stream is complete
254 // without retransmitting FEC, so using FEC + NACK for H.264 (for instance) is
255 // a waste of bandwidth since FEC packets still have to be transmitted. Note
256 // that this is not the case with FLEXFEC.
257 if (enable_protection_nack &&
258 !PayloadTypeSupportsSkippingFecPackets(
259 config_.encoder_settings.payload_name)) {
260 LOG(LS_WARNING) << "Transmitting payload type without picture ID using"
261 "NACK+FEC is a waste of bandwidth since FEC packets "
262 "also have to be retransmitted. Disabling FEC.";
263 enable_protection_fec = false;
264 }
224 // TODO(changbin): Should set RTX for RED mapping in RTP sender in future. 265 // TODO(changbin): Should set RTX for RED mapping in RTP sender in future.
225 vie_channel_->SetProtectionMode(enable_protection_nack, enable_protection_fec, 266 vie_channel_->SetProtectionMode(enable_protection_nack, enable_protection_fec,
226 config_.rtp.fec.red_payload_type, 267 config_.rtp.fec.red_payload_type,
227 config_.rtp.fec.ulpfec_payload_type); 268 config_.rtp.fec.ulpfec_payload_type);
228 vie_encoder_->SetProtectionMethod(enable_protection_nack, 269 vie_encoder_->SetProtectionMethod(enable_protection_nack,
229 enable_protection_fec); 270 enable_protection_fec);
230 271
231 ConfigureSsrcs(); 272 ConfigureSsrcs();
232 273
233 vie_channel_->SetRTCPCName(config_.rtp.c_name.c_str()); 274 vie_channel_->SetRTCPCName(config_.rtp.c_name.c_str());
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
329 bool VideoSendStream::ReconfigureVideoEncoder( 370 bool VideoSendStream::ReconfigureVideoEncoder(
330 const VideoEncoderConfig& config) { 371 const VideoEncoderConfig& config) {
331 TRACE_EVENT0("webrtc", "VideoSendStream::(Re)configureVideoEncoder"); 372 TRACE_EVENT0("webrtc", "VideoSendStream::(Re)configureVideoEncoder");
332 LOG(LS_INFO) << "(Re)configureVideoEncoder: " << config.ToString(); 373 LOG(LS_INFO) << "(Re)configureVideoEncoder: " << config.ToString();
333 const std::vector<VideoStream>& streams = config.streams; 374 const std::vector<VideoStream>& streams = config.streams;
334 RTC_DCHECK(!streams.empty()); 375 RTC_DCHECK(!streams.empty());
335 RTC_DCHECK_GE(config_.rtp.ssrcs.size(), streams.size()); 376 RTC_DCHECK_GE(config_.rtp.ssrcs.size(), streams.size());
336 377
337 VideoCodec video_codec; 378 VideoCodec video_codec;
338 memset(&video_codec, 0, sizeof(video_codec)); 379 memset(&video_codec, 0, sizeof(video_codec));
339 if (config_.encoder_settings.payload_name == "VP8") { 380 video_codec.codecType =
340 video_codec.codecType = kVideoCodecVP8; 381 PayloadNameToCodecType(config_.encoder_settings.payload_name);
341 } else if (config_.encoder_settings.payload_name == "VP9") {
342 video_codec.codecType = kVideoCodecVP9;
343 } else if (config_.encoder_settings.payload_name == "H264") {
344 video_codec.codecType = kVideoCodecH264;
345 } else {
346 video_codec.codecType = kVideoCodecGeneric;
347 }
348 382
349 switch (config.content_type) { 383 switch (config.content_type) {
350 case VideoEncoderConfig::ContentType::kRealtimeVideo: 384 case VideoEncoderConfig::ContentType::kRealtimeVideo:
351 video_codec.mode = kRealtimeVideo; 385 video_codec.mode = kRealtimeVideo;
352 break; 386 break;
353 case VideoEncoderConfig::ContentType::kScreen: 387 case VideoEncoderConfig::ContentType::kScreen:
354 video_codec.mode = kScreensharing; 388 video_codec.mode = kScreensharing;
355 if (config.streams.size() == 1 && 389 if (config.streams.size() == 1 &&
356 config.streams[0].temporal_layer_thresholds_bps.size() == 1) { 390 config.streams[0].temporal_layer_thresholds_bps.size() == 1) {
357 video_codec.targetBitrate = 391 video_codec.targetBitrate =
(...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after
612 vie_encoder_->SetSsrcs(used_ssrcs); 646 vie_encoder_->SetSsrcs(used_ssrcs);
613 647
614 // Restart the media flow 648 // Restart the media flow
615 vie_encoder_->Restart(); 649 vie_encoder_->Restart();
616 650
617 return true; 651 return true;
618 } 652 }
619 653
620 } // namespace internal 654 } // namespace internal
621 } // namespace webrtc 655 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698