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

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

Issue 1692783005: Revert of Don't send FEC for H.264 with NACK enabled. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: 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
« no previous file with comments | « webrtc/video/end_to_end_tests.cc ('k') | webrtc/video/video_send_stream_tests.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
100 ss << ", render_delay_ms: " << render_delay_ms; 100 ss << ", render_delay_ms: " << render_delay_ms;
101 ss << ", target_delay_ms: " << target_delay_ms; 101 ss << ", target_delay_ms: " << target_delay_ms;
102 ss << ", suspend_below_min_bitrate: " << (suspend_below_min_bitrate ? "on" 102 ss << ", suspend_below_min_bitrate: " << (suspend_below_min_bitrate ? "on"
103 : "off"); 103 : "off");
104 ss << '}'; 104 ss << '}';
105 return ss.str(); 105 return ss.str();
106 } 106 }
107 107
108 namespace { 108 namespace {
109 109
110 VideoCodecType PayloadNameToCodecType(const std::string& payload_name) {
111 if (payload_name == "VP8")
112 return kVideoCodecVP8;
113 if (payload_name == "VP9")
114 return kVideoCodecVP9;
115 if (payload_name == "H264")
116 return kVideoCodecH264;
117 return kVideoCodecGeneric;
118 }
119
120 bool PayloadTypeSupportsSkippingFecPackets(const std::string& payload_name) {
121 switch (PayloadNameToCodecType(payload_name)) {
122 case kVideoCodecVP8:
123 case kVideoCodecVP9:
124 return true;
125 case kVideoCodecH264:
126 case kVideoCodecGeneric:
127 return false;
128 case kVideoCodecI420:
129 case kVideoCodecRED:
130 case kVideoCodecULPFEC:
131 case kVideoCodecUnknown:
132 RTC_NOTREACHED();
133 return false;
134 }
135 RTC_NOTREACHED();
136 return false;
137 }
138
139 CpuOveruseOptions GetCpuOveruseOptions(bool full_overuse_time) { 110 CpuOveruseOptions GetCpuOveruseOptions(bool full_overuse_time) {
140 CpuOveruseOptions options; 111 CpuOveruseOptions options;
141 if (full_overuse_time) { 112 if (full_overuse_time) {
142 options.low_encode_usage_threshold_percent = 100; 113 options.low_encode_usage_threshold_percent = 100;
143 options.high_encode_usage_threshold_percent = 120; 114 options.high_encode_usage_threshold_percent = 120;
144 } 115 }
145 return options; 116 return options;
146 } 117 }
147 } // namespace 118 } // namespace
148 119
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
237 RTC_NOTREACHED() << "Registering unsupported RTP extension."; 208 RTC_NOTREACHED() << "Registering unsupported RTP extension.";
238 } 209 }
239 } 210 }
240 211
241 RtpRtcp* rtp_module = vie_channel_.rtp_rtcp(); 212 RtpRtcp* rtp_module = vie_channel_.rtp_rtcp();
242 remb_->AddRembSender(rtp_module); 213 remb_->AddRembSender(rtp_module);
243 rtp_module->SetREMBStatus(true); 214 rtp_module->SetREMBStatus(true);
244 215
245 // Enable NACK, FEC or both. 216 // Enable NACK, FEC or both.
246 const bool enable_protection_nack = config_.rtp.nack.rtp_history_ms > 0; 217 const bool enable_protection_nack = config_.rtp.nack.rtp_history_ms > 0;
247 bool enable_protection_fec = config_.rtp.fec.red_payload_type != -1; 218 const bool enable_protection_fec = config_.rtp.fec.red_payload_type != -1;
248 // Payload types without picture ID cannot determine that a stream is complete
249 // without retransmitting FEC, so using FEC + NACK for H.264 (for instance) is
250 // a waste of bandwidth since FEC packets still have to be transmitted. Note
251 // that this is not the case with FLEXFEC.
252 if (enable_protection_nack &&
253 !PayloadTypeSupportsSkippingFecPackets(
254 config_.encoder_settings.payload_name)) {
255 LOG(LS_WARNING) << "Transmitting payload type without picture ID using"
256 "NACK+FEC is a waste of bandwidth since FEC packets "
257 "also have to be retransmitted. Disabling FEC.";
258 enable_protection_fec = false;
259 }
260 // TODO(changbin): Should set RTX for RED mapping in RTP sender in future. 219 // TODO(changbin): Should set RTX for RED mapping in RTP sender in future.
261 vie_channel_.SetProtectionMode(enable_protection_nack, enable_protection_fec, 220 vie_channel_.SetProtectionMode(enable_protection_nack, enable_protection_fec,
262 config_.rtp.fec.red_payload_type, 221 config_.rtp.fec.red_payload_type,
263 config_.rtp.fec.ulpfec_payload_type); 222 config_.rtp.fec.ulpfec_payload_type);
264 vie_encoder_.SetProtectionMethod(enable_protection_nack, 223 vie_encoder_.SetProtectionMethod(enable_protection_nack,
265 enable_protection_fec); 224 enable_protection_fec);
266 225
267 ConfigureSsrcs(); 226 ConfigureSsrcs();
268 227
269 vie_channel_.SetRTCPCName(config_.rtp.c_name.c_str()); 228 vie_channel_.SetRTCPCName(config_.rtp.c_name.c_str());
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
358 bool VideoSendStream::ReconfigureVideoEncoder( 317 bool VideoSendStream::ReconfigureVideoEncoder(
359 const VideoEncoderConfig& config) { 318 const VideoEncoderConfig& config) {
360 TRACE_EVENT0("webrtc", "VideoSendStream::(Re)configureVideoEncoder"); 319 TRACE_EVENT0("webrtc", "VideoSendStream::(Re)configureVideoEncoder");
361 LOG(LS_INFO) << "(Re)configureVideoEncoder: " << config.ToString(); 320 LOG(LS_INFO) << "(Re)configureVideoEncoder: " << config.ToString();
362 const std::vector<VideoStream>& streams = config.streams; 321 const std::vector<VideoStream>& streams = config.streams;
363 RTC_DCHECK(!streams.empty()); 322 RTC_DCHECK(!streams.empty());
364 RTC_DCHECK_GE(config_.rtp.ssrcs.size(), streams.size()); 323 RTC_DCHECK_GE(config_.rtp.ssrcs.size(), streams.size());
365 324
366 VideoCodec video_codec; 325 VideoCodec video_codec;
367 memset(&video_codec, 0, sizeof(video_codec)); 326 memset(&video_codec, 0, sizeof(video_codec));
368 video_codec.codecType = 327 if (config_.encoder_settings.payload_name == "VP8") {
369 PayloadNameToCodecType(config_.encoder_settings.payload_name); 328 video_codec.codecType = kVideoCodecVP8;
329 } else if (config_.encoder_settings.payload_name == "VP9") {
330 video_codec.codecType = kVideoCodecVP9;
331 } else if (config_.encoder_settings.payload_name == "H264") {
332 video_codec.codecType = kVideoCodecH264;
333 } else {
334 video_codec.codecType = kVideoCodecGeneric;
335 }
370 336
371 switch (config.content_type) { 337 switch (config.content_type) {
372 case VideoEncoderConfig::ContentType::kRealtimeVideo: 338 case VideoEncoderConfig::ContentType::kRealtimeVideo:
373 video_codec.mode = kRealtimeVideo; 339 video_codec.mode = kRealtimeVideo;
374 break; 340 break;
375 case VideoEncoderConfig::ContentType::kScreen: 341 case VideoEncoderConfig::ContentType::kScreen:
376 video_codec.mode = kScreensharing; 342 video_codec.mode = kScreensharing;
377 if (config.streams.size() == 1 && 343 if (config.streams.size() == 1 &&
378 config.streams[0].temporal_layer_thresholds_bps.size() == 1) { 344 config.streams[0].temporal_layer_thresholds_bps.size() == 1) {
379 video_codec.targetBitrate = 345 video_codec.targetBitrate =
(...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after
632 used_ssrcs.resize(static_cast<size_t>(video_codec.numberOfSimulcastStreams)); 598 used_ssrcs.resize(static_cast<size_t>(video_codec.numberOfSimulcastStreams));
633 vie_encoder_.SetSsrcs(used_ssrcs); 599 vie_encoder_.SetSsrcs(used_ssrcs);
634 600
635 // Restart the media flow 601 // Restart the media flow
636 vie_encoder_.Restart(); 602 vie_encoder_.Restart();
637 603
638 return true; 604 return true;
639 } 605 }
640 } // namespace internal 606 } // namespace internal
641 } // namespace webrtc 607 } // namespace webrtc
OLDNEW
« no previous file with comments | « webrtc/video/end_to_end_tests.cc ('k') | webrtc/video/video_send_stream_tests.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698