UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
VideoEncoderInputImpl.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "VideoEncoderInput.h"
6#include "Containers/Queue.h"
7#include "Misc/ScopeLock.h"
9#include "CudaModule.h"
10
11// HACK (M84FIX) need to break these dependencies
12#if PLATFORM_WINDOWS
14#endif
15
16namespace AVEncoder
17{
18class FVideoEncoderInputFrameImpl;
19
21class FVideoEncoderInputImpl : public FVideoEncoderInput
22{
23public:
26
27 // --- properties
28
29 uint32 GetNumActiveFrames() const { FScopeLock Guard(&ProtectFrames); return ActiveFrames.Num(); }
30 bool GetHasFreeFrames() const { FScopeLock Guard(&ProtectFrames); return !AvailableFrames.IsEmpty(); }
31
32 // --- construct video encoder input based on expected input frame format
33
34 bool SetupForDummy();
36
37 // set up for an encoder that encodes a D3D11 texture (nvenc)
39
40 // set up for an encoder that encodes a D3D11 texture within a feature level 11.1 D3D11 device (amf)
42
43 // set up for an encoder that encodes a D3D12 texture (amf)
45
46 // set up for an encoder that encodes a D3D12 texture in the context of a D3D11 device (i.e. nvenc)
48
49 // set up an encoder that encodes a CUArray in a CUDA context
51
52#if PLATFORM_DESKTOP && !PLATFORM_APPLE
53 // set up an encoder that encodes a VkImage in the context of a VkDevice
55#endif
56
57 // --- available encoders
58
59 // get a list of supported video encoders
61
62 // --- encoder input frames - user managed
63
64 // create a user managed buffer
65 FVideoEncoderInputFrame* CreateBuffer(OnFrameReleasedCallback InOnFrameReleased) override;
66 // destroy user managed buffer
67 void DestroyBuffer(FVideoEncoderInputFrame* Buffer) override;
68
69 // --- encoder input frames - managed by this object
70
71 // obtain a video frame that can be used as a buffer for input to a video encoder
73
74 // release (free) an input frame and make it available for future use
75 void ReleaseInputFrame(FVideoEncoderInputFrame* InFrame) override;
76
77 // destroy/release any frames that are not currently in use
78 void Flush() override;
79
80 // indicates whether a given frame is a user managed frame or not
81 bool IsUserManagedFrame(const FVideoEncoderInputFrame* InBuffer) const;
82
83 // --- input properties
84
85#if PLATFORM_WINDOWS
88#endif
89
90 CUcontext GetCUDAEncoderContext() const override;
91
92#if PLATFORM_DESKTOP && !PLATFORM_APPLE
93 void* GetVulkanEncoderDevice() const override;
94#endif
95
96private:
97
98 // collect any encoder that can handle frame format
99 void CollectAvailableEncoders();
100
101 TArray<FVideoEncoderInfo> AvailableEncoders;
102
103 FVideoEncoderInputFrameImpl* CreateFrame();
104 void SetupFrameYUV420P(FVideoEncoderInputFrameImpl* Frame);
105 void SetupFrameD3D11(FVideoEncoderInputFrameImpl* Frame);
106 void SetupFrameD3D12(FVideoEncoderInputFrameImpl* Frame);
107 void SetupFrameVulkan(FVideoEncoderInputFrameImpl* Frame);
108 void SetupFrameCUDA(FVideoEncoderInputFrameImpl* Frame);
109
110 struct FFrameInfoDummy
111 {
112 } FrameInfoDummy;
113
114 struct FFrameInfoYUV420P
115 {
116 uint32 StrideY = 0;
117 uint32 StrideU = 0;
118 uint32 StrideV = 0;
119 } FrameInfoYUV420P;
120
121#if PLATFORM_WINDOWS
122 struct FFrameInfoD3D
123 {
127 } FrameInfoD3D;
128#endif
129
130 struct FFrameInfoCUDA
131 {
132 CUcontext EncoderContextCUDA;
133 } FrameInfoCUDA;
134
135#if PLATFORM_DESKTOP && !PLATFORM_APPLE
137#endif
138
139 mutable FCriticalSection ProtectFrames;
143 TArray<UserManagedFrame> UserManagedFrames;
144};
145
146class FVideoEncoderInputFrameImpl : public FVideoEncoderInputFrame
147{
148public:
153
154 // Clone frame - this will create a copy that references the original until destroyed
155 const FVideoEncoderInputFrame* Clone(FCloneDestroyedCallback InCloneDestroyedCallback) const override;
156
157 // Release (decrease reference count) of this input frame
158 void Release() const override;
159
161 void SetWidth(uint32 InWidth) { Width = InWidth; }
162 void SetHeight(uint32 InHeight) { Height = InHeight; }
163
164private:
166 const FVideoEncoderInputFrame* ClonedReference = nullptr;
167 const FCloneDestroyedCallback OnCloneDestroyed;
168};
170} /* namespace AVEncoder */
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
UE::FPlatformRecursiveMutex FCriticalSection
Definition CriticalSection.h:53
#define PRAGMA_ENABLE_DEPRECATION_WARNINGS
Definition GenericPlatformCompilerPreSetup.h:12
#define PRAGMA_DISABLE_DEPRECATION_WARNINGS
Definition GenericPlatformCompilerPreSetup.h:8
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition VideoEncoderInputImpl.h:147
void SetFormat(EVideoFrameFormat InFormat)
Definition VideoEncoderInputImpl.h:160
void SetHeight(uint32 InHeight)
Definition VideoEncoderInputImpl.h:162
FVideoEncoderInputFrameImpl(const FVideoEncoderInputFrameImpl &InCloneFrom)=delete
~FVideoEncoderInputFrameImpl()
Definition VideoEncoderInput.cpp:1144
void SetWidth(uint32 InWidth)
Definition VideoEncoderInputImpl.h:161
void Release() const override
Definition VideoEncoderInput.cpp:1156
const FVideoEncoderInputFrame * Clone(FCloneDestroyedCallback InCloneDestroyedCallback) const override
Definition VideoEncoderInput.cpp:1181
Definition VideoEncoderInputImpl.h:22
bool SetupForD3D11Shared(void *InApplicationD3DDevice)
Definition VideoEncoderInput.cpp:259
const TArray< FVideoEncoderInfo > & GetAvailableEncoders() override
Definition VideoEncoderInput.cpp:459
bool SetupForD3D12Shared(void *InApplicationD3DDevice)
Definition VideoEncoderInput.cpp:351
TSharedPtr< FVideoEncoderInputFrame > ObtainInputFrame() override
Definition VideoEncoderInput.cpp:522
void DestroyBuffer(FVideoEncoderInputFrame *Buffer) override
Definition VideoEncoderInput.cpp:499
void ReleaseInputFrame(FVideoEncoderInputFrame *InFrame) override
Definition VideoEncoderInput.cpp:592
uint32 GetNumActiveFrames() const
Definition VideoEncoderInputImpl.h:29
CUcontext GetCUDAEncoderContext() const override
Definition VideoEncoderInput.cpp:733
bool SetupForDummy()
Definition VideoEncoderInput.cpp:187
bool IsUserManagedFrame(const FVideoEncoderInputFrame *InBuffer) const
Definition VideoEncoderInput.cpp:468
FVideoEncoderInputFrame * CreateBuffer(OnFrameReleasedCallback InOnFrameReleased) override
Definition VideoEncoderInput.cpp:485
bool SetupForYUV420P(uint32 InWidth, uint32 InHeight)
Definition VideoEncoderInput.cpp:195
bool SetupForD3D11(void *InApplicationD3DDevice)
Definition VideoEncoderInput.cpp:208
void Flush() override
Definition VideoEncoderInput.cpp:643
bool GetHasFreeFrames() const
Definition VideoEncoderInputImpl.h:30
virtual ~FVideoEncoderInputImpl()
Definition VideoEncoderInput.cpp:170
bool SetupForCUDA(void *InApplicationContext)
Definition VideoEncoderInput.cpp:414
bool SetupForD3D12(void *InApplicationD3DDevice)
Definition VideoEncoderInput.cpp:311
Definition ScopeLock.h:141
Definition Array.h:670
Definition Queue.h:48
Definition RefCounting.h:454
Definition SharedPointer.h:692
Definition AudioEncoder.cpp:7
Definition Tuple.h:652