api: make CryptoOptions non-optional

Bug: webrtc:42235111
Change-Id: I45997f7766a1a4ebddf283bcb6fe1b3d6c02dfba
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/401700
Reviewed-by: Sameer Vijaykar <samvi@google.com>
Commit-Queue: Sameer Vijaykar <samvi@google.com>
Reviewed-by: Harald Alvestrand <hta@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#45274}
diff --git a/api/peer_connection_interface.h b/api/peer_connection_interface.h
index 1b0beb3..cd51c88 100644
--- a/api/peer_connection_interface.h
+++ b/api/peer_connection_interface.h
@@ -660,16 +660,11 @@
 
     // Defines advanced optional cryptographic settings related to SRTP and
     // frame encryption for native WebRTC.
-    std::optional<CryptoOptions> crypto_options;
+    CryptoOptions crypto_options;
 
     // TODO: bugs.webrtc.org/42235111 - remove after converting callers that
     // expect an optional.
-    CryptoOptions& GetWritableCryptoOptions() {
-      if (!crypto_options) {
-        crypto_options = CryptoOptions();
-      }
-      return *crypto_options;
-    }
+    CryptoOptions& GetWritableCryptoOptions() { return crypto_options; }
 
     // Configure if we should include the SDP attribute extmap-allow-mixed in
     // our offer on session level.
diff --git a/pc/peer_connection.cc b/pc/peer_connection.cc
index f2cc52b..de47f59 100644
--- a/pc/peer_connection.cc
+++ b/pc/peer_connection.cc
@@ -404,7 +404,7 @@
     SdpSemantics sdp_semantics;
     std::optional<AdapterType> network_preference;
     bool active_reset_srtp_params;
-    std::optional<CryptoOptions> crypto_options;
+    CryptoOptions crypto_options;
     bool offer_extmap_allow_mixed;
     std::string turn_logging_id;
     bool enable_implicit_rollback;
@@ -687,9 +687,7 @@
   config.disable_encryption = options_.disable_encryption;
   config.bundle_policy = configuration.bundle_policy;
   config.rtcp_mux_policy = configuration.rtcp_mux_policy;
-  config.crypto_options = configuration.crypto_options.has_value()
-                              ? *configuration.crypto_options
-                              : CryptoOptions();
+  config.crypto_options = configuration.crypto_options;
 
   // Maybe enable PQC from FieldTrials
   config.crypto_options.ephemeral_key_exchange_cipher_groups.Update(
@@ -1494,8 +1492,7 @@
   }
 
   if (has_local_description &&
-      configuration.crypto_options.value_or(CryptoOptions()) !=
-          configuration_.crypto_options) {
+      configuration.crypto_options != configuration_.crypto_options) {
     LOG_AND_RETURN_ERROR(RTCErrorType::INVALID_MODIFICATION,
                          "Can't change crypto_options after calling "
                          "SetLocalDescription.");
@@ -2973,10 +2970,7 @@
 
 CryptoOptions PeerConnection::GetCryptoOptions() {
   RTC_DCHECK_RUN_ON(signaling_thread());
-  if (!configuration_.crypto_options) {
-    configuration_.crypto_options = CryptoOptions();
-  }
-  return *configuration_.crypto_options;
+  return configuration_.crypto_options;
 }
 
 void PeerConnection::ClearStatsCache() {
diff --git a/pc/peer_connection.h b/pc/peer_connection.h
index f9ef0b5..2112e75 100644
--- a/pc/peer_connection.h
+++ b/pc/peer_connection.h
@@ -413,9 +413,8 @@
   // `sctp_mid()` if set. Called as part of setting the local description.
   RTCError StartSctpTransport(const SctpOptions& options) override;
 
-  // Returns the CryptoOptions for this PeerConnection. This will always
-  // return the RTCConfiguration.crypto_options if set and return a stock
-  // configuration if nothing was set.
+  // Returns the CryptoOptions set as RTCConfiguration.crypto_options for this
+  // PeerConnection.
   CryptoOptions GetCryptoOptions() override;
 
   // Internal implementation for AddTransceiver family of methods. If
diff --git a/sdk/android/src/jni/pc/crypto_options.cc b/sdk/android/src/jni/pc/crypto_options.cc
index f37ebc1..2174ac9 100644
--- a/sdk/android/src/jni/pc/crypto_options.cc
+++ b/sdk/android/src/jni/pc/crypto_options.cc
@@ -15,19 +15,18 @@
 namespace webrtc {
 namespace jni {
 
-std::optional<CryptoOptions> JavaToNativeOptionalCryptoOptions(
+CryptoOptions JavaToNativeCryptoOptions(
     JNIEnv* jni,
     const JavaRef<jobject>& j_crypto_options) {
+  CryptoOptions native_crypto_options;
   if (j_crypto_options.is_null()) {
-    return std::nullopt;
+    return native_crypto_options;
   }
-
   ScopedJavaLocalRef<jobject> j_srtp =
       Java_CryptoOptions_getSrtp(jni, j_crypto_options);
   ScopedJavaLocalRef<jobject> j_sframe =
       Java_CryptoOptions_getSFrame(jni, j_crypto_options);
 
-  CryptoOptions native_crypto_options;
   native_crypto_options.srtp.enable_gcm_crypto_suites =
       Java_Srtp_getEnableGcmCryptoSuites(jni, j_srtp);
   native_crypto_options.srtp.enable_aes128_sha1_32_crypto_cipher =
@@ -36,7 +35,7 @@
       Java_Srtp_getEnableEncryptedRtpHeaderExtensions(jni, j_srtp);
   native_crypto_options.sframe.require_frame_encryption =
       Java_SFrame_getRequireFrameEncryption(jni, j_sframe);
-  return std::optional<CryptoOptions>(native_crypto_options);
+  return native_crypto_options;
 }
 
 }  // namespace jni
diff --git a/sdk/android/src/jni/pc/crypto_options.h b/sdk/android/src/jni/pc/crypto_options.h
index f82f218..090385a 100644
--- a/sdk/android/src/jni/pc/crypto_options.h
+++ b/sdk/android/src/jni/pc/crypto_options.h
@@ -21,7 +21,7 @@
 namespace webrtc {
 namespace jni {
 
-std::optional<CryptoOptions> JavaToNativeOptionalCryptoOptions(
+CryptoOptions JavaToNativeCryptoOptions(
     JNIEnv* jni,
     const JavaRef<jobject>& j_crypto_options);
 
diff --git a/sdk/android/src/jni/pc/peer_connection.cc b/sdk/android/src/jni/pc/peer_connection.cc
index aaa4d457..d5c5ba6 100644
--- a/sdk/android/src/jni/pc/peer_connection.cc
+++ b/sdk/android/src/jni/pc/peer_connection.cc
@@ -270,8 +270,7 @@
   rtc_config->sdp_semantics = JavaToNativeSdpSemantics(jni, j_sdp_semantics);
   rtc_config->active_reset_srtp_params =
       Java_RTCConfiguration_getActiveResetSrtpParams(jni, j_rtc_config);
-  rtc_config->crypto_options =
-      JavaToNativeOptionalCryptoOptions(jni, j_crypto_options);
+  rtc_config->crypto_options = JavaToNativeCryptoOptions(jni, j_crypto_options);
   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.mm b/sdk/objc/api/peerconnection/RTCConfiguration.mm
index b0040a3..652e725 100644
--- a/sdk/objc/api/peerconnection/RTCConfiguration.mm
+++ b/sdk/objc/api/peerconnection/RTCConfiguration.mm
@@ -131,17 +131,17 @@
         [[self class] sdpSemanticsForNativeSdpSemantics:config.sdp_semantics];
     _turnCustomizer = config.turn_customizer;
     _activeResetSrtpParams = config.active_reset_srtp_params;
-    if (config.crypto_options) {
-      _cryptoOptions = [[RTC_OBJC_TYPE(RTCCryptoOptions) alloc]
-               initWithSrtpEnableGcmCryptoSuites:config.crypto_options->srtp
-                                                     .enable_gcm_crypto_suites
-             srtpEnableAes128Sha1_32CryptoCipher:
-                 config.crypto_options->srtp.enable_aes128_sha1_32_crypto_cipher
-          srtpEnableEncryptedRtpHeaderExtensions:
-              config.crypto_options->srtp.enable_encrypted_rtp_header_extensions
-                    sframeRequireFrameEncryption:config.crypto_options->sframe
-                                                     .require_frame_encryption];
-    }
+
+    _cryptoOptions = [[RTC_OBJC_TYPE(RTCCryptoOptions) alloc]
+             initWithSrtpEnableGcmCryptoSuites:config.crypto_options.srtp
+                                                   .enable_gcm_crypto_suites
+           srtpEnableAes128Sha1_32CryptoCipher:
+               config.crypto_options.srtp.enable_aes128_sha1_32_crypto_cipher
+        srtpEnableEncryptedRtpHeaderExtensions:
+            config.crypto_options.srtp.enable_encrypted_rtp_header_extensions
+                  sframeRequireFrameEncryption:config.crypto_options.sframe
+                                                   .require_frame_encryption];
+
     _turnLoggingId =
         [NSString stringWithUTF8String:config.turn_logging_id.c_str()];
     _rtcpAudioReportIntervalMs = config.audio_rtcp_report_interval_ms();
@@ -298,8 +298,7 @@
         _cryptoOptions.srtpEnableEncryptedRtpHeaderExtensions ? true : false;
     nativeCryptoOptions.sframe.require_frame_encryption =
         _cryptoOptions.sframeRequireFrameEncryption ? true : false;
-    nativeConfig->crypto_options =
-        std::optional<webrtc::CryptoOptions>(nativeCryptoOptions);
+    nativeConfig->crypto_options = nativeCryptoOptions;
   }
   nativeConfig->turn_logging_id = [_turnLoggingId UTF8String];
   nativeConfig->set_audio_rtcp_report_interval_ms(_rtcpAudioReportIntervalMs);
diff --git a/sdk/objc/unittests/RTCConfigurationTest.mm b/sdk/objc/unittests/RTCConfigurationTest.mm
index d4973bd..5c8fca0 100644
--- a/sdk/objc/unittests/RTCConfigurationTest.mm
+++ b/sdk/objc/unittests/RTCConfigurationTest.mm
@@ -81,15 +81,14 @@
   EXPECT_EQ(webrtc::PeerConnectionInterface::GATHER_CONTINUALLY,
             nativeConfig->continual_gathering_policy);
   EXPECT_EQ(true, nativeConfig->prune_turn_ports);
-  EXPECT_EQ(true, nativeConfig->crypto_options->srtp.enable_gcm_crypto_suites);
+  EXPECT_EQ(true, nativeConfig->crypto_options.srtp.enable_gcm_crypto_suites);
   EXPECT_EQ(
       true,
-      nativeConfig->crypto_options->srtp.enable_aes128_sha1_32_crypto_cipher);
-  EXPECT_EQ(true,
-            nativeConfig->crypto_options->srtp
-                .enable_encrypted_rtp_header_extensions);
-  EXPECT_EQ(true,
-            nativeConfig->crypto_options->sframe.require_frame_encryption);
+      nativeConfig->crypto_options.srtp.enable_aes128_sha1_32_crypto_cipher);
+  EXPECT_EQ(
+      true,
+      nativeConfig->crypto_options.srtp.enable_encrypted_rtp_header_extensions);
+  EXPECT_EQ(true, nativeConfig->crypto_options.sframe.require_frame_encryption);
   EXPECT_EQ(2500, nativeConfig->audio_rtcp_report_interval_ms());
   EXPECT_EQ(3750, nativeConfig->video_rtcp_report_interval_ms());
 }