FFmpeg
d3d12va_encode.h
Go to the documentation of this file.
1 /*
2  * Direct3D 12 HW acceleration video encoder
3  *
4  * Copyright (c) 2024 Intel Corporation
5  *
6  * This file is part of FFmpeg.
7  *
8  * FFmpeg is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public
10  * License as published by the Free Software Foundation; either
11  * version 2.1 of the License, or (at your option) any later version.
12  *
13  * FFmpeg is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16  * Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with FFmpeg; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21  */
22 
23 #ifndef AVCODEC_D3D12VA_ENCODE_H
24 #define AVCODEC_D3D12VA_ENCODE_H
25 
26 #include "libavutil/fifo.h"
27 #include "libavutil/hwcontext.h"
30 #include "avcodec.h"
31 #include "internal.h"
32 #include "hwconfig.h"
33 #include "hw_base_encode.h"
34 
35 struct D3D12VAEncodeType;
36 
38 
39 #define MAX_PARAM_BUFFER_SIZE 4096
40 #define D3D12VA_VIDEO_ENC_ASYNC_DEPTH 8
41 
42 typedef struct D3D12VAEncodePicture {
44 
46 
49 
51  ID3D12Resource *output_buffer;
52 
53  ID3D12Resource *encoded_metadata;
54  ID3D12Resource *resolved_metadata;
55 
56  D3D12_VIDEO_ENCODER_PICTURE_CONTROL_CODEC_DATA pic_ctl;
57 
60 
61 typedef struct D3D12VAEncodeProfile {
62  /**
63  * lavc profile value (AV_PROFILE_*).
64  */
66 
67  /**
68  * Supported bit depth.
69  */
70  int depth;
71 
72  /**
73  * Number of components.
74  */
76 
77  /**
78  * Chroma subsampling in width dimension.
79  */
81 
82  /**
83  * Chroma subsampling in height dimension.
84  */
86 
87  /**
88  * D3D12 profile value.
89  */
90  D3D12_VIDEO_ENCODER_PROFILE_DESC d3d12_profile;
92 
93 enum {
100 };
101 
102 
103 typedef struct D3D12VAEncodeRCMode {
104  /**
105  * Mode from above enum (RC_MODE_*).
106  */
107  int mode;
108 
109  /**
110  * Name.
111  *
112  */
113  const char *name;
114 
115  /**
116  * Uses bitrate parameters.
117  *
118  */
119  int bitrate;
120 
121  /**
122  * Supports maxrate distinct from bitrate.
123  *
124  */
125  int maxrate;
126 
127  /**
128  * Uses quality value.
129  *
130  */
131  int quality;
132 
133  /**
134  * Supports HRD/VBV parameters.
135  *
136  */
137  int hrd;
138 
139  /**
140  * D3D12 mode value.
141  */
142  D3D12_VIDEO_ENCODER_RATE_CONTROL_MODE d3d12_mode;
144 
145 typedef struct D3D12VAEncodeContext {
147 
148  /**
149  * Codec-specific hooks.
150  */
151  const struct D3D12VAEncodeType *codec;
152 
153  /**
154  * Explicitly set RC mode (otherwise attempt to pick from
155  * available modes).
156  */
158 
159  /**
160  * Explicitly-set QP, for use with the "qp" options.
161  * (Forces CQP mode when set, overriding everything else.)
162  */
164 
165  /**
166  * RC quality level - meaning depends on codec and RC mode.
167  * In CQP mode this sets the fixed quantiser value.
168  */
170 
171  /**
172  * Chosen encoding profile details.
173  */
175 
177 
178  /**
179  * ID3D12Device3 interface.
180  */
181  ID3D12Device3 *device3;
182 
183  /**
184  * ID3D12VideoDevice3 interface.
185  */
186  ID3D12VideoDevice3 *video_device3;
187 
188  /**
189  * Pool of (reusable) bitstream output buffers.
190  */
192 
193  /**
194  * D3D12 video encoder.
195  */
197 
198  ID3D12VideoEncoder *encoder;
199 
200  /**
201  * D3D12 video encoder heap.
202  */
203  ID3D12VideoEncoderHeap *encoder_heap;
204 
205  /**
206  * A cached queue for reusing the D3D12 command allocators.
207  *
208  * @see https://learn.microsoft.com/en-us/windows/win32/direct3d12/recording-command-lists-and-bundles#id3d12commandallocator
209  */
211 
212  /**
213  * D3D12 command queue.
214  */
215  ID3D12CommandQueue *command_queue;
216 
217  /**
218  * D3D12 video encode command list.
219  */
220  ID3D12VideoEncodeCommandList2 *command_list;
221 
222  /**
223  * The sync context used to sync command queue.
224  */
226 
227  /**
228  * The bi_not_empty feature.
229  */
231 
232  /**
233  * D3D12_FEATURE structures.
234  */
235  D3D12_FEATURE_DATA_VIDEO_ENCODER_RESOURCE_REQUIREMENTS req;
236 
237  D3D12_FEATURE_DATA_VIDEO_ENCODER_RESOLUTION_SUPPORT_LIMITS res_limits;
238 
239  /**
240  * D3D12_VIDEO_ENCODER structures.
241  */
242  D3D12_VIDEO_ENCODER_PICTURE_RESOLUTION_DESC resolution;
243 
244  D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION codec_conf;
245 
246  D3D12_VIDEO_ENCODER_RATE_CONTROL rc;
247 
248  D3D12_VIDEO_ENCODER_SEQUENCE_GOP_STRUCTURE gop;
249 
250  D3D12_VIDEO_ENCODER_LEVEL_SETTING level;
252 
253 typedef struct D3D12VAEncodeType {
254  /**
255  * List of supported profiles.
256  */
258 
259  /**
260  * D3D12 codec name.
261  */
262  D3D12_VIDEO_ENCODER_CODEC d3d12_codec;
263 
264  /**
265  * Codec feature flags.
266  */
267  int flags;
268 
269  /**
270  * Default quality for this codec - used as quantiser or RC quality
271  * factor depending on RC mode.
272  */
274 
275  /**
276  * Query codec configuration and determine encode parameters like
277  * block sizes for surface alignment and slices. If not set, assume
278  * that all blocks are 16x16 and that surfaces should be aligned to match
279  * this.
280  */
282 
283  /**
284  * Perform any extra codec-specific configuration.
285  */
287 
288  /**
289  * Set codec-specific level setting.
290  */
292 
293  /**
294  * The size of any private data structure associated with each
295  * picture (can be zero if not required).
296  */
298 
299  /**
300  * Fill the corresponding parameters.
301  */
303 
305  D3D12VAEncodePicture *pic);
306 
308 
309  /**
310  * Write the packed header data to the provided buffer.
311  */
313  char *data, size_t *data_len);
315 
317 
320 
321 #define D3D12VA_ENCODE_RC_MODE(name, desc) \
322  { #name, desc, 0, AV_OPT_TYPE_CONST, { .i64 = RC_MODE_ ## name }, \
323  0, 0, FLAGS, .unit = "rc_mode" }
324 #define D3D12VA_ENCODE_RC_OPTIONS \
325  { "rc_mode",\
326  "Set rate control mode", \
327  OFFSET(common.explicit_rc_mode), AV_OPT_TYPE_INT, \
328  { .i64 = RC_MODE_AUTO }, RC_MODE_AUTO, RC_MODE_MAX, FLAGS, .unit = "rc_mode" }, \
329  { "auto", "Choose mode automatically based on other parameters", \
330  0, AV_OPT_TYPE_CONST, { .i64 = RC_MODE_AUTO }, 0, 0, FLAGS, .unit = "rc_mode" }, \
331  D3D12VA_ENCODE_RC_MODE(CQP, "Constant-quality"), \
332  D3D12VA_ENCODE_RC_MODE(CBR, "Constant-bitrate"), \
333  D3D12VA_ENCODE_RC_MODE(VBR, "Variable-bitrate"), \
334  D3D12VA_ENCODE_RC_MODE(QVBR, "Quality-defined variable-bitrate")
335 
336 #endif /* AVCODEC_D3D12VA_ENCODE_H */
hwconfig.h
RC_MODE_QVBR
@ RC_MODE_QVBR
Definition: d3d12va_encode.h:98
D3D12VAEncodeRCMode::mode
int mode
Mode from above enum (RC_MODE_*).
Definition: d3d12va_encode.h:107
D3D12VAEncodeType::init_sequence_params
int(* init_sequence_params)(AVCodecContext *avctx)
Fill the corresponding parameters.
Definition: d3d12va_encode.h:302
D3D12VAEncodeProfile::d3d12_profile
D3D12_VIDEO_ENCODER_PROFILE_DESC d3d12_profile
D3D12 profile value.
Definition: d3d12va_encode.h:90
D3D12VAEncodeType::init_picture_params
int(* init_picture_params)(AVCodecContext *avctx, D3D12VAEncodePicture *pic)
Definition: d3d12va_encode.h:304
D3D12VAEncodeType::d3d12_codec
D3D12_VIDEO_ENCODER_CODEC d3d12_codec
D3D12 codec name.
Definition: d3d12va_encode.h:262
AVBufferPool
The buffer pool.
Definition: buffer_internal.h:88
D3D12VAEncodeContext::encoder_heap
ID3D12VideoEncoderHeap * encoder_heap
D3D12 video encoder heap.
Definition: d3d12va_encode.h:203
D3D12VAEncodePicture::input_surface
AVD3D12VAFrame * input_surface
Definition: d3d12va_encode.h:47
D3D12VAEncodeContext::req
D3D12_FEATURE_DATA_VIDEO_ENCODER_RESOURCE_REQUIREMENTS req
D3D12_FEATURE structures.
Definition: d3d12va_encode.h:235
internal.h
D3D12VAEncodeContext::explicit_rc_mode
int explicit_rc_mode
Explicitly set RC mode (otherwise attempt to pick from available modes).
Definition: d3d12va_encode.h:157
data
const char data[16]
Definition: mxf.c:148
D3D12VAEncodeRCMode::d3d12_mode
D3D12_VIDEO_ENCODER_RATE_CONTROL_MODE d3d12_mode
D3D12 mode value.
Definition: d3d12va_encode.h:142
D3D12VAEncodeContext::encoder_ref
AVBufferRef * encoder_ref
D3D12 video encoder.
Definition: d3d12va_encode.h:196
D3D12VAEncodeRCMode::maxrate
int maxrate
Supports maxrate distinct from bitrate.
Definition: d3d12va_encode.h:125
D3D12VAEncodeContext::encoder
ID3D12VideoEncoder * encoder
Definition: d3d12va_encode.h:198
D3D12VAEncodeType::configure
int(* configure)(AVCodecContext *avctx)
Perform any extra codec-specific configuration.
Definition: d3d12va_encode.h:286
D3D12VAEncodeContext::sync_ctx
AVD3D12VASyncContext sync_ctx
The sync context used to sync command queue.
Definition: d3d12va_encode.h:225
D3D12VAEncodeContext::resolution
D3D12_VIDEO_ENCODER_PICTURE_RESOLUTION_DESC resolution
D3D12_VIDEO_ENCODER structures.
Definition: d3d12va_encode.h:242
D3D12VAEncodeRCMode::quality
int quality
Uses quality value.
Definition: d3d12va_encode.h:131
D3D12VAEncodePicture::resolved_metadata
ID3D12Resource * resolved_metadata
Definition: d3d12va_encode.h:54
FFHWBaseEncodeContext
Definition: hw_base_encode.h:118
fifo.h
D3D12VAEncodePicture::output_buffer_ref
AVBufferRef * output_buffer_ref
Definition: d3d12va_encode.h:50
D3D12VAEncodeContext::rc_quality
int rc_quality
RC quality level - meaning depends on codec and RC mode.
Definition: d3d12va_encode.h:169
D3D12VAEncodePicture::output_buffer
ID3D12Resource * output_buffer
Definition: d3d12va_encode.h:51
D3D12VAEncodeContext::hwctx
AVD3D12VADeviceContext * hwctx
Definition: d3d12va_encode.h:176
D3D12VAEncodePicture::recon_surface
AVD3D12VAFrame * recon_surface
Definition: d3d12va_encode.h:48
ff_d3d12va_encode_close
int ff_d3d12va_encode_close(AVCodecContext *avctx)
Definition: d3d12va_encode.c:1519
D3D12VAEncodeContext::bi_not_empty
int bi_not_empty
The bi_not_empty feature.
Definition: d3d12va_encode.h:230
D3D12VAEncodeType::default_quality
int default_quality
Default quality for this codec - used as quantiser or RC quality factor depending on RC mode.
Definition: d3d12va_encode.h:273
D3D12VAEncodeRCMode::bitrate
int bitrate
Uses bitrate parameters.
Definition: d3d12va_encode.h:119
D3D12VAEncodeType::free_picture_params
void(* free_picture_params)(D3D12VAEncodePicture *pic)
Definition: d3d12va_encode.h:307
D3D12VAEncodeProfile::log2_chroma_w
int log2_chroma_w
Chroma subsampling in width dimension.
Definition: d3d12va_encode.h:80
pkt
AVPacket * pkt
Definition: movenc.c:60
ff_d3d12va_encode_init
int ff_d3d12va_encode_init(AVCodecContext *avctx)
Definition: d3d12va_encode.c:1400
D3D12VAEncodePicture::header_size
int header_size
Definition: d3d12va_encode.h:45
RC_MODE_CQP
@ RC_MODE_CQP
Definition: d3d12va_encode.h:95
D3D12VAEncodeType::picture_priv_data_size
size_t picture_priv_data_size
The size of any private data structure associated with each picture (can be zero if not required).
Definition: d3d12va_encode.h:297
D3D12VAEncodeProfile::nb_components
int nb_components
Number of components.
Definition: d3d12va_encode.h:75
hw_base_encode.h
D3D12VAEncodePicture::pic_ctl
D3D12_VIDEO_ENCODER_PICTURE_CONTROL_CODEC_DATA pic_ctl
Definition: d3d12va_encode.h:56
AVD3D12VASyncContext
This struct is used to sync d3d12 execution.
Definition: hwcontext_d3d12va.h:84
D3D12VAEncodeRCMode
Definition: d3d12va_encode.h:103
D3D12VAEncodeContext::device3
ID3D12Device3 * device3
ID3D12Device3 interface.
Definition: d3d12va_encode.h:181
D3D12VAEncodePicture::fence_value
int fence_value
Definition: d3d12va_encode.h:58
D3D12VAEncodeContext::base
FFHWBaseEncodeContext base
Definition: d3d12va_encode.h:146
D3D12VAEncodeContext::profile
const D3D12VAEncodeProfile * profile
Chosen encoding profile details.
Definition: d3d12va_encode.h:174
hwcontext_d3d12va.h
D3D12VAEncodeType::flags
int flags
Codec feature flags.
Definition: d3d12va_encode.h:267
D3D12VAEncodeContext::rc
D3D12_VIDEO_ENCODER_RATE_CONTROL rc
Definition: d3d12va_encode.h:246
D3D12VAEncodeContext::allocator_queue
AVFifo * allocator_queue
A cached queue for reusing the D3D12 command allocators.
Definition: d3d12va_encode.h:210
D3D12VAEncodeContext::codec_conf
D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION codec_conf
Definition: d3d12va_encode.h:244
AVFifo
Definition: fifo.c:35
D3D12VAEncodeContext::res_limits
D3D12_FEATURE_DATA_VIDEO_ENCODER_RESOLUTION_SUPPORT_LIMITS res_limits
Definition: d3d12va_encode.h:237
D3D12VAEncodeProfile
Definition: d3d12va_encode.h:61
D3D12VAEncodePicture::base
FFHWBaseEncodePicture base
Definition: d3d12va_encode.h:43
RC_MODE_CBR
@ RC_MODE_CBR
Definition: d3d12va_encode.h:96
D3D12VAEncodeContext::codec
const struct D3D12VAEncodeType * codec
Codec-specific hooks.
Definition: d3d12va_encode.h:151
AVCodecHWConfigInternal
Definition: hwconfig.h:25
RC_MODE_MAX
@ RC_MODE_MAX
Definition: d3d12va_encode.h:99
ff_d3d12va_encode_hw_configs
const AVCodecHWConfigInternal *const ff_d3d12va_encode_hw_configs[]
Definition: d3d12va_encode.c:36
AVD3D12VAFrame
D3D12VA frame descriptor for pool allocation.
Definition: hwcontext_d3d12va.h:106
D3D12VAEncodePicture::encoded_metadata
ID3D12Resource * encoded_metadata
Definition: d3d12va_encode.h:53
D3D12VAEncodePicture
Definition: d3d12va_encode.h:42
D3D12VAEncodeContext::level
D3D12_VIDEO_ENCODER_LEVEL_SETTING level
Definition: d3d12va_encode.h:250
ff_d3d12va_encode_receive_packet
int ff_d3d12va_encode_receive_packet(AVCodecContext *avctx, AVPacket *pkt)
Definition: d3d12va_encode.c:1395
AVD3D12VADeviceContext
This struct is allocated as AVHWDeviceContext.hwctx.
Definition: hwcontext_d3d12va.h:43
D3D12VAEncodeProfile::log2_chroma_h
int log2_chroma_h
Chroma subsampling in height dimension.
Definition: d3d12va_encode.h:85
D3D12VAEncodeRCMode::hrd
int hrd
Supports HRD/VBV parameters.
Definition: d3d12va_encode.h:137
D3D12VAEncodeType::write_sequence_header
int(* write_sequence_header)(AVCodecContext *avctx, char *data, size_t *data_len)
Write the packed header data to the provided buffer.
Definition: d3d12va_encode.h:312
avcodec.h
D3D12VAEncodeProfile::av_profile
int av_profile
lavc profile value (AV_PROFILE_*).
Definition: d3d12va_encode.h:65
FFHWBaseEncodePicture
Definition: hw_base_encode.h:61
D3D12VAEncodeContext
Definition: d3d12va_encode.h:145
D3D12VAEncodeContext::command_list
ID3D12VideoEncodeCommandList2 * command_list
D3D12 video encode command list.
Definition: d3d12va_encode.h:220
D3D12VAEncodeType::get_encoder_caps
int(* get_encoder_caps)(AVCodecContext *avctx)
Query codec configuration and determine encode parameters like block sizes for surface alignment and ...
Definition: d3d12va_encode.h:281
D3D12VAEncodeContext::command_queue
ID3D12CommandQueue * command_queue
D3D12 command queue.
Definition: d3d12va_encode.h:215
D3D12VAEncodeType::set_level
int(* set_level)(AVCodecContext *avctx)
Set codec-specific level setting.
Definition: d3d12va_encode.h:291
AVCodecContext
main external API structure.
Definition: avcodec.h:445
D3D12VAEncodeRCMode::name
const char * name
Name.
Definition: d3d12va_encode.h:113
D3D12VAEncodeContext::video_device3
ID3D12VideoDevice3 * video_device3
ID3D12VideoDevice3 interface.
Definition: d3d12va_encode.h:186
D3D12VAEncodeContext::output_buffer_pool
AVBufferPool * output_buffer_pool
Pool of (reusable) bitstream output buffers.
Definition: d3d12va_encode.h:191
D3D12VAEncodeProfile::depth
int depth
Supported bit depth.
Definition: d3d12va_encode.h:70
D3D12VAEncodeContext::gop
D3D12_VIDEO_ENCODER_SEQUENCE_GOP_STRUCTURE gop
Definition: d3d12va_encode.h:248
RC_MODE_AUTO
@ RC_MODE_AUTO
Definition: d3d12va_encode.h:94
AVBufferRef
A reference to a data buffer.
Definition: buffer.h:82
AVPacket
This structure stores compressed data.
Definition: packet.h:497
D3D12VAEncodeType::profiles
const D3D12VAEncodeProfile * profiles
List of supported profiles.
Definition: d3d12va_encode.h:257
D3D12VAEncodeContext::explicit_qp
int explicit_qp
Explicitly-set QP, for use with the "qp" options.
Definition: d3d12va_encode.h:163
hwcontext.h
D3D12VAEncodeType
Definition: d3d12va_encode.h:253
RC_MODE_VBR
@ RC_MODE_VBR
Definition: d3d12va_encode.h:97
hwcontext_d3d12va_internal.h
int
int
Definition: ffmpeg_filter.c:424