From b7f9113b7252ac831fff9dded803ef0fe5196c76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=85sa=20Persson?= Date: Mon, 2 Jan 2023 19:46:13 +0100 Subject: [PATCH] Add API for querying codec support. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Implement - BuiltinVideoEncoderFactory::QueryCodecSupport - QualityAnalyzingVideoEncoderFactory::QueryCodecSupport - FakeWebRtcVideoEncoderFactory::QueryCodecSupport Bug: webrtc:11607 Change-Id: I9a138bbdc809abf5577dd27d84a51d0ed77d62ba Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/290381 Reviewed-by: Erik Språng Commit-Queue: Åsa Persson Cr-Commit-Position: refs/heads/main@{#38994} --- api/video_codecs/BUILD.gn | 5 ++- .../builtin_video_encoder_factory.cc | 9 ++++++ media/engine/fake_webrtc_video_engine.cc | 31 +++++++++++++++++++ media/engine/fake_webrtc_video_engine.h | 3 ++ .../video/quality_analyzing_video_encoder.cc | 7 +++++ .../video/quality_analyzing_video_encoder.h | 3 ++ 6 files changed, 57 insertions(+), 1 deletion(-) 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;