| Index: talk/media/webrtc/webrtcvideoengine2.cc
|
| diff --git a/talk/media/webrtc/webrtcvideoengine2.cc b/talk/media/webrtc/webrtcvideoengine2.cc
|
| index 2d5ec5383b3f30ff6ae6e2bb7c9b8ddfd655b102..b266ab8d774af0d65237887e42d219809dbeca74 100644
|
| --- a/talk/media/webrtc/webrtcvideoengine2.cc
|
| +++ b/talk/media/webrtc/webrtcvideoengine2.cc
|
| @@ -55,6 +55,10 @@
|
| namespace cricket {
|
| namespace {
|
|
|
| +// Default values, used when options are unset.
|
| +const bool kDefault_suspend_below_min_bitrate = false;
|
| +const int kDefault_screencast_min_bitrate_kbps = 0;
|
| +
|
| // Wrap cricket::WebRtcVideoEncoderFactory as a webrtc::VideoEncoderFactory.
|
| class EncoderFactoryAdapter : public webrtc::VideoEncoderFactory {
|
| public:
|
| @@ -645,13 +649,15 @@ WebRtcVideoChannel2::WebRtcVideoChannel2(
|
| WebRtcVideoDecoderFactory* external_decoder_factory)
|
| : call_(call),
|
| unsignalled_ssrc_handler_(&default_unsignalled_ssrc_handler_),
|
| + signal_cpu_adaptation_(true),
|
| + disable_prerenderer_smoothing_(false),
|
| external_encoder_factory_(external_encoder_factory),
|
| external_decoder_factory_(external_decoder_factory) {
|
| RTC_DCHECK(thread_checker_.CalledOnValidThread());
|
| - SetDefaultOptions();
|
| - options_.SetAll(options);
|
| - if (options_.cpu_overuse_detection)
|
| - signal_cpu_adaptation_ = *options_.cpu_overuse_detection;
|
| +
|
| + SetSharedOptions(options);
|
| + send_params_.options = options;
|
| +
|
| rtcp_receiver_report_ssrc_ = kDefaultRtcpReceiverReportSsrc;
|
| sending_ = false;
|
| default_send_ssrc_ = 0;
|
| @@ -659,13 +665,6 @@ WebRtcVideoChannel2::WebRtcVideoChannel2(
|
| recv_codecs_ = FilterSupportedCodecs(MapCodecs(recv_codecs));
|
| }
|
|
|
| -void WebRtcVideoChannel2::SetDefaultOptions() {
|
| - options_.cpu_overuse_detection = rtc::Optional<bool>(true);
|
| - options_.dscp = rtc::Optional<bool>(false);
|
| - options_.suspend_below_min_bitrate = rtc::Optional<bool>(false);
|
| - options_.screencast_min_bitrate_kbps = rtc::Optional<int>(0);
|
| -}
|
| -
|
| WebRtcVideoChannel2::~WebRtcVideoChannel2() {
|
| for (auto& kv : send_streams_)
|
| delete kv.second;
|
| @@ -778,11 +777,23 @@ bool WebRtcVideoChannel2::GetChangedSendParameters(
|
| // Handle options.
|
| // TODO(pbos): Require VideoSendParameters to contain a full set of options
|
| // and check if params.options != options_ instead of applying a delta.
|
| - VideoOptions new_options = options_;
|
| +
|
| + // Keep the default options. TODO(nisse): This is a bit convoluted.
|
| + // It might be cleaner to change SetDefaultOptions to only set
|
| + // options with no current value. Or delete SetDefaultOptions; I
|
| + // think the problem is references to suspend_below_min_bitrate and
|
| + // screencast_min_bitrate which require values to be set, but those
|
| + // references could be changed to use .value_or(the_default_value)
|
| + // instead.
|
| +
|
| + VideoOptions new_options = send_params_.options;
|
| new_options.SetAll(params.options);
|
| - if (!(new_options == options_)) {
|
| + if (!(new_options == send_params_.options)) {
|
| changed_params->options = rtc::Optional<VideoOptions>(new_options);
|
| }
|
| +#if 0
|
| + send_params_.options = new_options;
|
| +#endif
|
|
|
| // Handle RTCP mode.
|
| if (params.rtcp.reduced_size != send_params_.rtcp.reduced_size) {
|
| @@ -791,12 +802,41 @@ bool WebRtcVideoChannel2::GetChangedSendParameters(
|
| : webrtc::RtcpMode::kCompound);
|
| }
|
|
|
| +#if 0
|
| + SetSharedOptions(params.options);
|
| + // TODO(nisse): Call each stream's SetSendParameters only for
|
| + // changed parameters? Used to check params.rtcp.reduced_size, but
|
| + // that broke the
|
| + // WebRtcVideoChannel2Test.SetOptionsWithSuspendBelowMinBitrate
|
| + // test.
|
| +
|
| + VideoOptions options = send_params_.options;
|
| + send_params_ = params;
|
| +
|
| + // Take care to keep old values of options, if the new params
|
| + // doesn't specify any value.
|
| + options.SetAll(params.options);
|
| + send_params_.options = options;
|
| +
|
| + SetSharedOptions(send_params_.options);
|
| + // Call each stream's SetSendParameters method. Leaves to the callee
|
| + // to check if there's any change.
|
| +
|
| + {
|
| + rtc::CritScope stream_lock(&stream_crit_);
|
| + for (auto& kv : send_streams_) {
|
| + kv.second->SetSendParameters(params);
|
| + }
|
| + }
|
| +#endif
|
| +
|
| return true;
|
| }
|
|
|
| bool WebRtcVideoChannel2::SetSendParameters(const VideoSendParameters& params) {
|
| TRACE_EVENT0("webrtc", "WebRtcVideoChannel2::SetSendParameters");
|
| LOG(LS_INFO) << "SetSendParameters: " << params.ToString();
|
| + // TODO(nisse): Should GetChangedSendParameters call SetSharedOptions?
|
| ChangedSendParameters changed_params;
|
| if (!GetChangedSendParameters(params, &changed_params)) {
|
| return false;
|
| @@ -838,6 +878,7 @@ bool WebRtcVideoChannel2::SetSendParameters(const VideoSendParameters& params) {
|
| call_->SetBitrateConfig(bitrate_config_);
|
| }
|
|
|
| +#if 0
|
| if (changed_params.options) {
|
| options_.SetAll(*changed_params.options);
|
| {
|
| @@ -850,7 +891,7 @@ bool WebRtcVideoChannel2::SetSendParameters(const VideoSendParameters& params) {
|
| options_.dscp.value_or(false) ? rtc::DSCP_AF41 : rtc::DSCP_DEFAULT;
|
| MediaChannel::SetDscp(dscp);
|
| }
|
| -
|
| +#endif
|
| {
|
| rtc::CritScope stream_lock(&stream_crit_);
|
| for (auto& kv : send_streams_) {
|
| @@ -1009,9 +1050,14 @@ bool WebRtcVideoChannel2::SetVideoSend(uint32_t ssrc, bool enable,
|
| return false;
|
| }
|
| if (enable && options) {
|
| + // TODO(nisse): Rebase problem.
|
| +#if 0
|
| VideoSendParameters new_params = send_params_;
|
| new_params.options.SetAll(*options);
|
| SetSendParameters(send_params_);
|
| +#else
|
| + return SetOptions(ssrc, *options);
|
| +#endif
|
| }
|
| return true;
|
| }
|
| @@ -1056,7 +1102,7 @@ bool WebRtcVideoChannel2::AddSendStream(const StreamParams& sp) {
|
| config.overuse_callback = this;
|
|
|
| WebRtcVideoSendStream* stream = new WebRtcVideoSendStream(
|
| - call_, sp, config, external_encoder_factory_, options_,
|
| + call_, sp, config, external_encoder_factory_,
|
| bitrate_config_.max_bitrate_bps, send_codec_, send_rtp_extensions_,
|
| send_params_);
|
|
|
| @@ -1186,7 +1232,7 @@ bool WebRtcVideoChannel2::AddRecvStream(const StreamParams& sp,
|
|
|
| receive_streams_[ssrc] = new WebRtcVideoReceiveStream(
|
| call_, sp, config, external_decoder_factory_, default_stream,
|
| - recv_codecs_, options_.disable_prerenderer_smoothing.value_or(false));
|
| + recv_codecs_, disable_prerenderer_smoothing_);
|
|
|
| return true;
|
| }
|
| @@ -1452,11 +1498,44 @@ bool WebRtcVideoChannel2::MuteStream(uint32_t ssrc, bool mute) {
|
| }
|
|
|
| // TODO(pbos): Remove SetOptions in favor of SetSendParameters.
|
| +#if 0
|
| +// TODO(nisse): Rebase leftover.
|
| void WebRtcVideoChannel2::SetOptions(const VideoOptions& options) {
|
| VideoSendParameters new_params = send_params_;
|
| new_params.options.SetAll(options);
|
| SetSendParameters(send_params_);
|
| }
|
| +#endif
|
| +void WebRtcVideoChannel2::SetSharedOptions(const VideoOptions& options) {
|
| + {
|
| + rtc::CritScope lock(&capturer_crit_);
|
| + if (options.cpu_overuse_detection)
|
| + signal_cpu_adaptation_ = *options.cpu_overuse_detection;
|
| + }
|
| + if (options.disable_prerenderer_smoothing)
|
| + disable_prerenderer_smoothing_ = *options.disable_prerenderer_smoothing;
|
| +
|
| + if (options.dscp) {
|
| + rtc::DiffServCodePoint dscp =
|
| + *options.dscp ? rtc::DSCP_AF41 : rtc::DSCP_DEFAULT;
|
| + MediaChannel::SetDscp(dscp);
|
| + }
|
| +}
|
| +
|
| +bool WebRtcVideoChannel2::SetOptions(uint32_t ssrc,
|
| + const VideoOptions& options) {
|
| + TRACE_EVENT0("webrtc", "WebRtcVideoChannel2::SetOptions");
|
| + LOG(LS_INFO) << "SetOptions: ssrc " << ssrc << ": " << options.ToString();
|
| + SetSharedOptions(options);
|
| +
|
| + rtc::CritScope stream_lock(&stream_crit_);
|
| + if (send_streams_.find(ssrc) == send_streams_.end()) {
|
| + return false;
|
| + }
|
| + send_streams_[ssrc]->SetOptions(options);
|
| +
|
| + return true;
|
| +}
|
|
|
| void WebRtcVideoChannel2::SetInterface(NetworkInterface* iface) {
|
| MediaChannel::SetInterface(iface);
|
| @@ -1565,7 +1644,6 @@ WebRtcVideoChannel2::WebRtcVideoSendStream::WebRtcVideoSendStream(
|
| const StreamParams& sp,
|
| const webrtc::VideoSendStream::Config& config,
|
| WebRtcVideoEncoderFactory* external_encoder_factory,
|
| - const VideoOptions& options,
|
| int max_bitrate_bps,
|
| const rtc::Optional<VideoCodecSettings>& codec_settings,
|
| const std::vector<webrtc::RtpExtension>& rtp_extensions,
|
| @@ -1577,7 +1655,7 @@ WebRtcVideoChannel2::WebRtcVideoSendStream::WebRtcVideoSendStream(
|
| call_(call),
|
| external_encoder_factory_(external_encoder_factory),
|
| stream_(NULL),
|
| - parameters_(config, options, max_bitrate_bps, codec_settings),
|
| + parameters_(config, send_params.options, max_bitrate_bps, codec_settings),
|
| pending_encoder_reconfiguration_(false),
|
| allocated_encoder_(NULL, webrtc::kVideoCodecUnknown, false),
|
| capturer_(NULL),
|
| @@ -1868,9 +1946,9 @@ void WebRtcVideoChannel2::WebRtcVideoSendStream::SetCodecAndOptions(
|
| parameters_.config.rtp.nack.rtp_history_ms =
|
| HasNack(codec_settings.codec) ? kNackHistoryMs : 0;
|
|
|
| - RTC_CHECK(options.suspend_below_min_bitrate);
|
| parameters_.config.suspend_below_min_bitrate =
|
| - *options.suspend_below_min_bitrate;
|
| + options.suspend_below_min_bitrate.value_or(
|
| + kDefault_suspend_below_min_bitrate);
|
|
|
| parameters_.codec_settings =
|
| rtc::Optional<WebRtcVideoChannel2::VideoCodecSettings>(codec_settings);
|
| @@ -1936,9 +2014,9 @@ WebRtcVideoChannel2::WebRtcVideoSendStream::CreateVideoEncoderConfig(
|
| const VideoCodec& codec) const {
|
| webrtc::VideoEncoderConfig encoder_config;
|
| if (dimensions.is_screencast) {
|
| - RTC_CHECK(parameters_.options.screencast_min_bitrate_kbps);
|
| encoder_config.min_transmit_bitrate_bps =
|
| - *parameters_.options.screencast_min_bitrate_kbps * 1000;
|
| + 1000 * parameters_.options.screencast_min_bitrate_kbps.value_or(
|
| + kDefault_screencast_min_bitrate_kbps);
|
| encoder_config.content_type =
|
| webrtc::VideoEncoderConfig::ContentType::kScreen;
|
| } else {
|
|
|