diff options
Diffstat (limited to 'dom/media/platforms/ffmpeg/FFmpegDecoderModule.h')
-rw-r--r-- | dom/media/platforms/ffmpeg/FFmpegDecoderModule.h | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/dom/media/platforms/ffmpeg/FFmpegDecoderModule.h b/dom/media/platforms/ffmpeg/FFmpegDecoderModule.h new file mode 100644 index 0000000000..3b1a5b673a --- /dev/null +++ b/dom/media/platforms/ffmpeg/FFmpegDecoderModule.h @@ -0,0 +1,129 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim:set ts=2 sw=2 sts=2 et cindent: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef __FFmpegDecoderModule_h__ +#define __FFmpegDecoderModule_h__ + +#include "FFmpegAudioDecoder.h" +#include "FFmpegLibWrapper.h" +#include "FFmpegVideoDecoder.h" +#include "PlatformDecoderModule.h" +#include "VideoUtils.h" +#include "VPXDecoder.h" +#include "mozilla/StaticPrefs_media.h" + +namespace mozilla { + +template <int V> +class FFmpegDecoderModule : public PlatformDecoderModule { + public: + static already_AddRefed<PlatformDecoderModule> Create( + FFmpegLibWrapper* aLib) { + RefPtr<PlatformDecoderModule> pdm = new FFmpegDecoderModule(aLib); + + return pdm.forget(); + } + + explicit FFmpegDecoderModule(FFmpegLibWrapper* aLib) : mLib(aLib) {} + virtual ~FFmpegDecoderModule() = default; + + already_AddRefed<MediaDataDecoder> CreateVideoDecoder( + const CreateDecoderParams& aParams) override { + if (Supports(SupportDecoderParams(aParams), nullptr) == + media::DecodeSupport::Unsupported) { + return nullptr; + } + RefPtr<MediaDataDecoder> decoder = new FFmpegVideoDecoder<V>( + mLib, aParams.VideoConfig(), aParams.mKnowsCompositor, + aParams.mImageContainer, + aParams.mOptions.contains(CreateDecoderParams::Option::LowLatency), + aParams.mOptions.contains( + CreateDecoderParams::Option::HardwareDecoderNotAllowed), + aParams.mTrackingId); + return decoder.forget(); + } + + already_AddRefed<MediaDataDecoder> CreateAudioDecoder( + const CreateDecoderParams& aParams) override { + if (Supports(SupportDecoderParams(aParams), nullptr) == + media::DecodeSupport::Unsupported) { + return nullptr; + } + RefPtr<MediaDataDecoder> decoder = + new FFmpegAudioDecoder<V>(mLib, aParams.AudioConfig()); + return decoder.forget(); + } + + media::DecodeSupportSet SupportsMimeType( + const nsACString& aMimeType, + DecoderDoctorDiagnostics* aDiagnostics) const override { + UniquePtr<TrackInfo> trackInfo = CreateTrackInfoWithMIMEType(aMimeType); + if (!trackInfo) { + return media::DecodeSupport::Unsupported; + } + return Supports(SupportDecoderParams(*trackInfo), aDiagnostics); + } + + media::DecodeSupportSet Supports( + const SupportDecoderParams& aParams, + DecoderDoctorDiagnostics* aDiagnostics) const override { + // This should only be supported by MFMediaEngineDecoderModule. + if (aParams.mMediaEngineId) { + return media::DecodeSupport::Unsupported; + } + + const auto& trackInfo = aParams.mConfig; + const nsACString& mimeType = trackInfo.mMimeType; + + // Temporary - forces use of VPXDecoder when alpha is present. + // Bug 1263836 will handle alpha scenario once implemented. It will shift + // the check for alpha to PDMFactory but not itself remove the need for a + // check. + if (VPXDecoder::IsVPX(mimeType) && trackInfo.GetAsVideoInfo()->HasAlpha()) { + MOZ_LOG(sPDMLog, LogLevel::Debug, + ("FFmpeg decoder rejects requested type '%s'", + mimeType.BeginReading())); + return media::DecodeSupport::Unsupported; + } + + AVCodecID videoCodec = FFmpegVideoDecoder<V>::GetCodecId(mimeType); + AVCodecID audioCodec = FFmpegAudioDecoder<V>::GetCodecId(mimeType); + if (audioCodec == AV_CODEC_ID_NONE && videoCodec == AV_CODEC_ID_NONE) { + MOZ_LOG(sPDMLog, LogLevel::Debug, + ("FFmpeg decoder rejects requested type '%s'", + mimeType.BeginReading())); + return media::DecodeSupport::Unsupported; + } + AVCodecID codec = audioCodec != AV_CODEC_ID_NONE ? audioCodec : videoCodec; + bool supports = !!FFmpegDataDecoder<V>::FindAVCodec(mLib, codec); + MOZ_LOG(sPDMLog, LogLevel::Debug, + ("FFmpeg decoder %s requested type '%s'", + supports ? "supports" : "rejects", mimeType.BeginReading())); + if (supports) { + // TODO: Note that we do not yet distinguish between SW/HW decode support. + // Will be done in bug 1754239. + return media::DecodeSupport::SoftwareDecode; + } + return media::DecodeSupport::Unsupported; + } + + protected: + bool SupportsColorDepth( + gfx::ColorDepth aColorDepth, + DecoderDoctorDiagnostics* aDiagnostics) const override { +#if defined(MOZ_WIDGET_ANDROID) + return aColorDepth == gfx::ColorDepth::COLOR_8; +#endif + return true; + } + + private: + FFmpegLibWrapper* mLib; +}; + +} // namespace mozilla + +#endif // __FFmpegDecoderModule_h__ |