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

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

Issue 1430433004: Replace rtc::cricket::Settable with rtc::Maybe (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: iOS and Android fixes 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 470 matching lines...) Expand 10 before | Expand all | Expand 10 after
481 // No automatic resizing when using simulcast or screencast. 481 // No automatic resizing when using simulcast or screencast.
482 bool automatic_resize = 482 bool automatic_resize =
483 !is_screencast && parameters_.config.rtp.ssrcs.size() == 1; 483 !is_screencast && parameters_.config.rtp.ssrcs.size() == 1;
484 bool frame_dropping = !is_screencast; 484 bool frame_dropping = !is_screencast;
485 bool denoising; 485 bool denoising;
486 bool codec_default_denoising = false; 486 bool codec_default_denoising = false;
487 if (is_screencast) { 487 if (is_screencast) {
488 denoising = false; 488 denoising = false;
489 } else { 489 } else {
490 // Use codec default if video_noise_reduction is unset. 490 // Use codec default if video_noise_reduction is unset.
491 codec_default_denoising = !options.video_noise_reduction.Get(&denoising); 491 codec_default_denoising = !options.video_noise_reduction;
492 denoising = options.video_noise_reduction.value_or(false);
492 } 493 }
493 494
494 if (CodecNamesEq(codec.name, kVp8CodecName)) { 495 if (CodecNamesEq(codec.name, kVp8CodecName)) {
495 encoder_settings_.vp8 = webrtc::VideoEncoder::GetDefaultVp8Settings(); 496 encoder_settings_.vp8 = webrtc::VideoEncoder::GetDefaultVp8Settings();
496 encoder_settings_.vp8.automaticResizeOn = automatic_resize; 497 encoder_settings_.vp8.automaticResizeOn = automatic_resize;
497 // VP8 denoising is enabled by default. 498 // VP8 denoising is enabled by default.
498 encoder_settings_.vp8.denoisingOn = 499 encoder_settings_.vp8.denoisingOn =
499 codec_default_denoising ? true : denoising; 500 codec_default_denoising ? true : denoising;
500 encoder_settings_.vp8.frameDroppingOn = frame_dropping; 501 encoder_settings_.vp8.frameDroppingOn = frame_dropping;
501 return &encoder_settings_.vp8; 502 return &encoder_settings_.vp8;
(...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after
769 const std::vector<VideoCodec>& recv_codecs, 770 const std::vector<VideoCodec>& recv_codecs,
770 WebRtcVideoEncoderFactory* external_encoder_factory, 771 WebRtcVideoEncoderFactory* external_encoder_factory,
771 WebRtcVideoDecoderFactory* external_decoder_factory) 772 WebRtcVideoDecoderFactory* external_decoder_factory)
772 : call_(call), 773 : call_(call),
773 unsignalled_ssrc_handler_(&default_unsignalled_ssrc_handler_), 774 unsignalled_ssrc_handler_(&default_unsignalled_ssrc_handler_),
774 external_encoder_factory_(external_encoder_factory), 775 external_encoder_factory_(external_encoder_factory),
775 external_decoder_factory_(external_decoder_factory) { 776 external_decoder_factory_(external_decoder_factory) {
776 RTC_DCHECK(thread_checker_.CalledOnValidThread()); 777 RTC_DCHECK(thread_checker_.CalledOnValidThread());
777 SetDefaultOptions(); 778 SetDefaultOptions();
778 options_.SetAll(options); 779 options_.SetAll(options);
779 options_.cpu_overuse_detection.Get(&signal_cpu_adaptation_); 780 if (options_.cpu_overuse_detection)
781 signal_cpu_adaptation_ = *options_.cpu_overuse_detection;
780 rtcp_receiver_report_ssrc_ = kDefaultRtcpReceiverReportSsrc; 782 rtcp_receiver_report_ssrc_ = kDefaultRtcpReceiverReportSsrc;
781 sending_ = false; 783 sending_ = false;
782 default_send_ssrc_ = 0; 784 default_send_ssrc_ = 0;
783 SetRecvCodecs(recv_codecs); 785 SetRecvCodecs(recv_codecs);
784 } 786 }
785 787
786 void WebRtcVideoChannel2::SetDefaultOptions() { 788 void WebRtcVideoChannel2::SetDefaultOptions() {
787 options_.cpu_overuse_detection.Set(true); 789 options_.cpu_overuse_detection = rtc::Maybe<bool>(true);
788 options_.dscp.Set(false); 790 options_.dscp = rtc::Maybe<bool>(false);
789 options_.suspend_below_min_bitrate.Set(false); 791 options_.suspend_below_min_bitrate = rtc::Maybe<bool>(false);
790 options_.screencast_min_bitrate.Set(0); 792 options_.screencast_min_bitrate = rtc::Maybe<int>(0);
791 } 793 }
792 794
793 WebRtcVideoChannel2::~WebRtcVideoChannel2() { 795 WebRtcVideoChannel2::~WebRtcVideoChannel2() {
794 for (auto& kv : send_streams_) 796 for (auto& kv : send_streams_)
795 delete kv.second; 797 delete kv.second;
796 for (auto& kv : receive_streams_) 798 for (auto& kv : receive_streams_)
797 delete kv.second; 799 delete kv.second;
798 } 800 }
799 801
800 bool WebRtcVideoChannel2::CodecIsExternallySupported( 802 bool WebRtcVideoChannel2::CodecIsExternallySupported(
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after
944 const std::vector<VideoCodecSettings> supported_codecs = 946 const std::vector<VideoCodecSettings> supported_codecs =
945 FilterSupportedCodecs(MapCodecs(codecs)); 947 FilterSupportedCodecs(MapCodecs(codecs));
946 948
947 if (supported_codecs.empty()) { 949 if (supported_codecs.empty()) {
948 LOG(LS_ERROR) << "No video codecs supported."; 950 LOG(LS_ERROR) << "No video codecs supported.";
949 return false; 951 return false;
950 } 952 }
951 953
952 LOG(LS_INFO) << "Using codec: " << supported_codecs.front().codec.ToString(); 954 LOG(LS_INFO) << "Using codec: " << supported_codecs.front().codec.ToString();
953 955
954 VideoCodecSettings old_codec; 956 if (send_codec_ && supported_codecs.front() == *send_codec_) {
955 if (send_codec_.Get(&old_codec) && supported_codecs.front() == old_codec) {
956 LOG(LS_INFO) << "Ignore call to SetSendCodecs because first supported " 957 LOG(LS_INFO) << "Ignore call to SetSendCodecs because first supported "
957 "codec hasn't changed."; 958 "codec hasn't changed.";
958 // Using same codec, avoid reconfiguring. 959 // Using same codec, avoid reconfiguring.
959 return true; 960 return true;
960 } 961 }
961 962
962 send_codec_.Set(supported_codecs.front()); 963 send_codec_ = rtc::Maybe<WebRtcVideoChannel2::VideoCodecSettings>(
964 supported_codecs.front());
963 965
964 rtc::CritScope stream_lock(&stream_crit_); 966 rtc::CritScope stream_lock(&stream_crit_);
965 LOG(LS_INFO) << "Change the send codec because SetSendCodecs has a different " 967 LOG(LS_INFO) << "Change the send codec because SetSendCodecs has a different "
966 "first supported codec."; 968 "first supported codec.";
967 for (auto& kv : send_streams_) { 969 for (auto& kv : send_streams_) {
968 RTC_DCHECK(kv.second != nullptr); 970 RTC_DCHECK(kv.second != nullptr);
969 kv.second->SetCodec(supported_codecs.front()); 971 kv.second->SetCodec(supported_codecs.front());
970 } 972 }
971 LOG(LS_INFO) << "SetNackAndRemb on all the receive streams because the send " 973 LOG(LS_INFO) << "SetNackAndRemb on all the receive streams because the send "
972 "codec has changed."; 974 "codec has changed.";
(...skipping 25 matching lines...) Expand all
998 bitrate_config_.max_bitrate_bps = bitrate_kbps * 1000; 1000 bitrate_config_.max_bitrate_bps = bitrate_kbps * 1000;
999 } else { 1001 } else {
1000 bitrate_config_.max_bitrate_bps = -1; 1002 bitrate_config_.max_bitrate_bps = -1;
1001 } 1003 }
1002 call_->SetBitrateConfig(bitrate_config_); 1004 call_->SetBitrateConfig(bitrate_config_);
1003 1005
1004 return true; 1006 return true;
1005 } 1007 }
1006 1008
1007 bool WebRtcVideoChannel2::GetSendCodec(VideoCodec* codec) { 1009 bool WebRtcVideoChannel2::GetSendCodec(VideoCodec* codec) {
1008 VideoCodecSettings codec_settings; 1010 if (!send_codec_) {
1009 if (!send_codec_.Get(&codec_settings)) {
1010 LOG(LS_VERBOSE) << "GetSendCodec: No send codec set."; 1011 LOG(LS_VERBOSE) << "GetSendCodec: No send codec set.";
1011 return false; 1012 return false;
1012 } 1013 }
1013 *codec = codec_settings.codec; 1014 *codec = send_codec_->codec;
1014 return true; 1015 return true;
1015 } 1016 }
1016 1017
1017 bool WebRtcVideoChannel2::SetSendStreamFormat(uint32_t ssrc, 1018 bool WebRtcVideoChannel2::SetSendStreamFormat(uint32_t ssrc,
1018 const VideoFormat& format) { 1019 const VideoFormat& format) {
1019 LOG(LS_VERBOSE) << "SetSendStreamFormat:" << ssrc << " -> " 1020 LOG(LS_VERBOSE) << "SetSendStreamFormat:" << ssrc << " -> "
1020 << format.ToString(); 1021 << format.ToString();
1021 rtc::CritScope stream_lock(&stream_crit_); 1022 rtc::CritScope stream_lock(&stream_crit_);
1022 if (send_streams_.find(ssrc) == send_streams_.end()) { 1023 if (send_streams_.find(ssrc) == send_streams_.end()) {
1023 return false; 1024 return false;
1024 } 1025 }
1025 return send_streams_[ssrc]->SetVideoFormat(format); 1026 return send_streams_[ssrc]->SetVideoFormat(format);
1026 } 1027 }
1027 1028
1028 bool WebRtcVideoChannel2::SetSend(bool send) { 1029 bool WebRtcVideoChannel2::SetSend(bool send) {
1029 LOG(LS_VERBOSE) << "SetSend: " << (send ? "true" : "false"); 1030 LOG(LS_VERBOSE) << "SetSend: " << (send ? "true" : "false");
1030 if (send && !send_codec_.IsSet()) { 1031 if (send && !send_codec_) {
1031 LOG(LS_ERROR) << "SetSend(true) called before setting codec."; 1032 LOG(LS_ERROR) << "SetSend(true) called before setting codec.";
1032 return false; 1033 return false;
1033 } 1034 }
1034 if (send) { 1035 if (send) {
1035 StartAllSendStreams(); 1036 StartAllSendStreams();
1036 } else { 1037 } else {
1037 StopAllSendStreams(); 1038 StopAllSendStreams();
1038 } 1039 }
1039 sending_ = send; 1040 sending_ = send;
1040 return true; 1041 return true;
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after
1216 1217
1217 for (uint32_t used_ssrc : sp.ssrcs) 1218 for (uint32_t used_ssrc : sp.ssrcs)
1218 receive_ssrcs_.insert(used_ssrc); 1219 receive_ssrcs_.insert(used_ssrc);
1219 1220
1220 webrtc::VideoReceiveStream::Config config(this); 1221 webrtc::VideoReceiveStream::Config config(this);
1221 ConfigureReceiverRtp(&config, sp); 1222 ConfigureReceiverRtp(&config, sp);
1222 1223
1223 // Set up A/V sync group based on sync label. 1224 // Set up A/V sync group based on sync label.
1224 config.sync_group = sp.sync_label; 1225 config.sync_group = sp.sync_label;
1225 1226
1226 config.rtp.remb = false; 1227 config.rtp.remb = send_codec_ ? HasRemb(send_codec_->codec) : false;
1227 VideoCodecSettings send_codec;
1228 if (send_codec_.Get(&send_codec)) {
1229 config.rtp.remb = HasRemb(send_codec.codec);
1230 }
1231 1228
1232 receive_streams_[ssrc] = new WebRtcVideoReceiveStream( 1229 receive_streams_[ssrc] = new WebRtcVideoReceiveStream(
1233 call_, sp, config, external_decoder_factory_, default_stream, 1230 call_, sp, config, external_decoder_factory_, default_stream,
1234 recv_codecs_); 1231 recv_codecs_);
1235 1232
1236 return true; 1233 return true;
1237 } 1234 }
1238 1235
1239 void WebRtcVideoChannel2::ConfigureReceiverRtp( 1236 void WebRtcVideoChannel2::ConfigureReceiverRtp(
1240 webrtc::VideoReceiveStream::Config* config, 1237 webrtc::VideoReceiveStream::Config* config,
(...skipping 362 matching lines...) Expand 10 before | Expand all | Expand 10 after
1603 TRACE_EVENT0("webrtc", "WebRtcVideoChannel2::SetOptions"); 1600 TRACE_EVENT0("webrtc", "WebRtcVideoChannel2::SetOptions");
1604 LOG(LS_INFO) << "SetOptions: " << options.ToString(); 1601 LOG(LS_INFO) << "SetOptions: " << options.ToString();
1605 VideoOptions old_options = options_; 1602 VideoOptions old_options = options_;
1606 options_.SetAll(options); 1603 options_.SetAll(options);
1607 if (options_ == old_options) { 1604 if (options_ == old_options) {
1608 // No new options to set. 1605 // No new options to set.
1609 return true; 1606 return true;
1610 } 1607 }
1611 { 1608 {
1612 rtc::CritScope lock(&capturer_crit_); 1609 rtc::CritScope lock(&capturer_crit_);
1613 options_.cpu_overuse_detection.Get(&signal_cpu_adaptation_); 1610 if (options_.cpu_overuse_detection)
1611 signal_cpu_adaptation_ = *options_.cpu_overuse_detection;
1614 } 1612 }
1615 rtc::DiffServCodePoint dscp = options_.dscp.GetWithDefaultIfUnset(false) 1613 rtc::DiffServCodePoint dscp =
1616 ? rtc::DSCP_AF41 1614 options_.dscp.value_or(false) ? rtc::DSCP_AF41 : rtc::DSCP_DEFAULT;
1617 : rtc::DSCP_DEFAULT;
1618 MediaChannel::SetDscp(dscp); 1615 MediaChannel::SetDscp(dscp);
1619 rtc::CritScope stream_lock(&stream_crit_); 1616 rtc::CritScope stream_lock(&stream_crit_);
1620 for (std::map<uint32_t, WebRtcVideoSendStream*>::iterator it = 1617 for (std::map<uint32_t, WebRtcVideoSendStream*>::iterator it =
1621 send_streams_.begin(); 1618 send_streams_.begin();
1622 it != send_streams_.end(); ++it) { 1619 it != send_streams_.end(); ++it) {
1623 it->second->SetOptions(options_); 1620 it->second->SetOptions(options_);
1624 } 1621 }
1625 return true; 1622 return true;
1626 } 1623 }
1627 1624
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
1699 it != send_streams_.end(); ++it) { 1696 it != send_streams_.end(); ++it) {
1700 it->second->Stop(); 1697 it->second->Stop();
1701 } 1698 }
1702 } 1699 }
1703 1700
1704 WebRtcVideoChannel2::WebRtcVideoSendStream::VideoSendStreamParameters:: 1701 WebRtcVideoChannel2::WebRtcVideoSendStream::VideoSendStreamParameters::
1705 VideoSendStreamParameters( 1702 VideoSendStreamParameters(
1706 const webrtc::VideoSendStream::Config& config, 1703 const webrtc::VideoSendStream::Config& config,
1707 const VideoOptions& options, 1704 const VideoOptions& options,
1708 int max_bitrate_bps, 1705 int max_bitrate_bps,
1709 const Settable<VideoCodecSettings>& codec_settings) 1706 const rtc::Maybe<VideoCodecSettings>& codec_settings)
1710 : config(config), 1707 : config(config),
1711 options(options), 1708 options(options),
1712 max_bitrate_bps(max_bitrate_bps), 1709 max_bitrate_bps(max_bitrate_bps),
1713 codec_settings(codec_settings) { 1710 codec_settings(codec_settings) {}
1714 }
1715 1711
1716 WebRtcVideoChannel2::WebRtcVideoSendStream::AllocatedEncoder::AllocatedEncoder( 1712 WebRtcVideoChannel2::WebRtcVideoSendStream::AllocatedEncoder::AllocatedEncoder(
1717 webrtc::VideoEncoder* encoder, 1713 webrtc::VideoEncoder* encoder,
1718 webrtc::VideoCodecType type, 1714 webrtc::VideoCodecType type,
1719 bool external) 1715 bool external)
1720 : encoder(encoder), 1716 : encoder(encoder),
1721 external_encoder(nullptr), 1717 external_encoder(nullptr),
1722 type(type), 1718 type(type),
1723 external(external) { 1719 external(external) {
1724 if (external) { 1720 if (external) {
1725 external_encoder = encoder; 1721 external_encoder = encoder;
1726 this->encoder = 1722 this->encoder =
1727 new webrtc::VideoEncoderSoftwareFallbackWrapper(type, encoder); 1723 new webrtc::VideoEncoderSoftwareFallbackWrapper(type, encoder);
1728 } 1724 }
1729 } 1725 }
1730 1726
1731 WebRtcVideoChannel2::WebRtcVideoSendStream::WebRtcVideoSendStream( 1727 WebRtcVideoChannel2::WebRtcVideoSendStream::WebRtcVideoSendStream(
1732 webrtc::Call* call, 1728 webrtc::Call* call,
1733 const StreamParams& sp, 1729 const StreamParams& sp,
1734 const webrtc::VideoSendStream::Config& config, 1730 const webrtc::VideoSendStream::Config& config,
1735 WebRtcVideoEncoderFactory* external_encoder_factory, 1731 WebRtcVideoEncoderFactory* external_encoder_factory,
1736 const VideoOptions& options, 1732 const VideoOptions& options,
1737 int max_bitrate_bps, 1733 int max_bitrate_bps,
1738 const Settable<VideoCodecSettings>& codec_settings, 1734 const rtc::Maybe<VideoCodecSettings>& codec_settings,
1739 const std::vector<webrtc::RtpExtension>& rtp_extensions) 1735 const std::vector<webrtc::RtpExtension>& rtp_extensions)
1740 : ssrcs_(sp.ssrcs), 1736 : ssrcs_(sp.ssrcs),
1741 ssrc_groups_(sp.ssrc_groups), 1737 ssrc_groups_(sp.ssrc_groups),
1742 call_(call), 1738 call_(call),
1743 external_encoder_factory_(external_encoder_factory), 1739 external_encoder_factory_(external_encoder_factory),
1744 stream_(NULL), 1740 stream_(NULL),
1745 parameters_(config, options, max_bitrate_bps, codec_settings), 1741 parameters_(config, options, max_bitrate_bps, codec_settings),
1746 allocated_encoder_(NULL, webrtc::kVideoCodecUnknown, false), 1742 allocated_encoder_(NULL, webrtc::kVideoCodecUnknown, false),
1747 capturer_(NULL), 1743 capturer_(NULL),
1748 sending_(false), 1744 sending_(false),
1749 muted_(false), 1745 muted_(false),
1750 old_adapt_changes_(0), 1746 old_adapt_changes_(0),
1751 first_frame_timestamp_ms_(0), 1747 first_frame_timestamp_ms_(0),
1752 last_frame_timestamp_ms_(0) { 1748 last_frame_timestamp_ms_(0) {
1753 parameters_.config.rtp.max_packet_size = kVideoMtu; 1749 parameters_.config.rtp.max_packet_size = kVideoMtu;
1754 1750
1755 sp.GetPrimarySsrcs(&parameters_.config.rtp.ssrcs); 1751 sp.GetPrimarySsrcs(&parameters_.config.rtp.ssrcs);
1756 sp.GetFidSsrcs(parameters_.config.rtp.ssrcs, 1752 sp.GetFidSsrcs(parameters_.config.rtp.ssrcs,
1757 &parameters_.config.rtp.rtx.ssrcs); 1753 &parameters_.config.rtp.rtx.ssrcs);
1758 parameters_.config.rtp.c_name = sp.cname; 1754 parameters_.config.rtp.c_name = sp.cname;
1759 parameters_.config.rtp.extensions = rtp_extensions; 1755 parameters_.config.rtp.extensions = rtp_extensions;
1760 1756
1761 VideoCodecSettings params; 1757 if (codec_settings) {
1762 if (codec_settings.Get(&params)) { 1758 SetCodec(*codec_settings);
1763 SetCodec(params);
1764 } 1759 }
1765 } 1760 }
1766 1761
1767 WebRtcVideoChannel2::WebRtcVideoSendStream::~WebRtcVideoSendStream() { 1762 WebRtcVideoChannel2::WebRtcVideoSendStream::~WebRtcVideoSendStream() {
1768 DisconnectCapturer(); 1763 DisconnectCapturer();
1769 if (stream_ != NULL) { 1764 if (stream_ != NULL) {
1770 call_->DestroyVideoSendStream(stream_); 1765 call_->DestroyVideoSendStream(stream_);
1771 } 1766 }
1772 DestroyVideoEncoder(&allocated_encoder_); 1767 DestroyVideoEncoder(&allocated_encoder_);
1773 } 1768 }
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after
1931 rtc::CritScope cs(&lock_); 1926 rtc::CritScope cs(&lock_);
1932 if (capturer_ == NULL) 1927 if (capturer_ == NULL)
1933 return; 1928 return;
1934 1929
1935 capturer_->SetApplyRotation(apply_rotation); 1930 capturer_->SetApplyRotation(apply_rotation);
1936 } 1931 }
1937 1932
1938 void WebRtcVideoChannel2::WebRtcVideoSendStream::SetOptions( 1933 void WebRtcVideoChannel2::WebRtcVideoSendStream::SetOptions(
1939 const VideoOptions& options) { 1934 const VideoOptions& options) {
1940 rtc::CritScope cs(&lock_); 1935 rtc::CritScope cs(&lock_);
1941 VideoCodecSettings codec_settings; 1936 if (parameters_.codec_settings) {
1942 if (parameters_.codec_settings.Get(&codec_settings)) {
1943 LOG(LS_INFO) << "SetCodecAndOptions because of SetOptions; options=" 1937 LOG(LS_INFO) << "SetCodecAndOptions because of SetOptions; options="
1944 << options.ToString(); 1938 << options.ToString();
1945 SetCodecAndOptions(codec_settings, options); 1939 SetCodecAndOptions(*parameters_.codec_settings, options);
1946 } else { 1940 } else {
1947 parameters_.options = options; 1941 parameters_.options = options;
1948 } 1942 }
1949 } 1943 }
1950 1944
1951 void WebRtcVideoChannel2::WebRtcVideoSendStream::SetCodec( 1945 void WebRtcVideoChannel2::WebRtcVideoSendStream::SetCodec(
1952 const VideoCodecSettings& codec_settings) { 1946 const VideoCodecSettings& codec_settings) {
1953 rtc::CritScope cs(&lock_); 1947 rtc::CritScope cs(&lock_);
1954 LOG(LS_INFO) << "SetCodecAndOptions because of SetCodec."; 1948 LOG(LS_INFO) << "SetCodecAndOptions because of SetCodec.";
1955 SetCodecAndOptions(codec_settings, parameters_.options); 1949 SetCodecAndOptions(codec_settings, parameters_.options);
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
2040 "payload type. Ignoring."; 2034 "payload type. Ignoring.";
2041 parameters_.config.rtp.rtx.ssrcs.clear(); 2035 parameters_.config.rtp.rtx.ssrcs.clear();
2042 } else { 2036 } else {
2043 parameters_.config.rtp.rtx.payload_type = codec_settings.rtx_payload_type; 2037 parameters_.config.rtp.rtx.payload_type = codec_settings.rtx_payload_type;
2044 } 2038 }
2045 } 2039 }
2046 2040
2047 parameters_.config.rtp.nack.rtp_history_ms = 2041 parameters_.config.rtp.nack.rtp_history_ms =
2048 HasNack(codec_settings.codec) ? kNackHistoryMs : 0; 2042 HasNack(codec_settings.codec) ? kNackHistoryMs : 0;
2049 2043
2050 options.suspend_below_min_bitrate.Get( 2044 RTC_CHECK(options.suspend_below_min_bitrate);
2051 &parameters_.config.suspend_below_min_bitrate); 2045 parameters_.config.suspend_below_min_bitrate =
2046 *options.suspend_below_min_bitrate;
2052 2047
2053 parameters_.codec_settings.Set(codec_settings); 2048 parameters_.codec_settings =
2049 rtc::Maybe<WebRtcVideoChannel2::VideoCodecSettings>(codec_settings);
2054 parameters_.options = options; 2050 parameters_.options = options;
2055 2051
2056 LOG(LS_INFO) 2052 LOG(LS_INFO)
2057 << "RecreateWebRtcStream (send) because of SetCodecAndOptions; options=" 2053 << "RecreateWebRtcStream (send) because of SetCodecAndOptions; options="
2058 << options.ToString(); 2054 << options.ToString();
2059 RecreateWebRtcStream(); 2055 RecreateWebRtcStream();
2060 if (allocated_encoder_.encoder != new_encoder.encoder) { 2056 if (allocated_encoder_.encoder != new_encoder.encoder) {
2061 DestroyVideoEncoder(&allocated_encoder_); 2057 DestroyVideoEncoder(&allocated_encoder_);
2062 allocated_encoder_ = new_encoder; 2058 allocated_encoder_ = new_encoder;
2063 } 2059 }
2064 } 2060 }
2065 2061
2066 void WebRtcVideoChannel2::WebRtcVideoSendStream::SetRtpExtensions( 2062 void WebRtcVideoChannel2::WebRtcVideoSendStream::SetRtpExtensions(
2067 const std::vector<webrtc::RtpExtension>& rtp_extensions) { 2063 const std::vector<webrtc::RtpExtension>& rtp_extensions) {
2068 rtc::CritScope cs(&lock_); 2064 rtc::CritScope cs(&lock_);
2069 parameters_.config.rtp.extensions = rtp_extensions; 2065 parameters_.config.rtp.extensions = rtp_extensions;
2070 if (stream_ != nullptr) { 2066 if (stream_ != nullptr) {
2071 LOG(LS_INFO) << "RecreateWebRtcStream (send) because of SetRtpExtensions"; 2067 LOG(LS_INFO) << "RecreateWebRtcStream (send) because of SetRtpExtensions";
2072 RecreateWebRtcStream(); 2068 RecreateWebRtcStream();
2073 } 2069 }
2074 } 2070 }
2075 2071
2076 webrtc::VideoEncoderConfig 2072 webrtc::VideoEncoderConfig
2077 WebRtcVideoChannel2::WebRtcVideoSendStream::CreateVideoEncoderConfig( 2073 WebRtcVideoChannel2::WebRtcVideoSendStream::CreateVideoEncoderConfig(
2078 const Dimensions& dimensions, 2074 const Dimensions& dimensions,
2079 const VideoCodec& codec) const { 2075 const VideoCodec& codec) const {
2080 webrtc::VideoEncoderConfig encoder_config; 2076 webrtc::VideoEncoderConfig encoder_config;
2081 if (dimensions.is_screencast) { 2077 if (dimensions.is_screencast) {
2082 int screencast_min_bitrate_kbps; 2078 RTC_CHECK(parameters_.options.screencast_min_bitrate);
2083 parameters_.options.screencast_min_bitrate.Get(
2084 &screencast_min_bitrate_kbps);
2085 encoder_config.min_transmit_bitrate_bps = 2079 encoder_config.min_transmit_bitrate_bps =
2086 screencast_min_bitrate_kbps * 1000; 2080 *parameters_.options.screencast_min_bitrate * 1000;
2087 encoder_config.content_type = 2081 encoder_config.content_type =
2088 webrtc::VideoEncoderConfig::ContentType::kScreen; 2082 webrtc::VideoEncoderConfig::ContentType::kScreen;
2089 } else { 2083 } else {
2090 encoder_config.min_transmit_bitrate_bps = 0; 2084 encoder_config.min_transmit_bitrate_bps = 0;
2091 encoder_config.content_type = 2085 encoder_config.content_type =
2092 webrtc::VideoEncoderConfig::ContentType::kRealtimeVideo; 2086 webrtc::VideoEncoderConfig::ContentType::kRealtimeVideo;
2093 } 2087 }
2094 2088
2095 // Restrict dimensions according to codec max. 2089 // Restrict dimensions according to codec max.
2096 int width = dimensions.width; 2090 int width = dimensions.width;
(...skipping 15 matching lines...) Expand all
2112 size_t stream_count = parameters_.config.rtp.ssrcs.size(); 2106 size_t stream_count = parameters_.config.rtp.ssrcs.size();
2113 if (IsCodecBlacklistedForSimulcast(codec.name) || dimensions.is_screencast) { 2107 if (IsCodecBlacklistedForSimulcast(codec.name) || dimensions.is_screencast) {
2114 stream_count = 1; 2108 stream_count = 1;
2115 } 2109 }
2116 2110
2117 encoder_config.streams = 2111 encoder_config.streams =
2118 CreateVideoStreams(clamped_codec, parameters_.options, 2112 CreateVideoStreams(clamped_codec, parameters_.options,
2119 parameters_.max_bitrate_bps, stream_count); 2113 parameters_.max_bitrate_bps, stream_count);
2120 2114
2121 // Conference mode screencast uses 2 temporal layers split at 100kbit. 2115 // Conference mode screencast uses 2 temporal layers split at 100kbit.
2122 if (parameters_.options.conference_mode.GetWithDefaultIfUnset(false) && 2116 if (parameters_.options.conference_mode.value_or(false) &&
2123 dimensions.is_screencast && encoder_config.streams.size() == 1) { 2117 dimensions.is_screencast && encoder_config.streams.size() == 1) {
2124 ScreenshareLayerConfig config = ScreenshareLayerConfig::GetDefault(); 2118 ScreenshareLayerConfig config = ScreenshareLayerConfig::GetDefault();
2125 2119
2126 // For screenshare in conference mode, tl0 and tl1 bitrates are piggybacked 2120 // For screenshare in conference mode, tl0 and tl1 bitrates are piggybacked
2127 // on the VideoCodec struct as target and max bitrates, respectively. 2121 // on the VideoCodec struct as target and max bitrates, respectively.
2128 // See eg. webrtc::VP8EncoderImpl::SetRates(). 2122 // See eg. webrtc::VP8EncoderImpl::SetRates().
2129 encoder_config.streams[0].target_bitrate_bps = 2123 encoder_config.streams[0].target_bitrate_bps =
2130 config.tl0_bitrate_kbps * 1000; 2124 config.tl0_bitrate_kbps * 1000;
2131 encoder_config.streams[0].max_bitrate_bps = config.tl1_bitrate_kbps * 1000; 2125 encoder_config.streams[0].max_bitrate_bps = config.tl1_bitrate_kbps * 1000;
2132 encoder_config.streams[0].temporal_layer_thresholds_bps.clear(); 2126 encoder_config.streams[0].temporal_layer_thresholds_bps.clear();
(...skipping 14 matching lines...) Expand all
2147 } 2141 }
2148 LOG(LS_INFO) << "SetDimensions: " << width << "x" << height 2142 LOG(LS_INFO) << "SetDimensions: " << width << "x" << height
2149 << (is_screencast ? " (screencast)" : " (not screencast)"); 2143 << (is_screencast ? " (screencast)" : " (not screencast)");
2150 2144
2151 last_dimensions_.width = width; 2145 last_dimensions_.width = width;
2152 last_dimensions_.height = height; 2146 last_dimensions_.height = height;
2153 last_dimensions_.is_screencast = is_screencast; 2147 last_dimensions_.is_screencast = is_screencast;
2154 2148
2155 RTC_DCHECK(!parameters_.encoder_config.streams.empty()); 2149 RTC_DCHECK(!parameters_.encoder_config.streams.empty());
2156 2150
2157 VideoCodecSettings codec_settings; 2151 RTC_CHECK(parameters_.codec_settings);
2158 parameters_.codec_settings.Get(&codec_settings); 2152 VideoCodecSettings codec_settings = *parameters_.codec_settings;
2159 2153
2160 webrtc::VideoEncoderConfig encoder_config = 2154 webrtc::VideoEncoderConfig encoder_config =
2161 CreateVideoEncoderConfig(last_dimensions_, codec_settings.codec); 2155 CreateVideoEncoderConfig(last_dimensions_, codec_settings.codec);
2162 2156
2163 encoder_config.encoder_specific_settings = ConfigureVideoEncoderSettings( 2157 encoder_config.encoder_specific_settings = ConfigureVideoEncoderSettings(
2164 codec_settings.codec, parameters_.options, is_screencast); 2158 codec_settings.codec, parameters_.options, is_screencast);
2165 2159
2166 bool stream_reconfigured = stream_->ReconfigureVideoEncoder(encoder_config); 2160 bool stream_reconfigured = stream_->ReconfigureVideoEncoder(encoder_config);
2167 2161
2168 encoder_config.encoder_specific_settings = NULL; 2162 encoder_config.encoder_specific_settings = NULL;
(...skipping 24 matching lines...) Expand all
2193 2187
2194 VideoSenderInfo 2188 VideoSenderInfo
2195 WebRtcVideoChannel2::WebRtcVideoSendStream::GetVideoSenderInfo() { 2189 WebRtcVideoChannel2::WebRtcVideoSendStream::GetVideoSenderInfo() {
2196 VideoSenderInfo info; 2190 VideoSenderInfo info;
2197 webrtc::VideoSendStream::Stats stats; 2191 webrtc::VideoSendStream::Stats stats;
2198 { 2192 {
2199 rtc::CritScope cs(&lock_); 2193 rtc::CritScope cs(&lock_);
2200 for (uint32_t ssrc : parameters_.config.rtp.ssrcs) 2194 for (uint32_t ssrc : parameters_.config.rtp.ssrcs)
2201 info.add_ssrc(ssrc); 2195 info.add_ssrc(ssrc);
2202 2196
2203 VideoCodecSettings codec_settings; 2197 if (parameters_.codec_settings)
2204 if (parameters_.codec_settings.Get(&codec_settings)) 2198 info.codec_name = parameters_.codec_settings->codec.name;
2205 info.codec_name = codec_settings.codec.name;
2206 for (size_t i = 0; i < parameters_.encoder_config.streams.size(); ++i) { 2199 for (size_t i = 0; i < parameters_.encoder_config.streams.size(); ++i) {
2207 if (i == parameters_.encoder_config.streams.size() - 1) { 2200 if (i == parameters_.encoder_config.streams.size() - 1) {
2208 info.preferred_bitrate += 2201 info.preferred_bitrate +=
2209 parameters_.encoder_config.streams[i].max_bitrate_bps; 2202 parameters_.encoder_config.streams[i].max_bitrate_bps;
2210 } else { 2203 } else {
2211 info.preferred_bitrate += 2204 info.preferred_bitrate +=
2212 parameters_.encoder_config.streams[i].target_bitrate_bps; 2205 parameters_.encoder_config.streams[i].target_bitrate_bps;
2213 } 2206 }
2214 } 2207 }
2215 2208
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
2307 int width = last_dimensions_.width; 2300 int width = last_dimensions_.width;
2308 last_dimensions_.width = 0; 2301 last_dimensions_.width = 0;
2309 SetDimensions(width, last_dimensions_.height, last_dimensions_.is_screencast); 2302 SetDimensions(width, last_dimensions_.height, last_dimensions_.is_screencast);
2310 } 2303 }
2311 2304
2312 void WebRtcVideoChannel2::WebRtcVideoSendStream::RecreateWebRtcStream() { 2305 void WebRtcVideoChannel2::WebRtcVideoSendStream::RecreateWebRtcStream() {
2313 if (stream_ != NULL) { 2306 if (stream_ != NULL) {
2314 call_->DestroyVideoSendStream(stream_); 2307 call_->DestroyVideoSendStream(stream_);
2315 } 2308 }
2316 2309
2317 VideoCodecSettings codec_settings; 2310 RTC_CHECK(parameters_.codec_settings);
2318 parameters_.codec_settings.Get(&codec_settings);
2319 parameters_.encoder_config.encoder_specific_settings = 2311 parameters_.encoder_config.encoder_specific_settings =
2320 ConfigureVideoEncoderSettings( 2312 ConfigureVideoEncoderSettings(
2321 codec_settings.codec, parameters_.options, 2313 parameters_.codec_settings->codec, parameters_.options,
2322 parameters_.encoder_config.content_type == 2314 parameters_.encoder_config.content_type ==
2323 webrtc::VideoEncoderConfig::ContentType::kScreen); 2315 webrtc::VideoEncoderConfig::ContentType::kScreen);
2324 2316
2325 webrtc::VideoSendStream::Config config = parameters_.config; 2317 webrtc::VideoSendStream::Config config = parameters_.config;
2326 if (!config.rtp.rtx.ssrcs.empty() && config.rtp.rtx.payload_type == -1) { 2318 if (!config.rtp.rtx.ssrcs.empty() && config.rtp.rtx.payload_type == -1) {
2327 LOG(LS_WARNING) << "RTX SSRCs configured but there's no configured RTX " 2319 LOG(LS_WARNING) << "RTX SSRCs configured but there's no configured RTX "
2328 "payload type the set codec. Ignoring RTX."; 2320 "payload type the set codec. Ignoring RTX.";
2329 config.rtp.rtx.ssrcs.clear(); 2321 config.rtp.rtx.ssrcs.clear();
2330 } 2322 }
2331 stream_ = call_->CreateVideoSendStream(config, parameters_.encoder_config); 2323 stream_ = call_->CreateVideoSendStream(config, parameters_.encoder_config);
(...skipping 417 matching lines...) Expand 10 before | Expand all | Expand 10 after
2749 video_codecs[i].rtx_payload_type = rtx_mapping[video_codecs[i].codec.id]; 2741 video_codecs[i].rtx_payload_type = rtx_mapping[video_codecs[i].codec.id];
2750 } 2742 }
2751 } 2743 }
2752 2744
2753 return video_codecs; 2745 return video_codecs;
2754 } 2746 }
2755 2747
2756 } // namespace cricket 2748 } // namespace cricket
2757 2749
2758 #endif // HAVE_WEBRTC_VIDEO 2750 #endif // HAVE_WEBRTC_VIDEO
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698