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

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

Issue 1788583004: Enable setting the maximum bitrate limit in RtpSender. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Rebased on top of the latest master branch Created 4 years, 9 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
OLDNEW
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 800 matching lines...) Expand 10 before | Expand all | Expand 10 after
811 RTC_DCHECK(kv.second != nullptr); 811 RTC_DCHECK(kv.second != nullptr);
812 kv.second->SetFeedbackParameters(HasNack(send_codec_->codec), 812 kv.second->SetFeedbackParameters(HasNack(send_codec_->codec),
813 HasRemb(send_codec_->codec), 813 HasRemb(send_codec_->codec),
814 HasTransportCc(send_codec_->codec)); 814 HasTransportCc(send_codec_->codec));
815 } 815 }
816 } 816 }
817 } 817 }
818 send_params_ = params; 818 send_params_ = params;
819 return true; 819 return true;
820 } 820 }
821 webrtc::RtpParameters WebRtcVideoChannel2::GetRtpParameters(
822 uint32_t ssrc) const {
823 rtc::CritScope stream_lock(&stream_crit_);
824 auto it = send_streams_.find(ssrc);
825 if (it == send_streams_.end()) {
826 LOG(LS_WARNING) << "Attempting to get RTP parameters for stream with ssrc "
827 << ssrc << " which doesn't exist.";
828 return webrtc::RtpParameters();
829 }
830
831 return it->second->rtp_parameters();
832 }
833
834 bool WebRtcVideoChannel2::SetRtpParameters(
835 uint32_t ssrc,
836 const webrtc::RtpParameters& parameters) {
837 rtc::CritScope stream_lock(&stream_crit_);
838 auto it = send_streams_.find(ssrc);
839 if (it == send_streams_.end()) {
840 LOG(LS_ERROR) << "Attempting to set RTP parameters for stream with ssrc "
841 << ssrc << " which doesn't exist.";
842 return false;
843 }
844
845 return it->second->SetRtpParameters(parameters);
846 }
821 847
822 bool WebRtcVideoChannel2::GetChangedRecvParameters( 848 bool WebRtcVideoChannel2::GetChangedRecvParameters(
823 const VideoRecvParameters& params, 849 const VideoRecvParameters& params,
824 ChangedRecvParameters* changed_params) const { 850 ChangedRecvParameters* changed_params) const {
825 if (!ValidateCodecFormats(params.codecs) || 851 if (!ValidateCodecFormats(params.codecs) ||
826 !ValidateRtpExtensions(params.extensions)) { 852 !ValidateRtpExtensions(params.extensions)) {
827 return false; 853 return false;
828 } 854 }
829 855
830 // Handle receive codecs. 856 // Handle receive codecs.
(...skipping 638 matching lines...) Expand 10 before | Expand all | Expand 10 after
1469 : worker_thread_(rtc::Thread::Current()), 1495 : worker_thread_(rtc::Thread::Current()),
1470 ssrcs_(sp.ssrcs), 1496 ssrcs_(sp.ssrcs),
1471 ssrc_groups_(sp.ssrc_groups), 1497 ssrc_groups_(sp.ssrc_groups),
1472 call_(call), 1498 call_(call),
1473 cpu_restricted_counter_(0), 1499 cpu_restricted_counter_(0),
1474 number_of_cpu_adapt_changes_(0), 1500 number_of_cpu_adapt_changes_(0),
1475 capturer_(nullptr), 1501 capturer_(nullptr),
1476 external_encoder_factory_(external_encoder_factory), 1502 external_encoder_factory_(external_encoder_factory),
1477 stream_(nullptr), 1503 stream_(nullptr),
1478 parameters_(config, options, max_bitrate_bps, codec_settings), 1504 parameters_(config, options, max_bitrate_bps, codec_settings),
1505 rtp_parameters_(CreateRtpParametersWithOneEncoding()),
1479 pending_encoder_reconfiguration_(false), 1506 pending_encoder_reconfiguration_(false),
1480 allocated_encoder_(nullptr, webrtc::kVideoCodecUnknown, false), 1507 allocated_encoder_(nullptr, webrtc::kVideoCodecUnknown, false),
1481 sending_(false), 1508 sending_(false),
1482 muted_(false), 1509 muted_(false),
1483 first_frame_timestamp_ms_(0), 1510 first_frame_timestamp_ms_(0),
1484 last_frame_timestamp_ms_(0) { 1511 last_frame_timestamp_ms_(0) {
1485 parameters_.config.rtp.max_packet_size = kVideoMtu; 1512 parameters_.config.rtp.max_packet_size = kVideoMtu;
1486 parameters_.conference_mode = send_params.conference_mode; 1513 parameters_.conference_mode = send_params.conference_mode;
1487 1514
1488 sp.GetPrimarySsrcs(&parameters_.config.rtp.ssrcs); 1515 sp.GetPrimarySsrcs(&parameters_.config.rtp.ssrcs);
(...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after
1756 bool recreate_stream = false; 1783 bool recreate_stream = false;
1757 if (params.rtcp_mode) { 1784 if (params.rtcp_mode) {
1758 parameters_.config.rtp.rtcp_mode = *params.rtcp_mode; 1785 parameters_.config.rtp.rtcp_mode = *params.rtcp_mode;
1759 recreate_stream = true; 1786 recreate_stream = true;
1760 } 1787 }
1761 if (params.rtp_header_extensions) { 1788 if (params.rtp_header_extensions) {
1762 parameters_.config.rtp.extensions = *params.rtp_header_extensions; 1789 parameters_.config.rtp.extensions = *params.rtp_header_extensions;
1763 recreate_stream = true; 1790 recreate_stream = true;
1764 } 1791 }
1765 if (params.max_bandwidth_bps) { 1792 if (params.max_bandwidth_bps) {
1766 // Max bitrate has changed, reconfigure encoder settings on the next frame
1767 // or stream recreation.
1768 parameters_.max_bitrate_bps = *params.max_bandwidth_bps; 1793 parameters_.max_bitrate_bps = *params.max_bandwidth_bps;
1769 pending_encoder_reconfiguration_ = true; 1794 pending_encoder_reconfiguration_ = true;
1770 } 1795 }
1771 if (params.conference_mode) { 1796 if (params.conference_mode) {
1772 parameters_.conference_mode = *params.conference_mode; 1797 parameters_.conference_mode = *params.conference_mode;
1773 } 1798 }
1774 1799
1775 // Set codecs and options. 1800 // Set codecs and options.
1776 if (params.codec) { 1801 if (params.codec) {
1777 SetCodec(*params.codec); 1802 SetCodec(*params.codec);
(...skipping 13 matching lines...) Expand all
1791 // that might cause a lock order inversion. 1816 // that might cause a lock order inversion.
1792 if (params.rtp_header_extensions) { 1817 if (params.rtp_header_extensions) {
1793 sink_wants_.rotation_applied = !ContainsHeaderExtension( 1818 sink_wants_.rotation_applied = !ContainsHeaderExtension(
1794 *params.rtp_header_extensions, kRtpVideoRotationHeaderExtension); 1819 *params.rtp_header_extensions, kRtpVideoRotationHeaderExtension);
1795 if (capturer_) { 1820 if (capturer_) {
1796 capturer_->AddOrUpdateSink(this, sink_wants_); 1821 capturer_->AddOrUpdateSink(this, sink_wants_);
1797 } 1822 }
1798 } 1823 }
1799 } 1824 }
1800 1825
1826 bool WebRtcVideoChannel2::WebRtcVideoSendStream::SetRtpParameters(
1827 const webrtc::RtpParameters& new_parameters) {
1828 if (!ValidateRtpParameters(new_parameters)) {
1829 return false;
1830 }
1831
1832 rtc::CritScope cs(&lock_);
1833 if (new_parameters.encodings[0].max_bitrate_bps !=
1834 rtp_parameters_.encodings[0].max_bitrate_bps) {
1835 pending_encoder_reconfiguration_ = true;
1836 }
1837 rtp_parameters_ = new_parameters;
1838 return true;
1839 }
1840
1841 bool WebRtcVideoChannel2::WebRtcVideoSendStream::ValidateRtpParameters(
1842 const webrtc::RtpParameters& rtp_parameters) {
1843 if (rtp_parameters.encodings.size() != 1) {
1844 LOG(LS_ERROR)
1845 << "Attempted to set RtpParameters without exactly one encoding";
1846 return false;
1847 }
1848 return true;
1849 }
1850
1801 webrtc::VideoEncoderConfig 1851 webrtc::VideoEncoderConfig
1802 WebRtcVideoChannel2::WebRtcVideoSendStream::CreateVideoEncoderConfig( 1852 WebRtcVideoChannel2::WebRtcVideoSendStream::CreateVideoEncoderConfig(
1803 const Dimensions& dimensions, 1853 const Dimensions& dimensions,
1804 const VideoCodec& codec) const { 1854 const VideoCodec& codec) const {
1805 webrtc::VideoEncoderConfig encoder_config; 1855 webrtc::VideoEncoderConfig encoder_config;
1806 bool is_screencast = parameters_.options.is_screencast.value_or(false); 1856 bool is_screencast = parameters_.options.is_screencast.value_or(false);
1807 if (is_screencast) { 1857 if (is_screencast) {
1808 encoder_config.min_transmit_bitrate_bps = 1858 encoder_config.min_transmit_bitrate_bps =
1809 1000 * parameters_.options.screencast_min_bitrate_kbps.value_or(0); 1859 1000 * parameters_.options.screencast_min_bitrate_kbps.value_or(0);
1810 encoder_config.content_type = 1860 encoder_config.content_type =
(...skipping 19 matching lines...) Expand all
1830 clamped_codec.height = height; 1880 clamped_codec.height = height;
1831 1881
1832 // By default, the stream count for the codec configuration should match the 1882 // By default, the stream count for the codec configuration should match the
1833 // number of negotiated ssrcs. But if the codec is blacklisted for simulcast 1883 // number of negotiated ssrcs. But if the codec is blacklisted for simulcast
1834 // or a screencast, only configure a single stream. 1884 // or a screencast, only configure a single stream.
1835 size_t stream_count = parameters_.config.rtp.ssrcs.size(); 1885 size_t stream_count = parameters_.config.rtp.ssrcs.size();
1836 if (IsCodecBlacklistedForSimulcast(codec.name) || is_screencast) { 1886 if (IsCodecBlacklistedForSimulcast(codec.name) || is_screencast) {
1837 stream_count = 1; 1887 stream_count = 1;
1838 } 1888 }
1839 1889
1840 encoder_config.streams = 1890 int stream_max_bitrate =
1841 CreateVideoStreams(clamped_codec, parameters_.options, 1891 MinPositive(rtp_parameters_.encodings[0].max_bitrate_bps,
1842 parameters_.max_bitrate_bps, stream_count); 1892 parameters_.max_bitrate_bps);
1893 encoder_config.streams = CreateVideoStreams(
1894 clamped_codec, parameters_.options, stream_max_bitrate, stream_count);
1843 1895
1844 // Conference mode screencast uses 2 temporal layers split at 100kbit. 1896 // Conference mode screencast uses 2 temporal layers split at 100kbit.
1845 if (parameters_.conference_mode && is_screencast && 1897 if (parameters_.conference_mode && is_screencast &&
1846 encoder_config.streams.size() == 1) { 1898 encoder_config.streams.size() == 1) {
1847 ScreenshareLayerConfig config = ScreenshareLayerConfig::GetDefault(); 1899 ScreenshareLayerConfig config = ScreenshareLayerConfig::GetDefault();
1848 1900
1849 // For screenshare in conference mode, tl0 and tl1 bitrates are piggybacked 1901 // For screenshare in conference mode, tl0 and tl1 bitrates are piggybacked
1850 // on the VideoCodec struct as target and max bitrates, respectively. 1902 // on the VideoCodec struct as target and max bitrates, respectively.
1851 // See eg. webrtc::VP8EncoderImpl::SetRates(). 1903 // See eg. webrtc::VP8EncoderImpl::SetRates().
1852 encoder_config.streams[0].target_bitrate_bps = 1904 encoder_config.streams[0].target_bitrate_bps =
(...skipping 664 matching lines...) Expand 10 before | Expand all | Expand 10 after
2517 rtx_mapping[video_codecs[i].codec.id] != 2569 rtx_mapping[video_codecs[i].codec.id] !=
2518 fec_settings.red_payload_type) { 2570 fec_settings.red_payload_type) {
2519 video_codecs[i].rtx_payload_type = rtx_mapping[video_codecs[i].codec.id]; 2571 video_codecs[i].rtx_payload_type = rtx_mapping[video_codecs[i].codec.id];
2520 } 2572 }
2521 } 2573 }
2522 2574
2523 return video_codecs; 2575 return video_codecs;
2524 } 2576 }
2525 2577
2526 } // namespace cricket 2578 } // namespace cricket
OLDNEW
« no previous file with comments | « webrtc/media/engine/webrtcvideoengine2.h ('k') | webrtc/media/engine/webrtcvideoengine2_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698