/* -*- 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/. */ #include "GMPDecoderModule.h" #ifdef MOZ_AV1 # include "AOMDecoder.h" #endif #include "DecoderDoctorDiagnostics.h" #include "GMPService.h" #include "GMPUtils.h" #include "GMPVideoDecoder.h" #include "MP4Decoder.h" #include "MediaDataDecoderProxy.h" #include "VPXDecoder.h" #include "VideoUtils.h" #include "gmp-video-decode.h" #include "mozilla/StaticMutex.h" #include "nsServiceManagerUtils.h" #ifdef XP_WIN # include "WMFDecoderModule.h" #endif namespace mozilla { static already_AddRefed CreateDecoderWrapper( GMPVideoDecoderParams&& aParams) { RefPtr s( gmp::GeckoMediaPluginService::GetGeckoMediaPluginService()); if (!s) { return nullptr; } nsCOMPtr thread(s->GetGMPThread()); if (!thread) { return nullptr; } RefPtr decoder(new MediaDataDecoderProxy( do_AddRef(new GMPVideoDecoder(std::move(aParams))), thread.forget())); return decoder.forget(); } already_AddRefed GMPDecoderModule::CreateVideoDecoder( const CreateDecoderParams& aParams) { if (!MP4Decoder::IsH264(aParams.mConfig.mMimeType) && #ifdef MOZ_AV1 !AOMDecoder::IsAV1(aParams.mConfig.mMimeType) && #endif !VPXDecoder::IsVP8(aParams.mConfig.mMimeType) && !VPXDecoder::IsVP9(aParams.mConfig.mMimeType)) { return nullptr; } return CreateDecoderWrapper(GMPVideoDecoderParams(aParams)); } already_AddRefed GMPDecoderModule::CreateAudioDecoder( const CreateDecoderParams& aParams) { return nullptr; } /* static */ media::DecodeSupportSet GMPDecoderModule::SupportsMimeType( const nsACString& aMimeType, const nsACString& aApi, const Maybe& aKeySystem) { AutoTArray tags; if (MP4Decoder::IsH264(aMimeType)) { tags.AppendElement("h264"_ns); #ifdef MOZ_AV1 } else if (AOMDecoder::IsAV1(aMimeType)) { tags.AppendElement("av1"_ns); #endif } else if (VPXDecoder::IsVP9(aMimeType)) { tags.AppendElement("vp9"_ns); } else if (VPXDecoder::IsVP8(aMimeType)) { tags.AppendElement("vp8"_ns); } else { return media::DecodeSupportSet{}; } // Optional tag for EME GMP plugins. if (aKeySystem) { tags.AppendElement(*aKeySystem); } // GMP plugins are always software based. return HaveGMPFor(aApi, tags) ? media::DecodeSupport::SoftwareDecode : media::DecodeSupportSet{}; } media::DecodeSupportSet GMPDecoderModule::SupportsMimeType( const nsACString& aMimeType, DecoderDoctorDiagnostics* aDiagnostics) const { return SupportsMimeType(aMimeType, "decode-video"_ns, Nothing()); } /* static */ already_AddRefed GMPDecoderModule::Create() { return MakeAndAddRef(); } } // namespace mozilla