OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2014 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2014 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 784 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
795 | 795 |
796 if (bitrate_config_changed) { | 796 if (bitrate_config_changed) { |
797 call_->SetBitrateConfig(bitrate_config_); | 797 call_->SetBitrateConfig(bitrate_config_); |
798 } | 798 } |
799 | 799 |
800 { | 800 { |
801 rtc::CritScope stream_lock(&stream_crit_); | 801 rtc::CritScope stream_lock(&stream_crit_); |
802 for (auto& kv : send_streams_) { | 802 for (auto& kv : send_streams_) { |
803 kv.second->SetSendParameters(changed_params); | 803 kv.second->SetSendParameters(changed_params); |
804 } | 804 } |
805 if (changed_params.codec) { | 805 if (changed_params.codec || changed_params.rtcp_mode) { |
806 // Update receive feedback parameters from new codec. | 806 // Update receive feedback parameters from new codec or RTCP mode. |
807 LOG(LS_INFO) | 807 LOG(LS_INFO) |
808 << "SetFeedbackOptions on all the receive streams because the send " | 808 << "SetFeedbackOptions on all the receive streams because the send " |
809 "codec has changed."; | 809 "codec or RTCP mode has changed."; |
810 for (auto& kv : receive_streams_) { | 810 for (auto& kv : receive_streams_) { |
811 RTC_DCHECK(kv.second != nullptr); | 811 RTC_DCHECK(kv.second != nullptr); |
812 kv.second->SetFeedbackParameters(HasNack(send_codec_->codec), | 812 kv.second->SetFeedbackParameters( |
813 HasRemb(send_codec_->codec), | 813 HasNack(send_codec_->codec), HasRemb(send_codec_->codec), |
814 HasTransportCc(send_codec_->codec)); | 814 HasTransportCc(send_codec_->codec), |
| 815 params.rtcp.reduced_size ? webrtc::RtcpMode::kReducedSize |
| 816 : webrtc::RtcpMode::kCompound); |
815 } | 817 } |
816 } | 818 } |
817 } | 819 } |
818 send_params_ = params; | 820 send_params_ = params; |
819 return true; | 821 return true; |
820 } | 822 } |
821 webrtc::RtpParameters WebRtcVideoChannel2::GetRtpParameters( | 823 webrtc::RtpParameters WebRtcVideoChannel2::GetRtpParameters( |
822 uint32_t ssrc) const { | 824 uint32_t ssrc) const { |
823 rtc::CritScope stream_lock(&stream_crit_); | 825 rtc::CritScope stream_lock(&stream_crit_); |
824 auto it = send_streams_.find(ssrc); | 826 auto it = send_streams_.find(ssrc); |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
875 } | 877 } |
876 | 878 |
877 // Handle RTP header extensions. | 879 // Handle RTP header extensions. |
878 std::vector<webrtc::RtpExtension> filtered_extensions = FilterRtpExtensions( | 880 std::vector<webrtc::RtpExtension> filtered_extensions = FilterRtpExtensions( |
879 params.extensions, webrtc::RtpExtension::IsSupportedForVideo, false); | 881 params.extensions, webrtc::RtpExtension::IsSupportedForVideo, false); |
880 if (filtered_extensions != recv_rtp_extensions_) { | 882 if (filtered_extensions != recv_rtp_extensions_) { |
881 changed_params->rtp_header_extensions = | 883 changed_params->rtp_header_extensions = |
882 rtc::Optional<std::vector<webrtc::RtpExtension>>(filtered_extensions); | 884 rtc::Optional<std::vector<webrtc::RtpExtension>>(filtered_extensions); |
883 } | 885 } |
884 | 886 |
885 // Handle RTCP mode. | |
886 if (params.rtcp.reduced_size != recv_params_.rtcp.reduced_size) { | |
887 changed_params->rtcp_mode = rtc::Optional<webrtc::RtcpMode>( | |
888 params.rtcp.reduced_size ? webrtc::RtcpMode::kReducedSize | |
889 : webrtc::RtcpMode::kCompound); | |
890 } | |
891 | |
892 return true; | 887 return true; |
893 } | 888 } |
894 | 889 |
895 bool WebRtcVideoChannel2::SetRecvParameters(const VideoRecvParameters& params) { | 890 bool WebRtcVideoChannel2::SetRecvParameters(const VideoRecvParameters& params) { |
896 TRACE_EVENT0("webrtc", "WebRtcVideoChannel2::SetRecvParameters"); | 891 TRACE_EVENT0("webrtc", "WebRtcVideoChannel2::SetRecvParameters"); |
897 LOG(LS_INFO) << "SetRecvParameters: " << params.ToString(); | 892 LOG(LS_INFO) << "SetRecvParameters: " << params.ToString(); |
898 ChangedRecvParameters changed_params; | 893 ChangedRecvParameters changed_params; |
899 if (!GetChangedRecvParameters(params, &changed_params)) { | 894 if (!GetChangedRecvParameters(params, &changed_params)) { |
900 return false; | 895 return false; |
901 } | 896 } |
(...skipping 250 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1152 | 1147 |
1153 void WebRtcVideoChannel2::ConfigureReceiverRtp( | 1148 void WebRtcVideoChannel2::ConfigureReceiverRtp( |
1154 webrtc::VideoReceiveStream::Config* config, | 1149 webrtc::VideoReceiveStream::Config* config, |
1155 const StreamParams& sp) const { | 1150 const StreamParams& sp) const { |
1156 uint32_t ssrc = sp.first_ssrc(); | 1151 uint32_t ssrc = sp.first_ssrc(); |
1157 | 1152 |
1158 config->rtp.remote_ssrc = ssrc; | 1153 config->rtp.remote_ssrc = ssrc; |
1159 config->rtp.local_ssrc = rtcp_receiver_report_ssrc_; | 1154 config->rtp.local_ssrc = rtcp_receiver_report_ssrc_; |
1160 | 1155 |
1161 config->rtp.extensions = recv_rtp_extensions_; | 1156 config->rtp.extensions = recv_rtp_extensions_; |
1162 config->rtp.rtcp_mode = recv_params_.rtcp.reduced_size | 1157 // Whether or not the receive stream sends reduced size RTCP is determined |
| 1158 // by the send params. |
| 1159 // TODO(deadbeef): Once we change "send_params" to "sender_params" and |
| 1160 // "recv_params" to "receiver_params", we should get this out of |
| 1161 // receiver_params_. |
| 1162 config->rtp.rtcp_mode = send_params_.rtcp.reduced_size |
1163 ? webrtc::RtcpMode::kReducedSize | 1163 ? webrtc::RtcpMode::kReducedSize |
1164 : webrtc::RtcpMode::kCompound; | 1164 : webrtc::RtcpMode::kCompound; |
1165 | 1165 |
1166 // TODO(pbos): This protection is against setting the same local ssrc as | 1166 // TODO(pbos): This protection is against setting the same local ssrc as |
1167 // remote which is not permitted by the lower-level API. RTCP requires a | 1167 // remote which is not permitted by the lower-level API. RTCP requires a |
1168 // corresponding sender SSRC. Figure out what to do when we don't have | 1168 // corresponding sender SSRC. Figure out what to do when we don't have |
1169 // (receive-only) or know a good local SSRC. | 1169 // (receive-only) or know a good local SSRC. |
1170 if (config->rtp.remote_ssrc == config->rtp.local_ssrc) { | 1170 if (config->rtp.remote_ssrc == config->rtp.local_ssrc) { |
1171 if (config->rtp.local_ssrc != kDefaultRtcpReceiverReportSsrc) { | 1171 if (config->rtp.local_ssrc != kDefaultRtcpReceiverReportSsrc) { |
1172 config->rtp.local_ssrc = kDefaultRtcpReceiverReportSsrc; | 1172 config->rtp.local_ssrc = kDefaultRtcpReceiverReportSsrc; |
(...skipping 1114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2287 config_.rtp.local_ssrc = local_ssrc; | 2287 config_.rtp.local_ssrc = local_ssrc; |
2288 LOG(LS_INFO) | 2288 LOG(LS_INFO) |
2289 << "RecreateWebRtcStream (recv) because of SetLocalSsrc; local_ssrc=" | 2289 << "RecreateWebRtcStream (recv) because of SetLocalSsrc; local_ssrc=" |
2290 << local_ssrc; | 2290 << local_ssrc; |
2291 RecreateWebRtcStream(); | 2291 RecreateWebRtcStream(); |
2292 } | 2292 } |
2293 | 2293 |
2294 void WebRtcVideoChannel2::WebRtcVideoReceiveStream::SetFeedbackParameters( | 2294 void WebRtcVideoChannel2::WebRtcVideoReceiveStream::SetFeedbackParameters( |
2295 bool nack_enabled, | 2295 bool nack_enabled, |
2296 bool remb_enabled, | 2296 bool remb_enabled, |
2297 bool transport_cc_enabled) { | 2297 bool transport_cc_enabled, |
| 2298 webrtc::RtcpMode rtcp_mode) { |
2298 int nack_history_ms = nack_enabled ? kNackHistoryMs : 0; | 2299 int nack_history_ms = nack_enabled ? kNackHistoryMs : 0; |
2299 if (config_.rtp.nack.rtp_history_ms == nack_history_ms && | 2300 if (config_.rtp.nack.rtp_history_ms == nack_history_ms && |
2300 config_.rtp.remb == remb_enabled && | 2301 config_.rtp.remb == remb_enabled && |
2301 config_.rtp.transport_cc == transport_cc_enabled) { | 2302 config_.rtp.transport_cc == transport_cc_enabled && |
| 2303 config_.rtp.rtcp_mode == rtcp_mode) { |
2302 LOG(LS_INFO) | 2304 LOG(LS_INFO) |
2303 << "Ignoring call to SetFeedbackParameters because parameters are " | 2305 << "Ignoring call to SetFeedbackParameters because parameters are " |
2304 "unchanged; nack=" | 2306 "unchanged; nack=" |
2305 << nack_enabled << ", remb=" << remb_enabled | 2307 << nack_enabled << ", remb=" << remb_enabled |
2306 << ", transport_cc=" << transport_cc_enabled; | 2308 << ", transport_cc=" << transport_cc_enabled; |
2307 return; | 2309 return; |
2308 } | 2310 } |
2309 config_.rtp.remb = remb_enabled; | 2311 config_.rtp.remb = remb_enabled; |
2310 config_.rtp.nack.rtp_history_ms = nack_history_ms; | 2312 config_.rtp.nack.rtp_history_ms = nack_history_ms; |
2311 config_.rtp.transport_cc = transport_cc_enabled; | 2313 config_.rtp.transport_cc = transport_cc_enabled; |
| 2314 config_.rtp.rtcp_mode = rtcp_mode; |
2312 LOG(LS_INFO) | 2315 LOG(LS_INFO) |
2313 << "RecreateWebRtcStream (recv) because of SetFeedbackParameters; nack=" | 2316 << "RecreateWebRtcStream (recv) because of SetFeedbackParameters; nack=" |
2314 << nack_enabled << ", remb=" << remb_enabled | 2317 << nack_enabled << ", remb=" << remb_enabled |
2315 << ", transport_cc=" << transport_cc_enabled; | 2318 << ", transport_cc=" << transport_cc_enabled; |
2316 RecreateWebRtcStream(); | 2319 RecreateWebRtcStream(); |
2317 } | 2320 } |
2318 | 2321 |
2319 void WebRtcVideoChannel2::WebRtcVideoReceiveStream::SetRecvParameters( | 2322 void WebRtcVideoChannel2::WebRtcVideoReceiveStream::SetRecvParameters( |
2320 const ChangedRecvParameters& params) { | 2323 const ChangedRecvParameters& params) { |
2321 bool needs_recreation = false; | 2324 bool needs_recreation = false; |
2322 std::vector<AllocatedDecoder> old_decoders; | 2325 std::vector<AllocatedDecoder> old_decoders; |
2323 if (params.codec_settings) { | 2326 if (params.codec_settings) { |
2324 ConfigureCodecs(*params.codec_settings, &old_decoders); | 2327 ConfigureCodecs(*params.codec_settings, &old_decoders); |
2325 needs_recreation = true; | 2328 needs_recreation = true; |
2326 } | 2329 } |
2327 if (params.rtp_header_extensions) { | 2330 if (params.rtp_header_extensions) { |
2328 config_.rtp.extensions = *params.rtp_header_extensions; | 2331 config_.rtp.extensions = *params.rtp_header_extensions; |
2329 needs_recreation = true; | 2332 needs_recreation = true; |
2330 } | 2333 } |
2331 if (params.rtcp_mode) { | |
2332 config_.rtp.rtcp_mode = *params.rtcp_mode; | |
2333 needs_recreation = true; | |
2334 } | |
2335 if (needs_recreation) { | 2334 if (needs_recreation) { |
2336 LOG(LS_INFO) << "RecreateWebRtcStream (recv) because of SetRecvParameters"; | 2335 LOG(LS_INFO) << "RecreateWebRtcStream (recv) because of SetRecvParameters"; |
2337 RecreateWebRtcStream(); | 2336 RecreateWebRtcStream(); |
2338 ClearDecoders(&old_decoders); | 2337 ClearDecoders(&old_decoders); |
2339 } | 2338 } |
2340 } | 2339 } |
2341 | 2340 |
2342 void WebRtcVideoChannel2::WebRtcVideoReceiveStream::RecreateWebRtcStream() { | 2341 void WebRtcVideoChannel2::WebRtcVideoReceiveStream::RecreateWebRtcStream() { |
2343 if (stream_ != NULL) { | 2342 if (stream_ != NULL) { |
2344 call_->DestroyVideoReceiveStream(stream_); | 2343 call_->DestroyVideoReceiveStream(stream_); |
(...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2567 rtx_mapping[video_codecs[i].codec.id] != | 2566 rtx_mapping[video_codecs[i].codec.id] != |
2568 fec_settings.red_payload_type) { | 2567 fec_settings.red_payload_type) { |
2569 video_codecs[i].rtx_payload_type = rtx_mapping[video_codecs[i].codec.id]; | 2568 video_codecs[i].rtx_payload_type = rtx_mapping[video_codecs[i].codec.id]; |
2570 } | 2569 } |
2571 } | 2570 } |
2572 | 2571 |
2573 return video_codecs; | 2572 return video_codecs; |
2574 } | 2573 } |
2575 | 2574 |
2576 } // namespace cricket | 2575 } // namespace cricket |
OLD | NEW |