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 594 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
605 WebRtcVideoChannel2::WebRtcVideoChannel2( | 605 WebRtcVideoChannel2::WebRtcVideoChannel2( |
606 webrtc::Call* call, | 606 webrtc::Call* call, |
607 const MediaConfig& config, | 607 const MediaConfig& config, |
608 const VideoOptions& options, | 608 const VideoOptions& options, |
609 const std::vector<VideoCodec>& recv_codecs, | 609 const std::vector<VideoCodec>& recv_codecs, |
610 WebRtcVideoEncoderFactory* external_encoder_factory, | 610 WebRtcVideoEncoderFactory* external_encoder_factory, |
611 WebRtcVideoDecoderFactory* external_decoder_factory) | 611 WebRtcVideoDecoderFactory* external_decoder_factory) |
612 : VideoMediaChannel(config), | 612 : VideoMediaChannel(config), |
613 call_(call), | 613 call_(call), |
614 unsignalled_ssrc_handler_(&default_unsignalled_ssrc_handler_), | 614 unsignalled_ssrc_handler_(&default_unsignalled_ssrc_handler_), |
615 signal_cpu_adaptation_(config.enable_cpu_overuse_detection), | 615 video_config_(config.video), |
616 disable_prerenderer_smoothing_(config.disable_prerenderer_smoothing), | |
617 external_encoder_factory_(external_encoder_factory), | 616 external_encoder_factory_(external_encoder_factory), |
618 external_decoder_factory_(external_decoder_factory) { | 617 external_decoder_factory_(external_decoder_factory) { |
619 RTC_DCHECK(thread_checker_.CalledOnValidThread()); | 618 RTC_DCHECK(thread_checker_.CalledOnValidThread()); |
620 | 619 |
621 send_params_.options = options; | 620 send_params_.options = options; |
622 | 621 |
623 rtcp_receiver_report_ssrc_ = kDefaultRtcpReceiverReportSsrc; | 622 rtcp_receiver_report_ssrc_ = kDefaultRtcpReceiverReportSsrc; |
624 sending_ = false; | 623 sending_ = false; |
625 default_send_ssrc_ = 0; | 624 default_send_ssrc_ = 0; |
626 RTC_DCHECK(ValidateCodecFormats(recv_codecs)); | 625 RTC_DCHECK(ValidateCodecFormats(recv_codecs)); |
(...skipping 367 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
994 | 993 |
995 rtc::CritScope stream_lock(&stream_crit_); | 994 rtc::CritScope stream_lock(&stream_crit_); |
996 | 995 |
997 if (!ValidateSendSsrcAvailability(sp)) | 996 if (!ValidateSendSsrcAvailability(sp)) |
998 return false; | 997 return false; |
999 | 998 |
1000 for (uint32_t used_ssrc : sp.ssrcs) | 999 for (uint32_t used_ssrc : sp.ssrcs) |
1001 send_ssrcs_.insert(used_ssrc); | 1000 send_ssrcs_.insert(used_ssrc); |
1002 | 1001 |
1003 webrtc::VideoSendStream::Config config(this); | 1002 webrtc::VideoSendStream::Config config(this); |
1004 WebRtcVideoSendStream* stream = new WebRtcVideoSendStream( | 1003 config.suspend_below_min_bitrate = video_config_.suspend_below_min_bitrate; |
1005 call_, sp, config, external_encoder_factory_, signal_cpu_adaptation_, | 1004 WebRtcVideoSendStream* stream = |
1006 bitrate_config_.max_bitrate_bps, send_codec_, send_rtp_extensions_, | 1005 new WebRtcVideoSendStream(call_, sp, config, external_encoder_factory_, |
1007 send_params_); | 1006 video_config_.enable_cpu_overuse_detection, |
| 1007 bitrate_config_.max_bitrate_bps, send_codec_, |
| 1008 send_rtp_extensions_, send_params_); |
1008 | 1009 |
1009 uint32_t ssrc = sp.first_ssrc(); | 1010 uint32_t ssrc = sp.first_ssrc(); |
1010 RTC_DCHECK(ssrc != 0); | 1011 RTC_DCHECK(ssrc != 0); |
1011 send_streams_[ssrc] = stream; | 1012 send_streams_[ssrc] = stream; |
1012 | 1013 |
1013 if (rtcp_receiver_report_ssrc_ == kDefaultRtcpReceiverReportSsrc) { | 1014 if (rtcp_receiver_report_ssrc_ == kDefaultRtcpReceiverReportSsrc) { |
1014 rtcp_receiver_report_ssrc_ = ssrc; | 1015 rtcp_receiver_report_ssrc_ = ssrc; |
1015 LOG(LS_INFO) << "SetLocalSsrc on all the receive streams because we added " | 1016 LOG(LS_INFO) << "SetLocalSsrc on all the receive streams because we added " |
1016 "a send stream."; | 1017 "a send stream."; |
1017 for (auto& kv : receive_streams_) | 1018 for (auto& kv : receive_streams_) |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1125 | 1126 |
1126 // Set up A/V sync group based on sync label. | 1127 // Set up A/V sync group based on sync label. |
1127 config.sync_group = sp.sync_label; | 1128 config.sync_group = sp.sync_label; |
1128 | 1129 |
1129 config.rtp.remb = send_codec_ ? HasRemb(send_codec_->codec) : false; | 1130 config.rtp.remb = send_codec_ ? HasRemb(send_codec_->codec) : false; |
1130 config.rtp.transport_cc = | 1131 config.rtp.transport_cc = |
1131 send_codec_ ? HasTransportCc(send_codec_->codec) : false; | 1132 send_codec_ ? HasTransportCc(send_codec_->codec) : false; |
1132 | 1133 |
1133 receive_streams_[ssrc] = new WebRtcVideoReceiveStream( | 1134 receive_streams_[ssrc] = new WebRtcVideoReceiveStream( |
1134 call_, sp, config, external_decoder_factory_, default_stream, | 1135 call_, sp, config, external_decoder_factory_, default_stream, |
1135 recv_codecs_, disable_prerenderer_smoothing_); | 1136 recv_codecs_, video_config_.disable_prerenderer_smoothing); |
1136 | 1137 |
1137 return true; | 1138 return true; |
1138 } | 1139 } |
1139 | 1140 |
1140 void WebRtcVideoChannel2::ConfigureReceiverRtp( | 1141 void WebRtcVideoChannel2::ConfigureReceiverRtp( |
1141 webrtc::VideoReceiveStream::Config* config, | 1142 webrtc::VideoReceiveStream::Config* config, |
1142 const StreamParams& sp) const { | 1143 const StreamParams& sp) const { |
1143 uint32_t ssrc = sp.first_ssrc(); | 1144 uint32_t ssrc = sp.first_ssrc(); |
1144 | 1145 |
1145 config->rtp.remote_ssrc = ssrc; | 1146 config->rtp.remote_ssrc = ssrc; |
(...skipping 356 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1502 ¶meters_.config.rtp.rtx.ssrcs); | 1503 ¶meters_.config.rtp.rtx.ssrcs); |
1503 parameters_.config.rtp.c_name = sp.cname; | 1504 parameters_.config.rtp.c_name = sp.cname; |
1504 parameters_.config.rtp.extensions = rtp_extensions; | 1505 parameters_.config.rtp.extensions = rtp_extensions; |
1505 parameters_.config.rtp.rtcp_mode = send_params.rtcp.reduced_size | 1506 parameters_.config.rtp.rtcp_mode = send_params.rtcp.reduced_size |
1506 ? webrtc::RtcpMode::kReducedSize | 1507 ? webrtc::RtcpMode::kReducedSize |
1507 : webrtc::RtcpMode::kCompound; | 1508 : webrtc::RtcpMode::kCompound; |
1508 parameters_.config.overuse_callback = | 1509 parameters_.config.overuse_callback = |
1509 enable_cpu_overuse_detection ? this : nullptr; | 1510 enable_cpu_overuse_detection ? this : nullptr; |
1510 | 1511 |
1511 if (codec_settings) { | 1512 if (codec_settings) { |
1512 SetCodecAndOptions(*codec_settings, parameters_.options); | 1513 SetCodec(*codec_settings); |
1513 } | 1514 } |
1514 } | 1515 } |
1515 | 1516 |
1516 WebRtcVideoChannel2::WebRtcVideoSendStream::~WebRtcVideoSendStream() { | 1517 WebRtcVideoChannel2::WebRtcVideoSendStream::~WebRtcVideoSendStream() { |
1517 DisconnectCapturer(); | 1518 DisconnectCapturer(); |
1518 if (stream_ != NULL) { | 1519 if (stream_ != NULL) { |
1519 call_->DestroyVideoSendStream(stream_); | 1520 call_->DestroyVideoSendStream(stream_); |
1520 } | 1521 } |
1521 DestroyVideoEncoder(&allocated_encoder_); | 1522 DestroyVideoEncoder(&allocated_encoder_); |
1522 } | 1523 } |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1641 } | 1642 } |
1642 | 1643 |
1643 const std::vector<uint32_t>& | 1644 const std::vector<uint32_t>& |
1644 WebRtcVideoChannel2::WebRtcVideoSendStream::GetSsrcs() const { | 1645 WebRtcVideoChannel2::WebRtcVideoSendStream::GetSsrcs() const { |
1645 return ssrcs_; | 1646 return ssrcs_; |
1646 } | 1647 } |
1647 | 1648 |
1648 void WebRtcVideoChannel2::WebRtcVideoSendStream::SetOptions( | 1649 void WebRtcVideoChannel2::WebRtcVideoSendStream::SetOptions( |
1649 const VideoOptions& options) { | 1650 const VideoOptions& options) { |
1650 rtc::CritScope cs(&lock_); | 1651 rtc::CritScope cs(&lock_); |
1651 if (parameters_.codec_settings) { | 1652 parameters_.options.SetAll(options); |
1652 LOG(LS_INFO) << "SetCodecAndOptions because of SetOptions; options=" | 1653 // Reconfigure encoder settings on the next frame or stream |
1653 << options.ToString(); | 1654 // recreation. |
1654 SetCodecAndOptions(*parameters_.codec_settings, options); | 1655 pending_encoder_reconfiguration_ = true; |
1655 } else { | |
1656 parameters_.options = options; | |
1657 } | |
1658 } | 1656 } |
1659 | 1657 |
1660 webrtc::VideoCodecType CodecTypeFromName(const std::string& name) { | 1658 webrtc::VideoCodecType CodecTypeFromName(const std::string& name) { |
1661 if (CodecNamesEq(name, kVp8CodecName)) { | 1659 if (CodecNamesEq(name, kVp8CodecName)) { |
1662 return webrtc::kVideoCodecVP8; | 1660 return webrtc::kVideoCodecVP8; |
1663 } else if (CodecNamesEq(name, kVp9CodecName)) { | 1661 } else if (CodecNamesEq(name, kVp9CodecName)) { |
1664 return webrtc::kVideoCodecVP9; | 1662 return webrtc::kVideoCodecVP9; |
1665 } else if (CodecNamesEq(name, kH264CodecName)) { | 1663 } else if (CodecNamesEq(name, kH264CodecName)) { |
1666 return webrtc::kVideoCodecH264; | 1664 return webrtc::kVideoCodecH264; |
1667 } | 1665 } |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1704 } | 1702 } |
1705 | 1703 |
1706 void WebRtcVideoChannel2::WebRtcVideoSendStream::DestroyVideoEncoder( | 1704 void WebRtcVideoChannel2::WebRtcVideoSendStream::DestroyVideoEncoder( |
1707 AllocatedEncoder* encoder) { | 1705 AllocatedEncoder* encoder) { |
1708 if (encoder->external) { | 1706 if (encoder->external) { |
1709 external_encoder_factory_->DestroyVideoEncoder(encoder->external_encoder); | 1707 external_encoder_factory_->DestroyVideoEncoder(encoder->external_encoder); |
1710 } | 1708 } |
1711 delete encoder->encoder; | 1709 delete encoder->encoder; |
1712 } | 1710 } |
1713 | 1711 |
1714 void WebRtcVideoChannel2::WebRtcVideoSendStream::SetCodecAndOptions( | 1712 void WebRtcVideoChannel2::WebRtcVideoSendStream::SetCodec( |
1715 const VideoCodecSettings& codec_settings, | 1713 const VideoCodecSettings& codec_settings) { |
1716 const VideoOptions& options) { | |
1717 parameters_.encoder_config = | 1714 parameters_.encoder_config = |
1718 CreateVideoEncoderConfig(last_dimensions_, codec_settings.codec); | 1715 CreateVideoEncoderConfig(last_dimensions_, codec_settings.codec); |
1719 RTC_DCHECK(!parameters_.encoder_config.streams.empty()); | 1716 RTC_DCHECK(!parameters_.encoder_config.streams.empty()); |
1720 | 1717 |
1721 AllocatedEncoder new_encoder = CreateVideoEncoder(codec_settings.codec); | 1718 AllocatedEncoder new_encoder = CreateVideoEncoder(codec_settings.codec); |
1722 parameters_.config.encoder_settings.encoder = new_encoder.encoder; | 1719 parameters_.config.encoder_settings.encoder = new_encoder.encoder; |
1723 parameters_.config.encoder_settings.full_overuse_time = new_encoder.external; | 1720 parameters_.config.encoder_settings.full_overuse_time = new_encoder.external; |
1724 parameters_.config.encoder_settings.payload_name = codec_settings.codec.name; | 1721 parameters_.config.encoder_settings.payload_name = codec_settings.codec.name; |
1725 parameters_.config.encoder_settings.payload_type = codec_settings.codec.id; | 1722 parameters_.config.encoder_settings.payload_type = codec_settings.codec.id; |
1726 if (new_encoder.external) { | 1723 if (new_encoder.external) { |
(...skipping 10 matching lines...) Expand all Loading... |
1737 "payload type. Ignoring."; | 1734 "payload type. Ignoring."; |
1738 parameters_.config.rtp.rtx.ssrcs.clear(); | 1735 parameters_.config.rtp.rtx.ssrcs.clear(); |
1739 } else { | 1736 } else { |
1740 parameters_.config.rtp.rtx.payload_type = codec_settings.rtx_payload_type; | 1737 parameters_.config.rtp.rtx.payload_type = codec_settings.rtx_payload_type; |
1741 } | 1738 } |
1742 } | 1739 } |
1743 | 1740 |
1744 parameters_.config.rtp.nack.rtp_history_ms = | 1741 parameters_.config.rtp.nack.rtp_history_ms = |
1745 HasNack(codec_settings.codec) ? kNackHistoryMs : 0; | 1742 HasNack(codec_settings.codec) ? kNackHistoryMs : 0; |
1746 | 1743 |
1747 parameters_.config.suspend_below_min_bitrate = | |
1748 options.suspend_below_min_bitrate.value_or(false); | |
1749 | |
1750 parameters_.codec_settings = | 1744 parameters_.codec_settings = |
1751 rtc::Optional<WebRtcVideoChannel2::VideoCodecSettings>(codec_settings); | 1745 rtc::Optional<WebRtcVideoChannel2::VideoCodecSettings>(codec_settings); |
1752 parameters_.options = options; | |
1753 | |
1754 LOG(LS_INFO) | |
1755 << "RecreateWebRtcStream (send) because of SetCodecAndOptions; options=" | |
1756 << options.ToString(); | |
1757 RecreateWebRtcStream(); | 1746 RecreateWebRtcStream(); |
1758 if (allocated_encoder_.encoder != new_encoder.encoder) { | 1747 if (allocated_encoder_.encoder != new_encoder.encoder) { |
1759 DestroyVideoEncoder(&allocated_encoder_); | 1748 DestroyVideoEncoder(&allocated_encoder_); |
1760 allocated_encoder_ = new_encoder; | 1749 allocated_encoder_ = new_encoder; |
1761 } | 1750 } |
1762 } | 1751 } |
1763 | 1752 |
1764 void WebRtcVideoChannel2::WebRtcVideoSendStream::SetSendParameters( | 1753 void WebRtcVideoChannel2::WebRtcVideoSendStream::SetSendParameters( |
1765 const ChangedSendParameters& params) { | 1754 const ChangedSendParameters& params) { |
1766 rtc::CritScope cs(&lock_); | 1755 rtc::CritScope cs(&lock_); |
(...skipping 15 matching lines...) Expand all Loading... |
1782 } | 1771 } |
1783 if (params.max_bandwidth_bps) { | 1772 if (params.max_bandwidth_bps) { |
1784 // Max bitrate has changed, reconfigure encoder settings on the next frame | 1773 // Max bitrate has changed, reconfigure encoder settings on the next frame |
1785 // or stream recreation. | 1774 // or stream recreation. |
1786 parameters_.max_bitrate_bps = *params.max_bandwidth_bps; | 1775 parameters_.max_bitrate_bps = *params.max_bandwidth_bps; |
1787 pending_encoder_reconfiguration_ = true; | 1776 pending_encoder_reconfiguration_ = true; |
1788 } | 1777 } |
1789 if (params.conference_mode) { | 1778 if (params.conference_mode) { |
1790 parameters_.conference_mode = *params.conference_mode; | 1779 parameters_.conference_mode = *params.conference_mode; |
1791 } | 1780 } |
| 1781 if (params.options) |
| 1782 SetOptions(*params.options); |
| 1783 |
1792 // Set codecs and options. | 1784 // Set codecs and options. |
1793 if (params.codec) { | 1785 if (params.codec) { |
1794 SetCodecAndOptions(*params.codec, | 1786 SetCodec(*params.codec); |
1795 params.options ? *params.options : parameters_.options); | |
1796 return; | 1787 return; |
1797 } else if (params.options) { | |
1798 // Reconfigure if codecs are already set. | |
1799 if (parameters_.codec_settings) { | |
1800 SetCodecAndOptions(*parameters_.codec_settings, *params.options); | |
1801 return; | |
1802 } else { | |
1803 parameters_.options = *params.options; | |
1804 } | |
1805 } else if (params.conference_mode && parameters_.codec_settings) { | 1788 } else if (params.conference_mode && parameters_.codec_settings) { |
1806 SetCodecAndOptions(*parameters_.codec_settings, parameters_.options); | 1789 SetCodec(*parameters_.codec_settings); |
1807 return; | 1790 return; |
1808 } | 1791 } |
1809 if (recreate_stream) { | 1792 if (recreate_stream) { |
1810 LOG(LS_INFO) << "RecreateWebRtcStream (send) because of SetSendParameters"; | 1793 LOG(LS_INFO) << "RecreateWebRtcStream (send) because of SetSendParameters"; |
1811 RecreateWebRtcStream(); | 1794 RecreateWebRtcStream(); |
1812 } | 1795 } |
1813 } | 1796 } |
1814 | 1797 |
1815 webrtc::VideoEncoderConfig | 1798 webrtc::VideoEncoderConfig |
1816 WebRtcVideoChannel2::WebRtcVideoSendStream::CreateVideoEncoderConfig( | 1799 WebRtcVideoChannel2::WebRtcVideoSendStream::CreateVideoEncoderConfig( |
(...skipping 717 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2534 rtx_mapping[video_codecs[i].codec.id] != | 2517 rtx_mapping[video_codecs[i].codec.id] != |
2535 fec_settings.red_payload_type) { | 2518 fec_settings.red_payload_type) { |
2536 video_codecs[i].rtx_payload_type = rtx_mapping[video_codecs[i].codec.id]; | 2519 video_codecs[i].rtx_payload_type = rtx_mapping[video_codecs[i].codec.id]; |
2537 } | 2520 } |
2538 } | 2521 } |
2539 | 2522 |
2540 return video_codecs; | 2523 return video_codecs; |
2541 } | 2524 } |
2542 | 2525 |
2543 } // namespace cricket | 2526 } // namespace cricket |
OLD | NEW |