commit 269cb6ce97aeb7e2a93748c147a7176925b9309e parent a99d001e7b5c51055f1519d0e20a25f6cc9fd5bb Author: Atila Butkovits <abutkovits@mozilla.com> Date: Wed, 24 Dec 2025 04:39:01 +0200 Revert "Bug 2005011 - Part 8. Expose MediaCodec encoder configurations on ffvpx. r=media-playback-reviewers,padenot" for causing bustages in FFmpegVideoDecoder.cpp. This reverts commit 28720f05016d6f5967ef55d53d61d348139e4cd9. Revert "Bug 2005011 - Part 7. Update ffmpeg configuration to be more accurate on Android. r=media-playback-reviewers,padenot" This reverts commit 654d670b05e501f7772fea1a4ac7732445406a66. Revert "Bug 2005011 - Part 6. Shuffle FFmpegDecoderModule member variable initialization. r=media-playback-reviewers,padenot" This reverts commit 51ea564fcaeffdbd16ba1952fa6a415bfbe9d785. Revert "Bug 2005011 - Part 5. Ensure we initialize FFmpegEncoderModule for advertising hardware support. r=media-playback-reviewers,padenot" This reverts commit e19013799e222e152599994cf307059a84d64664. Revert "Bug 2005011 - Part 4. Remove redundant gfxVars for VP8 HW decoding status. r=media-playback-reviewers,padenot" This reverts commit b6b226f9e94f8349ffb57ad1f9d299bac5248abc. Revert "Bug 2005011 - Part 3. Make gfxPlatform set the hardware codec-related gfxVars accurately on Android. r=media-playback-reviewers,padenot" This reverts commit 722cff78eb72f0c40dbd013c198b98465fed9abe. Revert "Bug 2005011 - Part 2. Move AV1 main profile check from AndroidDecoderModule to AOMDecoder. r=media-playback-reviewers,padenot" This reverts commit 08d019b2ab6fab03df40a1811fec45c6e059b5b1. Revert "Bug 2005011 - Part 1. Expose AV1 and HEVC hardware codec support on Android. r=geckoview-reviewers,media-playback-reviewers,tcampbell,padenot" This reverts commit 7a48aeca1ed554ed7a1383352ab3f4151e5994a9. Diffstat:
23 files changed, 67 insertions(+), 249 deletions(-)
diff --git a/dom/media/mediasource/MediaSource.cpp b/dom/media/mediasource/MediaSource.cpp @@ -62,16 +62,20 @@ namespace mozilla { // Returns true if we should enable MSE webm regardless of preferences. // 1. If MP4/H264 isn't supported: -// * N/KN editions (Europe and Korea) of Windows 10/11 without the optional -// "Windows Media Feature Pack" -// * Some Linux Desktop. +// * Windows XP +// * Windows Vista and Server 2008 without the optional "Platform Update +// Supplement" +// * N/KN editions (Europe and Korea) of Windows 7/8/8.1/10 without the +// optional "Windows Media Feature Pack" // 2. If H264 hardware acceleration is not available. +// 3. The CPU is considered to be fast enough static bool IsVP9Forced(DecoderDoctorDiagnostics* aDiagnostics) { bool mp4supported = MP4Decoder::IsSupportedType( MediaContainerType(MEDIAMIMETYPE(VIDEO_MP4)), aDiagnostics); bool hwsupported = gfx::gfxVars::CanUseHardwareVideoDecoding(); #ifdef MOZ_WIDGET_ANDROID - return !mp4supported || !hwsupported || gfx::gfxVars::UseVP9HwDecode(); + return !mp4supported || !hwsupported || + gfx::gfxVars::VP9HwDecodeIsAccelerated(); #else return !mp4supported || !hwsupported; #endif diff --git a/dom/media/platforms/agnostic/AOMDecoder.cpp b/dom/media/platforms/agnostic/AOMDecoder.cpp @@ -317,17 +317,6 @@ bool AOMDecoder::IsAV1(const nsACString& aMimeType) { } /* static */ -bool AOMDecoder::IsMainProfile(const MediaByteBuffer* aBox) { - if (!aBox || aBox->IsEmpty()) { - return false; - } - AV1SequenceInfo av1Info; - MediaResult seqHdrResult; - TryReadAV1CBox(aBox, av1Info, seqHdrResult); - return seqHdrResult.Code() == NS_OK && av1Info.mProfile == 0; -} - -/* static */ bool AOMDecoder::IsKeyframe(Span<const uint8_t> aBuffer) { aom_codec_stream_info_t info; PodZero(&info); diff --git a/dom/media/platforms/agnostic/AOMDecoder.h b/dom/media/platforms/agnostic/AOMDecoder.h @@ -39,9 +39,6 @@ class AOMDecoder final : public MediaDataDecoder, // by our demuxers to identify AV1 streams. static bool IsAV1(const nsACString& aMimeType); - // Return true if uses AV1 main profile. - static bool IsMainProfile(const MediaByteBuffer* aBox); - // Return true if a sample is a keyframe. static bool IsKeyframe(Span<const uint8_t> aBuffer); diff --git a/dom/media/platforms/android/AndroidDecoderModule.cpp b/dom/media/platforms/android/AndroidDecoderModule.cpp @@ -316,6 +316,16 @@ media::DecodeSupportSet AndroidDecoderModule::Supports( : media::DecodeSupportSet{}; } +static bool IsAV1MainProfile(const MediaByteBuffer* aBox) { + if (!aBox || aBox->IsEmpty()) { + return false; + } + AOMDecoder::AV1SequenceInfo av1Info; + MediaResult seqHdrResult; + AOMDecoder::TryReadAV1CBox(aBox, av1Info, seqHdrResult); + return seqHdrResult.Code() == NS_OK && av1Info.mProfile == 0; +} + already_AddRefed<MediaDataDecoder> AndroidDecoderModule::CreateVideoDecoder( const CreateDecoderParams& aParams) { // Temporary - forces use of VPXDecoder when alpha is present. @@ -327,7 +337,7 @@ already_AddRefed<MediaDataDecoder> AndroidDecoderModule::CreateVideoDecoder( } if (AOMDecoder::IsAV1(aParams.mConfig.mMimeType) && - !AOMDecoder::IsMainProfile(aParams.VideoConfig().mExtraData)) { + !IsAV1MainProfile(aParams.VideoConfig().mExtraData)) { return nullptr; } diff --git a/dom/media/platforms/ffmpeg/FFmpegDataEncoder.cpp b/dom/media/platforms/ffmpeg/FFmpegDataEncoder.cpp @@ -34,10 +34,6 @@ AVCodecID GetFFmpegEncoderCodecId<LIBAV_VER>(CodecType aCodec) { return AV_CODEC_ID_H264; } - if (aCodec == CodecType::H265) { - return AV_CODEC_ID_HEVC; - } - if (aCodec == CodecType::AV1) { return AV_CODEC_ID_AV1; } diff --git a/dom/media/platforms/ffmpeg/FFmpegDecoderModule.h b/dom/media/platforms/ffmpeg/FFmpegDecoderModule.h @@ -89,19 +89,16 @@ class FFmpegDecoderModule : public PlatformDecoderModule { {AV_CODEC_ID_VP8, gfx::gfxVars::UseVP8HwDecode()}, # endif -# if defined(MOZ_WIDGET_GTK) && !defined(FFVPX_VERSION) // These proprietary video codecs can only be decoded via hardware by using // the system ffmpeg, not supported by ffvpx. +# if (defined(MOZ_WIDGET_GTK) && !defined(FFVPX_VERSION)) || \ + defined(MOZ_WIDGET_ANDROID) # if LIBAVCODEC_VERSION_MAJOR >= 55 {AV_CODEC_ID_HEVC, gfx::gfxVars::UseHEVCHwDecode()}, # endif {AV_CODEC_ID_H264, gfx::gfxVars::UseH264HwDecode()}, # endif # ifdef MOZ_WIDGET_ANDROID - // These proprietary codecs can only be decoded via MediaCodec decoders, - // but the underlying implementation may be software or hardware. - {AV_CODEC_ID_HEVC, true}, - {AV_CODEC_ID_H264, true}, {AV_CODEC_ID_AAC, true}, # endif }; @@ -264,28 +261,7 @@ class FFmpegDecoderModule : public PlatformDecoderModule { supports += media::DecodeSupport::SoftwareDecode; } if (IsHWDecodingSupported(codecId)) { -#ifdef MOZ_WIDGET_ANDROID - // Because we don't provide software implementations of H264 or HEVC on - // Android, we must use the platform software decoders even if true - // hardware decoding support is missing. - switch (codecId) { - case AV_CODEC_ID_H264: - supports += gfx::gfxVars::UseH264HwDecode() - ? media::DecodeSupport::HardwareDecode - : media::DecodeSupport::SoftwareDecode; - break; - case AV_CODEC_ID_HEVC: - supports += gfx::gfxVars::UseHEVCHwDecode() - ? media::DecodeSupport::HardwareDecode - : media::DecodeSupport::SoftwareDecode; - break; - default: - supports += media::DecodeSupport::HardwareDecode; - break; - } -#else supports += media::DecodeSupport::HardwareDecode; -#endif } #ifdef XP_WIN diff --git a/dom/media/platforms/ffmpeg/FFmpegEncoderModule.cpp b/dom/media/platforms/ffmpeg/FFmpegEncoderModule.cpp @@ -30,10 +30,9 @@ namespace mozilla { template <int V> /* static */ void FFmpegEncoderModule<V>::Init(FFmpegLibWrapper* aLib) { -#if (defined(XP_WIN) || defined(MOZ_WIDGET_GTK) || \ - defined(MOZ_WIDGET_ANDROID)) && \ - defined(MOZ_USE_HWDECODE) && !defined(MOZ_FFVPX_AUDIOONLY) && \ - LIBAVCODEC_VERSION_MAJOR >= 58 +#if (defined(XP_WIN) || defined(MOZ_WIDGET_GTK) || \ + defined(MOZ_WIDGET_ANDROID)) && \ + defined(MOZ_USE_HWDECODE) && !defined(MOZ_FFVPX_AUDIOONLY) # ifdef XP_WIN if (!XRE_IsGPUProcess()) # else @@ -62,23 +61,23 @@ template <int V> # if LIBAVCODEC_VERSION_MAJOR >= 59 {AV_CODEC_ID_AV1, gfx::gfxVars::UseAV1HwEncode()}, # endif +# if LIBAVCODEC_VERSION_MAJOR >= 55 {AV_CODEC_ID_VP9, gfx::gfxVars::UseVP9HwEncode()}, -# if defined(MOZ_WIDGET_GTK) || defined(MOZ_WIDGET_ANDROID) +# endif +# if (defined(MOZ_WIDGET_GTK) || defined(MOZ_WIDGET_ANDROID)) && \ + LIBAVCODEC_VERSION_MAJOR >= 54 {AV_CODEC_ID_VP8, gfx::gfxVars::UseVP8HwEncode()}, # endif -# if defined(MOZ_WIDGET_GTK) && !defined(FFVPX_VERSION) - // These proprietary video codecs can only be encoded via hardware by - // using the system ffmpeg, not supported by ffvpx. + // These proprietary video codecs can only be encoded via hardware by using + // the system ffmpeg, not supported by ffvpx. +# if (defined(MOZ_WIDGET_GTK) && !defined(FFVPX_VERSION)) || \ + defined(MOZ_WIDGET_ANDROID) +# if LIBAVCODEC_VERSION_MAJOR >= 55 {AV_CODEC_ID_HEVC, gfx::gfxVars::UseHEVCHwEncode()}, +# endif {AV_CODEC_ID_H264, gfx::gfxVars::UseH264HwEncode()}, # endif -# if defined(MOZ_WIDGET_ANDROID) - // These proprietary codecs can only be encoded via MediaCodec encoders, - // but the underlying implementation may be software or hardware. - {AV_CODEC_ID_HEVC, true}, - {AV_CODEC_ID_H264, true}, -# endif }; // Reset the list of supported hardware codecs and reevaluate them. @@ -105,7 +104,7 @@ template <int V> ("Support %s for hw encoding", AVCodecToString(entry.mId))); } #endif // (XP_WIN || MOZ_WIDGET_GTK || MOZ_WIDGET_ANDROID) && MOZ_USE_HWDECODE - // && !MOZ_FFVPX_AUDIOONLY && LIBAVCODEC_VERSION_MAJOR >= 58 + // && !MOZ_FFVPX_AUDIOONLY } // namespace mozilla template <int V> @@ -145,11 +144,6 @@ EncodeSupportSet FFmpegEncoderModule<V>::SupportsCodec(CodecType aCodec) const { if (id == AV_CODEC_ID_NONE) { return EncodeSupportSet{}; } -#if LIBAVCODEC_VERSION_MAJOR >= 58 - if (id == AV_CODEC_ID_HEVC && !StaticPrefs::media_hevc_enabled()) { - return EncodeSupportSet{}; - } -#endif EncodeSupportSet supports; #ifdef MOZ_USE_HWDECODE if (StaticPrefs::media_ffvpx_hw_enabled()) { @@ -157,28 +151,7 @@ EncodeSupportSet FFmpegEncoderModule<V>::SupportsCodec(CodecType aCodec) const { // populated sSupportedHWCodecs. auto hwCodecs = sSupportedHWCodecs.Lock(); if (hwCodecs->Contains(static_cast<uint32_t>(id))) { -# ifdef MOZ_WIDGET_ANDROID - // Because we don't provide software implementations of H264 or HEVC on - // Android, we must use the platform software encoders even if true - // hardware encoding support is missing. - switch (id) { - case AV_CODEC_ID_H264: - supports += gfx::gfxVars::UseH264HwEncode() - ? EncodeSupport::HardwareEncode - : EncodeSupport::SoftwareEncode; - break; - case AV_CODEC_ID_HEVC: - supports += gfx::gfxVars::UseHEVCHwEncode() - ? EncodeSupport::HardwareEncode - : EncodeSupport::SoftwareEncode; - break; - default: - supports += EncodeSupport::HardwareEncode; - break; - } -# else supports += EncodeSupport::HardwareEncode; -# endif } } #endif diff --git a/dom/media/platforms/ffmpeg/FFmpegRuntimeLinker.cpp b/dom/media/platforms/ffmpeg/FFmpegRuntimeLinker.cpp @@ -26,7 +26,6 @@ class FFmpegDecoderModule { template <int V> class FFmpegEncoderModule { public: - static void Init(FFmpegLibWrapper*); static already_AddRefed<PlatformEncoderModule> Create(FFmpegLibWrapper*); }; @@ -99,40 +98,31 @@ bool FFmpegRuntimeLinker::Init() { switch (sLibAV.mVersion) { case 53: FFmpegDecoderModule<53>::Init(&sLibAV); - FFmpegEncoderModule<53>::Init(&sLibAV); break; case 54: FFmpegDecoderModule<54>::Init(&sLibAV); - FFmpegEncoderModule<54>::Init(&sLibAV); break; case 55: case 56: FFmpegDecoderModule<55>::Init(&sLibAV); - FFmpegEncoderModule<55>::Init(&sLibAV); break; case 57: FFmpegDecoderModule<57>::Init(&sLibAV); - FFmpegEncoderModule<57>::Init(&sLibAV); break; case 58: FFmpegDecoderModule<58>::Init(&sLibAV); - FFmpegEncoderModule<58>::Init(&sLibAV); break; case 59: FFmpegDecoderModule<59>::Init(&sLibAV); - FFmpegEncoderModule<59>::Init(&sLibAV); break; case 60: FFmpegDecoderModule<60>::Init(&sLibAV); - FFmpegEncoderModule<60>::Init(&sLibAV); break; case 61: FFmpegDecoderModule<61>::Init(&sLibAV); - FFmpegEncoderModule<61>::Init(&sLibAV); break; case 62: FFmpegDecoderModule<62>::Init(&sLibAV); - FFmpegEncoderModule<62>::Init(&sLibAV); break; } return true; diff --git a/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp b/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp @@ -519,34 +519,7 @@ void FFmpegVideoDecoder<LIBAV_VER>::PtsCorrectionContext::Reset() { #if defined(MOZ_USE_HWDECODE) bool FFmpegVideoDecoder<LIBAV_VER>::ShouldDisableHWDecoding( bool aDisableHardwareDecoding) const { -# ifdef MOZ_WIDGET_ANDROID -# ifdef FFVPX_VERSION - // We only support decrypt and decode with MediaCodec. - if (mCDM) { - FFMPEG_LOG("CDM requires platform decoder"); - return false; - } -# endif - switch (mCodecID) { - case AV_CODEC_ID_H264: - case AV_CODEC_ID_HEVC: - // We only support decoding H264/HEVC with MediaCodec. - FFMPEG_LOG("Codec %s requires platform decoder", - AVCodecToString(mCodecID)); - return false; - case AV_CODEC_ID_AV1: - // We only support main profile AV1 with MediaCodec. See bug 1967752. - if (!AOMDecoder::IsMainProfile(mInfo.mExtraData)) { - FFMPEG_LOG("Cannot use platfrom decoder AV1 without main profile"); - return true; - } - break; - default: - break; - } -# endif - -# if defined(MOZ_WIDGET_GTK) || defined(MOZ_WIDGET_ANDROID) +# ifdef MOZ_WIDGET_GTK bool supported = false; switch (mCodecID) { case AV_CODEC_ID_H264: @@ -568,16 +541,10 @@ bool FFmpegVideoDecoder<LIBAV_VER>::ShouldDisableHWDecoding( break; } if (!supported) { - FFMPEG_LOG("Codec %s is not accelerated", AVCodecToString(mCodecID)); - return true; - } - if (!XRE_IsRDDProcess()) { - FFMPEG_LOG("Platform decoder works in RDD process only"); + FFMPEG_LOG("Codec %s is not accelerated", mLib->avcodec_get_name(mCodecID)); return true; } -# endif -# ifdef MOZ_WIDGET_GTK bool isHardwareWebRenderUsed = mImageAllocator && (mImageAllocator->GetCompositorBackendType() == layers::LayersBackend::LAYERS_WR) && @@ -586,6 +553,15 @@ bool FFmpegVideoDecoder<LIBAV_VER>::ShouldDisableHWDecoding( FFMPEG_LOG("Hardware WebRender is off, VAAPI is disabled"); return true; } + if (!XRE_IsRDDProcess()) { + FFMPEG_LOG("VA-API works in RDD process only"); + return true; + } +# elif defined(MOZ_WIDGET_ANDROID) + // We only support decoding these with hardware on Android. + if (mCodecID == AV_CODEC_ID_H264 || mCodecID == AV_CODEC_ID_HEVC) { + return false; + } # endif return aDisableHardwareDecoding; } @@ -609,12 +585,12 @@ FFmpegVideoDecoder<LIBAV_VER>::FFmpegVideoDecoder( Maybe<TrackingId> aTrackingId, PRemoteCDMActor* aCDM) : FFmpegDataDecoder(aLib, GetCodecId(aConfig.mMimeType), aCDM), mImageAllocator(aAllocator), - mImageContainer(aImageContainer), - mInfo(aConfig), #ifdef MOZ_USE_HWDECODE mHardwareDecodingDisabled( ShouldDisableHWDecoding(aDisableHardwareDecoding)), #endif // MOZ_USE_HWDECODE + mImageContainer(aImageContainer), + mInfo(aConfig), mLowLatency(aLowLatency), mTrackingId(std::move(aTrackingId)), // Value may be changed later when codec is known after initialization. diff --git a/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.h b/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.h @@ -162,8 +162,6 @@ class FFmpegVideoDecoder<LIBAV_VER> #endif RefPtr<KnowsCompositor> mImageAllocator; - RefPtr<ImageContainer> mImageContainer; - VideoInfo mInfo; #ifdef MOZ_USE_HWDECODE public: @@ -242,6 +240,9 @@ class FFmpegVideoDecoder<LIBAV_VER> static nsTArray<AVCodecID> mAcceleratedFormats; #endif + RefPtr<ImageContainer> mImageContainer; + VideoInfo mInfo; + #if LIBAVCODEC_VERSION_MAJOR >= 58 class DecodeStats { public: diff --git a/dom/media/platforms/ffmpeg/FFmpegVideoEncoder.cpp b/dom/media/platforms/ffmpeg/FFmpegVideoEncoder.cpp @@ -317,20 +317,9 @@ bool FFmpegVideoEncoder<LIBAV_VER>::SvcEnabled() const { return mConfig.mScalabilityMode != ScalabilityMode::None; } -bool FFmpegVideoEncoder<LIBAV_VER>::ShouldTryHardware() const { -#ifdef MOZ_WIDGET_ANDROID - // On Android, the MediaCodec encoders are the only ones available to us, - // which may be implemented in hardware or software. - if (mCodecID == AV_CODEC_ID_H264 || mCodecID == AV_CODEC_ID_HEVC) { - return true; - } -#endif - return mConfig.mHardwarePreference != HardwarePreference::RequireSoftware; -} - MediaResult FFmpegVideoEncoder<LIBAV_VER>::InitEncoder() { MediaResult result(NS_ERROR_DOM_MEDIA_NOT_SUPPORTED_ERR); - if (ShouldTryHardware()) { + if (mConfig.mHardwarePreference != HardwarePreference::RequireSoftware) { result = InitEncoderInternal(/* aHardware */ true); } // TODO(aosmond): We should be checking here for RequireHardware, but we fail diff --git a/dom/media/platforms/ffmpeg/FFmpegVideoEncoder.h b/dom/media/platforms/ffmpeg/FFmpegVideoEncoder.h @@ -39,7 +39,6 @@ class FFmpegVideoEncoder<LIBAV_VER> : public FFmpegDataEncoder<LIBAV_VER> { virtual ~FFmpegVideoEncoder() = default; // Methods only called on mTaskQueue. virtual MediaResult InitEncoder() override; - bool ShouldTryHardware() const; MediaResult InitEncoderInternal(bool aHardware); #if LIBAVCODEC_VERSION_MAJOR >= 58 Result<EncodedData, MediaResult> EncodeInputWithModernAPIs( diff --git a/dom/media/platforms/ffmpeg/ffvpx/FFVPXRuntimeLinker.cpp b/dom/media/platforms/ffmpeg/ffvpx/FFVPXRuntimeLinker.cpp @@ -26,7 +26,6 @@ class FFmpegDecoderModule { template <int V> class FFmpegEncoderModule { public: - static void Init(FFmpegLibWrapper*); static already_AddRefed<PlatformEncoderModule> Create(FFmpegLibWrapper*); }; @@ -82,7 +81,6 @@ bool FFVPXRuntimeLinker::Init() { if (sLinkStatus) { if (sLinkStatus == LinkStatus_SUCCEEDED) { FFmpegDecoderModule<FFVPX_VERSION>::Init(&sFFVPXLib); - FFmpegEncoderModule<FFVPX_VERSION>::Init(&sFFVPXLib); } return sLinkStatus == LinkStatus_SUCCEEDED; } @@ -137,7 +135,6 @@ bool FFVPXRuntimeLinker::Init() { if (res == FFmpegLibWrapper::LinkResult::Success) { sLinkStatus = LinkStatus_SUCCEEDED; FFmpegDecoderModule<FFVPX_VERSION>::Init(&sFFVPXLib); - FFmpegEncoderModule<FFVPX_VERSION>::Init(&sFFVPXLib); return true; } return false; diff --git a/gfx/config/gfxVars.h b/gfx/config/gfxVars.h @@ -101,6 +101,7 @@ class MOZ_STACK_CLASS gfxVarsCollectUpdates; _(UseH264HwEncode, bool, false) \ _(UseHEVCHwDecode, bool, false) \ _(UseHEVCHwEncode, bool, false) \ + _(VP9HwDecodeIsAccelerated, bool, false) \ _(HwDecodedVideoZeroCopy, bool, false) \ _(UseWMFHWDWM, bool, false) \ _(UseDMABufSurfaceExport, bool, true) \ diff --git a/gfx/thebes/gfxAndroidPlatform.cpp b/gfx/thebes/gfxAndroidPlatform.cpp @@ -13,7 +13,6 @@ #include "mozilla/intl/LocaleService.h" #include "mozilla/intl/OSPreferences.h" #include "mozilla/java/GeckoAppShellWrappers.h" -#include "mozilla/java/HardwareCodecCapabilityUtilsWrappers.h" #include "mozilla/jni/Utils.h" #include "mozilla/layers/AndroidHardwareBuffer.h" #include "mozilla/Preferences.h" @@ -137,25 +136,6 @@ void gfxAndroidPlatform::WaitForInitializeFontAPI() { } } -// static -bool gfxAndroidPlatform::IsHwCodecSupported(media::MediaCodec aCodec, - bool aEncoder) { - switch (aCodec) { - case media::MediaCodec::H264: - return java::HardwareCodecCapabilityUtils::HasHWH264(aEncoder); - case media::MediaCodec::VP8: - return java::HardwareCodecCapabilityUtils::HasHWVP8(aEncoder); - case media::MediaCodec::VP9: - return java::HardwareCodecCapabilityUtils::HasHWVP9(aEncoder); - case media::MediaCodec::AV1: - return java::HardwareCodecCapabilityUtils::HasHWAV1(aEncoder); - case media::MediaCodec::HEVC: - return java::HardwareCodecCapabilityUtils::HasHWHEVC(aEncoder); - default: - return false; - } -} - gfxAndroidPlatform::gfxAndroidPlatform() { // A custom allocator. It counts allocations, enabling memory reporting. sFreetypeMemoryRecord.user = nullptr; diff --git a/gfx/thebes/gfxAndroidPlatform.h b/gfx/thebes/gfxAndroidPlatform.h @@ -10,7 +10,6 @@ #include "gfxUserFontSet.h" #include "nsCOMPtr.h" #include "nsTArray.h" -#include "MediaCodecsSupport.h" class gfxAndroidPlatform final : public gfxPlatform { public: @@ -51,9 +50,6 @@ class gfxAndroidPlatform final : public gfxPlatform { static bool IsFontAPIDisabled(bool aDontCheckPref = false); - static bool IsHwCodecSupported(mozilla::media::MediaCodec aCodec, - bool aEncoder); - protected: void InitAcceleration() override; diff --git a/gfx/thebes/gfxPlatform.cpp b/gfx/thebes/gfxPlatform.cpp @@ -3054,23 +3054,12 @@ void gfxPlatform::InitHardwareVideoConfig() { gfxVars::SetCanUseHardwareVideoDecoding(featureDec.IsEnabled()); gfxVars::SetCanUseHardwareVideoEncoding(featureEnc.IsEnabled()); -#ifdef MOZ_WIDGET_ANDROID -# define CODEC_HW_FEATURE_SETUP_PLATFORM(name, type, encoder) \ - feature##type##name.SetDefault(gfxAndroidPlatform::IsHwCodecSupported( \ - media::MediaCodec::name, encoder), \ - FeatureStatus::Unavailable, \ - "Hardware codec not available"); -#else -# define CODEC_HW_FEATURE_SETUP_PLATFORM(name, type, encoder) \ - feature##type##name.EnableByDefault(); -#endif - #define CODEC_HW_FEATURE_SETUP(name) \ FeatureState& featureDec##name = \ gfxConfig::GetFeature(Feature::name##_HW_DECODE); \ featureDec##name.Reset(); \ if (featureDec.IsEnabled()) { \ - CODEC_HW_FEATURE_SETUP_PLATFORM(name, Dec, false) \ + featureDec##name.EnableByDefault(); \ if (!IsGfxInfoStatusOkay(nsIGfxInfo::FEATURE_##name##_HW_DECODE, &message, \ failureId)) { \ featureDec##name.Disable(FeatureStatus::Blocklisted, message.get(), \ @@ -3082,7 +3071,7 @@ void gfxPlatform::InitHardwareVideoConfig() { gfxConfig::GetFeature(Feature::name##_HW_ENCODE); \ featureEnc##name.Reset(); \ if (featureEnc.IsEnabled()) { \ - CODEC_HW_FEATURE_SETUP_PLATFORM(name, Enc, true) \ + featureEnc##name.EnableByDefault(); \ if (!IsGfxInfoStatusOkay(nsIGfxInfo::FEATURE_##name##_HW_ENCODE, &message, \ failureId)) { \ featureEnc##name.Disable(FeatureStatus::Blocklisted, message.get(), \ @@ -3101,7 +3090,11 @@ void gfxPlatform::InitHardwareVideoConfig() { CODEC_HW_FEATURE_SETUP(HEVC) #endif -#undef CODEC_HW_FEATURE_SETUP_PLATFORM +#ifdef MOZ_WIDGET_ANDROID + gfxVars::SetVP9HwDecodeIsAccelerated( + java::HardwareCodecCapabilityUtils::HasHWVP9(false /* aIsEncoder */)); +#endif + #undef CODEC_HW_FEATURE_SETUP } diff --git a/media/ffvpx/config_components_audio_only.h b/media/ffvpx/config_components_audio_only.h @@ -607,7 +607,6 @@ #define CONFIG_APNG_ENCODER 0 #define CONFIG_ASV1_ENCODER 0 #define CONFIG_ASV2_ENCODER 0 -#define CONFIG_AV1_MEDIACODEC_ENCODER 0 #define CONFIG_AVRP_ENCODER 0 #define CONFIG_AVUI_ENCODER 0 #define CONFIG_AYUV_ENCODER 0 @@ -814,7 +813,6 @@ #define CONFIG_H263_V4L2M2M_ENCODER 0 #define CONFIG_LIBOPENH264_ENCODER 0 #define CONFIG_H264_AMF_ENCODER 0 -#define CONFIG_H264_MEDIACODEC_ENCODER 0 #define CONFIG_H264_MF_ENCODER 0 #define CONFIG_H264_NVENC_ENCODER 0 #define CONFIG_H264_OMX_ENCODER 0 @@ -823,7 +821,6 @@ #define CONFIG_H264_VAAPI_ENCODER 0 #define CONFIG_H264_VIDEOTOOLBOX_ENCODER 0 #define CONFIG_HEVC_AMF_ENCODER 0 -#define CONFIG_HEVC_MEDIACODEC_ENCODER 0 #define CONFIG_HEVC_MF_ENCODER 0 #define CONFIG_HEVC_NVENC_ENCODER 0 #define CONFIG_HEVC_QSV_ENCODER 0 @@ -837,13 +834,10 @@ #define CONFIG_MPEG2_QSV_ENCODER 0 #define CONFIG_MPEG2_VAAPI_ENCODER 0 #define CONFIG_MPEG4_OMX_ENCODER 0 -#define CONFIG_MPEG4_MEDIACODEC_ENCODER 0 #define CONFIG_MPEG4_V4L2M2M_ENCODER 0 #define CONFIG_PRORES_VIDEOTOOLBOX_ENCODER 0 -#define CONFIG_VP8_MEDIACODEC_ENCODER 0 #define CONFIG_VP8_V4L2M2M_ENCODER 0 #define CONFIG_VP8_VAAPI_ENCODER 0 -#define CONFIG_VP9_MEDIACODEC_ENCODER 0 #define CONFIG_VP9_VAAPI_ENCODER 0 #define CONFIG_VP9_QSV_ENCODER 0 #define CONFIG_AV1_D3D11VA_HWACCEL 0 diff --git a/media/ffvpx/config_components_audio_video.h b/media/ffvpx/config_components_audio_video.h @@ -660,7 +660,6 @@ #define CONFIG_MPEG1VIDEO_ENCODER 0 #define CONFIG_MPEG2VIDEO_ENCODER 0 #define CONFIG_MPEG4_ENCODER 0 -#define CONFIG_MPEG4_MEDIACODEC_ENCODER 0 #define CONFIG_MSMPEG4V2_ENCODER 0 #define CONFIG_MSMPEG4V3_ENCODER 0 #define CONFIG_MSVIDEO1_ENCODER 0 @@ -835,7 +834,6 @@ #define CONFIG_AAC_MF_ENCODER 0 #define CONFIG_AC3_MF_ENCODER 0 #define CONFIG_H263_V4L2M2M_ENCODER 0 -#define CONFIG_AV1_MEDIACODEC_ENCODER 0 #define CONFIG_AV1_NVENC_ENCODER 0 #define CONFIG_AV1_QSV_ENCODER 0 #define CONFIG_AV1_AMF_ENCODER 0 @@ -865,10 +863,8 @@ #define CONFIG_MPEG4_OMX_ENCODER 0 #define CONFIG_MPEG4_V4L2M2M_ENCODER 0 #define CONFIG_PRORES_VIDEOTOOLBOX_ENCODER 0 -#define CONFIG_VP8_MEDIACODEC_ENCODER 0 #define CONFIG_VP8_V4L2M2M_ENCODER 0 #define CONFIG_VP8_VAAPI_ENCODER 0 -#define CONFIG_VP9_MEDIACODEC_ENCODER 0 #define CONFIG_VP9_VAAPI_ENCODER 0 #define CONFIG_VP9_QSV_ENCODER 0 #define CONFIG_VNULL_ENCODER 0 diff --git a/media/ffvpx/config_override.h b/media/ffvpx/config_override.h @@ -76,10 +76,8 @@ #undef CONFIG_VP9_MEDIACODEC_DECODER #undef CONFIG_AV1_MEDIACODEC_DECODER #undef CONFIG_H264_MEDIACODEC_ENCODER -#undef CONFIG_HEVC_MEDIACODEC_ENCODER #undef CONFIG_VP8_MEDIACODEC_ENCODER #undef CONFIG_VP9_MEDIACODEC_ENCODER -#undef CONFIG_AV1_MEDIACODEC_ENCODER #if defined (MOZ_WIDGET_ANDROID) && !defined(MOZ_FFVPX_AUDIOONLY) #define CONFIG_H264_MEDIACODEC_DECODER 1 @@ -88,10 +86,8 @@ #define CONFIG_VP9_MEDIACODEC_DECODER 1 #define CONFIG_AV1_MEDIACODEC_DECODER 1 #define CONFIG_H264_MEDIACODEC_ENCODER 1 - #define CONFIG_HEVC_MEDIACODEC_ENCODER 1 #define CONFIG_VP8_MEDIACODEC_ENCODER 1 #define CONFIG_VP9_MEDIACODEC_ENCODER 1 - #define CONFIG_AV1_MEDIACODEC_ENCODER 1 #else #define CONFIG_H264_MEDIACODEC_DECODER 0 #define CONFIG_HEVC_MEDIACODEC_DECODER 0 @@ -99,10 +95,8 @@ #define CONFIG_VP9_MEDIACODEC_DECODER 0 #define CONFIG_AV1_MEDIACODEC_DECODER 0 #define CONFIG_H264_MEDIACODEC_ENCODER 0 - #define CONFIG_HEVC_MEDIACODEC_ENCODER 0 #define CONFIG_VP8_MEDIACODEC_ENCODER 0 #define CONFIG_VP9_MEDIACODEC_ENCODER 0 - #define CONFIG_AV1_MEDIACODEC_ENCODER 0 #endif #define CONFIG_H264_MEDIACODEC_DECODER_EXTRADATA 0 diff --git a/media/ffvpx/libavcodec/codec_list.c b/media/ffvpx/libavcodec/codec_list.c @@ -83,19 +83,4 @@ static const FFCodec * const codec_list[] = { #if CONFIG_HEVC_MEDIACODEC_DECODER &ff_hevc_mediacodec_decoder, #endif -#if CONFIG_AV1_MEDIACODEC_ENCODER - &ff_av1_mediacodec_encoder, -#endif -#if CONFIG_VP8_MEDIACODEC_ENCODER - &ff_vp8_mediacodec_encoder, -#endif -#if CONFIG_VP9_MEDIACODEC_ENCODER - &ff_vp9_mediacodec_encoder, -#endif -#if CONFIG_H264_MEDIACODEC_ENCODER - &ff_h264_mediacodec_encoder, -#endif -#if CONFIG_HEVC_MEDIACODEC_ENCODER - &ff_hevc_mediacodec_encoder, -#endif NULL }; diff --git a/mobile/android/geckoview/src/main/java/org/mozilla/gecko/util/HardwareCodecCapabilityUtils.java b/mobile/android/geckoview/src/main/java/org/mozilla/gecko/util/HardwareCodecCapabilityUtils.java @@ -41,8 +41,8 @@ public final class HardwareCodecCapabilityUtils { "OMX.rk." }; private static final String VP9_MIME_TYPE = "video/x-vnd.on2.vp9"; - // List of supported HW AV1/HEVC/H.264 codecs. - private static final String[] supportedGenericHwCodecPrefixes = { + // List of supported HW H.264 codecs. + private static final String[] supportedH264HwCodecPrefixes = { "OMX.qcom.", "OMX.Intel.", "OMX.Exynos.", @@ -303,10 +303,8 @@ public final class HardwareCodecCapabilityUtils { // Check if MIME type string has HW prefix (encode or decode, VP8, VP9, and H264) private static String[] getSupportedHWCodecPrefixes( final String aMimeType, final boolean aIsEncoder) { - if (aMimeType.equals(H264_MIME_TYPE) - || aMimeType.equals(HEVC_MIME_TYPE) - || aMimeType.equals(AV1_MIME_TYPE)) { - return supportedGenericHwCodecPrefixes; + if (aMimeType.equals(H264_MIME_TYPE)) { + return supportedH264HwCodecPrefixes; } if (aMimeType.equals(VP9_MIME_TYPE)) { return supportedVp9HwCodecPrefixes; @@ -320,9 +318,7 @@ public final class HardwareCodecCapabilityUtils { // Return list of HW codec prefixes (encode or decode, VP8, VP9, and H264) private static String[] getAllSupportedHWCodecPrefixes(final boolean aIsEncoder) { final Set<String> prefixes = new HashSet<>(); - final String[] mimeTypes = { - H264_MIME_TYPE, HEVC_MIME_TYPE, AV1_MIME_TYPE, VP8_MIME_TYPE, VP9_MIME_TYPE - }; + final String[] mimeTypes = {H264_MIME_TYPE, VP8_MIME_TYPE, VP9_MIME_TYPE}; for (final String mt : mimeTypes) { prefixes.addAll(Arrays.asList(getSupportedHWCodecPrefixes(mt, aIsEncoder))); } @@ -340,16 +336,6 @@ public final class HardwareCodecCapabilityUtils { } @WrapForJNI - public static boolean hasHWAV1(final boolean aIsEncoder) { - return getHWCodecCapability(AV1_MIME_TYPE, aIsEncoder); - } - - @WrapForJNI - public static boolean hasHWHEVC(final boolean aIsEncoder) { - return getHWCodecCapability(HEVC_MIME_TYPE, aIsEncoder); - } - - @WrapForJNI public static boolean hasHWH264(final boolean aIsEncoder) { return getHWCodecCapability(H264_MIME_TYPE, aIsEncoder); } diff --git a/testing/web-platform/meta/webcodecs/video-encoder-h26x-annexb.https.any.js.ini b/testing/web-platform/meta/webcodecs/video-encoder-h26x-annexb.https.any.js.ini @@ -16,9 +16,7 @@ disabled: if (os == "android") or (version == "Ubuntu 18.04"): not implemented [Verify stream compliance h26x annexb] - expected: - if os == "linux": PASS - PRECONDITION_FAILED + expected: PRECONDITION_FAILED [video-encoder-h26x-annexb.https.any.html?h265_annexb_hardware] @@ -30,9 +28,7 @@ [video-encoder-h26x-annexb.https.any.worker.html?h265_annexb_software] [Verify stream compliance h26x annexb] - expected: - if os == "linux": PASS - PRECONDITION_FAILED + expected: PRECONDITION_FAILED [video-encoder-h26x-annexb.https.any.worker.html?h265_annexb_hardware]