FFmpeg
d3d12va_encode_h264.c
Go to the documentation of this file.
1 /*
2  * Direct3D 12 HW acceleration video encoder
3  *
4  * This file is part of FFmpeg.
5  *
6  * FFmpeg is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * FFmpeg is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with FFmpeg; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19  */
20 #include "libavutil/opt.h"
21 #include "libavutil/common.h"
22 #include "libavutil/mem.h"
23 #include "libavutil/pixdesc.h"
25 
26 #include "avcodec.h"
27 #include "cbs.h"
28 #include "cbs_h264.h"
29 #include "hw_base_encode_h264.h"
30 #include "h2645data.h"
31 #include "h264_levels.h"
32 #include "codec_internal.h"
33 #include "d3d12va_encode.h"
34 
35 typedef struct D3D12VAEncodeH264Picture {
39 
40 typedef struct D3D12VAEncodeH264Context {
42 
43  // User options.
44  int qp;
45  int profile;
46  int level;
48 
49  // Writer structures.
52 
56 
57 typedef struct D3D12VAEncodeH264Level {
58  int level;
59  D3D12_VIDEO_ENCODER_LEVELS_H264 d3d12_level;
61 
63  { 10, D3D12_VIDEO_ENCODER_LEVELS_H264_1 },
64  { 11, D3D12_VIDEO_ENCODER_LEVELS_H264_11 },
65  { 12, D3D12_VIDEO_ENCODER_LEVELS_H264_12 },
66  { 13, D3D12_VIDEO_ENCODER_LEVELS_H264_13 },
67  { 20, D3D12_VIDEO_ENCODER_LEVELS_H264_2 },
68  { 21, D3D12_VIDEO_ENCODER_LEVELS_H264_21 },
69  { 22, D3D12_VIDEO_ENCODER_LEVELS_H264_22 },
70  { 30, D3D12_VIDEO_ENCODER_LEVELS_H264_3 },
71  { 31, D3D12_VIDEO_ENCODER_LEVELS_H264_31 },
72  { 32, D3D12_VIDEO_ENCODER_LEVELS_H264_32 },
73  { 40, D3D12_VIDEO_ENCODER_LEVELS_H264_4 },
74  { 41, D3D12_VIDEO_ENCODER_LEVELS_H264_41 },
75  { 42, D3D12_VIDEO_ENCODER_LEVELS_H264_42 },
76  { 50, D3D12_VIDEO_ENCODER_LEVELS_H264_5 },
77  { 51, D3D12_VIDEO_ENCODER_LEVELS_H264_51 },
78  { 52, D3D12_VIDEO_ENCODER_LEVELS_H264_52 },
79  { 60, D3D12_VIDEO_ENCODER_LEVELS_H264_6 },
80  { 61, D3D12_VIDEO_ENCODER_LEVELS_H264_61 },
81  { 62, D3D12_VIDEO_ENCODER_LEVELS_H264_62 },
82 };
83 
84 static const D3D12_VIDEO_ENCODER_PROFILE_H264 profile_main = D3D12_VIDEO_ENCODER_PROFILE_H264_MAIN;
85 static const D3D12_VIDEO_ENCODER_PROFILE_H264 profile_high = D3D12_VIDEO_ENCODER_PROFILE_H264_HIGH;
86 static const D3D12_VIDEO_ENCODER_PROFILE_H264 profile_high_10 = D3D12_VIDEO_ENCODER_PROFILE_H264_HIGH_10;
87 
88 #define D3D_PROFILE_DESC(name) \
89  { sizeof(D3D12_VIDEO_ENCODER_PROFILE_H264), { .pH264Profile = (D3D12_VIDEO_ENCODER_PROFILE_H264 *)&profile_ ## name } }
91  { AV_PROFILE_H264_MAIN, 8, 3, 1, 1, D3D_PROFILE_DESC(main) },
92  { AV_PROFILE_H264_HIGH, 8, 3, 1, 1, D3D_PROFILE_DESC(high) },
93  { AV_PROFILE_H264_HIGH_10, 10, 3, 1, 1, D3D_PROFILE_DESC(high_10) },
95 };
96 
98  char *data, size_t *data_len,
100 {
101  D3D12VAEncodeH264Context *priv = avctx->priv_data;
102  int err;
103 
104  err = ff_cbs_write_fragment_data(priv->cbc, au);
105  if (err < 0) {
106  av_log(avctx, AV_LOG_ERROR, "Failed to write packed header.\n");
107  return err;
108  }
109 
110  if (*data_len < 8 * au->data_size - au->data_bit_padding) {
111  av_log(avctx, AV_LOG_ERROR, "Access unit too large: "
112  "%zu < %zu.\n", *data_len,
113  8 * au->data_size - au->data_bit_padding);
114  return AVERROR(ENOSPC);
115  }
116 
117  memcpy(data, au->data, au->data_size);
118  *data_len = 8 * au->data_size - au->data_bit_padding;
119 
120  return 0;
121 }
122 
125  void *nal_unit)
126 {
127  H264RawNALUnitHeader *header = nal_unit;
128  int err;
129 
130  err = ff_cbs_insert_unit_content(au, -1,
131  header->nal_unit_type, nal_unit, NULL);
132  if (err < 0) {
133  av_log(avctx, AV_LOG_ERROR, "Failed to add NAL unit: "
134  "type = %d.\n", header->nal_unit_type);
135  return err;
136  }
137 
138  return 0;
139 }
140 
142  char *data, size_t *data_len)
143 {
144  D3D12VAEncodeH264Context *priv = avctx->priv_data;
146  int err;
147 
148  err = d3d12va_encode_h264_add_nal(avctx, au, &priv->units.raw_sps);
149  if (err < 0)
150  goto fail;
151 
152  err = d3d12va_encode_h264_add_nal(avctx, au, &priv->units.raw_pps);
153  if (err < 0)
154  goto fail;
155 
156  err = d3d12va_encode_h264_write_access_unit(avctx, data, data_len, au);
157 fail:
158  ff_cbs_fragment_reset(au);
159  return err;
160 }
161 
163 {
164  FFHWBaseEncodeContext *base_ctx = avctx->priv_data;
166  D3D12VAEncodeH264Context *priv = avctx->priv_data;
167  AVD3D12VAFramesContext *hwctx = base_ctx->input_frames->hwctx;
168  H264RawSPS *sps = &priv->units.raw_sps;
169  H264RawPPS *pps = &priv->units.raw_pps;
170  D3D12_VIDEO_ENCODER_PROFILE_H264 profile = D3D12_VIDEO_ENCODER_PROFILE_H264_MAIN;
171  D3D12_VIDEO_ENCODER_LEVELS_H264 level = { 0 };
172  const AVPixFmtDescriptor *desc;
173  HRESULT hr;
174  int err;
175 
176  D3D12_FEATURE_DATA_VIDEO_ENCODER_SUPPORT support = {
177  .NodeIndex = 0,
178  .Codec = D3D12_VIDEO_ENCODER_CODEC_H264,
179  .InputFormat = hwctx->format,
180  .RateControl = ctx->rc,
181  .IntraRefresh = D3D12_VIDEO_ENCODER_INTRA_REFRESH_MODE_NONE,
182  .SubregionFrameEncoding = D3D12_VIDEO_ENCODER_FRAME_SUBREGION_LAYOUT_MODE_FULL_FRAME,
183  .ResolutionsListCount = 1,
184  .pResolutionList = &ctx->resolution,
185  .CodecGopSequence = ctx->gop,
186  .MaxReferenceFramesInDPB = MAX_DPB_SIZE - 1,
187  .CodecConfiguration = ctx->codec_conf,
188  .SuggestedProfile.DataSize = sizeof(D3D12_VIDEO_ENCODER_PROFILE_H264),
189  .SuggestedProfile.pH264Profile = &profile,
190  .SuggestedLevel.DataSize = sizeof(D3D12_VIDEO_ENCODER_LEVELS_H264),
191  .SuggestedLevel.pH264LevelSetting = &level,
192  .pResolutionDependentSupport = &ctx->res_limits,
193  };
194 
195  hr = ID3D12VideoDevice3_CheckFeatureSupport(ctx->video_device3, D3D12_FEATURE_VIDEO_ENCODER_SUPPORT,
196  &support, sizeof(support));
197 
198  if (FAILED(hr)) {
199  av_log(avctx, AV_LOG_ERROR, "Failed to check encoder support(%lx).\n", (long)hr);
200  return AVERROR(EINVAL);
201  }
202 
203  if (!(support.SupportFlags & D3D12_VIDEO_ENCODER_SUPPORT_FLAG_GENERAL_SUPPORT_OK)) {
204  av_log(avctx, AV_LOG_ERROR, "Driver does not support some request features. %#x\n",
205  support.ValidationFlags);
206  return AVERROR(EINVAL);
207  }
208 
209  if (support.SupportFlags & D3D12_VIDEO_ENCODER_SUPPORT_FLAG_RECONSTRUCTED_FRAMES_REQUIRE_TEXTURE_ARRAYS) {
210  ctx->is_texture_array = 1;
211  av_log(avctx, AV_LOG_DEBUG, "D3D12 video encode on this device uses texture array mode.\n");
212  }
213 
215  av_assert0(desc);
216 
217  sps->pic_width_in_mbs_minus1 = ((base_ctx->surface_width + 0x0F) >> 4) - 1;
218  sps->pic_height_in_map_units_minus1 = ((base_ctx->surface_height + 0x0F) >> 4) - 1;
219 
220  priv->unit_opts.mb_width = sps->pic_width_in_mbs_minus1 + 1;
221  priv->unit_opts.mb_height = sps->pic_height_in_map_units_minus1 +1;
222 
223  err = ff_hw_base_encode_init_params_h264(base_ctx, avctx,
224  &priv->units, &priv->unit_opts);
225  if (err < 0)
226  return err;
227 
228  avctx->level = priv->units.raw_sps.level_idc;
229 
230  ctx->gop.pH264GroupOfPictures->pic_order_cnt_type = sps->pic_order_cnt_type;
231 
232  // override the default value according to the gop size
233  sps->log2_max_frame_num_minus4 = FFMAX(av_ceil_log2(base_ctx->gop_size) - 4, 0);
234  ctx->gop.pH264GroupOfPictures->log2_max_frame_num_minus4 = sps->log2_max_frame_num_minus4;
235  pps->deblocking_filter_control_present_flag = 1;
236 
237  return 0;
238 }
239 
241 {
242  HRESULT hr;
243  FFHWBaseEncodeContext *base_ctx = avctx->priv_data;
245  D3D12VAEncodeH264Context *priv = avctx->priv_data;
246 
247  D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION_H264 *config;
248  D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION_SUPPORT_H264 h264_caps;
249 
250  D3D12_FEATURE_DATA_VIDEO_ENCODER_CODEC_CONFIGURATION_SUPPORT codec_caps = {
251  .NodeIndex = 0,
252  .Codec = D3D12_VIDEO_ENCODER_CODEC_H264,
253  .Profile = ctx->profile->d3d12_profile,
254  .CodecSupportLimits.DataSize = sizeof(D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION_SUPPORT_H264),
255  };
256 
257  codec_caps.CodecSupportLimits.pH264Support = &h264_caps;
258  hr = ID3D12VideoDevice3_CheckFeatureSupport(ctx->video_device3, D3D12_FEATURE_VIDEO_ENCODER_CODEC_CONFIGURATION_SUPPORT,
259  &codec_caps, sizeof(codec_caps));
260  if (!(SUCCEEDED(hr) && codec_caps.IsSupported))
261  return AVERROR(EINVAL);
262 
263  ctx->codec_conf.DataSize = sizeof(D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION_H264);
264  ctx->codec_conf.pH264Config = av_mallocz(ctx->codec_conf.DataSize);
265  if (!ctx->codec_conf.pH264Config)
266  return AVERROR(ENOMEM);
267 
268  config = ctx->codec_conf.pH264Config;
269 
270  config->ConfigurationFlags = D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION_H264_FLAG_NONE;
271 
272  if (h264_caps.SupportFlags & D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION_SUPPORT_H264_FLAG_CABAC_ENCODING_SUPPORT) {
273  config->ConfigurationFlags |= D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION_H264_FLAG_ENABLE_CABAC_ENCODING;
274  priv->unit_opts.cabac = 1;
275  }
276 
277  base_ctx->surface_width = FFALIGN(avctx->width, 16);
278  base_ctx->surface_height = FFALIGN(avctx->height, 16);
279 
280  return 0;
281 }
282 
284 {
285  FFHWBaseEncodeContext *base_ctx = avctx->priv_data;
287  D3D12VAEncodeH264Context *priv = avctx->priv_data;
288  int fixed_qp_idr, fixed_qp_p, fixed_qp_b;
289  int err;
290 
291  err = ff_cbs_init(&priv->cbc, AV_CODEC_ID_H264, avctx);
292  if (err < 0)
293  return err;
294 
295  // Rate control
296  if (ctx->rc.Mode == D3D12_VIDEO_ENCODER_RATE_CONTROL_MODE_CQP) {
297  D3D12_VIDEO_ENCODER_RATE_CONTROL_CQP *cqp_ctl;
298  fixed_qp_p = av_clip(ctx->rc_quality, 1, 51);
299  if (avctx->i_quant_factor > 0.0)
300  fixed_qp_idr = av_clip((avctx->i_quant_factor * fixed_qp_p +
301  avctx->i_quant_offset) + 0.5, 1, 51);
302  else
303  fixed_qp_idr = fixed_qp_p;
304  if (avctx->b_quant_factor > 0.0)
305  fixed_qp_b = av_clip((avctx->b_quant_factor * fixed_qp_p +
306  avctx->b_quant_offset) + 0.5, 1, 51);
307  else
308  fixed_qp_b = fixed_qp_p;
309 
310  av_log(avctx, AV_LOG_DEBUG, "Using fixed QP = "
311  "%d / %d / %d for IDR- / P- / B-frames.\n",
312  fixed_qp_idr, fixed_qp_p, fixed_qp_b);
313 
314  ctx->rc.ConfigParams.DataSize = sizeof(D3D12_VIDEO_ENCODER_RATE_CONTROL_CQP);
315  cqp_ctl = av_mallocz(ctx->rc.ConfigParams.DataSize);
316  if (!cqp_ctl)
317  return AVERROR(ENOMEM);
318 
319  cqp_ctl->ConstantQP_FullIntracodedFrame = fixed_qp_idr;
320  cqp_ctl->ConstantQP_InterPredictedFrame_PrevRefOnly = fixed_qp_p;
321  cqp_ctl->ConstantQP_InterPredictedFrame_BiDirectionalRef = fixed_qp_b;
322 
323  ctx->rc.ConfigParams.pConfiguration_CQP = cqp_ctl;
324  }
325  priv->unit_opts.fixed_qp_idr = 26;
326 
327  // GOP
328  ctx->gop.DataSize = sizeof(D3D12_VIDEO_ENCODER_SEQUENCE_GOP_STRUCTURE_H264);
329  ctx->gop.pH264GroupOfPictures = av_mallocz(ctx->gop.DataSize);
330  if (!ctx->gop.pH264GroupOfPictures)
331  return AVERROR(ENOMEM);
332 
333  ctx->gop.pH264GroupOfPictures->GOPLength = base_ctx->gop_size;
334  ctx->gop.pH264GroupOfPictures->PPicturePeriod = base_ctx->b_per_p + 1;
335  ctx->gop.pH264GroupOfPictures->log2_max_frame_num_minus4 = FFMAX(av_ceil_log2(base_ctx->gop_size) - 4, 0);
336 
337  return 0;
338 }
339 
341 {
343  int i;
344 
345  ctx->level.DataSize = sizeof(D3D12_VIDEO_ENCODER_LEVELS_H264);
346  ctx->level.pH264LevelSetting = av_mallocz(ctx->level.DataSize);
347  if (!ctx->level.pH264LevelSetting)
348  return AVERROR(ENOMEM);
349 
350  for (i = 0; i < FF_ARRAY_ELEMS(h264_levels); i++) {
351  if (avctx->level == h264_levels[i].level) {
352  *ctx->level.pH264LevelSetting = h264_levels[i].d3d12_level;
353  break;
354  }
355  }
356 
357  if (i == FF_ARRAY_ELEMS(h264_levels)) {
358  av_log(avctx, AV_LOG_ERROR, "Invalid level %d.\n", avctx->level);
359  return AVERROR(EINVAL);
360  }
361 
362  return 0;
363 }
364 
366 {
367  if (!pic->pic_ctl.pH264PicData)
368  return;
369 
370  av_freep(&pic->pic_ctl.pH264PicData->pList0ReferenceFrames);
371  av_freep(&pic->pic_ctl.pH264PicData->pList1ReferenceFrames);
372  av_freep(&pic->pic_ctl.pH264PicData->pReferenceFramesReconPictureDescriptors);
373  av_freep(&pic->pic_ctl.pH264PicData);
374 }
375 
377  FFHWBaseEncodePicture *base_pic)
378 {
380  D3D12VAEncodePicture *pic = base_pic->priv;
381  D3D12VAEncodeH264Picture *hpic = base_pic->codec_priv;
382  FFHWBaseEncodePicture *prev = base_pic->prev;
383  D3D12VAEncodeH264Picture *hprev = prev ? prev->codec_priv : NULL;
384  D3D12_VIDEO_ENCODER_REFERENCE_PICTURE_DESCRIPTOR_H264 *pd = NULL;
385  UINT *ref_list0 = NULL, *ref_list1 = NULL;
386  int i, idx = 0;
387 
388  pic->pic_ctl.DataSize = sizeof(D3D12_VIDEO_ENCODER_PICTURE_CONTROL_CODEC_DATA_H264);
389  pic->pic_ctl.pH264PicData = av_mallocz(pic->pic_ctl.DataSize);
390  if (!pic->pic_ctl.pH264PicData)
391  return AVERROR(ENOMEM);
392 
393  if (base_pic->type == FF_HW_PICTURE_TYPE_IDR) {
394  av_assert0(base_pic->display_order == base_pic->encode_order);
395  hpic->last_idr_frame = base_pic->display_order;
396  ctx->idr_pic_id++;
397  } else {
398  av_assert0(prev);
399  hpic->last_idr_frame = hprev->last_idr_frame;
400  }
401  hpic->pic_order_cnt = base_pic->display_order - hpic->last_idr_frame;
402 
403  switch(base_pic->type) {
405  pic->pic_ctl.pH264PicData->FrameType = D3D12_VIDEO_ENCODER_FRAME_TYPE_H264_IDR_FRAME;
406  pic->pic_ctl.pH264PicData->idr_pic_id = ctx->idr_pic_id;
407  break;
409  pic->pic_ctl.pH264PicData->FrameType = D3D12_VIDEO_ENCODER_FRAME_TYPE_H264_I_FRAME;
410  break;
412  pic->pic_ctl.pH264PicData->FrameType = D3D12_VIDEO_ENCODER_FRAME_TYPE_H264_P_FRAME;
413  break;
415  pic->pic_ctl.pH264PicData->FrameType = D3D12_VIDEO_ENCODER_FRAME_TYPE_H264_B_FRAME;
416  break;
417  default:
418  av_assert0(0 && "invalid picture type");
419  }
420 
421  pic->pic_ctl.pH264PicData->PictureOrderCountNumber = hpic->pic_order_cnt;
422  pic->pic_ctl.pH264PicData->FrameDecodingOrderNumber = hpic->pic_order_cnt;
423 
424  if (base_pic->type == FF_HW_PICTURE_TYPE_P || base_pic->type == FF_HW_PICTURE_TYPE_B) {
425  pd = av_calloc(MAX_PICTURE_REFERENCES, sizeof(*pd));
426  if (!pd)
427  return AVERROR(ENOMEM);
428 
429  ref_list0 = av_calloc(MAX_PICTURE_REFERENCES, sizeof(*ref_list0));
430  if (!ref_list0)
431  return AVERROR(ENOMEM);
432 
433  pic->pic_ctl.pH264PicData->List0ReferenceFramesCount = base_pic->nb_refs[0];
434  for (i = 0; i < base_pic->nb_refs[0]; i++) {
435  FFHWBaseEncodePicture *ref = base_pic->refs[0][i];
437 
438  av_assert0(ref && ref->encode_order < base_pic->encode_order);
439  href = ref->codec_priv;
440 
441  ref_list0[i] = idx;
442  pd[idx].ReconstructedPictureResourceIndex = idx;
443  pd[idx].PictureOrderCountNumber = href->pic_order_cnt;
444  idx++;
445  }
446  }
447 
448  if (base_pic->type == FF_HW_PICTURE_TYPE_B) {
449  ref_list1 = av_calloc(MAX_PICTURE_REFERENCES, sizeof(*ref_list1));
450  if (!ref_list1)
451  return AVERROR(ENOMEM);
452 
453  pic->pic_ctl.pH264PicData->List1ReferenceFramesCount = base_pic->nb_refs[1];
454  for (i = 0; i < base_pic->nb_refs[1]; i++) {
455  FFHWBaseEncodePicture *ref = base_pic->refs[1][i];
457 
458  av_assert0(ref && ref->encode_order < base_pic->encode_order);
459  href = ref->codec_priv;
460 
461  ref_list1[i] = idx;
462  pd[idx].ReconstructedPictureResourceIndex = idx;
463  pd[idx].PictureOrderCountNumber = href->pic_order_cnt;
464  idx++;
465  }
466  }
467 
468  pic->pic_ctl.pH264PicData->pList0ReferenceFrames = ref_list0;
469  pic->pic_ctl.pH264PicData->pList1ReferenceFrames = ref_list1;
470  pic->pic_ctl.pH264PicData->ReferenceFramesReconPictureDescriptorsCount = idx;
471  pic->pic_ctl.pH264PicData->pReferenceFramesReconPictureDescriptors = pd;
472 
473  return 0;
474 }
475 
478 
479  .d3d12_codec = D3D12_VIDEO_ENCODER_CODEC_H264,
480 
481  .flags = FF_HW_FLAG_B_PICTURES |
484 
485  .default_quality = 25,
486 
487  .get_encoder_caps = &d3d12va_encode_h264_get_encoder_caps,
488 
489  .configure = &d3d12va_encode_h264_configure,
490 
491  .set_level = &d3d12va_encode_h264_set_level,
492 
493  .picture_priv_data_size = sizeof(D3D12VAEncodeH264Picture),
494 
495  .init_sequence_params = &d3d12va_encode_h264_init_sequence_params,
496 
497  .init_picture_params = &d3d12va_encode_h264_init_picture_params,
498 
499  .free_picture_params = &d3d12va_encode_h264_free_picture_params,
500 
502 };
503 
505 {
507  D3D12VAEncodeH264Context *priv = avctx->priv_data;
508 
509  ctx->codec = &d3d12va_encode_type_h264;
510 
511  if (avctx->profile == AV_PROFILE_UNKNOWN)
512  avctx->profile = priv->profile;
513  if (avctx->level == AV_LEVEL_UNKNOWN)
514  avctx->level = priv->level;
515 
516  if (avctx->level != AV_LEVEL_UNKNOWN && avctx->level & ~0xff) {
517  av_log(avctx, AV_LOG_ERROR, "Invalid level %d: must fit "
518  "in 8-bit unsigned integer.\n", avctx->level);
519  return AVERROR(EINVAL);
520  }
521 
522  if (priv->qp > 0)
523  ctx->explicit_qp = priv->qp;
524 
525  return ff_d3d12va_encode_init(avctx);
526 }
527 
529 {
530  D3D12VAEncodeH264Context *priv = avctx->priv_data;
531 
532  ff_cbs_fragment_free(&priv->current_access_unit);
533  ff_cbs_close(&priv->cbc);
534 
535  av_freep(&priv->common.codec_conf.pH264Config);
536  av_freep(&priv->common.gop.pH264GroupOfPictures);
537  av_freep(&priv->common.level.pH264LevelSetting);
538 
539  if (priv->common.rc.ConfigParams.pConfiguration_CQP != NULL) {
540  av_freep(&priv->common.rc.ConfigParams.pConfiguration_CQP);
541  }
542 
543  return ff_d3d12va_encode_close(avctx);
544 }
545 
546 #define OFFSET(x) offsetof(D3D12VAEncodeH264Context, x)
547 #define FLAGS (AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM)
552 
553  { "qp", "Constant QP (for P-frames; scaled by qfactor/qoffset for I/B)",
554  OFFSET(qp), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 52, FLAGS },
555 
556  { "profile", "Set profile (general_profile_idc)",
558  { .i64 = AV_PROFILE_UNKNOWN }, AV_PROFILE_UNKNOWN, 0xff, FLAGS, "profile" },
559 
560 #define PROFILE(name, value) name, NULL, 0, AV_OPT_TYPE_CONST, \
561  { .i64 = value }, 0, 0, FLAGS, "profile"
562  { PROFILE("main", AV_PROFILE_H264_MAIN) },
563  { PROFILE("high", AV_PROFILE_H264_HIGH) },
564  { PROFILE("high10", AV_PROFILE_H264_HIGH_10) },
565 #undef PROFILE
566 
567  { "level", "Set level (general_level_idc)",
569  { .i64 = AV_LEVEL_UNKNOWN }, AV_LEVEL_UNKNOWN, 0xff, FLAGS, "level" },
570 
571 #define LEVEL(name, value) name, NULL, 0, AV_OPT_TYPE_CONST, \
572  { .i64 = value }, 0, 0, FLAGS, "level"
573  { LEVEL("1", 10) },
574  { LEVEL("1.1", 11) },
575  { LEVEL("1.2", 12) },
576  { LEVEL("1.3", 13) },
577  { LEVEL("2", 20) },
578  { LEVEL("2.1", 21) },
579  { LEVEL("2.2", 22) },
580  { LEVEL("3", 30) },
581  { LEVEL("3.1", 31) },
582  { LEVEL("3.2", 32) },
583  { LEVEL("4", 40) },
584  { LEVEL("4.1", 41) },
585  { LEVEL("4.2", 42) },
586  { LEVEL("5", 50) },
587  { LEVEL("5.1", 51) },
588  { LEVEL("5.2", 52) },
589  { LEVEL("6", 60) },
590  { LEVEL("6.1", 61) },
591  { LEVEL("6.2", 62) },
592 #undef LEVEL
593 
594  { NULL },
595 };
596 
598  { "b", "0" },
599  { "bf", "2" },
600  { "g", "120" },
601  { "qmin", "-1" },
602  { "qmax", "-1" },
603  { NULL },
604 };
605 
607  .class_name = "h264_d3d12va",
608  .item_name = av_default_item_name,
609  .option = d3d12va_encode_h264_options,
610  .version = LIBAVUTIL_VERSION_INT,
611 };
612 
614  .p.name = "h264_d3d12va",
615  CODEC_LONG_NAME("D3D12VA h264 encoder"),
616  .p.type = AVMEDIA_TYPE_VIDEO,
617  .p.id = AV_CODEC_ID_H264,
618  .priv_data_size = sizeof(D3D12VAEncodeH264Context),
621  .close = &d3d12va_encode_h264_close,
622  .p.priv_class = &d3d12va_encode_h264_class,
623  .p.capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_HARDWARE |
625  .caps_internal = FF_CODEC_CAP_NOT_INIT_THREADSAFE |
627  .defaults = d3d12va_encode_h264_defaults,
629  .hw_configs = ff_d3d12va_encode_hw_configs,
630  .p.wrapper_name = "d3d12va",
631 };
cbs.h
D3D12VAEncodeH264Context::units
FFHWBaseEncodeH264 units
Definition: d3d12va_encode_h264.c:50
CODEC_PIXFMTS
#define CODEC_PIXFMTS(...)
Definition: codec_internal.h:392
level
uint8_t level
Definition: svq3.c:208
av_clip
#define av_clip
Definition: common.h:100
FF_CODEC_CAP_INIT_CLEANUP
#define FF_CODEC_CAP_INIT_CLEANUP
The codec allows calling the close function for deallocation even if the init function returned a fai...
Definition: codec_internal.h:42
AVERROR
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
opt.h
FFHWBaseEncodeH264Opts
Definition: hw_base_encode_h264.h:34
d3d12va_encode_h264_free_picture_params
static void d3d12va_encode_h264_free_picture_params(D3D12VAEncodePicture *pic)
Definition: d3d12va_encode_h264.c:365
OFFSET
#define OFFSET(x)
Definition: d3d12va_encode_h264.c:546
FFHWBaseEncodePicture::priv
void * priv
Definition: hw_base_encode.h:63
profile_high
static const D3D12_VIDEO_ENCODER_PROFILE_H264 profile_high
Definition: d3d12va_encode_h264.c:85
FFHWBaseEncodePicture::codec_priv
void * codec_priv
Definition: hw_base_encode.h:65
h264_levels.h
D3D12VAEncodeH264Context::idr_pic_id
int idr_pic_id
Definition: d3d12va_encode_h264.c:47
av_pix_fmt_desc_get
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
Definition: pixdesc.c:3456
AV_CODEC_CAP_HARDWARE
#define AV_CODEC_CAP_HARDWARE
Codec is backed by a hardware implementation.
Definition: codec.h:130
AV_PROFILE_H264_MAIN
#define AV_PROFILE_H264_MAIN
Definition: defs.h:112
FF_HW_PICTURE_TYPE_P
@ FF_HW_PICTURE_TYPE_P
Definition: hw_base_encode.h:41
cbs_h264.h
int64_t
long long int64_t
Definition: coverity.c:34
pixdesc.h
CodedBitstreamContext
Context structure for coded bitstream operations.
Definition: cbs.h:226
AVOption
AVOption.
Definition: opt.h:429
d3d12va_encode.h
d3d12va_encode_h264_write_access_unit
static int d3d12va_encode_h264_write_access_unit(AVCodecContext *avctx, char *data, size_t *data_len, CodedBitstreamFragment *au)
Definition: d3d12va_encode_h264.c:97
data
const char data[16]
Definition: mxf.c:149
high
int high
Definition: dovi_rpuenc.c:39
AVCodecContext::b_quant_offset
float b_quant_offset
qscale offset between IP and B-frames
Definition: avcodec.h:785
FF_CODEC_CAP_NOT_INIT_THREADSAFE
#define FF_CODEC_CAP_NOT_INIT_THREADSAFE
The codec is not known to be init-threadsafe (i.e.
Definition: codec_internal.h:34
FFCodec
Definition: codec_internal.h:127
ff_hw_base_encode_init_params_h264
int ff_hw_base_encode_init_params_h264(FFHWBaseEncodeContext *base_ctx, AVCodecContext *avctx, FFHWBaseEncodeH264 *common, FFHWBaseEncodeH264Opts *opts)
Definition: hw_base_encode_h264.c:26
FF_HW_PICTURE_TYPE_I
@ FF_HW_PICTURE_TYPE_I
Definition: hw_base_encode.h:40
D3D12VAEncodeH264Context
Definition: d3d12va_encode_h264.c:40
D3D12VAEncodeH264Context::level
int level
Definition: d3d12va_encode_h264.c:46
FFMAX
#define FFMAX(a, b)
Definition: macros.h:47
FF_HW_FLAG_B_PICTURE_REFERENCES
@ FF_HW_FLAG_B_PICTURE_REFERENCES
Definition: hw_base_encode.h:55
tf_sess_config.config
config
Definition: tf_sess_config.py:33
d3d12va_encode_h264_profiles
static const D3D12VAEncodeProfile d3d12va_encode_h264_profiles[]
Definition: d3d12va_encode_h264.c:90
FFHWBaseEncodeContext
Definition: hw_base_encode.h:122
FF_HW_PICTURE_TYPE_B
@ FF_HW_PICTURE_TYPE_B
Definition: hw_base_encode.h:42
ff_d3d12va_encode_hw_configs
const AVCodecHWConfigInternal *const ff_d3d12va_encode_hw_configs[]
Definition: d3d12va_encode.c:37
AVCodecContext::i_quant_factor
float i_quant_factor
qscale factor between P- and I-frames If > 0 then the last P-frame quantizer will be used (q = lastp_...
Definition: avcodec.h:794
FFCodecDefault
Definition: codec_internal.h:96
FFCodec::p
AVCodec p
The public AVCodec.
Definition: codec_internal.h:131
FFHWBaseEncodePicture::type
int type
Definition: hw_base_encode.h:78
av_ceil_log2
#define av_ceil_log2
Definition: common.h:97
fail
#define fail()
Definition: checkasm.h:208
FFHWBaseEncodeH264
Definition: hw_base_encode_h264.h:25
D3D12VAEncodeH264Context::cbc
CodedBitstreamContext * cbc
Definition: d3d12va_encode_h264.c:53
D3D12VA_ENCODE_RC_OPTIONS
#define D3D12VA_ENCODE_RC_OPTIONS
Definition: d3d12va_encode.h:359
FFHWBaseEncodePicture::prev
struct FFHWBaseEncodePicture * prev
Definition: hw_base_encode.h:101
D3D12VAEncodeH264Picture
Definition: d3d12va_encode_h264.c:35
FFHWBaseEncodeH264Opts::cabac
int cabac
Definition: hw_base_encode_h264.h:41
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:210
FF_ARRAY_ELEMS
#define FF_ARRAY_ELEMS(a)
Definition: sinewin_tablegen.c:29
main
int main
Definition: dovi_rpuenc.c:38
AV_PROFILE_UNKNOWN
#define AV_PROFILE_UNKNOWN
Definition: defs.h:65
D3D12VA_ENCODE_COMMON_OPTIONS
#define D3D12VA_ENCODE_COMMON_OPTIONS
Definition: d3d12va_encode.h:350
CodedBitstreamFragment
Coded bitstream fragment structure, combining one or more units.
Definition: cbs.h:129
d3d12va_encode_h264_add_nal
static int d3d12va_encode_h264_add_nal(AVCodecContext *avctx, CodedBitstreamFragment *au, void *nal_unit)
Definition: d3d12va_encode_h264.c:123
FFHWBaseEncodeH264Opts::fixed_qp_idr
int fixed_qp_idr
Definition: hw_base_encode_h264.h:42
D3D12VAEncodeH264Level::level
int level
Definition: d3d12va_encode_h264.c:58
CodedBitstreamFragment::data_size
size_t data_size
The number of bytes in the bitstream.
Definition: cbs.h:142
D3D12VAEncodeH264Picture::last_idr_frame
int64_t last_idr_frame
Definition: d3d12va_encode_h264.c:37
AV_PROFILE_H264_HIGH_10
#define AV_PROFILE_H264_HIGH_10
Definition: defs.h:115
AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE
#define AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE
This encoder can reorder user opaque values from input AVFrames and return them with corresponding ou...
Definition: codec.h:144
av_assert0
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:41
AV_LOG_DEBUG
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:231
LEVEL
#define LEVEL(name, value)
ctx
AVFormatContext * ctx
Definition: movenc.c:49
D3D12VAEncodeH264Context::common
D3D12VAEncodeContext common
Definition: d3d12va_encode_h264.c:41
D3D12VAEncodePicture::pic_ctl
D3D12_VIDEO_ENCODER_PICTURE_CONTROL_CODEC_DATA pic_ctl
Definition: d3d12va_encode.h:57
CodedBitstreamFragment::data_bit_padding
size_t data_bit_padding
The number of bits which should be ignored in the final byte.
Definition: cbs.h:146
h2645data.h
AV_CODEC_ID_H264
@ AV_CODEC_ID_H264
Definition: codec_id.h:79
CODEC_LONG_NAME
#define CODEC_LONG_NAME(str)
Definition: codec_internal.h:332
FFHWBaseEncodeH264::raw_sps
H264RawSPS raw_sps
Definition: hw_base_encode_h264.h:26
FFHWBaseEncodeContext::b_per_p
int b_per_p
Definition: hw_base_encode.h:189
FLAGS
#define FLAGS
Definition: d3d12va_encode_h264.c:547
LIBAVUTIL_VERSION_INT
#define LIBAVUTIL_VERSION_INT
Definition: version.h:85
AVClass
Describe the class of an AVClass context structure.
Definition: log.h:76
NULL
#define NULL
Definition: coverity.c:32
AVHWFramesContext::sw_format
enum AVPixelFormat sw_format
The pixel format identifying the actual data layout of the hardware frames.
Definition: hwcontext.h:213
hw_base_encode_h264.h
d3d12va_encode_h264_init_picture_params
static int d3d12va_encode_h264_init_picture_params(AVCodecContext *avctx, FFHWBaseEncodePicture *base_pic)
Definition: d3d12va_encode_h264.c:376
AV_LEVEL_UNKNOWN
#define AV_LEVEL_UNKNOWN
Definition: defs.h:209
d3d12va_encode_h264_get_encoder_caps
static int d3d12va_encode_h264_get_encoder_caps(AVCodecContext *avctx)
Definition: d3d12va_encode_h264.c:240
d3d12va_encode_h264_defaults
static const FFCodecDefault d3d12va_encode_h264_defaults[]
Definition: d3d12va_encode_h264.c:597
FF_CODEC_RECEIVE_PACKET_CB
#define FF_CODEC_RECEIVE_PACKET_CB(func)
Definition: codec_internal.h:367
H264RawNALUnitHeader
Definition: cbs_h264.h:31
av_default_item_name
const char * av_default_item_name(void *ptr)
Return the context name.
Definition: log.c:241
PROFILE
#define PROFILE(name, value)
D3D12VAEncodeH264Picture::pic_order_cnt
int pic_order_cnt
Definition: d3d12va_encode_h264.c:36
AVD3D12VAFramesContext
This struct is allocated as AVHWFramesContext.hwctx.
Definition: hwcontext_d3d12va.h:172
AV_PIX_FMT_D3D12
@ AV_PIX_FMT_D3D12
Hardware surfaces for Direct3D 12.
Definition: pixfmt.h:440
AVCodecContext::level
int level
Encoding level descriptor.
Definition: avcodec.h:1628
D3D12VAEncodeH264Context::qp
int qp
Definition: d3d12va_encode_h264.c:44
D3D12VAEncodeContext::rc
D3D12_VIDEO_ENCODER_RATE_CONTROL rc
Definition: d3d12va_encode.h:262
D3D12VAEncodeContext::codec_conf
D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION codec_conf
Definition: d3d12va_encode.h:260
init
int(* init)(AVBSFContext *ctx)
Definition: dts2pts.c:550
AV_CODEC_CAP_DR1
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
Definition: codec.h:52
codec_internal.h
ff_d3d12va_encode_init
int ff_d3d12va_encode_init(AVCodecContext *avctx)
Definition: d3d12va_encode.c:1499
FFHWBaseEncodePicture::nb_refs
int nb_refs[MAX_REFERENCE_LIST_NUM]
Definition: hw_base_encode.h:97
profile_main
static const D3D12_VIDEO_ENCODER_PROFILE_H264 profile_main
Definition: d3d12va_encode_h264.c:84
MAX_DPB_SIZE
#define MAX_DPB_SIZE
Definition: hw_base_encode.h:26
D3D12VAEncodeProfile
Definition: d3d12va_encode.h:62
CodedBitstreamFragment::data
uint8_t * data
Pointer to the bitstream form of this fragment.
Definition: cbs.h:135
d3d12va_encode_h264_write_sequence_header
static int d3d12va_encode_h264_write_sequence_header(AVCodecContext *avctx, char *data, size_t *data_len)
Definition: d3d12va_encode_h264.c:141
ff_h264_d3d12va_encoder
const FFCodec ff_h264_d3d12va_encoder
Definition: d3d12va_encode_h264.c:613
FFHWBaseEncodeH264::raw_pps
H264RawPPS raw_pps
Definition: hw_base_encode_h264.h:27
d3d12va_encode_type_h264
static const D3D12VAEncodeType d3d12va_encode_type_h264
Definition: d3d12va_encode_h264.c:476
header
static const uint8_t header[24]
Definition: sdr2.c:68
FFHWBaseEncodePicture::encode_order
int64_t encode_order
Definition: hw_base_encode.h:70
d3d12va_encode_h264_close
static int d3d12va_encode_h264_close(AVCodecContext *avctx)
Definition: d3d12va_encode_h264.c:528
d3d12va_encode_h264_init_sequence_params
static int d3d12va_encode_h264_init_sequence_params(AVCodecContext *avctx)
Definition: d3d12va_encode_h264.c:162
D3D12VAEncodePicture
Definition: d3d12va_encode.h:42
AVCodecContext::b_quant_factor
float b_quant_factor
qscale factor between IP and B-frames If > 0 then the last P-frame quantizer will be used (q= lastp_q...
Definition: avcodec.h:778
FFHWBaseEncodeH264Opts::mb_height
int mb_height
Definition: hw_base_encode_h264.h:39
D3D12VAEncodeContext::level
D3D12_VIDEO_ENCODER_LEVEL_SETTING level
Definition: d3d12va_encode.h:266
D3D_PROFILE_DESC
#define D3D_PROFILE_DESC(name)
Definition: d3d12va_encode_h264.c:88
d3d12va_encode_h264_init
static int d3d12va_encode_h264_init(AVCodecContext *avctx)
Definition: d3d12va_encode_h264.c:504
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:256
common.h
FF_HW_FLAG_B_PICTURES
@ FF_HW_FLAG_B_PICTURES
Definition: hw_base_encode.h:53
FFHWBaseEncodePicture::refs
struct FFHWBaseEncodePicture * refs[MAX_REFERENCE_LIST_NUM][MAX_PICTURE_REFERENCES]
Definition: hw_base_encode.h:98
av_mallocz
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
Definition: mem.c:256
AVCodec::name
const char * name
Name of the codec implementation.
Definition: codec.h:179
D3D12VAEncodeH264Context::current_access_unit
CodedBitstreamFragment current_access_unit
Definition: d3d12va_encode_h264.c:54
profile
int profile
Definition: mxfenc.c:2297
AVCodecContext::height
int height
Definition: avcodec.h:592
av_calloc
void * av_calloc(size_t nmemb, size_t size)
Definition: mem.c:264
avcodec.h
AVD3D12VAFramesContext::format
DXGI_FORMAT format
DXGI_FORMAT format.
Definition: hwcontext_d3d12va.h:177
FFHWBaseEncodeContext::gop_size
int gop_size
Definition: hw_base_encode.h:184
FFHWBaseEncodePicture
Definition: hw_base_encode.h:61
AVClass::class_name
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
Definition: log.h:81
AVHWFramesContext::hwctx
void * hwctx
The format-specific data, allocated and freed automatically along with this context.
Definition: hwcontext.h:153
sps
static int FUNC() sps(CodedBitstreamContext *ctx, RWContext *rw, H264RawSPS *current)
Definition: cbs_h264_syntax_template.c:260
D3D12VAEncodeContext
Definition: d3d12va_encode.h:146
d3d12va_encode_h264_options
static const AVOption d3d12va_encode_h264_options[]
Definition: d3d12va_encode_h264.c:548
FFHWBaseEncodeContext::surface_height
int surface_height
Definition: hw_base_encode.h:141
AVCodecContext
main external API structure.
Definition: avcodec.h:431
AV_PROFILE_H264_HIGH
#define AV_PROFILE_H264_HIGH
Definition: defs.h:114
write_sequence_header
static int write_sequence_header(AVCodecContext *avctx, FFHWBaseEncodePicture *base_pic, uint8_t *data, size_t *data_len)
Definition: vulkan_encode_av1.c:1095
H264RawSPS::level_idc
uint8_t level_idc
Definition: cbs_h264.h:113
d3d12va_encode_h264_class
static const AVClass d3d12va_encode_h264_class
Definition: d3d12va_encode_h264.c:606
AV_OPT_TYPE_INT
@ AV_OPT_TYPE_INT
Underlying C type is int.
Definition: opt.h:259
AVCodecContext::profile
int profile
profile
Definition: avcodec.h:1618
h264_levels
static const D3D12VAEncodeH264Level h264_levels[]
Definition: d3d12va_encode_h264.c:62
AVCodecContext::i_quant_offset
float i_quant_offset
qscale offset between P and I-frames
Definition: avcodec.h:801
ref
static int ref[MAX_W *MAX_W]
Definition: jpeg2000dwt.c:117
pps
uint64_t pps
Definition: dovi_rpuenc.c:36
FFHWBaseEncodeContext::input_frames
AVHWFramesContext * input_frames
Definition: hw_base_encode.h:153
AV_CODEC_CAP_DELAY
#define AV_CODEC_CAP_DELAY
Encoder or decoder requires flushing with NULL input at the end in order to give the complete and cor...
Definition: codec.h:76
FFHWBaseEncodeH264Opts::mb_width
int mb_width
Definition: hw_base_encode_h264.h:38
D3D12VAEncodeH264Level::d3d12_level
D3D12_VIDEO_ENCODER_LEVELS_H264 d3d12_level
Definition: d3d12va_encode_h264.c:59
FFHWBaseEncodeContext::surface_width
int surface_width
Definition: hw_base_encode.h:140
D3D12VAEncodeContext::gop
D3D12_VIDEO_ENCODER_SEQUENCE_GOP_STRUCTURE gop
Definition: d3d12va_encode.h:264
FF_HW_FLAG_NON_IDR_KEY_PICTURES
@ FF_HW_FLAG_NON_IDR_KEY_PICTURES
Definition: hw_base_encode.h:58
desc
const char * desc
Definition: libsvtav1.c:78
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:200
FF_HW_PICTURE_TYPE_IDR
@ FF_HW_PICTURE_TYPE_IDR
Definition: hw_base_encode.h:39
mem.h
D3D12VAEncodeH264Context::unit_opts
FFHWBaseEncodeH264Opts unit_opts
Definition: d3d12va_encode_h264.c:51
AVPixFmtDescriptor
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
Definition: pixdesc.h:69
ff_d3d12va_encode_close
int ff_d3d12va_encode_close(AVCodecContext *avctx)
Definition: d3d12va_encode.c:1634
FFALIGN
#define FFALIGN(x, a)
Definition: macros.h:78
ff_d3d12va_encode_receive_packet
int ff_d3d12va_encode_receive_packet(AVCodecContext *avctx, AVPacket *pkt)
Definition: d3d12va_encode.c:1494
AVCodecContext::priv_data
void * priv_data
Definition: avcodec.h:458
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:35
D3D12VAEncodeType::profiles
const D3D12VAEncodeProfile * profiles
List of supported profiles.
Definition: d3d12va_encode.h:275
AVCodecContext::width
int width
picture width / height.
Definition: avcodec.h:592
d3d12va_encode_h264_set_level
static int d3d12va_encode_h264_set_level(AVCodecContext *avctx)
Definition: d3d12va_encode_h264.c:340
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
D3D12VAEncodeH264Level
Definition: d3d12va_encode_h264.c:57
profile_high_10
static const D3D12_VIDEO_ENCODER_PROFILE_H264 profile_high_10
Definition: d3d12va_encode_h264.c:86
HW_BASE_ENCODE_COMMON_OPTIONS
#define HW_BASE_ENCODE_COMMON_OPTIONS
Definition: hw_base_encode.h:243
d3d12va_encode_h264_configure
static int d3d12va_encode_h264_configure(AVCodecContext *avctx)
Definition: d3d12va_encode_h264.c:283
D3D12VAEncodeType
Definition: d3d12va_encode.h:271
hwcontext_d3d12va_internal.h
FFHWBaseEncodePicture::display_order
int64_t display_order
Definition: hw_base_encode.h:69
D3D12VAEncodeH264Context::profile
int profile
Definition: d3d12va_encode_h264.c:45
MAX_PICTURE_REFERENCES
#define MAX_PICTURE_REFERENCES
Definition: hw_base_encode.h:27
H264RawSPS
Definition: cbs_h264.h:102
H264RawPPS
Definition: cbs_h264.h:171