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

Side by Side Diff: talk/media/webrtc/webrtcvideoengine2.cc

Issue 1418123003: Adding reduced size RTCP configuration down to the video stream level. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Fixing TODO comments. Created 5 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
OLDNEW
1 /* 1 /*
2 * libjingle 2 * libjingle
3 * Copyright 2014 Google Inc. 3 * Copyright 2014 Google Inc.
4 * 4 *
5 * Redistribution and use in source and binary forms, with or without 5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met: 6 * modification, are permitted provided that the following conditions are met:
7 * 7 *
8 * 1. Redistributions of source code must retain the above copyright notice, 8 * 1. Redistributions of source code must retain the above copyright notice,
9 * this list of conditions and the following disclaimer. 9 * this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright notice, 10 * 2. Redistributions in binary form must reproduce the above copyright notice,
(...skipping 845 matching lines...) Expand 10 before | Expand all | Expand 10 after
856 // side to cause recreation of the stream. 856 // side to cause recreation of the stream.
857 before[i].codec.preference = 0; 857 before[i].codec.preference = 0;
858 after[i].codec.preference = 0; 858 after[i].codec.preference = 0;
859 if (before[i] != after[i]) { 859 if (before[i] != after[i]) {
860 return true; 860 return true;
861 } 861 }
862 } 862 }
863 return false; 863 return false;
864 } 864 }
865 865
866 bool WebRtcVideoChannel2::SetSendParameters(const VideoSendParameters& params) { 866 bool WebRtcVideoChannel2::SetSendParameters(
867 const VideoSendParameters& send_params) {
867 // TODO(pbos): Refactor this to only recreate the send streams once 868 // TODO(pbos): Refactor this to only recreate the send streams once
868 // instead of 4 times. 869 // instead of 4 times.
869 return (SetSendCodecs(params.codecs) && 870 if (!SetSendCodecs(send_params.codecs) ||
870 SetSendRtpHeaderExtensions(params.extensions) && 871 !SetSendRtpHeaderExtensions(send_params.extensions) ||
871 SetMaxSendBandwidth(params.max_bandwidth_bps) && 872 !SetMaxSendBandwidth(send_params.max_bandwidth_bps) ||
872 SetOptions(params.options)); 873 !SetOptions(send_params.options)) {
874 return false;
875 }
876 if (send_params_.rtcp.reduced_size != send_params.rtcp.reduced_size) {
877 rtc::CritScope stream_lock(&stream_crit_);
878 for (auto& kv : send_streams_) {
879 kv.second->SetSendParameters(send_params);
880 }
881 }
882 send_params_ = send_params;
883 return true;
873 } 884 }
874 885
875 bool WebRtcVideoChannel2::SetRecvParameters(const VideoRecvParameters& params) { 886 bool WebRtcVideoChannel2::SetRecvParameters(
887 const VideoRecvParameters& recv_params) {
876 // TODO(pbos): Refactor this to only recreate the recv streams once 888 // TODO(pbos): Refactor this to only recreate the recv streams once
877 // instead of twice. 889 // instead of twice.
878 return (SetRecvCodecs(params.codecs) && 890 if (!SetRecvCodecs(recv_params.codecs) ||
879 SetRecvRtpHeaderExtensions(params.extensions)); 891 !SetRecvRtpHeaderExtensions(recv_params.extensions)) {
892 return false;
893 }
894 if (recv_params_.rtcp.reduced_size != recv_params.rtcp.reduced_size) {
895 rtc::CritScope stream_lock(&stream_crit_);
896 for (auto& kv : receive_streams_) {
897 kv.second->SetRecvParameters(recv_params);
898 }
899 }
900 recv_params_ = recv_params;
901 return true;
880 } 902 }
881 903
882 std::string WebRtcVideoChannel2::CodecSettingsVectorToString( 904 std::string WebRtcVideoChannel2::CodecSettingsVectorToString(
883 const std::vector<VideoCodecSettings>& codecs) { 905 const std::vector<VideoCodecSettings>& codecs) {
884 std::stringstream out; 906 std::stringstream out;
885 out << '{'; 907 out << '{';
886 for (size_t i = 0; i < codecs.size(); ++i) { 908 for (size_t i = 0; i < codecs.size(); ++i) {
887 out << codecs[i].codec.ToString(); 909 out << codecs[i].codec.ToString();
888 if (i != codecs.size() - 1) { 910 if (i != codecs.size() - 1) {
889 out << ", "; 911 out << ", ";
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after
1087 1109
1088 if (!ValidateSendSsrcAvailability(sp)) 1110 if (!ValidateSendSsrcAvailability(sp))
1089 return false; 1111 return false;
1090 1112
1091 for (uint32_t used_ssrc : sp.ssrcs) 1113 for (uint32_t used_ssrc : sp.ssrcs)
1092 send_ssrcs_.insert(used_ssrc); 1114 send_ssrcs_.insert(used_ssrc);
1093 1115
1094 webrtc::VideoSendStream::Config config(this); 1116 webrtc::VideoSendStream::Config config(this);
1095 config.overuse_callback = this; 1117 config.overuse_callback = this;
1096 1118
1097 WebRtcVideoSendStream* stream = 1119 WebRtcVideoSendStream* stream = new WebRtcVideoSendStream(
1098 new WebRtcVideoSendStream(call_, 1120 call_, sp, config, external_encoder_factory_, options_,
1099 sp, 1121 bitrate_config_.max_bitrate_bps, send_codec_, send_rtp_extensions_,
1100 config, 1122 send_params_);
1101 external_encoder_factory_,
1102 options_,
1103 bitrate_config_.max_bitrate_bps,
1104 send_codec_,
1105 send_rtp_extensions_);
1106 1123
1107 uint32_t ssrc = sp.first_ssrc(); 1124 uint32_t ssrc = sp.first_ssrc();
1108 RTC_DCHECK(ssrc != 0); 1125 RTC_DCHECK(ssrc != 0);
1109 send_streams_[ssrc] = stream; 1126 send_streams_[ssrc] = stream;
1110 1127
1111 if (rtcp_receiver_report_ssrc_ == kDefaultRtcpReceiverReportSsrc) { 1128 if (rtcp_receiver_report_ssrc_ == kDefaultRtcpReceiverReportSsrc) {
1112 rtcp_receiver_report_ssrc_ = ssrc; 1129 rtcp_receiver_report_ssrc_ = ssrc;
1113 LOG(LS_INFO) << "SetLocalSsrc on all the receive streams because we added " 1130 LOG(LS_INFO) << "SetLocalSsrc on all the receive streams because we added "
1114 "a send stream."; 1131 "a send stream.";
1115 for (auto& kv : receive_streams_) 1132 for (auto& kv : receive_streams_)
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
1235 1252
1236 void WebRtcVideoChannel2::ConfigureReceiverRtp( 1253 void WebRtcVideoChannel2::ConfigureReceiverRtp(
1237 webrtc::VideoReceiveStream::Config* config, 1254 webrtc::VideoReceiveStream::Config* config,
1238 const StreamParams& sp) const { 1255 const StreamParams& sp) const {
1239 uint32_t ssrc = sp.first_ssrc(); 1256 uint32_t ssrc = sp.first_ssrc();
1240 1257
1241 config->rtp.remote_ssrc = ssrc; 1258 config->rtp.remote_ssrc = ssrc;
1242 config->rtp.local_ssrc = rtcp_receiver_report_ssrc_; 1259 config->rtp.local_ssrc = rtcp_receiver_report_ssrc_;
1243 1260
1244 config->rtp.extensions = recv_rtp_extensions_; 1261 config->rtp.extensions = recv_rtp_extensions_;
1262 config->rtp.rtcp_mode = recv_params_.rtcp.reduced_size
1263 ? webrtc::RtcpMode::kReducedSize
1264 : webrtc::RtcpMode::kCompound;
1245 1265
1246 // TODO(pbos): This protection is against setting the same local ssrc as 1266 // TODO(pbos): This protection is against setting the same local ssrc as
1247 // remote which is not permitted by the lower-level API. RTCP requires a 1267 // remote which is not permitted by the lower-level API. RTCP requires a
1248 // corresponding sender SSRC. Figure out what to do when we don't have 1268 // corresponding sender SSRC. Figure out what to do when we don't have
1249 // (receive-only) or know a good local SSRC. 1269 // (receive-only) or know a good local SSRC.
1250 if (config->rtp.remote_ssrc == config->rtp.local_ssrc) { 1270 if (config->rtp.remote_ssrc == config->rtp.local_ssrc) {
1251 if (config->rtp.local_ssrc != kDefaultRtcpReceiverReportSsrc) { 1271 if (config->rtp.local_ssrc != kDefaultRtcpReceiverReportSsrc) {
1252 config->rtp.local_ssrc = kDefaultRtcpReceiverReportSsrc; 1272 config->rtp.local_ssrc = kDefaultRtcpReceiverReportSsrc;
1253 } else { 1273 } else {
1254 config->rtp.local_ssrc = kDefaultRtcpReceiverReportSsrc + 1; 1274 config->rtp.local_ssrc = kDefaultRtcpReceiverReportSsrc + 1;
(...skipping 471 matching lines...) Expand 10 before | Expand all | Expand 10 after
1726 } 1746 }
1727 1747
1728 WebRtcVideoChannel2::WebRtcVideoSendStream::WebRtcVideoSendStream( 1748 WebRtcVideoChannel2::WebRtcVideoSendStream::WebRtcVideoSendStream(
1729 webrtc::Call* call, 1749 webrtc::Call* call,
1730 const StreamParams& sp, 1750 const StreamParams& sp,
1731 const webrtc::VideoSendStream::Config& config, 1751 const webrtc::VideoSendStream::Config& config,
1732 WebRtcVideoEncoderFactory* external_encoder_factory, 1752 WebRtcVideoEncoderFactory* external_encoder_factory,
1733 const VideoOptions& options, 1753 const VideoOptions& options,
1734 int max_bitrate_bps, 1754 int max_bitrate_bps,
1735 const rtc::Optional<VideoCodecSettings>& codec_settings, 1755 const rtc::Optional<VideoCodecSettings>& codec_settings,
1736 const std::vector<webrtc::RtpExtension>& rtp_extensions) 1756 const std::vector<webrtc::RtpExtension>& rtp_extensions,
1757 // TODO(pbos): Don't duplicate information between send_params,
1758 // rtp_extensions, options, etc.
1759 const VideoSendParameters& send_params)
1737 : ssrcs_(sp.ssrcs), 1760 : ssrcs_(sp.ssrcs),
1738 ssrc_groups_(sp.ssrc_groups), 1761 ssrc_groups_(sp.ssrc_groups),
1739 call_(call), 1762 call_(call),
1740 external_encoder_factory_(external_encoder_factory), 1763 external_encoder_factory_(external_encoder_factory),
1741 stream_(NULL), 1764 stream_(NULL),
1742 parameters_(config, options, max_bitrate_bps, codec_settings), 1765 parameters_(config, options, max_bitrate_bps, codec_settings),
1743 allocated_encoder_(NULL, webrtc::kVideoCodecUnknown, false), 1766 allocated_encoder_(NULL, webrtc::kVideoCodecUnknown, false),
1744 capturer_(NULL), 1767 capturer_(NULL),
1745 sending_(false), 1768 sending_(false),
1746 muted_(false), 1769 muted_(false),
1747 old_adapt_changes_(0), 1770 old_adapt_changes_(0),
1748 first_frame_timestamp_ms_(0), 1771 first_frame_timestamp_ms_(0),
1749 last_frame_timestamp_ms_(0) { 1772 last_frame_timestamp_ms_(0) {
1750 parameters_.config.rtp.max_packet_size = kVideoMtu; 1773 parameters_.config.rtp.max_packet_size = kVideoMtu;
1751 1774
1752 sp.GetPrimarySsrcs(&parameters_.config.rtp.ssrcs); 1775 sp.GetPrimarySsrcs(&parameters_.config.rtp.ssrcs);
1753 sp.GetFidSsrcs(parameters_.config.rtp.ssrcs, 1776 sp.GetFidSsrcs(parameters_.config.rtp.ssrcs,
1754 &parameters_.config.rtp.rtx.ssrcs); 1777 &parameters_.config.rtp.rtx.ssrcs);
1755 parameters_.config.rtp.c_name = sp.cname; 1778 parameters_.config.rtp.c_name = sp.cname;
1756 parameters_.config.rtp.extensions = rtp_extensions; 1779 parameters_.config.rtp.extensions = rtp_extensions;
1780 parameters_.config.rtp.rtcp_mode = send_params.rtcp.reduced_size
1781 ? webrtc::RtcpMode::kReducedSize
1782 : webrtc::RtcpMode::kCompound;
1757 1783
1758 if (codec_settings) { 1784 if (codec_settings) {
1759 SetCodec(*codec_settings); 1785 SetCodec(*codec_settings);
1760 } 1786 }
1761 } 1787 }
1762 1788
1763 WebRtcVideoChannel2::WebRtcVideoSendStream::~WebRtcVideoSendStream() { 1789 WebRtcVideoChannel2::WebRtcVideoSendStream::~WebRtcVideoSendStream() {
1764 DisconnectCapturer(); 1790 DisconnectCapturer();
1765 if (stream_ != NULL) { 1791 if (stream_ != NULL) {
1766 call_->DestroyVideoSendStream(stream_); 1792 call_->DestroyVideoSendStream(stream_);
(...skipping 296 matching lines...) Expand 10 before | Expand all | Expand 10 after
2063 void WebRtcVideoChannel2::WebRtcVideoSendStream::SetRtpExtensions( 2089 void WebRtcVideoChannel2::WebRtcVideoSendStream::SetRtpExtensions(
2064 const std::vector<webrtc::RtpExtension>& rtp_extensions) { 2090 const std::vector<webrtc::RtpExtension>& rtp_extensions) {
2065 rtc::CritScope cs(&lock_); 2091 rtc::CritScope cs(&lock_);
2066 parameters_.config.rtp.extensions = rtp_extensions; 2092 parameters_.config.rtp.extensions = rtp_extensions;
2067 if (stream_ != nullptr) { 2093 if (stream_ != nullptr) {
2068 LOG(LS_INFO) << "RecreateWebRtcStream (send) because of SetRtpExtensions"; 2094 LOG(LS_INFO) << "RecreateWebRtcStream (send) because of SetRtpExtensions";
2069 RecreateWebRtcStream(); 2095 RecreateWebRtcStream();
2070 } 2096 }
2071 } 2097 }
2072 2098
2099 void WebRtcVideoChannel2::WebRtcVideoSendStream::SetSendParameters(
2100 const VideoSendParameters& send_params) {
2101 rtc::CritScope cs(&lock_);
2102 parameters_.config.rtp.rtcp_mode = send_params.rtcp.reduced_size
2103 ? webrtc::RtcpMode::kReducedSize
2104 : webrtc::RtcpMode::kCompound;
2105 if (stream_ != nullptr) {
2106 LOG(LS_INFO) << "RecreateWebRtcStream (send) because of SetSendParameters";
2107 RecreateWebRtcStream();
2108 }
2109 }
2110
2073 webrtc::VideoEncoderConfig 2111 webrtc::VideoEncoderConfig
2074 WebRtcVideoChannel2::WebRtcVideoSendStream::CreateVideoEncoderConfig( 2112 WebRtcVideoChannel2::WebRtcVideoSendStream::CreateVideoEncoderConfig(
2075 const Dimensions& dimensions, 2113 const Dimensions& dimensions,
2076 const VideoCodec& codec) const { 2114 const VideoCodec& codec) const {
2077 webrtc::VideoEncoderConfig encoder_config; 2115 webrtc::VideoEncoderConfig encoder_config;
2078 if (dimensions.is_screencast) { 2116 if (dimensions.is_screencast) {
2079 RTC_CHECK(parameters_.options.screencast_min_bitrate); 2117 RTC_CHECK(parameters_.options.screencast_min_bitrate);
2080 encoder_config.min_transmit_bitrate_bps = 2118 encoder_config.min_transmit_bitrate_bps =
2081 *parameters_.options.screencast_min_bitrate * 1000; 2119 *parameters_.options.screencast_min_bitrate * 1000;
2082 encoder_config.content_type = 2120 encoder_config.content_type =
(...skipping 407 matching lines...) Expand 10 before | Expand all | Expand 10 after
2490 RecreateWebRtcStream(); 2528 RecreateWebRtcStream();
2491 } 2529 }
2492 2530
2493 void WebRtcVideoChannel2::WebRtcVideoReceiveStream::SetRtpExtensions( 2531 void WebRtcVideoChannel2::WebRtcVideoReceiveStream::SetRtpExtensions(
2494 const std::vector<webrtc::RtpExtension>& extensions) { 2532 const std::vector<webrtc::RtpExtension>& extensions) {
2495 config_.rtp.extensions = extensions; 2533 config_.rtp.extensions = extensions;
2496 LOG(LS_INFO) << "RecreateWebRtcStream (recv) because of SetRtpExtensions"; 2534 LOG(LS_INFO) << "RecreateWebRtcStream (recv) because of SetRtpExtensions";
2497 RecreateWebRtcStream(); 2535 RecreateWebRtcStream();
2498 } 2536 }
2499 2537
2538 void WebRtcVideoChannel2::WebRtcVideoReceiveStream::SetRecvParameters(
2539 const VideoRecvParameters& recv_params) {
2540 config_.rtp.rtcp_mode = recv_params.rtcp.reduced_size
2541 ? webrtc::RtcpMode::kReducedSize
2542 : webrtc::RtcpMode::kCompound;
2543 LOG(LS_INFO) << "RecreateWebRtcStream (recv) because of SetRecvParameters";
2544 RecreateWebRtcStream();
2545 }
2546
2500 void WebRtcVideoChannel2::WebRtcVideoReceiveStream::RecreateWebRtcStream() { 2547 void WebRtcVideoChannel2::WebRtcVideoReceiveStream::RecreateWebRtcStream() {
2501 if (stream_ != NULL) { 2548 if (stream_ != NULL) {
2502 call_->DestroyVideoReceiveStream(stream_); 2549 call_->DestroyVideoReceiveStream(stream_);
2503 } 2550 }
2504 stream_ = call_->CreateVideoReceiveStream(config_); 2551 stream_ = call_->CreateVideoReceiveStream(config_);
2505 stream_->Start(); 2552 stream_->Start();
2506 } 2553 }
2507 2554
2508 void WebRtcVideoChannel2::WebRtcVideoReceiveStream::ClearDecoders( 2555 void WebRtcVideoChannel2::WebRtcVideoReceiveStream::ClearDecoders(
2509 std::vector<AllocatedDecoder>* allocated_decoders) { 2556 std::vector<AllocatedDecoder>* allocated_decoders) {
(...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after
2742 video_codecs[i].rtx_payload_type = rtx_mapping[video_codecs[i].codec.id]; 2789 video_codecs[i].rtx_payload_type = rtx_mapping[video_codecs[i].codec.id];
2743 } 2790 }
2744 } 2791 }
2745 2792
2746 return video_codecs; 2793 return video_codecs;
2747 } 2794 }
2748 2795
2749 } // namespace cricket 2796 } // namespace cricket
2750 2797
2751 #endif // HAVE_WEBRTC_VIDEO 2798 #endif // HAVE_WEBRTC_VIDEO
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698