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 800 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
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 Loading... |
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(¶meters_.config.rtp.ssrcs); | 1515 sp.GetPrimarySsrcs(¶meters_.config.rtp.ssrcs); |
(...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |