diff --git a/api/video_codecs/BUILD.gn b/api/video_codecs/BUILD.gn index afa1c5325b..101848a2e4 100644 --- a/api/video_codecs/BUILD.gn +++ b/api/video_codecs/BUILD.gn @@ -145,7 +145,10 @@ rtc_library("builtin_video_encoder_factory") { "../../rtc_base:checks", "../../rtc_base/system:rtc_export", ] - absl_deps = [ "//third_party/abseil-cpp/absl/strings" ] + absl_deps = [ + "//third_party/abseil-cpp/absl/strings", + "//third_party/abseil-cpp/absl/types:optional", + ] } rtc_source_set("video_encoder_factory_template") { diff --git a/api/video_codecs/builtin_video_encoder_factory.cc b/api/video_codecs/builtin_video_encoder_factory.cc index 78e5f8b8be..7c5f35b216 100644 --- a/api/video_codecs/builtin_video_encoder_factory.cc +++ b/api/video_codecs/builtin_video_encoder_factory.cc @@ -11,9 +11,11 @@ #include "api/video_codecs/builtin_video_encoder_factory.h" #include +#include #include #include "absl/strings/match.h" +#include "absl/types/optional.h" #include "api/video_codecs/sdp_video_format.h" #include "api/video_codecs/video_encoder.h" #include "media/base/codec.h" @@ -49,6 +51,13 @@ class BuiltinVideoEncoderFactory : public VideoEncoderFactory { return internal_encoder_factory_->GetSupportedFormats(); } + CodecSupport QueryCodecSupport( + const SdpVideoFormat& format, + absl::optional scalability_mode) const override { + return internal_encoder_factory_->QueryCodecSupport(format, + scalability_mode); + } + private: const std::unique_ptr internal_encoder_factory_; }; diff --git a/media/engine/fake_webrtc_video_engine.cc b/media/engine/fake_webrtc_video_engine.cc index 4a4ef2335e..3cd2855a6c 100644 --- a/media/engine/fake_webrtc_video_engine.cc +++ b/media/engine/fake_webrtc_video_engine.cc @@ -27,6 +27,21 @@ namespace { static constexpr webrtc::TimeDelta kEventTimeout = webrtc::TimeDelta::Seconds(10); +bool IsScalabilityModeSupported( + const std::vector& formats, + absl::optional scalability_mode) { + if (!scalability_mode.has_value()) { + return true; + } + for (const auto& format : formats) { + for (const auto& mode : format.scalability_modes) { + if (ScalabilityModeToString(mode) == scalability_mode) + return true; + } + } + return false; +} + } // namespace // Decoder. @@ -203,6 +218,22 @@ FakeWebRtcVideoEncoderFactory::GetSupportedFormats() const { return formats; } +webrtc::VideoEncoderFactory::CodecSupport +FakeWebRtcVideoEncoderFactory::QueryCodecSupport( + const webrtc::SdpVideoFormat& format, + absl::optional scalability_mode) const { + std::vector supported_formats; + for (const auto& f : formats_) { + if (format.IsSameCodec(f)) + supported_formats.push_back(f); + } + if (format.IsCodecInList(formats_)) { + return {.is_supported = IsScalabilityModeSupported(supported_formats, + scalability_mode)}; + } + return {.is_supported = false}; +} + std::unique_ptr FakeWebRtcVideoEncoderFactory::CreateVideoEncoder( const webrtc::SdpVideoFormat& format) { diff --git a/media/engine/fake_webrtc_video_engine.h b/media/engine/fake_webrtc_video_engine.h index 37ef53add7..0bbddd26f5 100644 --- a/media/engine/fake_webrtc_video_engine.h +++ b/media/engine/fake_webrtc_video_engine.h @@ -114,6 +114,9 @@ class FakeWebRtcVideoEncoderFactory : public webrtc::VideoEncoderFactory { FakeWebRtcVideoEncoderFactory(); std::vector GetSupportedFormats() const override; + webrtc::VideoEncoderFactory::CodecSupport QueryCodecSupport( + const webrtc::SdpVideoFormat& format, + absl::optional scalability_mode) const override; std::unique_ptr CreateVideoEncoder( const webrtc::SdpVideoFormat& format) override; diff --git a/test/pc/e2e/analyzer/video/quality_analyzing_video_encoder.cc b/test/pc/e2e/analyzer/video/quality_analyzing_video_encoder.cc index 7f742972cb..e814ba88b7 100644 --- a/test/pc/e2e/analyzer/video/quality_analyzing_video_encoder.cc +++ b/test/pc/e2e/analyzer/video/quality_analyzing_video_encoder.cc @@ -384,6 +384,13 @@ QualityAnalyzingVideoEncoderFactory::GetSupportedFormats() const { return delegate_->GetSupportedFormats(); } +VideoEncoderFactory::CodecSupport +QualityAnalyzingVideoEncoderFactory::QueryCodecSupport( + const SdpVideoFormat& format, + absl::optional scalability_mode) const { + return delegate_->QueryCodecSupport(format, scalability_mode); +} + std::unique_ptr QualityAnalyzingVideoEncoderFactory::CreateVideoEncoder( const SdpVideoFormat& format) { diff --git a/test/pc/e2e/analyzer/video/quality_analyzing_video_encoder.h b/test/pc/e2e/analyzer/video/quality_analyzing_video_encoder.h index 476136c468..4adeacc0cd 100644 --- a/test/pc/e2e/analyzer/video/quality_analyzing_video_encoder.h +++ b/test/pc/e2e/analyzer/video/quality_analyzing_video_encoder.h @@ -173,6 +173,9 @@ class QualityAnalyzingVideoEncoderFactory : public VideoEncoderFactory { // Methods of VideoEncoderFactory interface. std::vector GetSupportedFormats() const override; + VideoEncoderFactory::CodecSupport QueryCodecSupport( + const SdpVideoFormat& format, + absl::optional scalability_mode) const override; std::unique_ptr CreateVideoEncoder( const SdpVideoFormat& format) override;