2021-10-26 01:05:06 -04:00
|
|
|
// Copyright Epic Games, Inc. All Rights Reserved.
|
|
|
|
|
|
|
|
|
|
#include "Modules/ModuleManager.h"
|
|
|
|
|
|
2022-03-09 11:16:51 -05:00
|
|
|
#include "IVulkanDynamicRHI.h"
|
2021-10-26 01:05:06 -04:00
|
|
|
|
|
|
|
|
#include "Amf_Common.h"
|
|
|
|
|
#include "Amf_EncoderH264.h"
|
|
|
|
|
#include "VideoEncoderFactory.h"
|
|
|
|
|
|
|
|
|
|
#include "Misc/CoreDelegates.h"
|
|
|
|
|
|
|
|
|
|
class FAMFEncoderModule : public IModuleInterface
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
void StartupModule()
|
|
|
|
|
{
|
|
|
|
|
using namespace AVEncoder;
|
|
|
|
|
if(FApp::CanEverRender())
|
|
|
|
|
{
|
|
|
|
|
FAmfCommon& AMF = FAmfCommon::Setup();
|
|
|
|
|
|
|
|
|
|
if(AMF.GetIsAvailable())
|
|
|
|
|
{
|
|
|
|
|
#if PLATFORM_WINDOWS
|
|
|
|
|
const TCHAR* DynamicRHIModuleName = GetSelectedDynamicRHIModuleName(false);
|
|
|
|
|
#elif PLATFORM_LINUX
|
|
|
|
|
const TCHAR* DynamicRHIModuleName = TEXT("VulkanRHI");
|
|
|
|
|
#endif
|
|
|
|
|
if(FString("VulkanRHI") == FString(DynamicRHIModuleName))
|
|
|
|
|
{
|
2022-02-02 01:48:44 -05:00
|
|
|
#if PLATFORM_WINDOWS || PLATFORM_LINUX
|
|
|
|
|
UE_LOG(LogEncoderAMF, Error, TEXT("Vulkan AMF is currently unsuported and has been disabled."));
|
|
|
|
|
return;
|
2021-10-26 01:05:06 -04:00
|
|
|
#endif
|
2022-02-24 11:58:36 -05:00
|
|
|
AMF.InitializeContext(ERHIInterfaceType::Vulkan, "Vulkan", NULL);
|
2021-10-26 01:05:06 -04:00
|
|
|
amf::AMFContext1Ptr pContext1(AMF.GetContext());
|
|
|
|
|
|
|
|
|
|
amf_size NumDeviceExtensions = 0;
|
|
|
|
|
pContext1->GetVulkanDeviceExtensions(&NumDeviceExtensions, nullptr);
|
|
|
|
|
|
|
|
|
|
TArray<const ANSICHAR*> ExtentionsToAdd;
|
|
|
|
|
ExtentionsToAdd.AddUninitialized(5);
|
|
|
|
|
|
|
|
|
|
pContext1->GetVulkanDeviceExtensions(&NumDeviceExtensions, ExtentionsToAdd.GetData());
|
|
|
|
|
|
|
|
|
|
AMF.DestroyContext();
|
|
|
|
|
|
2022-03-09 11:16:51 -05:00
|
|
|
IVulkanDynamicRHI::AddEnabledDeviceExtensionsAndLayers(ExtentionsToAdd, TArray<const ANSICHAR*>());
|
2021-10-26 01:05:06 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
FCoreDelegates::OnPostEngineInit.AddLambda([]() {FVideoEncoderAmf_H264::Register(FVideoEncoderFactory::Get());});
|
|
|
|
|
|
|
|
|
|
AMFStarted = true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ShutdownModule()
|
|
|
|
|
{
|
|
|
|
|
using namespace AVEncoder;
|
|
|
|
|
if(AMFStarted)
|
|
|
|
|
{
|
|
|
|
|
FAmfCommon& AMF = FAmfCommon::Setup();
|
|
|
|
|
AMF.Shutdown();
|
|
|
|
|
AMFStarted = false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
bool AMFStarted = false;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
IMPLEMENT_MODULE(FAMFEncoderModule, EncoderAMF);
|