diff --git a/media/BUILD.gn b/media/BUILD.gn index 705378022e..550f9f9fa0 100644 --- a/media/BUILD.gn +++ b/media/BUILD.gn @@ -247,6 +247,7 @@ rtc_library("rtc_internal_video_codecs") { "../modules/video_coding:webrtc_vp8", "../modules/video_coding:webrtc_vp9", "../modules/video_coding/codecs/av1:libaom_av1_decoder", + "../modules/video_coding/codecs/av1:libaom_av1_encoder", "../rtc_base:checks", "../rtc_base:deprecation", "../rtc_base:rtc_base_approved", diff --git a/media/engine/internal_encoder_factory.cc b/media/engine/internal_encoder_factory.cc index 331f22b794..aabb810283 100644 --- a/media/engine/internal_encoder_factory.cc +++ b/media/engine/internal_encoder_factory.cc @@ -16,6 +16,7 @@ #include "api/video_codecs/sdp_video_format.h" #include "media/base/codec.h" #include "media/base/media_constants.h" +#include "modules/video_coding/codecs/av1/libaom_av1_encoder.h" #include "modules/video_coding/codecs/h264/include/h264.h" #include "modules/video_coding/codecs/vp8/include/vp8.h" #include "modules/video_coding/codecs/vp9/include/vp9.h" @@ -23,17 +24,23 @@ namespace webrtc { -std::vector InternalEncoderFactory::GetSupportedFormats() - const { +std::vector InternalEncoderFactory::SupportedFormats() { std::vector supported_codecs; supported_codecs.push_back(SdpVideoFormat(cricket::kVp8CodecName)); for (const webrtc::SdpVideoFormat& format : webrtc::SupportedVP9Codecs()) supported_codecs.push_back(format); for (const webrtc::SdpVideoFormat& format : webrtc::SupportedH264Codecs()) supported_codecs.push_back(format); + if (kIsLibaomAv1EncoderSupported) + supported_codecs.push_back(SdpVideoFormat(cricket::kAv1CodecName)); return supported_codecs; } +std::vector InternalEncoderFactory::GetSupportedFormats() + const { + return SupportedFormats(); +} + VideoEncoderFactory::CodecInfo InternalEncoderFactory::QueryVideoEncoder( const SdpVideoFormat& format) const { CodecInfo info; @@ -50,6 +57,9 @@ std::unique_ptr InternalEncoderFactory::CreateVideoEncoder( return VP9Encoder::Create(cricket::VideoCodec(format)); if (absl::EqualsIgnoreCase(format.name, cricket::kH264CodecName)) return H264Encoder::Create(cricket::VideoCodec(format)); + if (kIsLibaomAv1EncoderSupported && + absl::EqualsIgnoreCase(format.name, cricket::kAv1CodecName)) + return CreateLibaomAv1Encoder(); RTC_LOG(LS_ERROR) << "Trying to created encoder of unsupported format " << format.name; return nullptr; diff --git a/media/engine/internal_encoder_factory.h b/media/engine/internal_encoder_factory.h index 79dbc46e08..c15d1790f3 100644 --- a/media/engine/internal_encoder_factory.h +++ b/media/engine/internal_encoder_factory.h @@ -23,6 +23,7 @@ namespace webrtc { class RTC_EXPORT InternalEncoderFactory : public VideoEncoderFactory { public: + static std::vector SupportedFormats(); std::vector GetSupportedFormats() const override; CodecInfo QueryVideoEncoder(const SdpVideoFormat& format) const override; diff --git a/sdk/android/src/jni/android_media_encoder.cc b/sdk/android/src/jni/android_media_encoder.cc index 8db368b6ec..0d0e83a49f 100644 --- a/sdk/android/src/jni/android_media_encoder.cc +++ b/sdk/android/src/jni/android_media_encoder.cc @@ -438,8 +438,7 @@ bool IsFormatSupported(const std::vector& supported_formats, bool MediaCodecVideoEncoder::ProcessHWError( bool reset_if_fallback_unavailable) { ALOGE << "ProcessHWError"; - if (IsFormatSupported(InternalEncoderFactory().GetSupportedFormats(), - format_)) { + if (IsFormatSupported(InternalEncoderFactory::SupportedFormats(), format_)) { ALOGE << "Fallback to SW encoder."; sw_fallback_required_ = true; return false;