| Index: webrtc/media/engine/webrtcvideoengine2.cc
|
| diff --git a/webrtc/media/engine/webrtcvideoengine2.cc b/webrtc/media/engine/webrtcvideoengine2.cc
|
| index c192b52402ee95ef3f2ffd9dbe25f65ded5ecf6d..4e33df74fa272bbbd3dc9bd9d7a3ae5bbe277e50 100644
|
| --- a/webrtc/media/engine/webrtcvideoengine2.cc
|
| +++ b/webrtc/media/engine/webrtcvideoengine2.cc
|
| @@ -1588,7 +1588,8 @@ WebRtcVideoChannel2::WebRtcVideoSendStream::WebRtcVideoSendStream(
|
| ? webrtc::RtcpMode::kReducedSize
|
| : webrtc::RtcpMode::kCompound;
|
| if (codec_settings) {
|
| - SetCodec(*codec_settings);
|
| + bool force_encoder_allocation = false;
|
| + SetCodec(*codec_settings, force_encoder_allocation);
|
| }
|
| }
|
|
|
| @@ -1612,6 +1613,18 @@ bool WebRtcVideoChannel2::WebRtcVideoSendStream::SetVideoSend(
|
| if (options_present) {
|
| VideoOptions old_options = parameters_.options;
|
| parameters_.options.SetAll(*options);
|
| + if (parameters_.options.is_screencast.value_or(false) !=
|
| + old_options.is_screencast.value_or(false) &&
|
| + parameters_.codec_settings) {
|
| + // If screen content settings change, we may need to recreate the codec
|
| + // instance so that the correct type is used.
|
| +
|
| + bool force_encoder_allocation = true;
|
| + SetCodec(*parameters_.codec_settings, force_encoder_allocation);
|
| + // Mark screenshare parameter as being updated, then test for any other
|
| + // changes that may require codec reconfiguration.
|
| + old_options.is_screencast = options->is_screencast;
|
| + }
|
| if (parameters_.options != old_options) {
|
| ReconfigureEncoder();
|
| }
|
| @@ -1645,10 +1658,11 @@ WebRtcVideoChannel2::WebRtcVideoSendStream::GetSsrcs() const {
|
|
|
| WebRtcVideoChannel2::WebRtcVideoSendStream::AllocatedEncoder
|
| WebRtcVideoChannel2::WebRtcVideoSendStream::CreateVideoEncoder(
|
| - const VideoCodec& codec) {
|
| + const VideoCodec& codec,
|
| + bool force_encoder_allocation) {
|
| RTC_DCHECK_RUN_ON(&thread_checker_);
|
| // Do not re-create encoders of the same type.
|
| - if (codec == allocated_encoder_.codec &&
|
| + if (!force_encoder_allocation && codec == allocated_encoder_.codec &&
|
| allocated_encoder_.encoder != nullptr) {
|
| return allocated_encoder_;
|
| }
|
| @@ -1695,12 +1709,14 @@ void WebRtcVideoChannel2::WebRtcVideoSendStream::DestroyVideoEncoder(
|
| }
|
|
|
| void WebRtcVideoChannel2::WebRtcVideoSendStream::SetCodec(
|
| - const VideoCodecSettings& codec_settings) {
|
| + const VideoCodecSettings& codec_settings,
|
| + bool force_encoder_allocation) {
|
| RTC_DCHECK_RUN_ON(&thread_checker_);
|
| parameters_.encoder_config = CreateVideoEncoderConfig(codec_settings.codec);
|
| RTC_DCHECK_GT(parameters_.encoder_config.number_of_streams, 0);
|
|
|
| - AllocatedEncoder new_encoder = CreateVideoEncoder(codec_settings.codec);
|
| + AllocatedEncoder new_encoder =
|
| + CreateVideoEncoder(codec_settings.codec, force_encoder_allocation);
|
| parameters_.config.encoder_settings.encoder = new_encoder.encoder;
|
| parameters_.config.encoder_settings.full_overuse_time = new_encoder.external;
|
| parameters_.config.encoder_settings.payload_name = codec_settings.codec.name;
|
| @@ -1767,10 +1783,12 @@ void WebRtcVideoChannel2::WebRtcVideoSendStream::SetSendParameters(
|
|
|
| // Set codecs and options.
|
| if (params.codec) {
|
| - SetCodec(*params.codec);
|
| + bool force_encoder_allocation = false;
|
| + SetCodec(*params.codec, force_encoder_allocation);
|
| recreate_stream = false; // SetCodec has already recreated the stream.
|
| } else if (params.conference_mode && parameters_.codec_settings) {
|
| - SetCodec(*parameters_.codec_settings);
|
| + bool force_encoder_allocation = false;
|
| + SetCodec(*parameters_.codec_settings, force_encoder_allocation);
|
| recreate_stream = false; // SetCodec has already recreated the stream.
|
| }
|
| if (recreate_stream) {
|
|
|