// Copyright 1998-2017 Epic Games, Inc. All Rights Reserved. #include "Containers/Array.h" #include "Containers/UnrealString.h" #include "IMediaPlayerFactory.h" #include "IMediaModule.h" #include "IMediaOptions.h" #include "Internationalization/Internationalization.h" #include "Misc/Paths.h" #include "Modules/ModuleInterface.h" #include "Modules/ModuleManager.h" #include "UObject/Class.h" #include "UObject/NameTypes.h" #include "UObject/UObjectGlobals.h" #include "UObject/WeakObjectPtr.h" #if WITH_EDITOR #include "ISettingsModule.h" #include "ISettingsSection.h" #include "VlcMediaSettings.h" #endif #include "../../VlcMedia/Public/IVlcMediaModule.h" #define LOCTEXT_NAMESPACE "FVlcMediaFactoryModule" /** * Implements the VlcMediaFactory module. */ class FVlcMediaFactoryModule : public IMediaPlayerFactory , public IModuleInterface { public: //~ IMediaPlayerFactory interface virtual bool CanPlayUrl(const FString& Url, const IMediaOptions* Options, TArray* OutWarnings, TArray* OutErrors) const override { FString Scheme; FString Location; // check scheme if (!Url.Split(TEXT("://"), &Scheme, &Location, ESearchCase::CaseSensitive)) { if (OutErrors != nullptr) { OutErrors->Add(LOCTEXT("NoSchemeFound", "No URI scheme found")); } return false; } if (!SupportedUriSchemes.Contains(Scheme)) { if (OutErrors != nullptr) { OutErrors->Add(FText::Format(LOCTEXT("SchemeNotSupported", "The URI scheme '{0}' is not supported"), FText::FromString(Scheme))); } return false; } // check file extension if (Scheme == TEXT("file")) { const FString Extension = FPaths::GetExtension(Location, false); if (!SupportedFileExtensions.Contains(Extension)) { if (OutErrors != nullptr) { OutErrors->Add(FText::Format(LOCTEXT("ExtensionNotSupported", "The file extension '{0}' is not supported"), FText::FromString(Extension))); } return false; } } // check options if ((OutWarnings != nullptr) && (Options != nullptr)) { if (Options->GetMediaOption("PrecacheFile", false) && (Scheme != TEXT("file"))) { OutWarnings->Add(LOCTEXT("PrecacheFileWarning", "Precaching is supported for local files only")); } } return true; } virtual TSharedPtr CreatePlayer(IMediaEventSink& EventSink) override { auto VlcMediaModule = FModuleManager::LoadModulePtr("VlcMedia"); return (VlcMediaModule != nullptr) ? VlcMediaModule->CreatePlayer(EventSink) : nullptr; } virtual FText GetDisplayName() const override { return LOCTEXT("MediaPlayerDisplayName", "VideoLAN Player"); } virtual FName GetPlayerName() const override { static FName PlayerName(TEXT("VlcMedia")); return PlayerName; } virtual const TArray& GetSupportedPlatforms() const override { return SupportedPlatforms; } virtual bool SupportsFeature(EMediaFeature Feature) const override { return ((Feature == EMediaFeature::AudioSamples) || (Feature == EMediaFeature::AudioTracks) || (Feature == EMediaFeature::CaptionTracks) || (Feature == EMediaFeature::Video360) || (Feature == EMediaFeature::VideoSamples) || (Feature == EMediaFeature::VideoTracks)); } public: //~ IModuleInterface interface virtual void StartupModule() override { // supported file extensions SupportedFileExtensions.Add(TEXT("3g2")); SupportedFileExtensions.Add(TEXT("3ga")); SupportedFileExtensions.Add(TEXT("3gp")); SupportedFileExtensions.Add(TEXT("3gp2")); SupportedFileExtensions.Add(TEXT("3gpp")); SupportedFileExtensions.Add(TEXT("669")); SupportedFileExtensions.Add(TEXT("a52")); SupportedFileExtensions.Add(TEXT("aac")); SupportedFileExtensions.Add(TEXT("ac3")); SupportedFileExtensions.Add(TEXT("adt")); SupportedFileExtensions.Add(TEXT("adts")); SupportedFileExtensions.Add(TEXT("aif")); SupportedFileExtensions.Add(TEXT("aifc")); SupportedFileExtensions.Add(TEXT("aiff")); SupportedFileExtensions.Add(TEXT("amb")); SupportedFileExtensions.Add(TEXT("amr")); SupportedFileExtensions.Add(TEXT("amv")); SupportedFileExtensions.Add(TEXT("aob")); SupportedFileExtensions.Add(TEXT("ape")); SupportedFileExtensions.Add(TEXT("asf")); SupportedFileExtensions.Add(TEXT("au")); SupportedFileExtensions.Add(TEXT("avi")); SupportedFileExtensions.Add(TEXT("awb")); SupportedFileExtensions.Add(TEXT("bik")); SupportedFileExtensions.Add(TEXT("bin")); SupportedFileExtensions.Add(TEXT("caf")); SupportedFileExtensions.Add(TEXT("crf")); SupportedFileExtensions.Add(TEXT("divx")); SupportedFileExtensions.Add(TEXT("drc")); SupportedFileExtensions.Add(TEXT("dts")); SupportedFileExtensions.Add(TEXT("dv")); SupportedFileExtensions.Add(TEXT("evo")); SupportedFileExtensions.Add(TEXT("f4v")); SupportedFileExtensions.Add(TEXT("flac")); SupportedFileExtensions.Add(TEXT("flv")); SupportedFileExtensions.Add(TEXT("gvi")); SupportedFileExtensions.Add(TEXT("gxf")); SupportedFileExtensions.Add(TEXT("iso")); SupportedFileExtensions.Add(TEXT("it")); SupportedFileExtensions.Add(TEXT("kar")); SupportedFileExtensions.Add(TEXT("m1v")); SupportedFileExtensions.Add(TEXT("m2t")); SupportedFileExtensions.Add(TEXT("m2ts")); SupportedFileExtensions.Add(TEXT("m2v")); SupportedFileExtensions.Add(TEXT("m4a")); SupportedFileExtensions.Add(TEXT("m4b")); SupportedFileExtensions.Add(TEXT("m4p")); SupportedFileExtensions.Add(TEXT("m4v")); SupportedFileExtensions.Add(TEXT("m5p")); SupportedFileExtensions.Add(TEXT("mid")); SupportedFileExtensions.Add(TEXT("mka")); SupportedFileExtensions.Add(TEXT("mkv")); SupportedFileExtensions.Add(TEXT("mlp")); SupportedFileExtensions.Add(TEXT("mod")); SupportedFileExtensions.Add(TEXT("mov")); SupportedFileExtensions.Add(TEXT("mp1")); SupportedFileExtensions.Add(TEXT("mp2")); SupportedFileExtensions.Add(TEXT("mp2v")); SupportedFileExtensions.Add(TEXT("mp3")); SupportedFileExtensions.Add(TEXT("mp4")); SupportedFileExtensions.Add(TEXT("mp4v")); SupportedFileExtensions.Add(TEXT("mpa")); SupportedFileExtensions.Add(TEXT("mpc")); SupportedFileExtensions.Add(TEXT("mpe")); SupportedFileExtensions.Add(TEXT("mpeg")); SupportedFileExtensions.Add(TEXT("mpeg1")); SupportedFileExtensions.Add(TEXT("mpeg2")); SupportedFileExtensions.Add(TEXT("mpeg4")); SupportedFileExtensions.Add(TEXT("mpg")); SupportedFileExtensions.Add(TEXT("mpga")); SupportedFileExtensions.Add(TEXT("mpv2")); SupportedFileExtensions.Add(TEXT("mts")); SupportedFileExtensions.Add(TEXT("mtv")); SupportedFileExtensions.Add(TEXT("mus")); SupportedFileExtensions.Add(TEXT("mxf")); SupportedFileExtensions.Add(TEXT("mxg")); SupportedFileExtensions.Add(TEXT("nsc")); SupportedFileExtensions.Add(TEXT("nsv")); SupportedFileExtensions.Add(TEXT("nut")); SupportedFileExtensions.Add(TEXT("nuv")); SupportedFileExtensions.Add(TEXT("oga")); SupportedFileExtensions.Add(TEXT("ogg")); SupportedFileExtensions.Add(TEXT("ogm")); SupportedFileExtensions.Add(TEXT("ogv")); SupportedFileExtensions.Add(TEXT("ogx")); SupportedFileExtensions.Add(TEXT("oma")); SupportedFileExtensions.Add(TEXT("opus")); SupportedFileExtensions.Add(TEXT("qcp")); SupportedFileExtensions.Add(TEXT("ps")); SupportedFileExtensions.Add(TEXT("ra")); SupportedFileExtensions.Add(TEXT("ram")); SupportedFileExtensions.Add(TEXT("rec")); SupportedFileExtensions.Add(TEXT("rm")); SupportedFileExtensions.Add(TEXT("rmi")); SupportedFileExtensions.Add(TEXT("rmvb")); SupportedFileExtensions.Add(TEXT("rpl")); SupportedFileExtensions.Add(TEXT("rv")); SupportedFileExtensions.Add(TEXT("s3m")); SupportedFileExtensions.Add(TEXT("sdp")); SupportedFileExtensions.Add(TEXT("sid")); SupportedFileExtensions.Add(TEXT("spx")); SupportedFileExtensions.Add(TEXT("ts")); SupportedFileExtensions.Add(TEXT("tak")); SupportedFileExtensions.Add(TEXT("thd")); SupportedFileExtensions.Add(TEXT("thp")); SupportedFileExtensions.Add(TEXT("tod")); SupportedFileExtensions.Add(TEXT("tta")); SupportedFileExtensions.Add(TEXT("rp")); SupportedFileExtensions.Add(TEXT("rs")); SupportedFileExtensions.Add(TEXT("tta")); SupportedFileExtensions.Add(TEXT("tts")); SupportedFileExtensions.Add(TEXT("txd")); SupportedFileExtensions.Add(TEXT("ty")); SupportedFileExtensions.Add(TEXT("vid")); SupportedFileExtensions.Add(TEXT("vob")); SupportedFileExtensions.Add(TEXT("voc")); SupportedFileExtensions.Add(TEXT("vqf")); SupportedFileExtensions.Add(TEXT("vro")); SupportedFileExtensions.Add(TEXT("w64")); SupportedFileExtensions.Add(TEXT("wav")); SupportedFileExtensions.Add(TEXT("webm")); SupportedFileExtensions.Add(TEXT("wm")); SupportedFileExtensions.Add(TEXT("wma")); SupportedFileExtensions.Add(TEXT("wmv")); SupportedFileExtensions.Add(TEXT("wtv")); SupportedFileExtensions.Add(TEXT("wv")); SupportedFileExtensions.Add(TEXT("xa")); SupportedFileExtensions.Add(TEXT("xesc")); SupportedFileExtensions.Add(TEXT("xm")); // supported platforms SupportedPlatforms.Add(TEXT("Linux")); SupportedPlatforms.Add(TEXT("Mac")); SupportedPlatforms.Add(TEXT("Windows")); SupportedPlatforms.Add(TEXT("WinRT")); // supported schemes SupportedUriSchemes.Add(TEXT("cdda")); SupportedUriSchemes.Add(TEXT("dccp")); SupportedUriSchemes.Add(TEXT("dshow")); SupportedUriSchemes.Add(TEXT("dvd")); SupportedUriSchemes.Add(TEXT("file")); SupportedUriSchemes.Add(TEXT("dvd")); SupportedUriSchemes.Add(TEXT("ftp")); SupportedUriSchemes.Add(TEXT("http")); SupportedUriSchemes.Add(TEXT("https")); SupportedUriSchemes.Add(TEXT("icyx")); SupportedUriSchemes.Add(TEXT("itpc")); SupportedUriSchemes.Add(TEXT("mms")); SupportedUriSchemes.Add(TEXT("mmsh")); SupportedUriSchemes.Add(TEXT("mmst")); SupportedUriSchemes.Add(TEXT("mmsu")); SupportedUriSchemes.Add(TEXT("mtp")); SupportedUriSchemes.Add(TEXT("pnm")); SupportedUriSchemes.Add(TEXT("realrtsp")); SupportedUriSchemes.Add(TEXT("rtmp")); SupportedUriSchemes.Add(TEXT("rtp")); SupportedUriSchemes.Add(TEXT("rtsp")); SupportedUriSchemes.Add(TEXT("sap")); SupportedUriSchemes.Add(TEXT("smb")); SupportedUriSchemes.Add(TEXT("screen")); SupportedUriSchemes.Add(TEXT("unsv")); SupportedUriSchemes.Add(TEXT("v4l2")); SupportedUriSchemes.Add(TEXT("vcd")); #if WITH_EDITOR // register settings ISettingsModule* SettingsModule = FModuleManager::GetModulePtr("Settings"); if (SettingsModule != nullptr) { ISettingsSectionPtr SettingsSection = SettingsModule->RegisterSettings("Project", "Plugins", "VlcMedia", LOCTEXT("VlcMediaSettingsName", "VLC Media"), LOCTEXT("VlcMediaSettingsDescription", "Configure the VLC Media plug-in."), GetMutableDefault() ); } #endif //WITH_EDITOR // register player factory auto MediaModule = FModuleManager::LoadModulePtr("Media"); if (MediaModule != nullptr) { MediaModule->RegisterPlayerFactory(*this); } } virtual void ShutdownModule() override { // unregister player factory auto MediaModule = FModuleManager::GetModulePtr("Media"); if (MediaModule != nullptr) { MediaModule->UnregisterPlayerFactory(*this); } #if WITH_EDITOR // unregister settings ISettingsModule* SettingsModule = FModuleManager::GetModulePtr("Settings"); if (SettingsModule != nullptr) { SettingsModule->UnregisterSettings("Project", "Plugins", "VlcMedia"); } #endif //WITH_EDITOR } private: /** List of supported media file types. */ TArray SupportedFileExtensions; /** List of platforms that the media player support. */ TArray SupportedPlatforms; /** List of supported URI schemes. */ TArray SupportedUriSchemes; }; #undef LOCTEXT_NAMESPACE IMPLEMENT_MODULE(FVlcMediaFactoryModule, VlcMediaFactory);