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

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

Issue 1711763003: New flag is_screencast in VideoOptions. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Fix use-after-free of FakeVideoSendStream. Created 4 years, 10 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
Index: webrtc/media/engine/webrtcvideoengine2.cc
diff --git a/webrtc/media/engine/webrtcvideoengine2.cc b/webrtc/media/engine/webrtcvideoengine2.cc
index c6bdafee5a336666a4fd46f5aab78c0590525105..a3a32fb3504a963f0649ea719d82690dece64d24 100644
--- a/webrtc/media/engine/webrtcvideoengine2.cc
+++ b/webrtc/media/engine/webrtcvideoengine2.cc
@@ -410,9 +410,8 @@ WebRtcVideoChannel2::WebRtcVideoSendStream::CreateVideoStreams(
}
void* WebRtcVideoChannel2::WebRtcVideoSendStream::ConfigureVideoEncoderSettings(
- const VideoCodec& codec,
- const VideoOptions& options,
- bool is_screencast) {
+ const VideoCodec& codec) {
+ bool is_screencast = parameters_.options.is_screencast.value_or(false);
// No automatic resizing when using simulcast or screencast.
bool automatic_resize =
!is_screencast && parameters_.config.rtp.ssrcs.size() == 1;
@@ -423,8 +422,8 @@ void* WebRtcVideoChannel2::WebRtcVideoSendStream::ConfigureVideoEncoderSettings(
denoising = false;
} else {
// Use codec default if video_noise_reduction is unset.
- codec_default_denoising = !options.video_noise_reduction;
- denoising = options.video_noise_reduction.value_or(false);
+ codec_default_denoising = !parameters_.options.video_noise_reduction;
+ denoising = parameters_.options.video_noise_reduction.value_or(false);
}
if (CodecNamesEq(codec.name, kH264CodecName)) {
@@ -1528,7 +1527,7 @@ WebRtcVideoChannel2::WebRtcVideoSendStream::WebRtcVideoSendStream(
: webrtc::RtcpMode::kCompound;
if (codec_settings) {
- SetCodecAndOptions(*codec_settings, parameters_.options);
+ SetCodecAndOptions(*codec_settings);
}
}
@@ -1588,8 +1587,7 @@ void WebRtcVideoChannel2::WebRtcVideoSendStream::OnFrame(
last_frame_timestamp_ms_ = first_frame_timestamp_ms_ + frame_delta_ms;
video_frame.set_render_time_ms(last_frame_timestamp_ms_);
// Reconfigure codec if necessary.
- SetDimensions(video_frame.width(), video_frame.height(),
- capturer_->IsScreencast());
+ SetDimensions(video_frame.width(), video_frame.height());
last_rotation_ = video_frame.rotation();
stream_->Input()->IncomingCapturedFrame(video_frame);
@@ -1668,12 +1666,12 @@ WebRtcVideoChannel2::WebRtcVideoSendStream::GetSsrcs() const {
void WebRtcVideoChannel2::WebRtcVideoSendStream::SetOptions(
const VideoOptions& options) {
rtc::CritScope cs(&lock_);
+ // TODO(nisse): Use .SetAll method?
+ parameters_.options = options;
pthatcher1 2016/02/20 08:33:00 If you don't, then the options that come from SetV
nisse-webrtc 2016/02/22 07:52:34 I'll change to SetAll. I think splitting VideoOpti
nisse-webrtc 2016/02/23 13:13:59 Done.
if (parameters_.codec_settings) {
LOG(LS_INFO) << "SetCodecAndOptions because of SetOptions; options="
<< options.ToString();
- SetCodecAndOptions(*parameters_.codec_settings, options);
- } else {
- parameters_.options = options;
+ SetCodecAndOptions(*parameters_.codec_settings);
}
}
@@ -1732,8 +1730,7 @@ void WebRtcVideoChannel2::WebRtcVideoSendStream::DestroyVideoEncoder(
}
void WebRtcVideoChannel2::WebRtcVideoSendStream::SetCodecAndOptions(
- const VideoCodecSettings& codec_settings,
- const VideoOptions& options) {
+ const VideoCodecSettings& codec_settings) {
parameters_.encoder_config =
CreateVideoEncoderConfig(last_dimensions_, codec_settings.codec);
RTC_DCHECK(!parameters_.encoder_config.streams.empty());
@@ -1765,15 +1762,14 @@ void WebRtcVideoChannel2::WebRtcVideoSendStream::SetCodecAndOptions(
HasNack(codec_settings.codec) ? kNackHistoryMs : 0;
parameters_.config.suspend_below_min_bitrate =
- options.suspend_below_min_bitrate.value_or(false);
+ parameters_.options.suspend_below_min_bitrate.value_or(false);
parameters_.codec_settings =
rtc::Optional<WebRtcVideoChannel2::VideoCodecSettings>(codec_settings);
- parameters_.options = options;
LOG(LS_INFO)
<< "RecreateWebRtcStream (send) because of SetCodecAndOptions; options="
- << options.ToString();
+ << parameters_.options.ToString();
RecreateWebRtcStream();
if (allocated_encoder_.encoder != new_encoder.encoder) {
DestroyVideoEncoder(&allocated_encoder_);
@@ -1810,21 +1806,20 @@ void WebRtcVideoChannel2::WebRtcVideoSendStream::SetSendParameters(
parameters_.conference_mode = *params.conference_mode;
}
// Set codecs and options.
+ if (params.options)
+ parameters_.options = *params.options;
if (params.codec) {
- SetCodecAndOptions(*params.codec,
- params.options ? *params.options : parameters_.options);
+ SetCodecAndOptions(*params.codec);
return;
} else if (params.options) {
// Reconfigure if codecs are already set.
if (parameters_.codec_settings) {
- SetCodecAndOptions(*parameters_.codec_settings, *params.options);
+ SetCodecAndOptions(*parameters_.codec_settings);
return;
- } else {
- parameters_.options = *params.options;
}
}
else if (params.conference_mode && parameters_.codec_settings) {
- SetCodecAndOptions(*parameters_.codec_settings, parameters_.options);
+ SetCodecAndOptions(*parameters_.codec_settings);
return;
}
if (recreate_stream) {
@@ -1838,7 +1833,8 @@ WebRtcVideoChannel2::WebRtcVideoSendStream::CreateVideoEncoderConfig(
const Dimensions& dimensions,
const VideoCodec& codec) const {
webrtc::VideoEncoderConfig encoder_config;
- if (dimensions.is_screencast) {
+ bool is_screencast = parameters_.options.is_screencast.value_or(false);
+ if (is_screencast) {
encoder_config.min_transmit_bitrate_bps =
1000 * parameters_.options.screencast_min_bitrate_kbps.value_or(0);
encoder_config.content_type =
@@ -1852,7 +1848,7 @@ WebRtcVideoChannel2::WebRtcVideoSendStream::CreateVideoEncoderConfig(
// Restrict dimensions according to codec max.
int width = dimensions.width;
int height = dimensions.height;
- if (!dimensions.is_screencast) {
+ if (!is_screencast) {
if (codec.width < width)
width = codec.width;
if (codec.height < height)
@@ -1867,7 +1863,7 @@ WebRtcVideoChannel2::WebRtcVideoSendStream::CreateVideoEncoderConfig(
// 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();
- if (IsCodecBlacklistedForSimulcast(codec.name) || dimensions.is_screencast) {
+ if (IsCodecBlacklistedForSimulcast(codec.name) || is_screencast) {
stream_count = 1;
}
@@ -1876,7 +1872,7 @@ WebRtcVideoChannel2::WebRtcVideoSendStream::CreateVideoEncoderConfig(
parameters_.max_bitrate_bps, stream_count);
// Conference mode screencast uses 2 temporal layers split at 100kbit.
- if (parameters_.conference_mode && dimensions.is_screencast &&
+ if (parameters_.conference_mode && is_screencast &&
encoder_config.streams.size() == 1) {
ScreenshareLayerConfig config = ScreenshareLayerConfig::GetDefault();
@@ -1895,20 +1891,16 @@ WebRtcVideoChannel2::WebRtcVideoSendStream::CreateVideoEncoderConfig(
void WebRtcVideoChannel2::WebRtcVideoSendStream::SetDimensions(
int width,
- int height,
- bool is_screencast) {
+ int height) {
if (last_dimensions_.width == width && last_dimensions_.height == height &&
- last_dimensions_.is_screencast == is_screencast &&
!pending_encoder_reconfiguration_) {
// Configured using the same parameters, do not reconfigure.
return;
}
- LOG(LS_INFO) << "SetDimensions: " << width << "x" << height
- << (is_screencast ? " (screencast)" : " (not screencast)");
+ LOG(LS_INFO) << "SetDimensions: " << width << "x" << height;
last_dimensions_.width = width;
last_dimensions_.height = height;
- last_dimensions_.is_screencast = is_screencast;
RTC_DCHECK(!parameters_.encoder_config.streams.empty());
@@ -1919,7 +1911,7 @@ void WebRtcVideoChannel2::WebRtcVideoSendStream::SetDimensions(
CreateVideoEncoderConfig(last_dimensions_, codec_settings.codec);
encoder_config.encoder_specific_settings = ConfigureVideoEncoderSettings(
- codec_settings.codec, parameters_.options, is_screencast);
+ codec_settings.codec);
bool stream_reconfigured = stream_->ReconfigureVideoEncoder(encoder_config);
@@ -2067,11 +2059,12 @@ void WebRtcVideoChannel2::WebRtcVideoSendStream::RecreateWebRtcStream() {
}
RTC_CHECK(parameters_.codec_settings);
+ RTC_DCHECK_EQ((parameters_.encoder_config.content_type ==
+ webrtc::VideoEncoderConfig::ContentType::kScreen),
+ parameters_.options.is_screencast.value_or(false))
+ << "encoder content type inconsistent with screencast option";
parameters_.encoder_config.encoder_specific_settings =
- ConfigureVideoEncoderSettings(
- parameters_.codec_settings->codec, parameters_.options,
- parameters_.encoder_config.content_type ==
- webrtc::VideoEncoderConfig::ContentType::kScreen);
+ ConfigureVideoEncoderSettings(parameters_.codec_settings->codec);
webrtc::VideoSendStream::Config config = parameters_.config;
if (!config.rtp.rtx.ssrcs.empty() && config.rtp.rtx.payload_type == -1) {

Powered by Google App Engine
This is Rietveld 408576698