Add ObjC interface wrapping new GetImplementations method.

Bug: webrtc:10795
Change-Id: I32a4bcb9bd51155b6bc82a161765b5cda9539100
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/150100
Commit-Queue: Kári Helgason <kthelgason@webrtc.org>
Reviewed-by: Anders Carlsson <andersc@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#28947}
diff --git a/sdk/objc/base/RTCVideoEncoderFactory.h b/sdk/objc/base/RTCVideoEncoderFactory.h
index 20c603d..3291797 100644
--- a/sdk/objc/base/RTCVideoEncoderFactory.h
+++ b/sdk/objc/base/RTCVideoEncoderFactory.h
@@ -23,6 +23,9 @@
 - (nullable id<RTCVideoEncoder>)createEncoder:(RTCVideoCodecInfo *)info;
 - (NSArray<RTCVideoCodecInfo *> *)supportedCodecs;  // TODO(andersc): "supportedFormats" instead?
 
+@optional
+- (NSArray<RTCVideoCodecInfo *> *)implementations;
+
 @end
 
 NS_ASSUME_NONNULL_END
diff --git a/sdk/objc/native/src/objc_video_encoder_factory.h b/sdk/objc/native/src/objc_video_encoder_factory.h
index 7bf56bd..6974377 100644
--- a/sdk/objc/native/src/objc_video_encoder_factory.h
+++ b/sdk/objc/native/src/objc_video_encoder_factory.h
@@ -27,6 +27,7 @@
   id<RTCVideoEncoderFactory> wrapped_encoder_factory() const;
 
   std::vector<SdpVideoFormat> GetSupportedFormats() const override;
+  std::vector<SdpVideoFormat> GetImplementations() const override;
   std::unique_ptr<VideoEncoder> CreateVideoEncoder(
       const SdpVideoFormat& format) override;
   CodecInfo QueryVideoEncoder(const SdpVideoFormat& format) const override;
diff --git a/sdk/objc/native/src/objc_video_encoder_factory.mm b/sdk/objc/native/src/objc_video_encoder_factory.mm
index e59c1a1..b0c7c2c 100644
--- a/sdk/objc/native/src/objc_video_encoder_factory.mm
+++ b/sdk/objc/native/src/objc_video_encoder_factory.mm
@@ -121,7 +121,7 @@
 
 std::vector<SdpVideoFormat> ObjCVideoEncoderFactory::GetSupportedFormats() const {
   std::vector<SdpVideoFormat> supported_formats;
-  for (RTCVideoCodecInfo *supportedCodec in encoder_factory_.supportedCodecs) {
+  for (RTCVideoCodecInfo *supportedCodec in [encoder_factory_ supportedCodecs]) {
     SdpVideoFormat format = [supportedCodec nativeSdpVideoFormat];
     supported_formats.push_back(format);
   }
@@ -129,6 +129,18 @@
   return supported_formats;
 }
 
+std::vector<SdpVideoFormat> ObjCVideoEncoderFactory::GetImplementations() const {
+  if ([encoder_factory_ respondsToSelector:SEL("implementations")]) {
+    std::vector<SdpVideoFormat> supported_formats;
+    for (RTCVideoCodecInfo *supportedCodec in [encoder_factory_ implementations]) {
+      SdpVideoFormat format = [supportedCodec nativeSdpVideoFormat];
+      supported_formats.push_back(format);
+    }
+    return supported_formats;
+  }
+  return GetSupportedFormats();
+}
+
 VideoEncoderFactory::CodecInfo ObjCVideoEncoderFactory::QueryVideoEncoder(
     const SdpVideoFormat &format) const {
   // TODO(andersc): This is a hack until we figure out how this should be done properly.
diff --git a/sdk/objc/unittests/objc_video_encoder_factory_tests.mm b/sdk/objc/unittests/objc_video_encoder_factory_tests.mm
index 70ef068..cd7d739 100644
--- a/sdk/objc/unittests/objc_video_encoder_factory_tests.mm
+++ b/sdk/objc/unittests/objc_video_encoder_factory_tests.mm
@@ -122,3 +122,17 @@
 
   EXPECT_EQ(encoder->Release(), WEBRTC_VIDEO_CODEC_ERROR);
 }
+
+TEST(ObjCVideoEncoderFactoryTest, GetSupportedFormats) {
+  webrtc::ObjCVideoEncoderFactory encoder_factory(CreateOKEncoderFactory());
+  std::vector<webrtc::SdpVideoFormat> supportedFormats = encoder_factory.GetSupportedFormats();
+  EXPECT_EQ(supportedFormats.size(), 1u);
+  EXPECT_EQ(supportedFormats[0].name, "H264");
+}
+
+TEST(ObjCVideoEncoderFactoryTest, GetImplementations) {
+  webrtc::ObjCVideoEncoderFactory encoder_factory(CreateOKEncoderFactory());
+  std::vector<webrtc::SdpVideoFormat> supportedFormats = encoder_factory.GetImplementations();
+  EXPECT_EQ(supportedFormats.size(), 1u);
+  EXPECT_EQ(supportedFormats[0].name, "H264");
+}