This commit is contained in:
2025-07-14 22:24:27 +08:00
parent daacc18ecf
commit 4af19ef574
7722 changed files with 72086 additions and 0 deletions

View File

@ -0,0 +1,168 @@
// ------------------------------------------------
// Copyright Joe Marshall 2024- All Rights Reserved
// ------------------------------------------------
//
// Factory class to tell Unreal that we can play
// different types of media.
// ------------------------------------------------
#include "AndroidVulkanVideo.h"
#include "IMediaModule.h"
#include "IMediaPlayerFactory.h"
#include "Misc/Guid.h"
#include "Misc/Paths.h"
#include "Modules/ModuleManager.h"
#define LOCTEXT_NAMESPACE "FAndroidVulkanVideoFactoryModule"
class FAndroidVulkanVideoFactoryModule : public IMediaPlayerFactory, public IModuleInterface
{
public:
virtual bool CanPlayUrl(const FString &Url, const IMediaOptions * /*Options*/,
TArray<FText> * /*OutWarnings*/,
TArray<FText> *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;
}
}
return true;
}
virtual TSharedPtr<IMediaPlayer, ESPMode::ThreadSafe> CreatePlayer(
IMediaEventSink &EventSink) override
{
auto AndroidVulkanVideoModule =
FModuleManager::LoadModulePtr<IAndroidVulkanVideoModule>("AndroidVulkanVideo");
return (AndroidVulkanVideoModule != nullptr)
? AndroidVulkanVideoModule->CreatePlayer(EventSink)
: nullptr;
}
virtual FText GetDisplayName() const override
{
return LOCTEXT("MediaPlayerDisplayName", "Android Vulkan Video");
}
virtual FName GetPlayerName() const override
{
static FName PlayerName(TEXT("DirectVideo Android"));
return PlayerName;
}
virtual FGuid GetPlayerPluginGUID() const override
{
static FGuid OurGUID(0x9bf2d7c6, 0xb2b84d26, 0xb6ae5a3a, 0xc9883569);
return OurGUID;
}
virtual const TArray<FString> &GetSupportedPlatforms() const override
{
return SupportedPlatforms;
}
virtual bool SupportsFeature(EMediaFeature Feature) const override
{
return ((Feature == EMediaFeature::AudioTracks) ||
(Feature == EMediaFeature::VideoSamples) ||
(Feature == EMediaFeature::VideoTracks));
}
virtual void ShutdownModule() override
{
// unregister player factory
auto MediaModule = FModuleManager::GetModulePtr<IMediaModule>("Media");
if (MediaModule != nullptr)
{
MediaModule->UnregisterPlayerFactory(*this);
}
}
virtual void StartupModule() override
{
// supported file extensions
SupportedFileExtensions.Add(TEXT("3gpp"));
SupportedFileExtensions.Add(TEXT("aac"));
SupportedFileExtensions.Add(TEXT("mp4"));
SupportedFileExtensions.Add(TEXT("m3u8"));
SupportedFileExtensions.Add(TEXT("webm"));
// supported platforms
SupportedPlatforms.Add(TEXT("Android"));
// supported schemes
SupportedUriSchemes.Add(TEXT("file"));
/* SupportedUriSchemes.Add(TEXT("http"));
SupportedUriSchemes.Add(TEXT("httpd"));
SupportedUriSchemes.Add(TEXT("https"));
SupportedUriSchemes.Add(TEXT("mms"));
SupportedUriSchemes.Add(TEXT("rtsp"));
SupportedUriSchemes.Add(TEXT("rtspt"));
SupportedUriSchemes.Add(TEXT("rtspu"));*/
// register media player info
auto MediaModule = FModuleManager::LoadModulePtr<IMediaModule>("Media");
if (MediaModule != nullptr)
{
MediaModule->RegisterPlayerFactory(*this);
}
}
private:
/** List of supported media file types. */
TArray<FString> SupportedFileExtensions;
/** List of platforms that the media player support. */
TArray<FString> SupportedPlatforms;
/** List of supported URI schemes. */
TArray<FString> SupportedUriSchemes;
};
#undef LOCTEXT_NAMESPACE
IMPLEMENT_MODULE(FAndroidVulkanVideoFactoryModule, AndroidVulkanVideoFactory);