In objc software video encoder wrappers expose functions to list supported scalability modes.

Bug: b/299588022
Change-Id: I41c06b1e4257d6ce47cadfec65e98f224c0f6be0
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/360682
Reviewed-by: Mirko Bonadei <mbonadei@webrtc.org>
Reviewed-by: Åsa Persson <asapersson@webrtc.org>
Commit-Queue: Danil Chapovalov <danilchap@webrtc.org>
Reviewed-by: Kári Helgason <kthelgason@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#42883}
diff --git a/sdk/BUILD.gn b/sdk/BUILD.gn
index f2e4040..a03d737 100644
--- a/sdk/BUILD.gn
+++ b/sdk/BUILD.gn
@@ -763,8 +763,11 @@
 
       deps = [
         ":base_objc",
+        ":helpers_objc",
         ":wrapped_native_codec_objc",
+        "../api/video_codecs:scalability_mode",
         "../modules/video_coding:webrtc_vp8",
+        "../modules/video_coding:webrtc_vp8_scalability",
       ]
     }
 
@@ -780,7 +783,9 @@
 
       deps = [
         ":base_objc",
+        ":helpers_objc",
         ":wrapped_native_codec_objc",
+        "../api/video_codecs:scalability_mode",
         "../modules/video_coding:webrtc_vp9",
       ]
     }
@@ -811,7 +816,10 @@
 
       deps = [
         ":base_objc",
+        ":helpers_objc",
         ":wrapped_native_codec_objc",
+        "../api/video_codecs:scalability_mode",
+        "../modules/video_coding/codecs/av1:av1_svc_config",
         "../modules/video_coding/codecs/av1:libaom_av1_encoder",
       ]
     }
diff --git a/sdk/objc/api/video_codec/RTCVideoEncoderAV1.h b/sdk/objc/api/video_codec/RTCVideoEncoderAV1.h
index 8aa55e4..04d1ff9 100644
--- a/sdk/objc/api/video_codec/RTCVideoEncoderAV1.h
+++ b/sdk/objc/api/video_codec/RTCVideoEncoderAV1.h
@@ -20,7 +20,12 @@
  * RTCPeerConnectionFactory. Even though it implements the RTCVideoEncoder protocol, it can not be
  * used independently from the RTCPeerConnectionFactory.
  */
-+ (id<RTC_OBJC_TYPE(RTCVideoEncoder)>)av1Encoder;
++ (nonnull id<RTC_OBJC_TYPE(RTCVideoEncoder)>)av1Encoder;
+
+/* Returns list of scalability modes supported by the encoder that can be
+ * created with `av1Encoder` method above.
+ */
++ (nonnull NSArray<NSString*>*)supportedScalabilityModes;
 
 + (bool)isSupported;
 
diff --git a/sdk/objc/api/video_codec/RTCVideoEncoderAV1.mm b/sdk/objc/api/video_codec/RTCVideoEncoderAV1.mm
index 43137b5..6146f07 100644
--- a/sdk/objc/api/video_codec/RTCVideoEncoderAV1.mm
+++ b/sdk/objc/api/video_codec/RTCVideoEncoderAV1.mm
@@ -15,6 +15,10 @@
 #import "RTCNativeVideoEncoder.h"
 #import "RTCNativeVideoEncoderBuilder+Native.h"
 #import "RTCVideoEncoderAV1.h"
+#import "helpers/NSString+StdString.h"
+
+#include "api/video_codecs/scalability_mode.h"
+#include "modules/video_coding/codecs/av1/av1_svc_config.h"
 #include "modules/video_coding/codecs/av1/libaom_av1_encoder.h"
 
 @interface RTC_OBJC_TYPE (RTCVideoEncoderAV1Builder)
@@ -35,6 +39,17 @@
       return [[RTC_OBJC_TYPE(RTCVideoEncoderAV1Builder) alloc] init];
     }
 
+    + (NSArray<NSString*>*)supportedScalabilityModes {
+      // `LibaomAv1EncoderSupportedScalabilityModes` returns an std::vector-like container, but
+      // exact type might change, thus use `auto`.
+      auto modes = webrtc::LibaomAv1EncoderSupportedScalabilityModes();
+      NSMutableArray<NSString*>* result = [NSMutableArray arrayWithCapacity:std::size(modes)];
+      for (webrtc::ScalabilityMode mode : modes) {
+        [result addObject:[NSString stringForAbslStringView:webrtc::ScalabilityModeToString(mode)]];
+      }
+      return result;
+    }
+
     + (bool)isSupported {
       return true;
     }
diff --git a/sdk/objc/api/video_codec/RTCVideoEncoderVP8.h b/sdk/objc/api/video_codec/RTCVideoEncoderVP8.h
index e136a5b..bbd5069 100644
--- a/sdk/objc/api/video_codec/RTCVideoEncoderVP8.h
+++ b/sdk/objc/api/video_codec/RTCVideoEncoderVP8.h
@@ -20,6 +20,11 @@
  * RTCPeerConnectionFactory. Even though it implements the RTCVideoEncoder protocol, it can not be
  * used independently from the RTCPeerConnectionFactory.
  */
-+ (id<RTC_OBJC_TYPE(RTCVideoEncoder)>)vp8Encoder;
++ (nonnull id<RTC_OBJC_TYPE(RTCVideoEncoder)>)vp8Encoder;
+
+/* Returns list of scalability modes supported by the encoder that can be
+ * created with `vp8Encoder` method above.
+ */
++ (nonnull NSArray<NSString*>*)supportedScalabilityModes;
 
 @end
diff --git a/sdk/objc/api/video_codec/RTCVideoEncoderVP8.mm b/sdk/objc/api/video_codec/RTCVideoEncoderVP8.mm
index 4a3100d..010b72f 100644
--- a/sdk/objc/api/video_codec/RTCVideoEncoderVP8.mm
+++ b/sdk/objc/api/video_codec/RTCVideoEncoderVP8.mm
@@ -15,8 +15,11 @@
 #import "RTCNativeVideoEncoder.h"
 #import "RTCNativeVideoEncoderBuilder+Native.h"
 #import "RTCVideoEncoderVP8.h"
+#import "helpers/NSString+StdString.h"
 
+#include "api/video_codecs/scalability_mode.h"
 #include "modules/video_coding/codecs/vp8/include/vp8.h"
+#include "modules/video_coding/codecs/vp8/vp8_scalability.h"
 
 @interface RTC_OBJC_TYPE (RTCVideoEncoderVP8Builder)
     : RTC_OBJC_TYPE(RTCNativeVideoEncoder) <RTC_OBJC_TYPE (RTCNativeVideoEncoderBuilder)>
@@ -36,4 +39,13 @@
       return [[RTC_OBJC_TYPE(RTCVideoEncoderVP8Builder) alloc] init];
     }
 
+    + (NSArray<NSString*>*)supportedScalabilityModes {
+      NSMutableArray<NSString*>* result =
+          [NSMutableArray arrayWithCapacity:std::size(webrtc::kVP8SupportedScalabilityModes)];
+      for (webrtc::ScalabilityMode mode : webrtc::kVP8SupportedScalabilityModes) {
+        [result addObject:[NSString stringForAbslStringView:webrtc::ScalabilityModeToString(mode)]];
+      }
+      return result;
+    }
+
     @end
diff --git a/sdk/objc/api/video_codec/RTCVideoEncoderVP9.h b/sdk/objc/api/video_codec/RTCVideoEncoderVP9.h
index f7dac61..69ad181 100644
--- a/sdk/objc/api/video_codec/RTCVideoEncoderVP9.h
+++ b/sdk/objc/api/video_codec/RTCVideoEncoderVP9.h
@@ -20,7 +20,12 @@
  * RTCPeerConnectionFactory. Even though it implements the RTCVideoEncoder protocol, it can not be
  * used independently from the RTCPeerConnectionFactory.
  */
-+ (id<RTC_OBJC_TYPE(RTCVideoEncoder)>)vp9Encoder;
++ (nullable id<RTC_OBJC_TYPE(RTCVideoEncoder)>)vp9Encoder;
+
+/* Returns list of scalability modes supported by the encoder that can be
+ * created with `vp9Encoder` method above.
+ */
++ (nonnull NSArray<NSString*>*)supportedScalabilityModes;
 
 + (bool)isSupported;
 
diff --git a/sdk/objc/api/video_codec/RTCVideoEncoderVP9.mm b/sdk/objc/api/video_codec/RTCVideoEncoderVP9.mm
index 1026f40..14903c7 100644
--- a/sdk/objc/api/video_codec/RTCVideoEncoderVP9.mm
+++ b/sdk/objc/api/video_codec/RTCVideoEncoderVP9.mm
@@ -15,7 +15,9 @@
 #import "RTCNativeVideoEncoder.h"
 #import "RTCNativeVideoEncoderBuilder+Native.h"
 #import "RTCVideoEncoderVP9.h"
+#import "helpers/NSString+StdString.h"
 
+#include "api/video_codecs/scalability_mode.h"
 #include "modules/video_coding/codecs/vp9/include/vp9.h"
 
 @interface RTC_OBJC_TYPE (RTCVideoEncoderVP9Builder)
@@ -40,6 +42,17 @@
 #endif
     }
 
+    + (NSArray<NSString*>*)supportedScalabilityModes {
+      NSMutableArray<NSString*>* result = [NSMutableArray array];
+      for (webrtc::ScalabilityMode mode : webrtc::kAllScalabilityModes) {
+        if (webrtc::VP9Encoder::SupportsScalabilityMode(mode)) {
+          [result
+              addObject:[NSString stringForAbslStringView:webrtc::ScalabilityModeToString(mode)]];
+        }
+      }
+      return result;
+    }
+
     + (bool)isSupported {
 #if defined(RTC_ENABLE_VP9)
       return true;