Files
UnrealEngine/Engine/Plugins/Media/BinkMedia/Source/BinkMediaPlayer/Private/BinkFunctionLibrary.cpp
2025-05-18 13:04:45 +08:00

80 lines
2.4 KiB
C++

// Copyright Epic Games Tools LLC
// Licenced under the Unreal Engine EULA
#include "BinkFunctionLibrary.h"
#include "BinkMovieStreamer.h"
#include "Engine/GameViewportClient.h"
#include "Engine/Engine.h"
#include "RenderingThread.h"
extern TSharedPtr<FBinkMovieStreamer, ESPMode::ThreadSafe> MovieStreamer;
// Note: Has to be in a seperate function because you can't do #if inside a render command macro
static void Bink_DrawOverlays_Internal(FRHICommandListImmediate &RHICmdList, const UGameViewportClient* gameViewport) {
if (!GEngine || !gameViewport || !gameViewport->Viewport) {
return;
}
FVector2D screenSize;
gameViewport->GetViewportSize(screenSize);
const FTextureRHIRef &backbuffer = gameViewport->Viewport->GetRenderTargetTexture();
if(!backbuffer.GetReference())
{
return;
}
BINKPLUGINFRAMEINFO FrameInfo = {};
FrameInfo.screen_resource = backbuffer.GetReference();
FrameInfo.screen_resource_state = 4; // D3D12_RESOURCE_STATE_RENDER_TARGET; (only used in d3d12)
FrameInfo.width = screenSize.X;
FrameInfo.height = screenSize.Y;
FrameInfo.sdr_or_hdr = backbuffer->GetFormat() == PF_A2B10G10R10 ? 1 : 0;
FrameInfo.cmdBuf = &RHICmdList;
BinkPluginSetPerFrameInfo(&FrameInfo);
BinkPluginAllScheduled();
BinkPluginDraw(0, 1);
}
void UBinkFunctionLibrary::Bink_DrawOverlays()
{
TWeakObjectPtr<UGameViewportClient> gameViewport = (GEngine != nullptr) ? GEngine->GameViewport : nullptr;
if (!gameViewport.IsValid()) {
return;
}
ENQUEUE_RENDER_COMMAND(BinkOverlays)([gameViewport](FRHICommandListImmediate& RHICmdList)
{
if (gameViewport.IsValid())
{
Bink_DrawOverlays_Internal(RHICmdList, gameViewport.Get());
}
});
}
FTimespan UBinkFunctionLibrary::BinkLoadingMovie_GetDuration()
{
double ms = 0;
if(MovieStreamer.IsValid() && MovieStreamer.Get()->bnk)
{
BINKPLUGININFO bpinfo = {};
BinkPluginInfo(MovieStreamer.Get()->bnk, &bpinfo);
ms = ((double)bpinfo.Frames) * ((double)bpinfo.FrameRateDiv) * 1000.0 / ((double)bpinfo.FrameRate);
}
return FTimespan::FromMilliseconds(ms);
}
FTimespan UBinkFunctionLibrary::BinkLoadingMovie_GetTime()
{
double ms = 0;
if(MovieStreamer.IsValid() && MovieStreamer.Get()->bnk)
{
BINKPLUGININFO bpinfo = {};
BinkPluginInfo(MovieStreamer.Get()->bnk, &bpinfo);
ms = ((double)bpinfo.FrameNum) * ((double)bpinfo.FrameRateDiv) * 1000.0 / ((double)bpinfo.FrameRate);
}
return FTimespan::FromMilliseconds(ms);
}