diff --git a/api/peer_connection_interface.h b/api/peer_connection_interface.h index 8977137f65..2d0abd8156 100644 --- a/api/peer_connection_interface.h +++ b/api/peer_connection_interface.h @@ -666,6 +666,10 @@ class RTC_EXPORT PeerConnectionInterface : public webrtc::RefCountInterface { // Added to be able to control rollout of this feature. bool enable_implicit_rollback = false; + // Whether network condition based codec switching is allowed. + // TODO(bugs.webrtc.org/11341): Remove this unsupported config value. + absl::optional allow_codec_switching; + // The delay before doing a usage histogram report for long-lived // PeerConnections. Used for testing only. absl::optional report_usage_pattern_delay_ms; diff --git a/pc/peer_connection.cc b/pc/peer_connection.cc index 46c28bba37..8afc44eb14 100644 --- a/pc/peer_connection.cc +++ b/pc/peer_connection.cc @@ -329,6 +329,7 @@ RTCErrorOr ApplyConfiguration( modified_config.active_reset_srtp_params = configuration.active_reset_srtp_params; modified_config.turn_logging_id = configuration.turn_logging_id; + modified_config.allow_codec_switching = configuration.allow_codec_switching; modified_config.stable_writable_connection_ping_interval_ms = configuration.stable_writable_connection_ping_interval_ms; if (configuration != modified_config) { @@ -457,6 +458,7 @@ bool PeerConnectionInterface::RTCConfiguration::operator==( bool offer_extmap_allow_mixed; std::string turn_logging_id; bool enable_implicit_rollback; + absl::optional allow_codec_switching; absl::optional report_usage_pattern_delay_ms; absl::optional stable_writable_connection_ping_interval_ms; VpnPreference vpn_preference; @@ -520,6 +522,7 @@ bool PeerConnectionInterface::RTCConfiguration::operator==( offer_extmap_allow_mixed == o.offer_extmap_allow_mixed && turn_logging_id == o.turn_logging_id && enable_implicit_rollback == o.enable_implicit_rollback && + allow_codec_switching == o.allow_codec_switching && report_usage_pattern_delay_ms == o.report_usage_pattern_delay_ms && stable_writable_connection_ping_interval_ms == o.stable_writable_connection_ping_interval_ms && diff --git a/sdk/android/api/org/webrtc/PeerConnection.java b/sdk/android/api/org/webrtc/PeerConnection.java index d530bc2c0c..5c87fe3ea3 100644 --- a/sdk/android/api/org/webrtc/PeerConnection.java +++ b/sdk/android/api/org/webrtc/PeerConnection.java @@ -540,6 +540,11 @@ public class PeerConnection { // every offer/answer negotiation.This is only intended to be a workaround for crbug.com/835958 public boolean activeResetSrtpParams; + // Whether this client is allowed to switch encoding codec mid-stream. This is a workaround for + // a WebRTC bug where the receiver could get confussed if a codec switch happened mid-call. + // Null indicates no change to currently configured value. + @Nullable public Boolean allowCodecSwitching; + /** * Defines advanced optional cryptographic settings related to SRTP and * frame encryption for native WebRTC. Setting this will overwrite any @@ -606,6 +611,7 @@ public class PeerConnection { activeResetSrtpParams = false; cryptoOptions = null; turnLoggingId = null; + allowCodecSwitching = null; enableImplicitRollback = false; offerExtmapAllowMixed = true; } @@ -795,6 +801,12 @@ public class PeerConnection { return activeResetSrtpParams; } + @Nullable + @CalledByNative("RTCConfiguration") + Boolean getAllowCodecSwitching() { + return allowCodecSwitching; + } + @Nullable @CalledByNative("RTCConfiguration") CryptoOptions getCryptoOptions() { diff --git a/sdk/android/src/jni/pc/peer_connection.cc b/sdk/android/src/jni/pc/peer_connection.cc index e5fb11e3b4..a063804ac8 100644 --- a/sdk/android/src/jni/pc/peer_connection.cc +++ b/sdk/android/src/jni/pc/peer_connection.cc @@ -267,6 +267,10 @@ void JavaToNativeRTCConfiguration( Java_RTCConfiguration_getActiveResetSrtpParams(jni, j_rtc_config); rtc_config->crypto_options = JavaToNativeOptionalCryptoOptions(jni, j_crypto_options); + + rtc_config->allow_codec_switching = JavaToNativeOptionalBool( + jni, Java_RTCConfiguration_getAllowCodecSwitching(jni, j_rtc_config)); + rtc_config->offer_extmap_allow_mixed = Java_RTCConfiguration_getOfferExtmapAllowMixed(jni, j_rtc_config); rtc_config->enable_implicit_rollback = diff --git a/sdk/objc/api/peerconnection/RTCConfiguration.h b/sdk/objc/api/peerconnection/RTCConfiguration.h index 011eaa613d..1b0d14baf1 100644 --- a/sdk/objc/api/peerconnection/RTCConfiguration.h +++ b/sdk/objc/api/peerconnection/RTCConfiguration.h @@ -184,6 +184,12 @@ RTC_OBJC_EXPORT */ @property(nonatomic, assign) BOOL activeResetSrtpParams; +/** If the remote side support mid-stream codec switches then allow encoder + * switching to be performed. + */ + +@property(nonatomic, assign) BOOL allowCodecSwitching; + /** * Defines advanced optional cryptographic settings related to SRTP and * frame encryption for native WebRTC. Setting this will overwrite any diff --git a/sdk/objc/api/peerconnection/RTCConfiguration.mm b/sdk/objc/api/peerconnection/RTCConfiguration.mm index 86ecbabf8d..8e42cb2a82 100644 --- a/sdk/objc/api/peerconnection/RTCConfiguration.mm +++ b/sdk/objc/api/peerconnection/RTCConfiguration.mm @@ -51,6 +51,7 @@ @synthesize sdpSemantics = _sdpSemantics; @synthesize turnCustomizer = _turnCustomizer; @synthesize activeResetSrtpParams = _activeResetSrtpParams; +@synthesize allowCodecSwitching = _allowCodecSwitching; @synthesize cryptoOptions = _cryptoOptions; @synthesize turnLoggingId = _turnLoggingId; @synthesize rtcpAudioReportIntervalMs = _rtcpAudioReportIntervalMs; @@ -138,6 +139,7 @@ _turnLoggingId = [NSString stringWithUTF8String:config.turn_logging_id.c_str()]; _rtcpAudioReportIntervalMs = config.audio_rtcp_report_interval_ms(); _rtcpVideoReportIntervalMs = config.video_rtcp_report_interval_ms(); + _allowCodecSwitching = config.allow_codec_switching.value_or(false); _enableImplicitRollback = config.enable_implicit_rollback; _offerExtmapAllowMixed = config.offer_extmap_allow_mixed; _iceCheckIntervalStrongConnectivity = @@ -284,6 +286,7 @@ nativeConfig->turn_logging_id = [_turnLoggingId UTF8String]; nativeConfig->set_audio_rtcp_report_interval_ms(_rtcpAudioReportIntervalMs); nativeConfig->set_video_rtcp_report_interval_ms(_rtcpVideoReportIntervalMs); + nativeConfig->allow_codec_switching = _allowCodecSwitching; nativeConfig->enable_implicit_rollback = _enableImplicitRollback; nativeConfig->offer_extmap_allow_mixed = _offerExtmapAllowMixed; if (_iceCheckIntervalStrongConnectivity != nil) {