| OLD | NEW | 
|---|
| 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 114 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 125   ss << ", max_packet_size: " << max_packet_size; | 125   ss << ", max_packet_size: " << max_packet_size; | 
| 126   ss << ", extensions: ["; | 126   ss << ", extensions: ["; | 
| 127   for (size_t i = 0; i < extensions.size(); ++i) { | 127   for (size_t i = 0; i < extensions.size(); ++i) { | 
| 128     ss << extensions[i].ToString(); | 128     ss << extensions[i].ToString(); | 
| 129     if (i != extensions.size() - 1) | 129     if (i != extensions.size() - 1) | 
| 130       ss << ", "; | 130       ss << ", "; | 
| 131   } | 131   } | 
| 132   ss << ']'; | 132   ss << ']'; | 
| 133 | 133 | 
| 134   ss << ", nack: {rtp_history_ms: " << nack.rtp_history_ms << '}'; | 134   ss << ", nack: {rtp_history_ms: " << nack.rtp_history_ms << '}'; | 
| 135   ss << ", fec: " << fec.ToString(); | 135   ss << ", ulpfec: " << ulpfec.ToString(); | 
| 136   ss << ", rtx: " << rtx.ToString(); | 136   ss << ", rtx: " << rtx.ToString(); | 
| 137   ss << ", c_name: " << c_name; | 137   ss << ", c_name: " << c_name; | 
| 138   ss << '}'; | 138   ss << '}'; | 
| 139   return ss.str(); | 139   return ss.str(); | 
| 140 } | 140 } | 
| 141 | 141 | 
| 142 std::string VideoSendStream::Config::ToString() const { | 142 std::string VideoSendStream::Config::ToString() const { | 
| 143   std::stringstream ss; | 143   std::stringstream ss; | 
| 144   ss << "{encoder_settings: " << encoder_settings.ToString(); | 144   ss << "{encoder_settings: " << encoder_settings.ToString(); | 
| 145   ss << ", rtp: " << rtp.ToString(); | 145   ss << ", rtp: " << rtp.ToString(); | 
| (...skipping 769 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 915     } | 915     } | 
| 916   } | 916   } | 
| 917 | 917 | 
| 918   return result; | 918   return result; | 
| 919 } | 919 } | 
| 920 | 920 | 
| 921 void VideoSendStreamImpl::ConfigureProtection() { | 921 void VideoSendStreamImpl::ConfigureProtection() { | 
| 922   RTC_DCHECK_RUN_ON(worker_queue_); | 922   RTC_DCHECK_RUN_ON(worker_queue_); | 
| 923   // Enable NACK, FEC or both. | 923   // Enable NACK, FEC or both. | 
| 924   const bool enable_protection_nack = config_->rtp.nack.rtp_history_ms > 0; | 924   const bool enable_protection_nack = config_->rtp.nack.rtp_history_ms > 0; | 
| 925   bool enable_protection_fec = config_->rtp.fec.ulpfec_payload_type != -1; | 925   bool enable_protection_fec = config_->rtp.ulpfec.ulpfec_payload_type != -1; | 
| 926   // Payload types without picture ID cannot determine that a stream is complete | 926   // Payload types without picture ID cannot determine that a stream is complete | 
| 927   // without retransmitting FEC, so using FEC + NACK for H.264 (for instance) is | 927   // without retransmitting FEC, so using FEC + NACK for H.264 (for instance) is | 
| 928   // a waste of bandwidth since FEC packets still have to be transmitted. Note | 928   // a waste of bandwidth since FEC packets still have to be transmitted. Note | 
| 929   // that this is not the case with FLEXFEC. | 929   // that this is not the case with FLEXFEC. | 
| 930   if (enable_protection_nack && | 930   if (enable_protection_nack && | 
| 931       !PayloadTypeSupportsSkippingFecPackets( | 931       !PayloadTypeSupportsSkippingFecPackets( | 
| 932           config_->encoder_settings.payload_name)) { | 932           config_->encoder_settings.payload_name)) { | 
| 933     LOG(LS_WARNING) << "Transmitting payload type without picture ID using" | 933     LOG(LS_WARNING) << "Transmitting payload type without picture ID using" | 
| 934                        "NACK+FEC is a waste of bandwidth since FEC packets " | 934                        "NACK+FEC is a waste of bandwidth since FEC packets " | 
| 935                        "also have to be retransmitted. Disabling FEC."; | 935                        "also have to be retransmitted. Disabling FEC."; | 
| 936     enable_protection_fec = false; | 936     enable_protection_fec = false; | 
| 937   } | 937   } | 
| 938 | 938 | 
| 939   // Set to valid uint8_ts to be castable later without signed overflows. | 939   // Set to valid uint8_ts to be castable later without signed overflows. | 
| 940   uint8_t payload_type_red = 0; | 940   uint8_t payload_type_red = 0; | 
| 941   uint8_t payload_type_fec = 0; | 941   uint8_t payload_type_fec = 0; | 
| 942 | 942 | 
| 943   // TODO(changbin): Should set RTX for RED mapping in RTP sender in future. | 943   // TODO(changbin): Should set RTX for RED mapping in RTP sender in future. | 
| 944   // Validate payload types. If either RED or FEC payload types are set then | 944   // Validate payload types. If either RED or FEC payload types are set then | 
| 945   // both should be. If FEC is enabled then they both have to be set. | 945   // both should be. If FEC is enabled then they both have to be set. | 
| 946   if (config_->rtp.fec.red_payload_type != -1) { | 946   if (config_->rtp.ulpfec.red_payload_type != -1) { | 
| 947     RTC_DCHECK_GE(config_->rtp.fec.red_payload_type, 0); | 947     RTC_DCHECK_GE(config_->rtp.ulpfec.red_payload_type, 0); | 
| 948     RTC_DCHECK_LE(config_->rtp.fec.red_payload_type, 127); | 948     RTC_DCHECK_LE(config_->rtp.ulpfec.red_payload_type, 127); | 
| 949     // TODO(holmer): We should only enable red if ulpfec is also enabled, but | 949     // TODO(holmer): We should only enable red if ulpfec is also enabled, but | 
| 950     // but due to an incompatibility issue with previous versions the receiver | 950     // but due to an incompatibility issue with previous versions the receiver | 
| 951     // assumes rtx packets are containing red if it has been configured to | 951     // assumes rtx packets are containing red if it has been configured to | 
| 952     // receive red. Remove this in a few versions once the incompatibility | 952     // receive red. Remove this in a few versions once the incompatibility | 
| 953     // issue is resolved (M53 timeframe). | 953     // issue is resolved (M53 timeframe). | 
| 954     payload_type_red = static_cast<uint8_t>(config_->rtp.fec.red_payload_type); | 954     payload_type_red = | 
|  | 955         static_cast<uint8_t>(config_->rtp.ulpfec.red_payload_type); | 
| 955   } | 956   } | 
| 956   if (config_->rtp.fec.ulpfec_payload_type != -1) { | 957   if (config_->rtp.ulpfec.ulpfec_payload_type != -1) { | 
| 957     RTC_DCHECK_GE(config_->rtp.fec.ulpfec_payload_type, 0); | 958     RTC_DCHECK_GE(config_->rtp.ulpfec.ulpfec_payload_type, 0); | 
| 958     RTC_DCHECK_LE(config_->rtp.fec.ulpfec_payload_type, 127); | 959     RTC_DCHECK_LE(config_->rtp.ulpfec.ulpfec_payload_type, 127); | 
| 959     payload_type_fec = | 960     payload_type_fec = | 
| 960         static_cast<uint8_t>(config_->rtp.fec.ulpfec_payload_type); | 961         static_cast<uint8_t>(config_->rtp.ulpfec.ulpfec_payload_type); | 
| 961   } | 962   } | 
| 962 | 963 | 
| 963   for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_) { | 964   for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_) { | 
| 964     // Set NACK. | 965     // Set NACK. | 
| 965     rtp_rtcp->SetStorePacketsStatus( | 966     rtp_rtcp->SetStorePacketsStatus( | 
| 966         enable_protection_nack || congestion_controller_->pacer(), | 967         enable_protection_nack || congestion_controller_->pacer(), | 
| 967         kMinSendSidePacketHistorySize); | 968         kMinSendSidePacketHistorySize); | 
| 968     // Set FEC. | 969     // Set FEC. | 
| 969     for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_) { | 970     for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_) { | 
| 970       rtp_rtcp->SetGenericFECStatus(enable_protection_fec, payload_type_red, | 971       rtp_rtcp->SetGenericFECStatus(enable_protection_fec, payload_type_red, | 
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1005       rtp_rtcp->SetRtxState(it->second); | 1006       rtp_rtcp->SetRtxState(it->second); | 
| 1006   } | 1007   } | 
| 1007 | 1008 | 
| 1008   // Configure RTX payload types. | 1009   // Configure RTX payload types. | 
| 1009   RTC_DCHECK_GE(config_->rtp.rtx.payload_type, 0); | 1010   RTC_DCHECK_GE(config_->rtp.rtx.payload_type, 0); | 
| 1010   for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_) { | 1011   for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_) { | 
| 1011     rtp_rtcp->SetRtxSendPayloadType(config_->rtp.rtx.payload_type, | 1012     rtp_rtcp->SetRtxSendPayloadType(config_->rtp.rtx.payload_type, | 
| 1012                                     config_->encoder_settings.payload_type); | 1013                                     config_->encoder_settings.payload_type); | 
| 1013     rtp_rtcp->SetRtxSendStatus(kRtxRetransmitted | kRtxRedundantPayloads); | 1014     rtp_rtcp->SetRtxSendStatus(kRtxRetransmitted | kRtxRedundantPayloads); | 
| 1014   } | 1015   } | 
| 1015   if (config_->rtp.fec.red_payload_type != -1 && | 1016   if (config_->rtp.ulpfec.red_payload_type != -1 && | 
| 1016       config_->rtp.fec.red_rtx_payload_type != -1) { | 1017       config_->rtp.ulpfec.red_rtx_payload_type != -1) { | 
| 1017     for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_) { | 1018     for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_) { | 
| 1018       rtp_rtcp->SetRtxSendPayloadType(config_->rtp.fec.red_rtx_payload_type, | 1019       rtp_rtcp->SetRtxSendPayloadType(config_->rtp.ulpfec.red_rtx_payload_type, | 
| 1019                                       config_->rtp.fec.red_payload_type); | 1020                                       config_->rtp.ulpfec.red_payload_type); | 
| 1020     } | 1021     } | 
| 1021   } | 1022   } | 
| 1022 } | 1023 } | 
| 1023 | 1024 | 
| 1024 std::map<uint32_t, RtpState> VideoSendStreamImpl::GetRtpStates() const { | 1025 std::map<uint32_t, RtpState> VideoSendStreamImpl::GetRtpStates() const { | 
| 1025   RTC_DCHECK_RUN_ON(worker_queue_); | 1026   RTC_DCHECK_RUN_ON(worker_queue_); | 
| 1026   std::map<uint32_t, RtpState> rtp_states; | 1027   std::map<uint32_t, RtpState> rtp_states; | 
| 1027   for (size_t i = 0; i < config_->rtp.ssrcs.size(); ++i) { | 1028   for (size_t i = 0; i < config_->rtp.ssrcs.size(); ++i) { | 
| 1028     uint32_t ssrc = config_->rtp.ssrcs[i]; | 1029     uint32_t ssrc = config_->rtp.ssrcs[i]; | 
| 1029     RTC_DCHECK_EQ(ssrc, rtp_rtcp_modules_[i]->SSRC()); | 1030     RTC_DCHECK_EQ(ssrc, rtp_rtcp_modules_[i]->SSRC()); | 
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1106                           &module_nack_rate); | 1107                           &module_nack_rate); | 
| 1107     *sent_video_rate_bps += module_video_rate; | 1108     *sent_video_rate_bps += module_video_rate; | 
| 1108     *sent_nack_rate_bps += module_nack_rate; | 1109     *sent_nack_rate_bps += module_nack_rate; | 
| 1109     *sent_fec_rate_bps += module_fec_rate; | 1110     *sent_fec_rate_bps += module_fec_rate; | 
| 1110   } | 1111   } | 
| 1111   return 0; | 1112   return 0; | 
| 1112 } | 1113 } | 
| 1113 | 1114 | 
| 1114 }  // namespace internal | 1115 }  // namespace internal | 
| 1115 }  // namespace webrtc | 1116 }  // namespace webrtc | 
| OLD | NEW | 
|---|