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

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

Issue 2469093003: Remove RED/RTX workaround from sender/receiver and VideoEngine2. (Closed)
Patch Set: Fix warning message. Created 4 years, 1 month 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/rtp_stream_receiver.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 #include "webrtc/video/video_send_stream.h" 10 #include "webrtc/video/video_send_stream.h"
(...skipping 924 matching lines...) Expand 10 before | Expand all | Expand 10 after
935 encoded_image, codec_specific_info->codecType); 935 encoded_image, codec_specific_info->codecType);
936 RTC_DCHECK(ok); 936 RTC_DCHECK(ok);
937 } 937 }
938 } 938 }
939 939
940 return result; 940 return result;
941 } 941 }
942 942
943 void VideoSendStreamImpl::ConfigureProtection() { 943 void VideoSendStreamImpl::ConfigureProtection() {
944 RTC_DCHECK_RUN_ON(worker_queue_); 944 RTC_DCHECK_RUN_ON(worker_queue_);
945 // Enable NACK, FEC or both. 945
946 const bool enable_protection_nack = config_->rtp.nack.rtp_history_ms > 0; 946 const bool nack_enabled = config_->rtp.nack.rtp_history_ms > 0;
947 const int red_payload_type = config_->rtp.ulpfec.red_payload_type; 947 int red_payload_type = config_->rtp.ulpfec.red_payload_type;
948 int ulpfec_payload_type = config_->rtp.ulpfec.ulpfec_payload_type; 948 int ulpfec_payload_type = config_->rtp.ulpfec.ulpfec_payload_type;
949
950 // Shorthands.
951 auto IsRedEnabled = [&]() { return red_payload_type >= 0; };
952 auto IsUlpfecEnabled = [&]() { return ulpfec_payload_type >= 0; };
953 auto DisableUlpfec = [&]() { ulpfec_payload_type = -1; };
954
949 // Payload types without picture ID cannot determine that a stream is complete 955 // Payload types without picture ID cannot determine that a stream is complete
950 // without retransmitting FEC, so using FEC + NACK for H.264 (for instance) is 956 // without retransmitting FEC, so using ULPFEC + NACK for H.264 (for instance)
951 // a waste of bandwidth since FEC packets still have to be transmitted. Note 957 // is a waste of bandwidth since FEC packets still have to be transmitted.
952 // that this is not the case with FLEXFEC. 958 // Note that this is not the case with FlexFEC.
953 if (enable_protection_nack && 959 if (nack_enabled && IsUlpfecEnabled() &&
954 !PayloadTypeSupportsSkippingFecPackets( 960 !PayloadTypeSupportsSkippingFecPackets(
955 config_->encoder_settings.payload_name)) { 961 config_->encoder_settings.payload_name)) {
956 LOG(LS_WARNING) << "Transmitting payload type without picture ID using" 962 LOG(LS_WARNING)
957 "NACK+FEC is a waste of bandwidth since FEC packets " 963 << "Transmitting payload type without picture ID using "
958 "also have to be retransmitted. Disabling FEC."; 964 "NACK+ULPFEC is a waste of bandwidth since ULPFEC packets "
959 ulpfec_payload_type = -1; 965 "also have to be retransmitted. Disabling ULPFEC.";
966 DisableUlpfec();
960 } 967 }
961 968
962 // TODO(brandtr): Remove the workaround described below. 969 // Verify payload types.
963 // 970 //
964 // In theory, we should enable RED if and only if ULPFEC is also enabled, 971 // Due to how old receivers work, we need to always send RED if it has been
965 // and vice versa. (We only support ULPFEC over RED, not multiplexed in any 972 // negotiated. This is a remnant of an old RED/RTX workaround, see
966 // other way.) However, due to the RED/RTX workaround introduced here: 973 // https://codereview.webrtc.org/2469093003.
967 // https://codereview.webrtc.org/1649493004, we need to send media over RED 974 // TODO(brandtr): This change went into M56, so we can remove it in ~M59.
968 // (even if ULPFEC is disabled), whenever RED has been negotiated in the SDP. 975 // At that time, we can disable RED whenever ULPFEC is disabled, as there is
969 // This is due to the associated payload type is hardcoded to be RED in the 976 // no point in using RED without ULPFEC.
970 // receiver, whenever RED appears in the SDP. If we would not send media over 977 if (IsRedEnabled()) {
971 // RED in this case, the RTX receiver would recover retransmitted packets
972 // using the wrong payload type.
973
974 // Verify validity of provided payload types.
975 if (red_payload_type != -1) {
976 RTC_DCHECK_GE(red_payload_type, 0); 978 RTC_DCHECK_GE(red_payload_type, 0);
977 RTC_DCHECK_LE(red_payload_type, 127); 979 RTC_DCHECK_LE(red_payload_type, 127);
978 } 980 }
979 if (ulpfec_payload_type != -1) { 981 if (IsUlpfecEnabled()) {
980 RTC_DCHECK_GE(ulpfec_payload_type, 0); 982 RTC_DCHECK_GE(ulpfec_payload_type, 0);
981 RTC_DCHECK_LE(ulpfec_payload_type, 127); 983 RTC_DCHECK_LE(ulpfec_payload_type, 127);
984 if (!IsRedEnabled()) {
985 LOG(LS_WARNING)
986 << "ULPFEC is enabled but RED is disabled. Disabling ULPFEC.";
987 DisableUlpfec();
988 }
982 } 989 }
983 990
984 for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_) { 991 for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_) {
985 // Set NACK. 992 // Set NACK.
986 rtp_rtcp->SetStorePacketsStatus( 993 rtp_rtcp->SetStorePacketsStatus(
987 enable_protection_nack || congestion_controller_->pacer(), 994 nack_enabled || congestion_controller_->pacer(),
988 kMinSendSidePacketHistorySize); 995 kMinSendSidePacketHistorySize);
989 // Set FEC. 996 // Set RED/ULPFEC information.
990 for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_) { 997 for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_) {
991 rtp_rtcp->SetUlpfecConfig(red_payload_type, ulpfec_payload_type); 998 rtp_rtcp->SetUlpfecConfig(red_payload_type, ulpfec_payload_type);
992 } 999 }
993 } 1000 }
994 1001
995 const bool enable_protection_fec = (ulpfec_payload_type != -1); 1002 protection_bitrate_calculator_.SetProtectionMethod(IsUlpfecEnabled(),
996 protection_bitrate_calculator_.SetProtectionMethod(enable_protection_fec, 1003 nack_enabled);
997 enable_protection_nack);
998 } 1004 }
999 1005
1000 void VideoSendStreamImpl::ConfigureSsrcs() { 1006 void VideoSendStreamImpl::ConfigureSsrcs() {
1001 RTC_DCHECK_RUN_ON(worker_queue_); 1007 RTC_DCHECK_RUN_ON(worker_queue_);
1002 // Configure regular SSRCs. 1008 // Configure regular SSRCs.
1003 for (size_t i = 0; i < config_->rtp.ssrcs.size(); ++i) { 1009 for (size_t i = 0; i < config_->rtp.ssrcs.size(); ++i) {
1004 uint32_t ssrc = config_->rtp.ssrcs[i]; 1010 uint32_t ssrc = config_->rtp.ssrcs[i];
1005 RtpRtcp* const rtp_rtcp = rtp_rtcp_modules_[i]; 1011 RtpRtcp* const rtp_rtcp = rtp_rtcp_modules_[i];
1006 rtp_rtcp->SetSSRC(ssrc); 1012 rtp_rtcp->SetSSRC(ssrc);
1007 1013
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after
1133 } 1139 }
1134 1140
1135 void VideoSendStreamImpl::SetTransportOverhead( 1141 void VideoSendStreamImpl::SetTransportOverhead(
1136 int transport_overhead_per_packet) { 1142 int transport_overhead_per_packet) {
1137 for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_) 1143 for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_)
1138 rtp_rtcp->SetTransportOverhead(transport_overhead_per_packet); 1144 rtp_rtcp->SetTransportOverhead(transport_overhead_per_packet);
1139 } 1145 }
1140 1146
1141 } // namespace internal 1147 } // namespace internal
1142 } // namespace webrtc 1148 } // namespace webrtc
OLDNEW
« no previous file with comments | « webrtc/video/rtp_stream_receiver.cc ('k') | webrtc/video/video_send_stream_tests.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698