RtpSenderInterface::SetEncoderSelector
This cl/ adds a way of setting an EncoderSelector on a specific
RtpSenderInterface. This makes it possible to easily use different
EncoderSelector on different streams within the same or different PeerConnections.
The cl/ is almost identical to the impl. of RtpSenderInterface::SetFrameEncryptor.
Iff a EncoderSelector is set on the RtpSender, it will take precedence
over the VideoEncoderFactory::GetEncoderSelector.
Bug: webrtc:14122
Change-Id: Ief4f7c06df7f1ef4ce3245de304a48e9de0ad587
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/264542
Reviewed-by: Rasmus Brandt <brandtr@webrtc.org>
Commit-Queue: Jonas Oreland <jonaso@webrtc.org>
Reviewed-by: Harald Alvestrand <hta@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#37150}
diff --git a/pc/rtp_sender.cc b/pc/rtp_sender.cc
index 6c4c578..d8d4b52 100644
--- a/pc/rtp_sender.cc
+++ b/pc/rtp_sender.cc
@@ -132,6 +132,23 @@
}
}
+void RtpSenderBase::SetEncoderSelector(
+ std::unique_ptr<VideoEncoderFactory::EncoderSelectorInterface>
+ encoder_selector) {
+ RTC_DCHECK_RUN_ON(signaling_thread_);
+ encoder_selector_ = std::move(encoder_selector);
+ SetEncoderSelectorOnChannel();
+}
+
+void RtpSenderBase::SetEncoderSelectorOnChannel() {
+ RTC_DCHECK_RUN_ON(signaling_thread_);
+ if (media_channel_ && ssrc_ && !stopped_) {
+ worker_thread_->Invoke<void>(RTC_FROM_HERE, [&] {
+ media_channel_->SetEncoderSelector(ssrc_, encoder_selector_.get());
+ });
+ }
+}
+
void RtpSenderBase::SetMediaChannel(cricket::MediaChannel* media_channel) {
RTC_DCHECK(media_channel == nullptr ||
media_channel->media_type() == media_type());
@@ -321,6 +338,9 @@
if (frame_transformer_) {
SetEncoderToPacketizerFrameTransformer(frame_transformer_);
}
+ if (encoder_selector_) {
+ SetEncoderSelectorOnChannel();
+ }
}
void RtpSenderBase::Stop() {