Delete encoder caching in WebRtcVideoSendStream.
This is a followup to https://webrtc-review.googlesource.com/61640, which ensures that picture id and tl0 pic idx are continuous, independent of how the encoder objects are created and destroyed. The plan is to later move responsibility for encoder creation to VideoSendStream::ReconfigureVideoEncoder, delegating work to VideoStreamEncoder. Bug: webrtc:8830 Change-Id: Idde5c91f24d3c0e3fa6a3bb26eb06f6800896a28 Reviewed-on: https://webrtc-review.googlesource.com/62082 Reviewed-by: Magnus Jedvert <magjed@webrtc.org> Commit-Queue: Niels Moller <nisse@webrtc.org> Cr-Commit-Position: refs/heads/master@{#22473}
This commit is contained in:
@ -1619,8 +1619,7 @@ WebRtcVideoChannel::WebRtcVideoSendStream::WebRtcVideoSendStream(
|
|||||||
? webrtc::RtcpMode::kReducedSize
|
? webrtc::RtcpMode::kReducedSize
|
||||||
: webrtc::RtcpMode::kCompound;
|
: webrtc::RtcpMode::kCompound;
|
||||||
if (codec_settings) {
|
if (codec_settings) {
|
||||||
bool force_encoder_allocation = false;
|
SetCodec(*codec_settings);
|
||||||
SetCodec(*codec_settings, force_encoder_allocation);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1651,8 +1650,7 @@ bool WebRtcVideoChannel::WebRtcVideoSendStream::SetVideoSend(
|
|||||||
// If screen content settings change, we may need to recreate the codec
|
// If screen content settings change, we may need to recreate the codec
|
||||||
// instance so that the correct type is used.
|
// instance so that the correct type is used.
|
||||||
|
|
||||||
bool force_encoder_allocation = true;
|
SetCodec(*parameters_.codec_settings);
|
||||||
SetCodec(*parameters_.codec_settings, force_encoder_allocation);
|
|
||||||
// Mark screenshare parameter as being updated, then test for any other
|
// Mark screenshare parameter as being updated, then test for any other
|
||||||
// changes that may require codec reconfiguration.
|
// changes that may require codec reconfiguration.
|
||||||
old_options.is_screencast = options->is_screencast;
|
old_options.is_screencast = options->is_screencast;
|
||||||
@ -1701,33 +1699,27 @@ WebRtcVideoChannel::WebRtcVideoSendStream::GetSsrcs() const {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void WebRtcVideoChannel::WebRtcVideoSendStream::SetCodec(
|
void WebRtcVideoChannel::WebRtcVideoSendStream::SetCodec(
|
||||||
const VideoCodecSettings& codec_settings,
|
const VideoCodecSettings& codec_settings) {
|
||||||
bool force_encoder_allocation) {
|
|
||||||
RTC_DCHECK_RUN_ON(&thread_checker_);
|
RTC_DCHECK_RUN_ON(&thread_checker_);
|
||||||
parameters_.encoder_config = CreateVideoEncoderConfig(codec_settings.codec);
|
parameters_.encoder_config = CreateVideoEncoderConfig(codec_settings.codec);
|
||||||
RTC_DCHECK_GT(parameters_.encoder_config.number_of_streams, 0);
|
RTC_DCHECK_GT(parameters_.encoder_config.number_of_streams, 0);
|
||||||
|
|
||||||
// Do not re-create encoders of the same type. We can't overwrite
|
const webrtc::SdpVideoFormat format(codec_settings.codec.name,
|
||||||
// |allocated_encoder_| immediately, because we need to release it after the
|
codec_settings.codec.params);
|
||||||
// RecreateWebRtcStream() call.
|
// We can't overwrite |allocated_encoder_| immediately, because we
|
||||||
std::unique_ptr<webrtc::VideoEncoder> new_encoder;
|
// need to release it after the RecreateWebRtcStream() call.
|
||||||
if (force_encoder_allocation || !allocated_encoder_ ||
|
std::unique_ptr<webrtc::VideoEncoder> new_encoder =
|
||||||
allocated_codec_ != codec_settings.codec) {
|
encoder_factory_->CreateVideoEncoder(format);
|
||||||
const webrtc::SdpVideoFormat format(codec_settings.codec.name,
|
|
||||||
codec_settings.codec.params);
|
|
||||||
new_encoder = encoder_factory_->CreateVideoEncoder(format);
|
|
||||||
|
|
||||||
parameters_.config.encoder_settings.encoder = new_encoder.get();
|
parameters_.config.encoder_settings.encoder = new_encoder.get();
|
||||||
|
|
||||||
|
const webrtc::VideoEncoderFactory::CodecInfo info =
|
||||||
|
encoder_factory_->QueryVideoEncoder(format);
|
||||||
|
parameters_.config.encoder_settings.full_overuse_time =
|
||||||
|
info.is_hardware_accelerated;
|
||||||
|
parameters_.config.encoder_settings.internal_source =
|
||||||
|
info.has_internal_source;
|
||||||
|
|
||||||
const webrtc::VideoEncoderFactory::CodecInfo info =
|
|
||||||
encoder_factory_->QueryVideoEncoder(format);
|
|
||||||
parameters_.config.encoder_settings.full_overuse_time =
|
|
||||||
info.is_hardware_accelerated;
|
|
||||||
parameters_.config.encoder_settings.internal_source =
|
|
||||||
info.has_internal_source;
|
|
||||||
} else {
|
|
||||||
new_encoder = std::move(allocated_encoder_);
|
|
||||||
}
|
|
||||||
parameters_.config.encoder_settings.payload_name = codec_settings.codec.name;
|
parameters_.config.encoder_settings.payload_name = codec_settings.codec.name;
|
||||||
parameters_.config.encoder_settings.payload_type = codec_settings.codec.id;
|
parameters_.config.encoder_settings.payload_type = codec_settings.codec.id;
|
||||||
parameters_.config.rtp.ulpfec = codec_settings.ulpfec;
|
parameters_.config.rtp.ulpfec = codec_settings.ulpfec;
|
||||||
@ -1754,7 +1746,6 @@ void WebRtcVideoChannel::WebRtcVideoSendStream::SetCodec(
|
|||||||
RTC_LOG(LS_INFO) << "RecreateWebRtcStream (send) because of SetCodec.";
|
RTC_LOG(LS_INFO) << "RecreateWebRtcStream (send) because of SetCodec.";
|
||||||
RecreateWebRtcStream();
|
RecreateWebRtcStream();
|
||||||
allocated_encoder_ = std::move(new_encoder);
|
allocated_encoder_ = std::move(new_encoder);
|
||||||
allocated_codec_ = codec_settings.codec;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void WebRtcVideoChannel::WebRtcVideoSendStream::SetSendParameters(
|
void WebRtcVideoChannel::WebRtcVideoSendStream::SetSendParameters(
|
||||||
@ -1781,12 +1772,10 @@ void WebRtcVideoChannel::WebRtcVideoSendStream::SetSendParameters(
|
|||||||
|
|
||||||
// Set codecs and options.
|
// Set codecs and options.
|
||||||
if (params.codec) {
|
if (params.codec) {
|
||||||
bool force_encoder_allocation = false;
|
SetCodec(*params.codec);
|
||||||
SetCodec(*params.codec, force_encoder_allocation);
|
|
||||||
recreate_stream = false; // SetCodec has already recreated the stream.
|
recreate_stream = false; // SetCodec has already recreated the stream.
|
||||||
} else if (params.conference_mode && parameters_.codec_settings) {
|
} else if (params.conference_mode && parameters_.codec_settings) {
|
||||||
bool force_encoder_allocation = false;
|
SetCodec(*parameters_.codec_settings);
|
||||||
SetCodec(*parameters_.codec_settings, force_encoder_allocation);
|
|
||||||
recreate_stream = false; // SetCodec has already recreated the stream.
|
recreate_stream = false; // SetCodec has already recreated the stream.
|
||||||
}
|
}
|
||||||
if (recreate_stream) {
|
if (recreate_stream) {
|
||||||
|
@ -312,8 +312,7 @@ class WebRtcVideoChannel : public VideoMediaChannel, public webrtc::Transport {
|
|||||||
|
|
||||||
rtc::scoped_refptr<webrtc::VideoEncoderConfig::EncoderSpecificSettings>
|
rtc::scoped_refptr<webrtc::VideoEncoderConfig::EncoderSpecificSettings>
|
||||||
ConfigureVideoEncoderSettings(const VideoCodec& codec);
|
ConfigureVideoEncoderSettings(const VideoCodec& codec);
|
||||||
void SetCodec(const VideoCodecSettings& codec,
|
void SetCodec(const VideoCodecSettings& codec);
|
||||||
bool force_encoder_allocation);
|
|
||||||
void RecreateWebRtcStream();
|
void RecreateWebRtcStream();
|
||||||
webrtc::VideoEncoderConfig CreateVideoEncoderConfig(
|
webrtc::VideoEncoderConfig CreateVideoEncoderConfig(
|
||||||
const VideoCodec& codec) const;
|
const VideoCodec& codec) const;
|
||||||
@ -355,7 +354,6 @@ class WebRtcVideoChannel : public VideoMediaChannel, public webrtc::Transport {
|
|||||||
webrtc::RtpParameters rtp_parameters_ RTC_GUARDED_BY(&thread_checker_);
|
webrtc::RtpParameters rtp_parameters_ RTC_GUARDED_BY(&thread_checker_);
|
||||||
std::unique_ptr<webrtc::VideoEncoder> allocated_encoder_
|
std::unique_ptr<webrtc::VideoEncoder> allocated_encoder_
|
||||||
RTC_GUARDED_BY(&thread_checker_);
|
RTC_GUARDED_BY(&thread_checker_);
|
||||||
VideoCodec allocated_codec_ RTC_GUARDED_BY(&thread_checker_);
|
|
||||||
|
|
||||||
bool sending_ RTC_GUARDED_BY(&thread_checker_);
|
bool sending_ RTC_GUARDED_BY(&thread_checker_);
|
||||||
};
|
};
|
||||||
|
Reference in New Issue
Block a user