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 {
45 
48 
50  ID3D12Resource *output_buffer;
51 
52  ID3D12Resource *encoded_metadata;
53  ID3D12Resource *resolved_metadata;
54 
56 
57  D3D12_VIDEO_ENCODER_PICTURE_CONTROL_CODEC_DATA pic_ctl;
58 
61 
62 typedef struct D3D12VAEncodeProfile {
63  /**
64  * lavc profile value (AV_PROFILE_*).
65  */
67 
68  /**
69  * Supported bit depth.
70  */
71  int depth;
72 
73  /**
74  * Number of components.
75  */
77 
78  /**
79  * Chroma subsampling in width dimension.
80  */
82 
83  /**
84  * Chroma subsampling in height dimension.
85  */
87 
88  /**
89  * D3D12 profile value.
90  */
91  D3D12_VIDEO_ENCODER_PROFILE_DESC d3d12_profile;
93 
94 enum {
101 };
102 
103 
104 typedef struct D3D12VAEncodeRCMode {
105  /**
106  * Mode from above enum (RC_MODE_*).
107  */
108  int mode;
109 
110  /**
111  * Name.
112  *
113  */
114  const char *name;
115 
116  /**
117  * Uses bitrate parameters.
118  *
119  */
120  int bitrate;
121 
122  /**
123  * Supports maxrate distinct from bitrate.
124  *
125  */
126  int maxrate;
127 
128  /**
129  * Uses quality value.
130  *
131  */
132  int quality;
133 
134  /**
135  * Supports HRD/VBV parameters.
136  *
137  */
138  int hrd;
139 
140  /**
141  * D3D12 mode value.
142  */
143  D3D12_VIDEO_ENCODER_RATE_CONTROL_MODE d3d12_mode;
145 
146 typedef struct D3D12VAEncodeContext {
148 
149  /**
150  * Codec-specific hooks.
151  */
152  const struct D3D12VAEncodeType *codec;
153 
154  /**
155  * Max frame size
156  */
158 
159  /**
160  * Explicitly set RC mode (otherwise attempt to pick from
161  * available modes).
162  */
164 
165  /**
166  * Explicitly-set QP, for use with the "qp" options.
167  * (Forces CQP mode when set, overriding everything else.)
168  */
170 
171  /**
172  * RC quality level - meaning depends on codec and RC mode.
173  * In CQP mode this sets the fixed quantiser value.
174  */
176 
177  /**
178  * Chosen encoding profile details.
179  */
181 
183 
184  /**
185  * ID3D12Device3 interface.
186  */
187  ID3D12Device3 *device3;
188 
189  /**
190  * ID3D12VideoDevice3 interface.
191  */
192  ID3D12VideoDevice3 *video_device3;
193 
194  /**
195  * Pool of (reusable) bitstream output buffers.
196  */
198 
199  /**
200  * Flag indicates if the HW is texture array mode.
201  */
203 
204  /**
205  * The number of planes in the input DXGI FORMAT.
206  */
208 
209  /**
210  * D3D12 video encoder.
211  */
213 
214  ID3D12VideoEncoder *encoder;
215 
216  /**
217  * D3D12 video encoder heap.
218  */
219  ID3D12VideoEncoderHeap *encoder_heap;
220 
221  /**
222  * A cached queue for reusing the D3D12 command allocators.
223  *
224  * @see https://learn.microsoft.com/en-us/windows/win32/direct3d12/recording-command-lists-and-bundles#id3d12commandallocator
225  */
227 
228  /**
229  * D3D12 command queue.
230  */
231  ID3D12CommandQueue *command_queue;
232 
233  /**
234  * D3D12 video encode command list.
235  */
236  ID3D12VideoEncodeCommandList2 *command_list;
237 
238  /**
239  * The sync context used to sync command queue.
240  */
242 
243  /**
244  * The bi_not_empty feature.
245  */
247 
248  /**
249  * D3D12_FEATURE structures.
250  */
251  D3D12_FEATURE_DATA_VIDEO_ENCODER_RESOURCE_REQUIREMENTS req;
252 
253  D3D12_FEATURE_DATA_VIDEO_ENCODER_RESOLUTION_SUPPORT_LIMITS res_limits;
254 
255  /**
256  * D3D12_VIDEO_ENCODER structures.
257  */
258  D3D12_VIDEO_ENCODER_PICTURE_RESOLUTION_DESC resolution;
259 
260  D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION codec_conf;
261 
262  D3D12_VIDEO_ENCODER_RATE_CONTROL rc;
263 
264  D3D12_VIDEO_ENCODER_SEQUENCE_GOP_STRUCTURE gop;
265 
266  D3D12_VIDEO_ENCODER_LEVEL_SETTING level;
268 
269 typedef struct D3D12VAEncodeType {
270  /**
271  * List of supported profiles.
272  */
274 
275  /**
276  * D3D12 codec name.
277  */
278  D3D12_VIDEO_ENCODER_CODEC d3d12_codec;
279 
280  /**
281  * Codec feature flags.
282  */
283  int flags;
284 
285  /**
286  * Default quality for this codec - used as quantiser or RC quality
287  * factor depending on RC mode.
288  */
290 
291  /**
292  * Query codec configuration and determine encode parameters like
293  * block sizes for surface alignment and slices. If not set, assume
294  * that all blocks are 16x16 and that surfaces should be aligned to match
295  * this.
296  */
298 
299  /**
300  * Perform any extra codec-specific configuration.
301  */
302  int (*configure)(AVCodecContext *avctx);
303 
304  /**
305  * Set codec-specific level setting.
306  */
307  int (*set_level)(AVCodecContext *avctx);
308 
309  /**
310  * The size of any private data structure associated with each
311  * picture (can be zero if not required).
312  */
314 
315  /**
316  * Fill the corresponding parameters.
317  */
319 
321  FFHWBaseEncodePicture *base_pic);
322 
324 
325  /**
326  * Write the packed header data to the provided buffer.
327  */
329  char *data, size_t *data_len);
331 
333 
336 
337 #define D3D12VA_ENCODE_COMMON_OPTIONS \
338  { "max_frame_size", \
339  "Maximum frame size (in bytes)",\
340  OFFSET(common.max_frame_size), AV_OPT_TYPE_INT, \
341  { .i64 = 0 }, 0, INT_MAX / 8, FLAGS }
342 
343 #define D3D12VA_ENCODE_RC_MODE(name, desc) \
344  { #name, desc, 0, AV_OPT_TYPE_CONST, { .i64 = RC_MODE_ ## name }, \
345  0, 0, FLAGS, .unit = "rc_mode" }
346 #define D3D12VA_ENCODE_RC_OPTIONS \
347  { "rc_mode",\
348  "Set rate control mode", \
349  OFFSET(common.explicit_rc_mode), AV_OPT_TYPE_INT, \
350  { .i64 = RC_MODE_AUTO }, RC_MODE_AUTO, RC_MODE_MAX, FLAGS, .unit = "rc_mode" }, \
351  { "auto", "Choose mode automatically based on other parameters", \
352  0, AV_OPT_TYPE_CONST, { .i64 = RC_MODE_AUTO }, 0, 0, FLAGS, .unit = "rc_mode" }, \
353  D3D12VA_ENCODE_RC_MODE(CQP, "Constant-quality"), \
354  D3D12VA_ENCODE_RC_MODE(CBR, "Constant-bitrate"), \
355  D3D12VA_ENCODE_RC_MODE(VBR, "Variable-bitrate"), \
356  D3D12VA_ENCODE_RC_MODE(QVBR, "Quality-defined variable-bitrate")
357 
358 #endif /* AVCODEC_D3D12VA_ENCODE_H */
hwconfig.h
D3D12VAEncodeRCMode::mode
int mode
Mode from above enum (RC_MODE_*).
Definition: d3d12va_encode.h:108
D3D12VAEncodeType::init_sequence_params
int(* init_sequence_params)(AVCodecContext *avctx)
Fill the corresponding parameters.
Definition: d3d12va_encode.h:318
D3D12VAEncodeProfile::d3d12_profile
D3D12_VIDEO_ENCODER_PROFILE_DESC d3d12_profile
D3D12 profile value.
Definition: d3d12va_encode.h:91
D3D12VAEncodeType::d3d12_codec
D3D12_VIDEO_ENCODER_CODEC d3d12_codec
D3D12 codec name.
Definition: d3d12va_encode.h:278
AVBufferPool
The buffer pool.
Definition: buffer_internal.h:88
RC_MODE_AUTO
@ RC_MODE_AUTO
Definition: d3d12va_encode.h:95
D3D12VAEncodeType::init_picture_params
int(* init_picture_params)(AVCodecContext *avctx, FFHWBaseEncodePicture *base_pic)
Definition: d3d12va_encode.h:320
D3D12VAEncodeContext::encoder_heap
ID3D12VideoEncoderHeap * encoder_heap
D3D12 video encoder heap.
Definition: d3d12va_encode.h:219
D3D12VAEncodePicture::input_surface
AVD3D12VAFrame * input_surface
Definition: d3d12va_encode.h:46
D3D12VAEncodeContext::req
D3D12_FEATURE_DATA_VIDEO_ENCODER_RESOURCE_REQUIREMENTS req
D3D12_FEATURE structures.
Definition: d3d12va_encode.h:251
internal.h
D3D12VAEncodeContext::plane_count
int plane_count
The number of planes in the input DXGI FORMAT.
Definition: d3d12va_encode.h:207
D3D12VAEncodeContext::explicit_rc_mode
int explicit_rc_mode
Explicitly set RC mode (otherwise attempt to pick from available modes).
Definition: d3d12va_encode.h:163
data
const char data[16]
Definition: mxf.c:149
D3D12VAEncodeRCMode::d3d12_mode
D3D12_VIDEO_ENCODER_RATE_CONTROL_MODE d3d12_mode
D3D12 mode value.
Definition: d3d12va_encode.h:143
D3D12VAEncodeContext::encoder_ref
AVBufferRef * encoder_ref
D3D12 video encoder.
Definition: d3d12va_encode.h:212
RC_MODE_MAX
@ RC_MODE_MAX
Definition: d3d12va_encode.h:100
D3D12VAEncodeRCMode::maxrate
int maxrate
Supports maxrate distinct from bitrate.
Definition: d3d12va_encode.h:126
D3D12VAEncodeContext::encoder
ID3D12VideoEncoder * encoder
Definition: d3d12va_encode.h:214
D3D12VAEncodeType::configure
int(* configure)(AVCodecContext *avctx)
Perform any extra codec-specific configuration.
Definition: d3d12va_encode.h:302
D3D12VAEncodeContext::sync_ctx
AVD3D12VASyncContext sync_ctx
The sync context used to sync command queue.
Definition: d3d12va_encode.h:241
D3D12VAEncodeContext::resolution
D3D12_VIDEO_ENCODER_PICTURE_RESOLUTION_DESC resolution
D3D12_VIDEO_ENCODER structures.
Definition: d3d12va_encode.h:258
D3D12VAEncodeRCMode::quality
int quality
Uses quality value.
Definition: d3d12va_encode.h:132
D3D12VAEncodePicture::resolved_metadata
ID3D12Resource * resolved_metadata
Definition: d3d12va_encode.h:53
FFHWBaseEncodeContext
Definition: hw_base_encode.h:122
fifo.h
D3D12VAEncodePicture::output_buffer_ref
AVBufferRef * output_buffer_ref
Definition: d3d12va_encode.h:49
D3D12VAEncodeContext::rc_quality
int rc_quality
RC quality level - meaning depends on codec and RC mode.
Definition: d3d12va_encode.h:175
D3D12VAEncodePicture::output_buffer
ID3D12Resource * output_buffer
Definition: d3d12va_encode.h:50
D3D12VAEncodeContext::hwctx
AVD3D12VADeviceContext * hwctx
Definition: d3d12va_encode.h:182
D3D12VAEncodePicture::recon_surface
AVD3D12VAFrame * recon_surface
Definition: d3d12va_encode.h:47
ff_d3d12va_encode_close
int ff_d3d12va_encode_close(AVCodecContext *avctx)
Definition: d3d12va_encode.c:1608
D3D12VAEncodeContext::bi_not_empty
int bi_not_empty
The bi_not_empty feature.
Definition: d3d12va_encode.h:246
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:289
D3D12VAEncodeRCMode::bitrate
int bitrate
Uses bitrate parameters.
Definition: d3d12va_encode.h:120
D3D12VAEncodeType::free_picture_params
void(* free_picture_params)(D3D12VAEncodePicture *pic)
Definition: d3d12va_encode.h:323
D3D12VAEncodeProfile::log2_chroma_w
int log2_chroma_w
Chroma subsampling in width dimension.
Definition: d3d12va_encode.h:81
pkt
AVPacket * pkt
Definition: movenc.c:60
ff_d3d12va_encode_init
int ff_d3d12va_encode_init(AVCodecContext *avctx)
Definition: d3d12va_encode.c:1479
D3D12VAEncodePicture::header_size
int header_size
Definition: d3d12va_encode.h:43
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:313
D3D12VAEncodeProfile::nb_components
int nb_components
Number of components.
Definition: d3d12va_encode.h:76
hw_base_encode.h
D3D12VAEncodePicture::pic_ctl
D3D12_VIDEO_ENCODER_PICTURE_CONTROL_CODEC_DATA pic_ctl
Definition: d3d12va_encode.h:57
AVD3D12VASyncContext
This struct is used to sync d3d12 execution.
Definition: hwcontext_d3d12va.h:104
D3D12VAEncodeRCMode
Definition: d3d12va_encode.h:104
D3D12VAEncodeContext::device3
ID3D12Device3 * device3
ID3D12Device3 interface.
Definition: d3d12va_encode.h:187
D3D12VAEncodePicture::fence_value
int fence_value
Definition: d3d12va_encode.h:59
D3D12VAEncodeContext::base
FFHWBaseEncodeContext base
Definition: d3d12va_encode.h:147
D3D12VAEncodeContext::profile
const D3D12VAEncodeProfile * profile
Chosen encoding profile details.
Definition: d3d12va_encode.h:180
D3D12VAEncodePicture::subresource_index
int subresource_index
Definition: d3d12va_encode.h:55
hwcontext_d3d12va.h
D3D12VAEncodeContext::max_frame_size
int max_frame_size
Max frame size.
Definition: d3d12va_encode.h:157
D3D12VAEncodeType::flags
int flags
Codec feature flags.
Definition: d3d12va_encode.h:283
D3D12VAEncodeContext::rc
D3D12_VIDEO_ENCODER_RATE_CONTROL rc
Definition: d3d12va_encode.h:262
D3D12VAEncodeContext::allocator_queue
AVFifo * allocator_queue
A cached queue for reusing the D3D12 command allocators.
Definition: d3d12va_encode.h:226
D3D12VAEncodeContext::codec_conf
D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION codec_conf
Definition: d3d12va_encode.h:260
AVFifo
Definition: fifo.c:35
D3D12VAEncodeContext::res_limits
D3D12_FEATURE_DATA_VIDEO_ENCODER_RESOLUTION_SUPPORT_LIMITS res_limits
Definition: d3d12va_encode.h:253
D3D12VAEncodeContext::is_texture_array
int is_texture_array
Flag indicates if the HW is texture array mode.
Definition: d3d12va_encode.h:202
D3D12VAEncodeProfile
Definition: d3d12va_encode.h:62
D3D12VAEncodeContext::codec
const struct D3D12VAEncodeType * codec
Codec-specific hooks.
Definition: d3d12va_encode.h:152
AVCodecHWConfigInternal
Definition: hwconfig.h:25
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:138
RC_MODE_QVBR
@ RC_MODE_QVBR
Definition: d3d12va_encode.h:99
D3D12VAEncodePicture::encoded_metadata
ID3D12Resource * encoded_metadata
Definition: d3d12va_encode.h:52
D3D12VAEncodePicture
Definition: d3d12va_encode.h:42
D3D12VAEncodeContext::level
D3D12_VIDEO_ENCODER_LEVEL_SETTING level
Definition: d3d12va_encode.h:266
ff_d3d12va_encode_receive_packet
int ff_d3d12va_encode_receive_packet(AVCodecContext *avctx, AVPacket *pkt)
Definition: d3d12va_encode.c:1474
AVD3D12VADeviceContext
This struct is allocated as AVHWDeviceContext.hwctx.
Definition: hwcontext_d3d12va.h:43
RC_MODE_VBR
@ RC_MODE_VBR
Definition: d3d12va_encode.h:98
D3D12VAEncodeProfile::log2_chroma_h
int log2_chroma_h
Chroma subsampling in height dimension.
Definition: d3d12va_encode.h:86
D3D12VAEncodeRCMode::hrd
int hrd
Supports HRD/VBV parameters.
Definition: d3d12va_encode.h:138
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:328
avcodec.h
D3D12VAEncodeProfile::av_profile
int av_profile
lavc profile value (AV_PROFILE_*).
Definition: d3d12va_encode.h:66
FFHWBaseEncodePicture
Definition: hw_base_encode.h:61
D3D12VAEncodeContext
Definition: d3d12va_encode.h:146
D3D12VAEncodeContext::command_list
ID3D12VideoEncodeCommandList2 * command_list
D3D12 video encode command list.
Definition: d3d12va_encode.h:236
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:297
D3D12VAEncodeContext::command_queue
ID3D12CommandQueue * command_queue
D3D12 command queue.
Definition: d3d12va_encode.h:231
D3D12VAEncodeType::set_level
int(* set_level)(AVCodecContext *avctx)
Set codec-specific level setting.
Definition: d3d12va_encode.h:307
AVCodecContext
main external API structure.
Definition: avcodec.h:431
D3D12VAEncodeRCMode::name
const char * name
Name.
Definition: d3d12va_encode.h:114
D3D12VAEncodeContext::video_device3
ID3D12VideoDevice3 * video_device3
ID3D12VideoDevice3 interface.
Definition: d3d12va_encode.h:192
D3D12VAEncodeContext::output_buffer_pool
AVBufferPool * output_buffer_pool
Pool of (reusable) bitstream output buffers.
Definition: d3d12va_encode.h:197
D3D12VAEncodePicture::aligned_header_size
int aligned_header_size
Definition: d3d12va_encode.h:44
D3D12VAEncodeProfile::depth
int depth
Supported bit depth.
Definition: d3d12va_encode.h:71
D3D12VAEncodeContext::gop
D3D12_VIDEO_ENCODER_SEQUENCE_GOP_STRUCTURE gop
Definition: d3d12va_encode.h:264
AVBufferRef
A reference to a data buffer.
Definition: buffer.h:82
AVPacket
This structure stores compressed data.
Definition: packet.h:535
D3D12VAEncodeType::profiles
const D3D12VAEncodeProfile * profiles
List of supported profiles.
Definition: d3d12va_encode.h:273
D3D12VAEncodeContext::explicit_qp
int explicit_qp
Explicitly-set QP, for use with the "qp" options.
Definition: d3d12va_encode.h:169
hwcontext.h
D3D12VAEncodeType
Definition: d3d12va_encode.h:269
hwcontext_d3d12va_internal.h
RC_MODE_CQP
@ RC_MODE_CQP
Definition: d3d12va_encode.h:96
RC_MODE_CBR
@ RC_MODE_CBR
Definition: d3d12va_encode.h:97