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

Unified Diff: webrtc/media/engine/webrtcvideoengine2.cc

Issue 2351633002: Let ViEEncoder handle resolution changes. (Closed)
Patch Set: rebased Created 4 years, 2 months 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « webrtc/media/engine/webrtcvideoengine2.h ('k') | webrtc/media/engine/webrtcvideoengine2_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: webrtc/media/engine/webrtcvideoengine2.cc
diff --git a/webrtc/media/engine/webrtcvideoengine2.cc b/webrtc/media/engine/webrtcvideoengine2.cc
index 5176c115b70d8224978abad1c1555e327c9e39e6..3a3961c3980ef312d1af1ba26afb4a4ffa72875f 100644
--- a/webrtc/media/engine/webrtcvideoengine2.cc
+++ b/webrtc/media/engine/webrtcvideoengine2.cc
@@ -14,6 +14,7 @@
#include <algorithm>
#include <set>
#include <string>
+#include <utility>
#include "webrtc/base/copyonwritebuffer.h"
#include "webrtc/base/logging.h"
@@ -322,12 +323,83 @@ int GetDefaultVp9TemporalLayers() {
}
return 1;
}
+
+class EncoderStreamFactory
+ : public webrtc::VideoEncoderConfig::VideoStreamFactoryInterface {
+ public:
+ EncoderStreamFactory(std::string codec_name,
+ int max_qp,
+ int max_framerate,
+ bool is_screencast,
+ bool conference_mode)
+ : codec_name_(codec_name),
+ max_qp_(max_qp),
+ max_framerate_(max_framerate),
+ is_screencast_(is_screencast),
+ conference_mode_(conference_mode) {}
+
+ private:
+ std::vector<webrtc::VideoStream> CreateEncoderStreams(
+ int width,
+ int height,
+ const webrtc::VideoEncoderConfig& encoder_config) override {
+ RTC_DCHECK(encoder_config.number_of_streams > 1 ? !is_screencast_ : true);
+ if (encoder_config.number_of_streams > 1) {
+ return GetSimulcastConfig(encoder_config.number_of_streams, width, height,
+ encoder_config.max_bitrate_bps, max_qp_,
+ max_framerate_);
+ }
+
+ // For unset max bitrates set default bitrate for non-simulcast.
+ int max_bitrate_bps =
+ (encoder_config.max_bitrate_bps > 0)
+ ? encoder_config.max_bitrate_bps
+ : GetMaxDefaultVideoBitrateKbps(width, height) * 1000;
+
+ webrtc::VideoStream stream;
+ stream.width = width;
+ stream.height = height;
+ stream.max_framerate = max_framerate_;
+ stream.min_bitrate_bps = kMinVideoBitrateKbps * 1000;
+ stream.target_bitrate_bps = stream.max_bitrate_bps = max_bitrate_bps;
+ stream.max_qp = max_qp_;
+
+ // Conference mode screencast uses 2 temporal layers split at 100kbit.
+ if (conference_mode_ && is_screencast_) {
+ ScreenshareLayerConfig config = ScreenshareLayerConfig::GetDefault();
+ // For screenshare in conference mode, tl0 and tl1 bitrates are
+ // piggybacked
+ // on the VideoCodec struct as target and max bitrates, respectively.
+ // See eg. webrtc::VP8EncoderImpl::SetRates().
+ stream.target_bitrate_bps = config.tl0_bitrate_kbps * 1000;
+ stream.max_bitrate_bps = config.tl1_bitrate_kbps * 1000;
+ stream.temporal_layer_thresholds_bps.clear();
+ stream.temporal_layer_thresholds_bps.push_back(config.tl0_bitrate_kbps *
+ 1000);
+ }
+
+ if (CodecNamesEq(codec_name_, kVp9CodecName) && !is_screencast_) {
+ stream.temporal_layer_thresholds_bps.resize(
+ GetDefaultVp9TemporalLayers() - 1);
+ }
+
+ std::vector<webrtc::VideoStream> streams;
+ streams.push_back(stream);
+ return streams;
+ }
+
+ const std::string codec_name_;
+ const int max_qp_;
+ const int max_framerate_;
+ const bool is_screencast_;
+ const bool conference_mode_;
+};
+
} // namespace
// Constants defined in webrtc/media/engine/constants.h
// TODO(pbos): Move these to a separate constants.cc file.
-const int kMinVideoBitrate = 30;
-const int kStartVideoBitrate = 300;
+const int kMinVideoBitrateKbps = 30;
const int kVideoMtu = 1200;
const int kVideoRtpBufferSize = 65536;
@@ -398,61 +470,10 @@ std::vector<VideoCodec> DefaultVideoCodecList() {
return codecs;
}
-std::vector<webrtc::VideoStream>
-WebRtcVideoChannel2::WebRtcVideoSendStream::CreateSimulcastVideoStreams(
- const VideoCodec& codec,
- const VideoOptions& options,
- int max_bitrate_bps,
- size_t num_streams) {
- int max_qp = kDefaultQpMax;
- codec.GetParam(kCodecParamMaxQuantization, &max_qp);
-
- return GetSimulcastConfig(
- num_streams, codec.width, codec.height, max_bitrate_bps, max_qp,
- codec.framerate != 0 ? codec.framerate : kDefaultVideoMaxFramerate);
-}
-
-std::vector<webrtc::VideoStream>
-WebRtcVideoChannel2::WebRtcVideoSendStream::CreateVideoStreams(
- const VideoCodec& codec,
- const VideoOptions& options,
- int max_bitrate_bps,
- size_t num_streams) {
- int codec_max_bitrate_kbps;
- if (codec.GetParam(kCodecParamMaxBitrate, &codec_max_bitrate_kbps)) {
- max_bitrate_bps = codec_max_bitrate_kbps * 1000;
- }
- if (num_streams != 1) {
- return CreateSimulcastVideoStreams(codec, options, max_bitrate_bps,
- num_streams);
- }
-
- // For unset max bitrates set default bitrate for non-simulcast.
- if (max_bitrate_bps <= 0) {
- max_bitrate_bps =
- GetMaxDefaultVideoBitrateKbps(codec.width, codec.height) * 1000;
- }
-
- webrtc::VideoStream stream;
- stream.width = codec.width;
- stream.height = codec.height;
- stream.max_framerate =
- codec.framerate != 0 ? codec.framerate : kDefaultVideoMaxFramerate;
-
- stream.min_bitrate_bps = kMinVideoBitrate * 1000;
- stream.target_bitrate_bps = stream.max_bitrate_bps = max_bitrate_bps;
-
- int max_qp = kDefaultQpMax;
- codec.GetParam(kCodecParamMaxQuantization, &max_qp);
- stream.max_qp = max_qp;
- std::vector<webrtc::VideoStream> streams;
- streams.push_back(stream);
- return streams;
-}
-
rtc::scoped_refptr<webrtc::VideoEncoderConfig::EncoderSpecificSettings>
WebRtcVideoChannel2::WebRtcVideoSendStream::ConfigureVideoEncoderSettings(
const VideoCodec& codec) {
+ RTC_DCHECK_RUN_ON(&thread_checker_);
bool is_screencast = parameters_.options.is_screencast.value_or(false);
// No automatic resizing when using simulcast or screencast.
bool automatic_resize =
@@ -1543,6 +1564,7 @@ WebRtcVideoChannel2::WebRtcVideoSendStream::VideoSendStreamParameters::
: config(std::move(config)),
options(options),
max_bitrate_bps(max_bitrate_bps),
+ conference_mode(false),
codec_settings(codec_settings) {}
WebRtcVideoChannel2::WebRtcVideoSendStream::AllocatedEncoder::AllocatedEncoder(
@@ -1587,7 +1609,6 @@ WebRtcVideoChannel2::WebRtcVideoSendStream::WebRtcVideoSendStream(
encoder_sink_(nullptr),
parameters_(std::move(config), options, max_bitrate_bps, codec_settings),
rtp_parameters_(CreateRtpParametersWithOneEncoding()),
- pending_encoder_reconfiguration_(false),
allocated_encoder_(nullptr, webrtc::kVideoCodecUnknown, false),
sending_(false),
last_frame_timestamp_us_(0) {
@@ -1655,7 +1676,6 @@ void WebRtcVideoChannel2::WebRtcVideoSendStream::OnFrame(
last_frame_info_.height = video_frame.height();
last_frame_info_.rotation = video_frame.rotation();
last_frame_info_.is_texture = video_frame.is_texture();
- pending_encoder_reconfiguration_ = true;
LOG(LS_INFO) << "Video frame parameters changed: dimensions="
<< last_frame_info_.width << "x" << last_frame_info_.height
@@ -1670,22 +1690,13 @@ void WebRtcVideoChannel2::WebRtcVideoSendStream::OnFrame(
last_frame_timestamp_us_ = video_frame.timestamp_us();
- if (pending_encoder_reconfiguration_) {
- ReconfigureEncoder();
- pending_encoder_reconfiguration_ = false;
- }
-
- // Not sending, abort after reconfiguration. Reconfiguration should still
- // occur to permit sending this input as quickly as possible once we start
- // sending (without having to reconfigure then).
- if (!sending_) {
- return;
- }
-
++frame_count_;
if (cpu_restricted_counter_ > 0)
++cpu_restricted_frame_count_;
+ // Forward frame to the encoder regardless if we are sending or not. This is
+ // to ensure that the encoder can be reconfigured with the correct frame size
+ // as quickly as possible.
encoder_sink_->OnFrame(video_frame);
}
@@ -1694,7 +1705,7 @@ bool WebRtcVideoChannel2::WebRtcVideoSendStream::SetVideoSend(
const VideoOptions* options,
rtc::VideoSourceInterface<cricket::VideoFrame>* source) {
TRACE_EVENT0("webrtc", "WebRtcVideoSendStream::SetVideoSend");
- RTC_DCHECK(thread_checker_.CalledOnValidThread());
+ RTC_DCHECK_RUN_ON(&thread_checker_);
// Ignore |options| pointer if |enable| is false.
bool options_present = enable && options;
@@ -1703,50 +1714,47 @@ bool WebRtcVideoChannel2::WebRtcVideoSendStream::SetVideoSend(
DisconnectSource();
}
- if (options_present || source_changing) {
- rtc::CritScope cs(&lock_);
-
- if (options_present) {
- VideoOptions old_options = parameters_.options;
- parameters_.options.SetAll(*options);
- // Reconfigure encoder settings on the next frame or stream
- // recreation if the options changed.
- if (parameters_.options != old_options) {
- pending_encoder_reconfiguration_ = true;
- }
+ if (options_present) {
+ VideoOptions old_options = parameters_.options;
+ parameters_.options.SetAll(*options);
+ // If options has changed and SetCodec has been called.
+ if (parameters_.options != old_options && stream_) {
+ ReconfigureEncoder();
}
+ }
- if (source_changing) {
- if (source == nullptr && encoder_sink_ != nullptr) {
- LOG(LS_VERBOSE) << "Disabling capturer, sending black frame.";
- // Force this black frame not to be dropped due to timestamp order
- // check. As IncomingCapturedFrame will drop the frame if this frame's
- // timestamp is less than or equal to last frame's timestamp, it is
- // necessary to give this black frame a larger timestamp than the
- // previous one.
- last_frame_timestamp_us_ += rtc::kNumMicrosecsPerMillisec;
- rtc::scoped_refptr<webrtc::I420Buffer> black_buffer(
- webrtc::I420Buffer::Create(last_frame_info_.width,
- last_frame_info_.height));
- black_buffer->SetToBlack();
-
- encoder_sink_->OnFrame(webrtc::VideoFrame(
- black_buffer, last_frame_info_.rotation, last_frame_timestamp_us_));
- }
- source_ = source;
+ if (source_changing) {
+ rtc::CritScope cs(&lock_);
+ if (source == nullptr && encoder_sink_ != nullptr &&
+ last_frame_info_.width > 0) {
+ LOG(LS_VERBOSE) << "Disabling capturer, sending black frame.";
+ // Force this black frame not to be dropped due to timestamp order
+ // check. As IncomingCapturedFrame will drop the frame if this frame's
+ // timestamp is less than or equal to last frame's timestamp, it is
+ // necessary to give this black frame a larger timestamp than the
+ // previous one.
+ last_frame_timestamp_us_ += rtc::kNumMicrosecsPerMillisec;
+ rtc::scoped_refptr<webrtc::I420Buffer> black_buffer(
+ webrtc::I420Buffer::Create(last_frame_info_.width,
+ last_frame_info_.height));
+ black_buffer->SetToBlack();
+
+ encoder_sink_->OnFrame(webrtc::VideoFrame(
+ black_buffer, last_frame_info_.rotation, last_frame_timestamp_us_));
}
+ source_ = source;
}
- // |source_->AddOrUpdateSink| may not be called while holding |lock_| since
- // that might cause a lock order inversion.
if (source_changing && source_) {
+ // |source_->AddOrUpdateSink| may not be called while holding |lock_| since
+ // that might cause a lock order inversion.
source_->AddOrUpdateSink(this, sink_wants_);
}
return true;
}
void WebRtcVideoChannel2::WebRtcVideoSendStream::DisconnectSource() {
- RTC_DCHECK(thread_checker_.CalledOnValidThread());
+ RTC_DCHECK_RUN_ON(&thread_checker_);
if (source_ == nullptr) {
return;
}
@@ -1781,6 +1789,7 @@ webrtc::VideoCodecType CodecTypeFromName(const std::string& name) {
WebRtcVideoChannel2::WebRtcVideoSendStream::AllocatedEncoder
WebRtcVideoChannel2::WebRtcVideoSendStream::CreateVideoEncoder(
const VideoCodec& codec) {
+ RTC_DCHECK_RUN_ON(&thread_checker_);
webrtc::VideoCodecType type = CodecTypeFromName(codec.name);
// Do not re-create encoders of the same type.
@@ -1815,6 +1824,7 @@ WebRtcVideoChannel2::WebRtcVideoSendStream::CreateVideoEncoder(
void WebRtcVideoChannel2::WebRtcVideoSendStream::DestroyVideoEncoder(
AllocatedEncoder* encoder) {
+ RTC_DCHECK_RUN_ON(&thread_checker_);
if (encoder->external) {
external_encoder_factory_->DestroyVideoEncoder(encoder->external_encoder);
}
@@ -1823,8 +1833,9 @@ void WebRtcVideoChannel2::WebRtcVideoSendStream::DestroyVideoEncoder(
void WebRtcVideoChannel2::WebRtcVideoSendStream::SetCodec(
const VideoCodecSettings& codec_settings) {
+ RTC_DCHECK_RUN_ON(&thread_checker_);
parameters_.encoder_config = CreateVideoEncoderConfig(codec_settings.codec);
- RTC_DCHECK(!parameters_.encoder_config.streams.empty());
+ RTC_DCHECK_GT(parameters_.encoder_config.number_of_streams, 0u);
AllocatedEncoder new_encoder = CreateVideoEncoder(codec_settings.codec);
parameters_.config.encoder_settings.encoder = new_encoder.encoder;
@@ -1865,41 +1876,38 @@ void WebRtcVideoChannel2::WebRtcVideoSendStream::SetCodec(
void WebRtcVideoChannel2::WebRtcVideoSendStream::SetSendParameters(
const ChangedSendParameters& params) {
- {
- rtc::CritScope cs(&lock_);
- // |recreate_stream| means construction-time parameters have changed and the
- // sending stream needs to be reset with the new config.
- bool recreate_stream = false;
- if (params.rtcp_mode) {
- parameters_.config.rtp.rtcp_mode = *params.rtcp_mode;
- recreate_stream = true;
- }
- if (params.rtp_header_extensions) {
- parameters_.config.rtp.extensions = *params.rtp_header_extensions;
- recreate_stream = true;
- }
- if (params.max_bandwidth_bps) {
- parameters_.max_bitrate_bps = *params.max_bandwidth_bps;
- pending_encoder_reconfiguration_ = true;
- }
- if (params.conference_mode) {
- parameters_.conference_mode = *params.conference_mode;
- }
+ RTC_DCHECK_RUN_ON(&thread_checker_);
+ // |recreate_stream| means construction-time parameters have changed and the
+ // sending stream needs to be reset with the new config.
+ bool recreate_stream = false;
+ if (params.rtcp_mode) {
+ parameters_.config.rtp.rtcp_mode = *params.rtcp_mode;
+ recreate_stream = true;
+ }
+ if (params.rtp_header_extensions) {
+ parameters_.config.rtp.extensions = *params.rtp_header_extensions;
+ recreate_stream = true;
+ }
+ if (params.max_bandwidth_bps) {
+ parameters_.max_bitrate_bps = *params.max_bandwidth_bps;
+ ReconfigureEncoder();
+ }
+ if (params.conference_mode) {
+ parameters_.conference_mode = *params.conference_mode;
+ }
- // Set codecs and options.
- if (params.codec) {
- SetCodec(*params.codec);
- recreate_stream = false; // SetCodec has already recreated the stream.
- } else if (params.conference_mode && parameters_.codec_settings) {
- SetCodec(*parameters_.codec_settings);
- recreate_stream = false; // SetCodec has already recreated the stream.
- }
- if (recreate_stream) {
- LOG(LS_INFO)
- << "RecreateWebRtcStream (send) because of SetSendParameters";
- RecreateWebRtcStream();
- }
- } // release |lock_|
+ // Set codecs and options.
+ if (params.codec) {
+ SetCodec(*params.codec);
+ recreate_stream = false; // SetCodec has already recreated the stream.
+ } else if (params.conference_mode && parameters_.codec_settings) {
+ SetCodec(*parameters_.codec_settings);
+ recreate_stream = false; // SetCodec has already recreated the stream.
+ }
+ if (recreate_stream) {
+ LOG(LS_INFO) << "RecreateWebRtcStream (send) because of SetSendParameters";
+ RecreateWebRtcStream();
+ }
// |source_->AddOrUpdateSink| may not be called while holding |lock_| since
// that might cause a lock order inversion.
@@ -1914,18 +1922,19 @@ void WebRtcVideoChannel2::WebRtcVideoSendStream::SetSendParameters(
bool WebRtcVideoChannel2::WebRtcVideoSendStream::SetRtpParameters(
const webrtc::RtpParameters& new_parameters) {
+ RTC_DCHECK_RUN_ON(&thread_checker_);
if (!ValidateRtpParameters(new_parameters)) {
return false;
}
- rtc::CritScope cs(&lock_);
- if (new_parameters.encodings[0].max_bitrate_bps !=
- rtp_parameters_.encodings[0].max_bitrate_bps) {
- pending_encoder_reconfiguration_ = true;
- }
+ bool reconfigure_encoder = new_parameters.encodings[0].max_bitrate_bps !=
+ rtp_parameters_.encodings[0].max_bitrate_bps;
rtp_parameters_ = new_parameters;
// Codecs are currently handled at the WebRtcVideoChannel2 level.
rtp_parameters_.codecs.clear();
+ if (reconfigure_encoder) {
+ ReconfigureEncoder();
+ }
// Encoding may have been activated/deactivated.
UpdateSendState();
return true;
@@ -1933,7 +1942,7 @@ bool WebRtcVideoChannel2::WebRtcVideoSendStream::SetRtpParameters(
webrtc::RtpParameters
WebRtcVideoChannel2::WebRtcVideoSendStream::GetRtpParameters() const {
- rtc::CritScope cs(&lock_);
+ RTC_DCHECK_RUN_ON(&thread_checker_);
return rtp_parameters_;
}
@@ -1948,6 +1957,7 @@ bool WebRtcVideoChannel2::WebRtcVideoSendStream::ValidateRtpParameters(
}
void WebRtcVideoChannel2::WebRtcVideoSendStream::UpdateSendState() {
+ RTC_DCHECK_RUN_ON(&thread_checker_);
// TODO(deadbeef): Need to handle more than one encoding in the future.
RTC_DCHECK(rtp_parameters_.encodings.size() == 1u);
if (sending_ && rtp_parameters_.encodings[0].active) {
@@ -1963,6 +1973,7 @@ void WebRtcVideoChannel2::WebRtcVideoSendStream::UpdateSendState() {
webrtc::VideoEncoderConfig
WebRtcVideoChannel2::WebRtcVideoSendStream::CreateVideoEncoderConfig(
const VideoCodec& codec) const {
+ RTC_DCHECK_RUN_ON(&thread_checker_);
webrtc::VideoEncoderConfig encoder_config;
bool is_screencast = parameters_.options.is_screencast.value_or(false);
if (is_screencast) {
@@ -1976,60 +1987,39 @@ WebRtcVideoChannel2::WebRtcVideoSendStream::CreateVideoEncoderConfig(
webrtc::VideoEncoderConfig::ContentType::kRealtimeVideo;
}
- // Restrict dimensions according to codec max.
- int width = last_frame_info_.width;
- int height = last_frame_info_.height;
- if (!is_screencast) {
- if (codec.width < width)
- width = codec.width;
- if (codec.height < height)
- height = codec.height;
- }
-
- VideoCodec clamped_codec = codec;
- clamped_codec.width = width;
- clamped_codec.height = height;
-
// By default, the stream count for the codec configuration should match the
// number of negotiated ssrcs. But if the codec is blacklisted for simulcast
// or a screencast, only configure a single stream.
- size_t stream_count = parameters_.config.rtp.ssrcs.size();
+ encoder_config.number_of_streams = parameters_.config.rtp.ssrcs.size();
if (IsCodecBlacklistedForSimulcast(codec.name) || is_screencast) {
- stream_count = 1;
+ encoder_config.number_of_streams = 1;
}
int stream_max_bitrate =
MinPositive(rtp_parameters_.encodings[0].max_bitrate_bps,
parameters_.max_bitrate_bps);
- encoder_config.streams = CreateVideoStreams(
- clamped_codec, parameters_.options, stream_max_bitrate, stream_count);
- encoder_config.expect_encode_from_texture = last_frame_info_.is_texture;
-
- // Conference mode screencast uses 2 temporal layers split at 100kbit.
- if (parameters_.conference_mode && is_screencast &&
- encoder_config.streams.size() == 1) {
- ScreenshareLayerConfig config = ScreenshareLayerConfig::GetDefault();
-
- // For screenshare in conference mode, tl0 and tl1 bitrates are piggybacked
- // on the VideoCodec struct as target and max bitrates, respectively.
- // See eg. webrtc::VP8EncoderImpl::SetRates().
- encoder_config.streams[0].target_bitrate_bps =
- config.tl0_bitrate_kbps * 1000;
- encoder_config.streams[0].max_bitrate_bps = config.tl1_bitrate_kbps * 1000;
- encoder_config.streams[0].temporal_layer_thresholds_bps.clear();
- encoder_config.streams[0].temporal_layer_thresholds_bps.push_back(
- config.tl0_bitrate_kbps * 1000);
- }
- if (CodecNamesEq(codec.name, kVp9CodecName) && !is_screencast &&
- encoder_config.streams.size() == 1) {
- encoder_config.streams[0].temporal_layer_thresholds_bps.resize(
- GetDefaultVp9TemporalLayers() - 1);
+
+ int codec_max_bitrate_kbps;
+ if (codec.GetParam(kCodecParamMaxBitrate, &codec_max_bitrate_kbps)) {
+ stream_max_bitrate = codec_max_bitrate_kbps * 1000;
}
+ encoder_config.max_bitrate_bps = stream_max_bitrate;
+
+ int max_qp = kDefaultQpMax;
+ codec.GetParam(kCodecParamMaxQuantization, &max_qp);
+ int max_framerate =
+ codec.framerate != 0 ? codec.framerate : kDefaultVideoMaxFramerate;
+
+ encoder_config.video_stream_factory =
+ new rtc::RefCountedObject<EncoderStreamFactory>(
+ codec.name, max_qp, max_framerate, is_screencast,
+ parameters_.conference_mode);
return encoder_config;
}
void WebRtcVideoChannel2::WebRtcVideoSendStream::ReconfigureEncoder() {
- RTC_DCHECK(!parameters_.encoder_config.streams.empty());
+ RTC_DCHECK_RUN_ON(&thread_checker_);
+ RTC_DCHECK_GT(parameters_.encoder_config.number_of_streams, 0u);
RTC_CHECK(parameters_.codec_settings);
VideoCodecSettings codec_settings = *parameters_.codec_settings;
@@ -2048,7 +2038,7 @@ void WebRtcVideoChannel2::WebRtcVideoSendStream::ReconfigureEncoder() {
}
void WebRtcVideoChannel2::WebRtcVideoSendStream::SetSend(bool send) {
- rtc::CritScope cs(&lock_);
+ RTC_DCHECK_RUN_ON(&thread_checker_);
sending_ = send;
UpdateSendState();
}
@@ -2078,63 +2068,62 @@ void WebRtcVideoChannel2::WebRtcVideoSendStream::OnLoadUpdate(Load load) {
this, load));
return;
}
- RTC_DCHECK(thread_checker_.CalledOnValidThread());
+ RTC_DCHECK_RUN_ON(&thread_checker_);
if (!source_) {
return;
}
- {
+
+ LOG(LS_INFO) << "OnLoadUpdate " << load << ", is_screencast: "
+ << (parameters_.options.is_screencast
+ ? (*parameters_.options.is_screencast ? "true" : "false")
+ : "unset");
+ // Do not adapt resolution for screen content as this will likely result in
+ // blurry and unreadable text.
+ if (parameters_.options.is_screencast.value_or(false))
+ return;
+
+ rtc::Optional<int> max_pixel_count;
+ rtc::Optional<int> max_pixel_count_step_up;
+ if (load == kOveruse) {
rtc::CritScope cs(&lock_);
- LOG(LS_INFO) << "OnLoadUpdate " << load << ", is_screencast: "
- << (parameters_.options.is_screencast
- ? (*parameters_.options.is_screencast ? "true"
- : "false")
- : "unset");
- // Do not adapt resolution for screen content as this will likely result in
- // blurry and unreadable text.
- if (parameters_.options.is_screencast.value_or(false))
+ if (cpu_restricted_counter_ >= kMaxCpuDowngrades) {
return;
-
- rtc::Optional<int> max_pixel_count;
- rtc::Optional<int> max_pixel_count_step_up;
- if (load == kOveruse) {
- if (cpu_restricted_counter_ >= kMaxCpuDowngrades) {
- return;
- }
- // The input video frame size will have a resolution with less than or
- // equal to |max_pixel_count| depending on how the source can scale the
- // input frame size.
- max_pixel_count = rtc::Optional<int>(
- (last_frame_info_.height * last_frame_info_.width * 3) / 5);
- // Increase |number_of_cpu_adapt_changes_| if
- // sink_wants_.max_pixel_count will be changed since
- // last time |source_->AddOrUpdateSink| was called. That is, this will
- // result in a new request for the source to change resolution.
- if (!sink_wants_.max_pixel_count ||
- *sink_wants_.max_pixel_count > *max_pixel_count) {
- ++number_of_cpu_adapt_changes_;
- ++cpu_restricted_counter_;
- }
- } else {
- RTC_DCHECK(load == kUnderuse);
- // The input video frame size will have a resolution with "one step up"
- // pixels than |max_pixel_count_step_up| where "one step up" depends on
- // how the source can scale the input frame size.
- max_pixel_count_step_up =
- rtc::Optional<int>(last_frame_info_.height * last_frame_info_.width);
- // Increase |number_of_cpu_adapt_changes_| if
- // sink_wants_.max_pixel_count_step_up will be changed since
- // last time |source_->AddOrUpdateSink| was called. That is, this will
- // result in a new request for the source to change resolution.
- if (sink_wants_.max_pixel_count ||
- (sink_wants_.max_pixel_count_step_up &&
- *sink_wants_.max_pixel_count_step_up < *max_pixel_count_step_up)) {
- ++number_of_cpu_adapt_changes_;
- --cpu_restricted_counter_;
- }
}
- sink_wants_.max_pixel_count = max_pixel_count;
- sink_wants_.max_pixel_count_step_up = max_pixel_count_step_up;
+ // The input video frame size will have a resolution with less than or
+ // equal to |max_pixel_count| depending on how the source can scale the
+ // input frame size.
+ max_pixel_count = rtc::Optional<int>(
+ (last_frame_info_.height * last_frame_info_.width * 3) / 5);
+ // Increase |number_of_cpu_adapt_changes_| if
+ // sink_wants_.max_pixel_count will be changed since
+ // last time |source_->AddOrUpdateSink| was called. That is, this will
+ // result in a new request for the source to change resolution.
+ if (!sink_wants_.max_pixel_count ||
+ *sink_wants_.max_pixel_count > *max_pixel_count) {
+ ++number_of_cpu_adapt_changes_;
+ ++cpu_restricted_counter_;
+ }
+ } else {
+ RTC_DCHECK(load == kUnderuse);
+ rtc::CritScope cs(&lock_);
+ // The input video frame size will have a resolution with "one step up"
+ // pixels than |max_pixel_count_step_up| where "one step up" depends on
+ // how the source can scale the input frame size.
+ max_pixel_count_step_up =
+ rtc::Optional<int>(last_frame_info_.height * last_frame_info_.width);
+ // Increase |number_of_cpu_adapt_changes_| if
+ // sink_wants_.max_pixel_count_step_up will be changed since
+ // last time |source_->AddOrUpdateSink| was called. That is, this will
+ // result in a new request for the source to change resolution.
+ if (sink_wants_.max_pixel_count ||
+ (sink_wants_.max_pixel_count_step_up &&
+ *sink_wants_.max_pixel_count_step_up < *max_pixel_count_step_up)) {
+ ++number_of_cpu_adapt_changes_;
+ --cpu_restricted_counter_;
+ }
}
+ sink_wants_.max_pixel_count = max_pixel_count;
+ sink_wants_.max_pixel_count_step_up = max_pixel_count_step_up;
// |source_->AddOrUpdateSink| may not be called while holding |lock_| since
// that might cause a lock order inversion.
source_->AddOrUpdateSink(this, sink_wants_);
@@ -2143,21 +2132,17 @@ void WebRtcVideoChannel2::WebRtcVideoSendStream::OnLoadUpdate(Load load) {
VideoSenderInfo WebRtcVideoChannel2::WebRtcVideoSendStream::GetVideoSenderInfo(
bool log_stats) {
VideoSenderInfo info;
- webrtc::VideoSendStream::Stats stats;
- RTC_DCHECK(thread_checker_.CalledOnValidThread());
- {
- rtc::CritScope cs(&lock_);
- for (uint32_t ssrc : parameters_.config.rtp.ssrcs)
- info.add_ssrc(ssrc);
+ RTC_DCHECK_RUN_ON(&thread_checker_);
+ for (uint32_t ssrc : parameters_.config.rtp.ssrcs)
+ info.add_ssrc(ssrc);
- if (parameters_.codec_settings)
- info.codec_name = parameters_.codec_settings->codec.name;
+ if (parameters_.codec_settings)
+ info.codec_name = parameters_.codec_settings->codec.name;
- if (stream_ == NULL)
- return info;
+ if (stream_ == NULL)
+ return info;
- stats = stream_->GetStats();
- }
+ webrtc::VideoSendStream::Stats stats = stream_->GetStats();
if (log_stats)
LOG(LS_INFO) << stats.ToString(rtc::TimeMillis());
@@ -2218,7 +2203,7 @@ VideoSenderInfo WebRtcVideoChannel2::WebRtcVideoSendStream::GetVideoSenderInfo(
void WebRtcVideoChannel2::WebRtcVideoSendStream::FillBandwidthEstimationInfo(
BandwidthEstimationInfo* bwe_info) {
- rtc::CritScope cs(&lock_);
+ RTC_DCHECK_RUN_ON(&thread_checker_);
if (stream_ == NULL) {
return;
}
@@ -2234,6 +2219,7 @@ void WebRtcVideoChannel2::WebRtcVideoSendStream::FillBandwidthEstimationInfo(
}
void WebRtcVideoChannel2::WebRtcVideoSendStream::RecreateWebRtcStream() {
+ RTC_DCHECK_RUN_ON(&thread_checker_);
if (stream_ != NULL) {
call_->DestroyVideoSendStream(stream_);
}
@@ -2257,7 +2243,6 @@ void WebRtcVideoChannel2::WebRtcVideoSendStream::RecreateWebRtcStream() {
stream_->SetSource(this);
parameters_.encoder_config.encoder_specific_settings = NULL;
- pending_encoder_reconfiguration_ = false;
// Call stream_->Start() if necessary conditions are met.
UpdateSendState();
« no previous file with comments | « webrtc/media/engine/webrtcvideoengine2.h ('k') | webrtc/media/engine/webrtcvideoengine2_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698