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 491 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
502 LOG(LS_INFO) << "WebRtcVideoEngine2::~WebRtcVideoEngine2"; | 502 LOG(LS_INFO) << "WebRtcVideoEngine2::~WebRtcVideoEngine2"; |
503 } | 503 } |
504 | 504 |
505 void WebRtcVideoEngine2::Init() { | 505 void WebRtcVideoEngine2::Init() { |
506 LOG(LS_INFO) << "WebRtcVideoEngine2::Init"; | 506 LOG(LS_INFO) << "WebRtcVideoEngine2::Init"; |
507 initialized_ = true; | 507 initialized_ = true; |
508 } | 508 } |
509 | 509 |
510 WebRtcVideoChannel2* WebRtcVideoEngine2::CreateChannel( | 510 WebRtcVideoChannel2* WebRtcVideoEngine2::CreateChannel( |
511 webrtc::Call* call, | 511 webrtc::Call* call, |
| 512 const MediaConfig& config, |
512 const VideoOptions& options) { | 513 const VideoOptions& options) { |
513 RTC_DCHECK(initialized_); | 514 RTC_DCHECK(initialized_); |
514 LOG(LS_INFO) << "CreateChannel. Options: " << options.ToString(); | 515 LOG(LS_INFO) << "CreateChannel. Options: " << options.ToString(); |
515 return new WebRtcVideoChannel2(call, options, video_codecs_, | 516 return new WebRtcVideoChannel2(call, config, options, video_codecs_, |
516 external_encoder_factory_, external_decoder_factory_); | 517 external_encoder_factory_, |
| 518 external_decoder_factory_); |
517 } | 519 } |
518 | 520 |
519 const std::vector<VideoCodec>& WebRtcVideoEngine2::codecs() const { | 521 const std::vector<VideoCodec>& WebRtcVideoEngine2::codecs() const { |
520 return video_codecs_; | 522 return video_codecs_; |
521 } | 523 } |
522 | 524 |
523 RtpCapabilities WebRtcVideoEngine2::GetCapabilities() const { | 525 RtpCapabilities WebRtcVideoEngine2::GetCapabilities() const { |
524 RtpCapabilities capabilities; | 526 RtpCapabilities capabilities; |
525 capabilities.header_extensions.push_back( | 527 capabilities.header_extensions.push_back( |
526 RtpHeaderExtension(kRtpTimestampOffsetHeaderExtension, | 528 RtpHeaderExtension(kRtpTimestampOffsetHeaderExtension, |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
595 0); | 597 0); |
596 | 598 |
597 AddDefaultFeedbackParams(&codec); | 599 AddDefaultFeedbackParams(&codec); |
598 supported_codecs.push_back(codec); | 600 supported_codecs.push_back(codec); |
599 } | 601 } |
600 return supported_codecs; | 602 return supported_codecs; |
601 } | 603 } |
602 | 604 |
603 WebRtcVideoChannel2::WebRtcVideoChannel2( | 605 WebRtcVideoChannel2::WebRtcVideoChannel2( |
604 webrtc::Call* call, | 606 webrtc::Call* call, |
| 607 const MediaConfig& config, |
605 const VideoOptions& options, | 608 const VideoOptions& options, |
606 const std::vector<VideoCodec>& recv_codecs, | 609 const std::vector<VideoCodec>& recv_codecs, |
607 WebRtcVideoEncoderFactory* external_encoder_factory, | 610 WebRtcVideoEncoderFactory* external_encoder_factory, |
608 WebRtcVideoDecoderFactory* external_decoder_factory) | 611 WebRtcVideoDecoderFactory* external_decoder_factory) |
609 : call_(call), | 612 : VideoMediaChannel(config), |
| 613 call_(call), |
610 unsignalled_ssrc_handler_(&default_unsignalled_ssrc_handler_), | 614 unsignalled_ssrc_handler_(&default_unsignalled_ssrc_handler_), |
| 615 signal_cpu_adaptation_(config.enable_cpu_overuse_detection), |
| 616 disable_prerenderer_smoothing_(config.disable_prerenderer_smoothing), |
611 external_encoder_factory_(external_encoder_factory), | 617 external_encoder_factory_(external_encoder_factory), |
612 external_decoder_factory_(external_decoder_factory) { | 618 external_decoder_factory_(external_decoder_factory) { |
613 RTC_DCHECK(thread_checker_.CalledOnValidThread()); | 619 RTC_DCHECK(thread_checker_.CalledOnValidThread()); |
614 SetDefaultOptions(); | |
615 options_.SetAll(options); | 620 options_.SetAll(options); |
616 if (options_.cpu_overuse_detection) | |
617 signal_cpu_adaptation_ = *options_.cpu_overuse_detection; | |
618 rtcp_receiver_report_ssrc_ = kDefaultRtcpReceiverReportSsrc; | 621 rtcp_receiver_report_ssrc_ = kDefaultRtcpReceiverReportSsrc; |
619 sending_ = false; | 622 sending_ = false; |
620 default_send_ssrc_ = 0; | 623 default_send_ssrc_ = 0; |
621 RTC_DCHECK(ValidateCodecFormats(recv_codecs)); | 624 RTC_DCHECK(ValidateCodecFormats(recv_codecs)); |
622 recv_codecs_ = FilterSupportedCodecs(MapCodecs(recv_codecs)); | 625 recv_codecs_ = FilterSupportedCodecs(MapCodecs(recv_codecs)); |
623 } | 626 } |
624 | 627 |
625 void WebRtcVideoChannel2::SetDefaultOptions() { | |
626 options_.cpu_overuse_detection = rtc::Optional<bool>(true); | |
627 options_.dscp = rtc::Optional<bool>(false); | |
628 options_.suspend_below_min_bitrate = rtc::Optional<bool>(false); | |
629 options_.screencast_min_bitrate_kbps = rtc::Optional<int>(0); | |
630 } | |
631 | |
632 WebRtcVideoChannel2::~WebRtcVideoChannel2() { | 628 WebRtcVideoChannel2::~WebRtcVideoChannel2() { |
633 for (auto& kv : send_streams_) | 629 for (auto& kv : send_streams_) |
634 delete kv.second; | 630 delete kv.second; |
635 for (auto& kv : receive_streams_) | 631 for (auto& kv : receive_streams_) |
636 delete kv.second; | 632 delete kv.second; |
637 } | 633 } |
638 | 634 |
639 bool WebRtcVideoChannel2::CodecIsExternallySupported( | 635 bool WebRtcVideoChannel2::CodecIsExternallySupported( |
640 const std::string& name) const { | 636 const std::string& name) const { |
641 if (external_encoder_factory_ == NULL) { | 637 if (external_encoder_factory_ == NULL) { |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
750 // Handle RTCP mode. | 746 // Handle RTCP mode. |
751 if (params.rtcp.reduced_size != send_params_.rtcp.reduced_size) { | 747 if (params.rtcp.reduced_size != send_params_.rtcp.reduced_size) { |
752 changed_params->rtcp_mode = rtc::Optional<webrtc::RtcpMode>( | 748 changed_params->rtcp_mode = rtc::Optional<webrtc::RtcpMode>( |
753 params.rtcp.reduced_size ? webrtc::RtcpMode::kReducedSize | 749 params.rtcp.reduced_size ? webrtc::RtcpMode::kReducedSize |
754 : webrtc::RtcpMode::kCompound); | 750 : webrtc::RtcpMode::kCompound); |
755 } | 751 } |
756 | 752 |
757 return true; | 753 return true; |
758 } | 754 } |
759 | 755 |
| 756 rtc::DiffServCodePoint WebRtcVideoChannel2::PreferredDscp() const { |
| 757 return rtc::DSCP_AF41; |
| 758 } |
| 759 |
760 bool WebRtcVideoChannel2::SetSendParameters(const VideoSendParameters& params) { | 760 bool WebRtcVideoChannel2::SetSendParameters(const VideoSendParameters& params) { |
761 TRACE_EVENT0("webrtc", "WebRtcVideoChannel2::SetSendParameters"); | 761 TRACE_EVENT0("webrtc", "WebRtcVideoChannel2::SetSendParameters"); |
762 LOG(LS_INFO) << "SetSendParameters: " << params.ToString(); | 762 LOG(LS_INFO) << "SetSendParameters: " << params.ToString(); |
763 ChangedSendParameters changed_params; | 763 ChangedSendParameters changed_params; |
764 if (!GetChangedSendParameters(params, &changed_params)) { | 764 if (!GetChangedSendParameters(params, &changed_params)) { |
765 return false; | 765 return false; |
766 } | 766 } |
767 | 767 |
768 bool bitrate_config_changed = false; | 768 bool bitrate_config_changed = false; |
769 | 769 |
(...skipping 24 matching lines...) Expand all Loading... |
794 bitrate_config_.min_bitrate_bps > max_bitrate_bps) { | 794 bitrate_config_.min_bitrate_bps > max_bitrate_bps) { |
795 bitrate_config_.min_bitrate_bps = max_bitrate_bps; | 795 bitrate_config_.min_bitrate_bps = max_bitrate_bps; |
796 } | 796 } |
797 bitrate_config_changed = true; | 797 bitrate_config_changed = true; |
798 } | 798 } |
799 | 799 |
800 if (bitrate_config_changed) { | 800 if (bitrate_config_changed) { |
801 call_->SetBitrateConfig(bitrate_config_); | 801 call_->SetBitrateConfig(bitrate_config_); |
802 } | 802 } |
803 | 803 |
804 if (changed_params.options) { | 804 if (changed_params.options) |
805 options_.SetAll(*changed_params.options); | 805 options_.SetAll(*changed_params.options); |
806 { | |
807 rtc::CritScope lock(&capturer_crit_); | |
808 if (options_.cpu_overuse_detection) { | |
809 signal_cpu_adaptation_ = *options_.cpu_overuse_detection; | |
810 } | |
811 } | |
812 rtc::DiffServCodePoint dscp = | |
813 options_.dscp.value_or(false) ? rtc::DSCP_AF41 : rtc::DSCP_DEFAULT; | |
814 MediaChannel::SetDscp(dscp); | |
815 } | |
816 | 806 |
817 { | 807 { |
818 rtc::CritScope stream_lock(&stream_crit_); | 808 rtc::CritScope stream_lock(&stream_crit_); |
819 for (auto& kv : send_streams_) { | 809 for (auto& kv : send_streams_) { |
820 kv.second->SetSendParameters(changed_params); | 810 kv.second->SetSendParameters(changed_params); |
821 } | 811 } |
822 if (changed_params.codec) { | 812 if (changed_params.codec) { |
823 // Update receive feedback parameters from new codec. | 813 // Update receive feedback parameters from new codec. |
824 LOG(LS_INFO) | 814 LOG(LS_INFO) |
825 << "SetFeedbackOptions on all the receive streams because the send " | 815 << "SetFeedbackOptions on all the receive streams because the send " |
(...skipping 305 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1131 | 1121 |
1132 // Set up A/V sync group based on sync label. | 1122 // Set up A/V sync group based on sync label. |
1133 config.sync_group = sp.sync_label; | 1123 config.sync_group = sp.sync_label; |
1134 | 1124 |
1135 config.rtp.remb = send_codec_ ? HasRemb(send_codec_->codec) : false; | 1125 config.rtp.remb = send_codec_ ? HasRemb(send_codec_->codec) : false; |
1136 config.rtp.transport_cc = | 1126 config.rtp.transport_cc = |
1137 send_codec_ ? HasTransportCc(send_codec_->codec) : false; | 1127 send_codec_ ? HasTransportCc(send_codec_->codec) : false; |
1138 | 1128 |
1139 receive_streams_[ssrc] = new WebRtcVideoReceiveStream( | 1129 receive_streams_[ssrc] = new WebRtcVideoReceiveStream( |
1140 call_, sp, config, external_decoder_factory_, default_stream, | 1130 call_, sp, config, external_decoder_factory_, default_stream, |
1141 recv_codecs_, options_.disable_prerenderer_smoothing.value_or(false)); | 1131 recv_codecs_, disable_prerenderer_smoothing_); |
1142 | 1132 |
1143 return true; | 1133 return true; |
1144 } | 1134 } |
1145 | 1135 |
1146 void WebRtcVideoChannel2::ConfigureReceiverRtp( | 1136 void WebRtcVideoChannel2::ConfigureReceiverRtp( |
1147 webrtc::VideoReceiveStream::Config* config, | 1137 webrtc::VideoReceiveStream::Config* config, |
1148 const StreamParams& sp) const { | 1138 const StreamParams& sp) const { |
1149 uint32_t ssrc = sp.first_ssrc(); | 1139 uint32_t ssrc = sp.first_ssrc(); |
1150 | 1140 |
1151 config->rtp.remote_ssrc = ssrc; | 1141 config->rtp.remote_ssrc = ssrc; |
(...skipping 608 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1760 "payload type. Ignoring."; | 1750 "payload type. Ignoring."; |
1761 parameters_.config.rtp.rtx.ssrcs.clear(); | 1751 parameters_.config.rtp.rtx.ssrcs.clear(); |
1762 } else { | 1752 } else { |
1763 parameters_.config.rtp.rtx.payload_type = codec_settings.rtx_payload_type; | 1753 parameters_.config.rtp.rtx.payload_type = codec_settings.rtx_payload_type; |
1764 } | 1754 } |
1765 } | 1755 } |
1766 | 1756 |
1767 parameters_.config.rtp.nack.rtp_history_ms = | 1757 parameters_.config.rtp.nack.rtp_history_ms = |
1768 HasNack(codec_settings.codec) ? kNackHistoryMs : 0; | 1758 HasNack(codec_settings.codec) ? kNackHistoryMs : 0; |
1769 | 1759 |
1770 RTC_CHECK(options.suspend_below_min_bitrate); | |
1771 parameters_.config.suspend_below_min_bitrate = | 1760 parameters_.config.suspend_below_min_bitrate = |
1772 *options.suspend_below_min_bitrate; | 1761 options.suspend_below_min_bitrate.value_or(false); |
1773 | 1762 |
1774 parameters_.codec_settings = | 1763 parameters_.codec_settings = |
1775 rtc::Optional<WebRtcVideoChannel2::VideoCodecSettings>(codec_settings); | 1764 rtc::Optional<WebRtcVideoChannel2::VideoCodecSettings>(codec_settings); |
1776 parameters_.options = options; | 1765 parameters_.options = options; |
1777 | 1766 |
1778 LOG(LS_INFO) | 1767 LOG(LS_INFO) |
1779 << "RecreateWebRtcStream (send) because of SetCodecAndOptions; options=" | 1768 << "RecreateWebRtcStream (send) because of SetCodecAndOptions; options=" |
1780 << options.ToString(); | 1769 << options.ToString(); |
1781 RecreateWebRtcStream(); | 1770 RecreateWebRtcStream(); |
1782 if (allocated_encoder_.encoder != new_encoder.encoder) { | 1771 if (allocated_encoder_.encoder != new_encoder.encoder) { |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1828 RecreateWebRtcStream(); | 1817 RecreateWebRtcStream(); |
1829 } | 1818 } |
1830 } | 1819 } |
1831 | 1820 |
1832 webrtc::VideoEncoderConfig | 1821 webrtc::VideoEncoderConfig |
1833 WebRtcVideoChannel2::WebRtcVideoSendStream::CreateVideoEncoderConfig( | 1822 WebRtcVideoChannel2::WebRtcVideoSendStream::CreateVideoEncoderConfig( |
1834 const Dimensions& dimensions, | 1823 const Dimensions& dimensions, |
1835 const VideoCodec& codec) const { | 1824 const VideoCodec& codec) const { |
1836 webrtc::VideoEncoderConfig encoder_config; | 1825 webrtc::VideoEncoderConfig encoder_config; |
1837 if (dimensions.is_screencast) { | 1826 if (dimensions.is_screencast) { |
1838 RTC_CHECK(parameters_.options.screencast_min_bitrate_kbps); | |
1839 encoder_config.min_transmit_bitrate_bps = | 1827 encoder_config.min_transmit_bitrate_bps = |
1840 *parameters_.options.screencast_min_bitrate_kbps * 1000; | 1828 1000 * parameters_.options.screencast_min_bitrate_kbps.value_or(0); |
1841 encoder_config.content_type = | 1829 encoder_config.content_type = |
1842 webrtc::VideoEncoderConfig::ContentType::kScreen; | 1830 webrtc::VideoEncoderConfig::ContentType::kScreen; |
1843 } else { | 1831 } else { |
1844 encoder_config.min_transmit_bitrate_bps = 0; | 1832 encoder_config.min_transmit_bitrate_bps = 0; |
1845 encoder_config.content_type = | 1833 encoder_config.content_type = |
1846 webrtc::VideoEncoderConfig::ContentType::kRealtimeVideo; | 1834 webrtc::VideoEncoderConfig::ContentType::kRealtimeVideo; |
1847 } | 1835 } |
1848 | 1836 |
1849 // Restrict dimensions according to codec max. | 1837 // Restrict dimensions according to codec max. |
1850 int width = dimensions.width; | 1838 int width = dimensions.width; |
(...skipping 652 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2503 video_codecs[i].rtx_payload_type = rtx_mapping[video_codecs[i].codec.id]; | 2491 video_codecs[i].rtx_payload_type = rtx_mapping[video_codecs[i].codec.id]; |
2504 } | 2492 } |
2505 } | 2493 } |
2506 | 2494 |
2507 return video_codecs; | 2495 return video_codecs; |
2508 } | 2496 } |
2509 | 2497 |
2510 } // namespace cricket | 2498 } // namespace cricket |
2511 | 2499 |
2512 #endif // HAVE_WEBRTC_VIDEO | 2500 #endif // HAVE_WEBRTC_VIDEO |
OLD | NEW |