diff --git a/sdk/objc/base/RTCVideoEncoderFactory.h b/sdk/objc/base/RTCVideoEncoderFactory.h index 20c603d6fe..3291797d5a 100644 --- a/sdk/objc/base/RTCVideoEncoderFactory.h +++ b/sdk/objc/base/RTCVideoEncoderFactory.h @@ -23,6 +23,9 @@ RTC_OBJC_EXPORT - (nullable id)createEncoder:(RTCVideoCodecInfo *)info; - (NSArray *)supportedCodecs; // TODO(andersc): "supportedFormats" instead? +@optional +- (NSArray *)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 7bf56bd081..6974377380 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 @@ class ObjCVideoEncoderFactory : public VideoEncoderFactory { id wrapped_encoder_factory() const; std::vector GetSupportedFormats() const override; + std::vector GetImplementations() const override; std::unique_ptr 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 e59c1a1163..b0c7c2c5f1 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 @@ id ObjCVideoEncoderFactory::wrapped_encoder_factory() co std::vector ObjCVideoEncoderFactory::GetSupportedFormats() const { std::vector 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 @@ std::vector ObjCVideoEncoderFactory::GetSupportedFormats() const return supported_formats; } +std::vector ObjCVideoEncoderFactory::GetImplementations() const { + if ([encoder_factory_ respondsToSelector:SEL("implementations")]) { + std::vector 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 70ef068fe7..cd7d739c4e 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 @@ TEST(ObjCVideoEncoderFactoryTest, ReleaseEncodeReturnsErrorOnFail) { EXPECT_EQ(encoder->Release(), WEBRTC_VIDEO_CODEC_ERROR); } + +TEST(ObjCVideoEncoderFactoryTest, GetSupportedFormats) { + webrtc::ObjCVideoEncoderFactory encoder_factory(CreateOKEncoderFactory()); + std::vector 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 supportedFormats = encoder_factory.GetImplementations(); + EXPECT_EQ(supportedFormats.size(), 1u); + EXPECT_EQ(supportedFormats[0].name, "H264"); +}