FFmpeg
d3d12va_encode_hevc.c
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 #include "libavutil/opt.h"
23 #include "libavutil/common.h"
24 #include "libavutil/mem.h"
25 #include "libavutil/pixdesc.h"
27 
28 #include "avcodec.h"
29 #include "cbs.h"
30 #include "cbs_h265.h"
31 #include "hw_base_encode_h265.h"
32 #include "h2645data.h"
33 #include "h265_profile_level.h"
34 #include "codec_internal.h"
35 #include "d3d12va_encode.h"
36 
37 typedef struct D3D12VAEncodeHEVCPicture {
41 
42 typedef struct D3D12VAEncodeHEVCContext {
44 
45  // User options.
46  int qp;
47  int profile;
48  int level;
50 
51  // Writer structures.
54 
58 
59 typedef struct D3D12VAEncodeHEVCLevel {
60  int level;
61  D3D12_VIDEO_ENCODER_LEVELS_HEVC d3d12_level;
63 
64 static const D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION_SUPPORT_HEVC hevc_config_support_sets[] =
65 {
66  {
67  D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION_SUPPORT_HEVC_FLAG_NONE,
68  D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION_HEVC_CUSIZE_8x8,
69  D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION_HEVC_CUSIZE_32x32,
70  D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION_HEVC_TUSIZE_4x4,
71  D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION_HEVC_TUSIZE_32x32,
72  3,
73  3,
74  },
75  {
76  D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION_SUPPORT_HEVC_FLAG_NONE,
77  D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION_HEVC_CUSIZE_8x8,
78  D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION_HEVC_CUSIZE_32x32,
79  D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION_HEVC_TUSIZE_4x4,
80  D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION_HEVC_TUSIZE_32x32,
81  0,
82  0,
83  },
84  {
85  D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION_SUPPORT_HEVC_FLAG_NONE,
86  D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION_HEVC_CUSIZE_8x8,
87  D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION_HEVC_CUSIZE_32x32,
88  D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION_HEVC_TUSIZE_4x4,
89  D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION_HEVC_TUSIZE_32x32,
90  2,
91  2,
92  },
93  {
94  D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION_SUPPORT_HEVC_FLAG_NONE,
95  D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION_HEVC_CUSIZE_8x8,
96  D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION_HEVC_CUSIZE_64x64,
97  D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION_HEVC_TUSIZE_4x4,
98  D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION_HEVC_TUSIZE_32x32,
99  2,
100  2,
101  },
102  {
103  D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION_SUPPORT_HEVC_FLAG_NONE,
104  D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION_HEVC_CUSIZE_8x8,
105  D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION_HEVC_CUSIZE_64x64,
106  D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION_HEVC_TUSIZE_4x4,
107  D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION_HEVC_TUSIZE_32x32,
108  4,
109  4,
110  },
111 };
112 
114  { 30, D3D12_VIDEO_ENCODER_LEVELS_HEVC_1 },
115  { 60, D3D12_VIDEO_ENCODER_LEVELS_HEVC_2 },
116  { 63, D3D12_VIDEO_ENCODER_LEVELS_HEVC_21 },
117  { 90, D3D12_VIDEO_ENCODER_LEVELS_HEVC_3 },
118  { 93, D3D12_VIDEO_ENCODER_LEVELS_HEVC_31 },
119  { 120, D3D12_VIDEO_ENCODER_LEVELS_HEVC_4 },
120  { 123, D3D12_VIDEO_ENCODER_LEVELS_HEVC_41 },
121  { 150, D3D12_VIDEO_ENCODER_LEVELS_HEVC_5 },
122  { 153, D3D12_VIDEO_ENCODER_LEVELS_HEVC_51 },
123  { 156, D3D12_VIDEO_ENCODER_LEVELS_HEVC_52 },
124  { 180, D3D12_VIDEO_ENCODER_LEVELS_HEVC_6 },
125  { 183, D3D12_VIDEO_ENCODER_LEVELS_HEVC_61 },
126  { 186, D3D12_VIDEO_ENCODER_LEVELS_HEVC_62 },
127 };
128 
129 static const D3D12_VIDEO_ENCODER_PROFILE_HEVC profile_main = D3D12_VIDEO_ENCODER_PROFILE_HEVC_MAIN;
130 static const D3D12_VIDEO_ENCODER_PROFILE_HEVC profile_main10 = D3D12_VIDEO_ENCODER_PROFILE_HEVC_MAIN10;
131 
132 #define D3D_PROFILE_DESC(name) \
133  { sizeof(D3D12_VIDEO_ENCODER_PROFILE_HEVC), { .pHEVCProfile = (D3D12_VIDEO_ENCODER_PROFILE_HEVC *)&profile_ ## name } }
135  { AV_PROFILE_HEVC_MAIN, 8, 3, 1, 1, D3D_PROFILE_DESC(main) },
136  { AV_PROFILE_HEVC_MAIN_10, 10, 3, 1, 1, D3D_PROFILE_DESC(main10) },
137  { AV_PROFILE_UNKNOWN },
138 };
139 
140 static uint8_t d3d12va_encode_hevc_map_cusize(D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION_HEVC_CUSIZE cusize)
141 {
142  switch (cusize) {
143  case D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION_HEVC_CUSIZE_8x8: return 8;
144  case D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION_HEVC_CUSIZE_16x16: return 16;
145  case D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION_HEVC_CUSIZE_32x32: return 32;
146  case D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION_HEVC_CUSIZE_64x64: return 64;
147  default: av_assert0(0);
148  }
149  return 0;
150 }
151 
152 static uint8_t d3d12va_encode_hevc_map_tusize(D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION_HEVC_TUSIZE tusize)
153 {
154  switch (tusize) {
155  case D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION_HEVC_TUSIZE_4x4: return 4;
156  case D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION_HEVC_TUSIZE_8x8: return 8;
157  case D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION_HEVC_TUSIZE_16x16: return 16;
158  case D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION_HEVC_TUSIZE_32x32: return 32;
159  default: av_assert0(0);
160  }
161  return 0;
162 }
163 
165  char *data, size_t *data_len,
167 {
168  D3D12VAEncodeHEVCContext *priv = avctx->priv_data;
169  int err;
170 
171  err = ff_cbs_write_fragment_data(priv->cbc, au);
172  if (err < 0) {
173  av_log(avctx, AV_LOG_ERROR, "Failed to write packed header.\n");
174  return err;
175  }
176 
177  if (*data_len < 8 * au->data_size - au->data_bit_padding) {
178  av_log(avctx, AV_LOG_ERROR, "Access unit too large: "
179  "%zu < %zu.\n", *data_len,
180  8 * au->data_size - au->data_bit_padding);
181  return AVERROR(ENOSPC);
182  }
183 
184  memcpy(data, au->data, au->data_size);
185  *data_len = 8 * au->data_size - au->data_bit_padding;
186 
187  return 0;
188 }
189 
192  void *nal_unit)
193 {
194  H265RawNALUnitHeader *header = nal_unit;
195  int err;
196 
197  err = ff_cbs_insert_unit_content(au, -1,
198  header->nal_unit_type, nal_unit, NULL);
199  if (err < 0) {
200  av_log(avctx, AV_LOG_ERROR, "Failed to add NAL unit: "
201  "type = %d.\n", header->nal_unit_type);
202  return err;
203  }
204 
205  return 0;
206 }
207 
209  char *data, size_t *data_len)
210 {
211  D3D12VAEncodeHEVCContext *priv = avctx->priv_data;
213  int err;
214 
215  err = d3d12va_encode_hevc_add_nal(avctx, au, &priv->units.raw_vps);
216  if (err < 0)
217  goto fail;
218 
219  err = d3d12va_encode_hevc_add_nal(avctx, au, &priv->units.raw_sps);
220  if (err < 0)
221  goto fail;
222 
223  err = d3d12va_encode_hevc_add_nal(avctx, au, &priv->units.raw_pps);
224  if (err < 0)
225  goto fail;
226 
227  err = d3d12va_encode_hevc_write_access_unit(avctx, data, data_len, au);
228 fail:
229  ff_cbs_fragment_reset(au);
230  return err;
231 
232 }
233 
235 {
236  FFHWBaseEncodeContext *base_ctx = avctx->priv_data;
238  D3D12VAEncodeHEVCContext *priv = avctx->priv_data;
239  AVD3D12VAFramesContext *hwctx = base_ctx->input_frames->hwctx;
240  H265RawSPS *sps = &priv->units.raw_sps;
241  H265RawPPS *pps = &priv->units.raw_pps;
242  D3D12_VIDEO_ENCODER_PROFILE_HEVC profile = D3D12_VIDEO_ENCODER_PROFILE_HEVC_MAIN;
243  D3D12_VIDEO_ENCODER_LEVEL_TIER_CONSTRAINTS_HEVC level = { 0 };
244  const AVPixFmtDescriptor *desc;
245  uint8_t min_cu_size, max_cu_size, min_tu_size, max_tu_size;
246  HRESULT hr;
247  int err;
248 
249  D3D12_FEATURE_DATA_VIDEO_ENCODER_SUPPORT support = {
250  .NodeIndex = 0,
251  .Codec = D3D12_VIDEO_ENCODER_CODEC_HEVC,
252  .InputFormat = hwctx->format,
253  .RateControl = ctx->rc,
254  .IntraRefresh = ctx->intra_refresh.Mode,
255  .SubregionFrameEncoding = D3D12_VIDEO_ENCODER_FRAME_SUBREGION_LAYOUT_MODE_FULL_FRAME,
256  .ResolutionsListCount = 1,
257  .pResolutionList = &ctx->resolution,
258  .CodecGopSequence = ctx->gop,
259  .MaxReferenceFramesInDPB = MAX_DPB_SIZE - 1,
260  .CodecConfiguration = ctx->codec_conf,
261  .SuggestedProfile.DataSize = sizeof(D3D12_VIDEO_ENCODER_PROFILE_HEVC),
262  .SuggestedProfile.pHEVCProfile = &profile,
263  .SuggestedLevel.DataSize = sizeof(D3D12_VIDEO_ENCODER_LEVEL_TIER_CONSTRAINTS_HEVC),
264  .SuggestedLevel.pHEVCLevelSetting = &level,
265  .pResolutionDependentSupport = &ctx->res_limits,
266  };
267 
268  hr = ID3D12VideoDevice3_CheckFeatureSupport(ctx->video_device3, D3D12_FEATURE_VIDEO_ENCODER_SUPPORT,
269  &support, sizeof(support));
270 
271  if (FAILED(hr)) {
272  av_log(avctx, AV_LOG_ERROR, "Failed to check encoder support(%lx).\n", (long)hr);
273  return AVERROR(EINVAL);
274  }
275 
276  if (!(support.SupportFlags & D3D12_VIDEO_ENCODER_SUPPORT_FLAG_GENERAL_SUPPORT_OK)) {
277  av_log(avctx, AV_LOG_ERROR, "Driver does not support requested features. ValidationFlags: %#x\n",
278  support.ValidationFlags);
279  ff_d3d12va_encode_check_encoder_feature_flags(avctx, support.ValidationFlags);
280  return AVERROR(EINVAL);
281  }
282 
283  if (support.SupportFlags & D3D12_VIDEO_ENCODER_SUPPORT_FLAG_RECONSTRUCTED_FRAMES_REQUIRE_TEXTURE_ARRAYS) {
284  ctx->is_texture_array = 1;
285  av_log(avctx, AV_LOG_DEBUG, "D3D12 video encode on this device uses texture array mode.\n");
286  }
287 
288  // Check if the configuration with DELTA_QP is supported
289  if (support.SupportFlags & D3D12_VIDEO_ENCODER_SUPPORT_FLAG_RATE_CONTROL_DELTA_QP_AVAILABLE) {
290  base_ctx->roi_allowed = 1;
291  // Store the QP map region size from resolution limits
292  ctx->qp_map_region_size = ctx->res_limits.QPMapRegionPixelsSize;
293  av_log(avctx, AV_LOG_DEBUG, "ROI encoding is supported via delta QP "
294  "(QP map region size: %d pixels).\n", ctx->qp_map_region_size);
295  } else {
296  base_ctx->roi_allowed = 0;
297  av_log(avctx, AV_LOG_DEBUG, "ROI encoding not supported by hardware for current rate control mode \n");
298  }
299 
300  // Check motion estimation precision mode support
301  if (ctx->me_precision != D3D12_VIDEO_ENCODER_MOTION_ESTIMATION_PRECISION_MODE_MAXIMUM) {
302  if (!(support.SupportFlags & D3D12_VIDEO_ENCODER_SUPPORT_FLAG_MOTION_ESTIMATION_PRECISION_MODE_LIMIT_AVAILABLE)) {
303  av_log(avctx, AV_LOG_ERROR, "Hardware does not support motion estimation "
304  "precision mode limits.\n");
305  return AVERROR(ENOTSUP);
306  }
307  av_log(avctx, AV_LOG_VERBOSE, "Hardware supports motion estimation "
308  "precision mode limits.\n");
309  }
310 
312  av_assert0(desc);
313 
314  min_cu_size = d3d12va_encode_hevc_map_cusize(ctx->codec_conf.pHEVCConfig->MinLumaCodingUnitSize);
315  max_cu_size = d3d12va_encode_hevc_map_cusize(ctx->codec_conf.pHEVCConfig->MaxLumaCodingUnitSize);
316  min_tu_size = d3d12va_encode_hevc_map_tusize(ctx->codec_conf.pHEVCConfig->MinLumaTransformUnitSize);
317  max_tu_size = d3d12va_encode_hevc_map_tusize(ctx->codec_conf.pHEVCConfig->MaxLumaTransformUnitSize);
318 
319  // cu_qp_delta always required to be 1 in https://github.com/microsoft/DirectX-Specs/blob/master/d3d/D3D12VideoEncoding.md
321  priv->unit_opts.nb_slices = 1;
322 
323  err = ff_hw_base_encode_init_params_h265(base_ctx, avctx,
324  &priv->units, &priv->unit_opts);
325  if (err < 0)
326  return err;
327 
329 
330  av_assert0(ctx->res_limits.SubregionBlockPixelsSize % min_cu_size == 0);
331 
332  sps->pic_width_in_luma_samples = FFALIGN(base_ctx->surface_width,
333  ctx->res_limits.SubregionBlockPixelsSize);
334  sps->pic_height_in_luma_samples = FFALIGN(base_ctx->surface_height,
335  ctx->res_limits.SubregionBlockPixelsSize);
336 
337  if (avctx->width != sps->pic_width_in_luma_samples ||
338  avctx->height != sps->pic_height_in_luma_samples) {
339  sps->conformance_window_flag = 1;
340  sps->conf_win_left_offset = 0;
341  sps->conf_win_right_offset =
342  (sps->pic_width_in_luma_samples - avctx->width) >> desc->log2_chroma_w;
343  sps->conf_win_top_offset = 0;
344  sps->conf_win_bottom_offset =
345  (sps->pic_height_in_luma_samples - avctx->height) >> desc->log2_chroma_h;
346  } else {
347  sps->conformance_window_flag = 0;
348  }
349 
350  sps->log2_max_pic_order_cnt_lsb_minus4 = ctx->gop.pHEVCGroupOfPictures->log2_max_pic_order_cnt_lsb_minus4;
351 
352  sps->log2_min_luma_coding_block_size_minus3 = (uint8_t)(av_log2(min_cu_size) - 3);
353  sps->log2_diff_max_min_luma_coding_block_size = (uint8_t)(av_log2(max_cu_size) - av_log2(min_cu_size));
354  sps->log2_min_luma_transform_block_size_minus2 = (uint8_t)(av_log2(min_tu_size) - 2);
355  sps->log2_diff_max_min_luma_transform_block_size = (uint8_t)(av_log2(max_tu_size) - av_log2(min_tu_size));
356 
357  sps->max_transform_hierarchy_depth_inter = ctx->codec_conf.pHEVCConfig->max_transform_hierarchy_depth_inter;
358  sps->max_transform_hierarchy_depth_intra = ctx->codec_conf.pHEVCConfig->max_transform_hierarchy_depth_intra;
359 
360  sps->amp_enabled_flag = !!(ctx->codec_conf.pHEVCConfig->ConfigurationFlags &
361  D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION_HEVC_FLAG_USE_ASYMETRIC_MOTION_PARTITION);
362  sps->sample_adaptive_offset_enabled_flag = !!(ctx->codec_conf.pHEVCConfig->ConfigurationFlags &
363  D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION_HEVC_FLAG_ENABLE_SAO_FILTER);
364 
365  pps->cabac_init_present_flag = 1;
366 
367  pps->init_qp_minus26 = 0;
368 
369  pps->transform_skip_enabled_flag = !!(ctx->codec_conf.pHEVCConfig->ConfigurationFlags &
370  D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION_HEVC_FLAG_ENABLE_TRANSFORM_SKIPPING);
371 
372  pps->pps_slice_chroma_qp_offsets_present_flag = 1;
373 
374  pps->tiles_enabled_flag = 0; // no tiling in D3D12
375 
376  pps->pps_loop_filter_across_slices_enabled_flag = !(ctx->codec_conf.pHEVCConfig->ConfigurationFlags &
377  D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION_HEVC_FLAG_DISABLE_LOOP_FILTER_ACROSS_SLICES);
378 
379  pps->deblocking_filter_control_present_flag = 1;
380  pps->constrained_intra_pred_flag = priv->constrained_intra_pred;
381 
382  return 0;
383 }
384 
386 {
387  int i;
388  HRESULT hr;
389  uint8_t min_cu_size, max_cu_size;
390  FFHWBaseEncodeContext *base_ctx = avctx->priv_data;
392  D3D12VAEncodeHEVCContext *priv = avctx->priv_data;
393  D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION_HEVC *config;
394  D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION_SUPPORT_HEVC hevc_caps;
395 
396  D3D12_FEATURE_DATA_VIDEO_ENCODER_CODEC_CONFIGURATION_SUPPORT codec_caps = {
397  .NodeIndex = 0,
398  .Codec = D3D12_VIDEO_ENCODER_CODEC_HEVC,
399  .Profile = ctx->profile->d3d12_profile,
400  .CodecSupportLimits.DataSize = sizeof(D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION_SUPPORT_HEVC),
401  };
402 
403  for (i = 0; i < FF_ARRAY_ELEMS(hevc_config_support_sets); i++) {
404  hevc_caps = hevc_config_support_sets[i];
405  codec_caps.CodecSupportLimits.pHEVCSupport = &hevc_caps;
406  hr = ID3D12VideoDevice3_CheckFeatureSupport(ctx->video_device3, D3D12_FEATURE_VIDEO_ENCODER_CODEC_CONFIGURATION_SUPPORT,
407  &codec_caps, sizeof(codec_caps));
408  if (SUCCEEDED(hr) && codec_caps.IsSupported)
409  break;
410  }
411 
413  av_log(avctx, AV_LOG_ERROR, "Unsupported codec configuration\n");
414  return AVERROR(EINVAL);
415  }
416 
417  ctx->codec_conf.DataSize = sizeof(D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION_HEVC);
418  ctx->codec_conf.pHEVCConfig = av_mallocz(ctx->codec_conf.DataSize);
419  if (!ctx->codec_conf.pHEVCConfig)
420  return AVERROR(ENOMEM);
421 
422  config = ctx->codec_conf.pHEVCConfig;
423 
424  config->ConfigurationFlags = D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION_HEVC_FLAG_NONE;
425  config->MinLumaCodingUnitSize = hevc_caps.MinLumaCodingUnitSize;
426  config->MaxLumaCodingUnitSize = hevc_caps.MaxLumaCodingUnitSize;
427  config->MinLumaTransformUnitSize = hevc_caps.MinLumaTransformUnitSize;
428  config->MaxLumaTransformUnitSize = hevc_caps.MaxLumaTransformUnitSize;
429  config->max_transform_hierarchy_depth_inter = hevc_caps.max_transform_hierarchy_depth_inter;
430  config->max_transform_hierarchy_depth_intra = hevc_caps.max_transform_hierarchy_depth_intra;
431 
432  if (hevc_caps.SupportFlags & D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION_SUPPORT_HEVC_FLAG_ASYMETRIC_MOTION_PARTITION_SUPPORT ||
433  hevc_caps.SupportFlags & D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION_SUPPORT_HEVC_FLAG_ASYMETRIC_MOTION_PARTITION_REQUIRED)
434  config->ConfigurationFlags |= D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION_HEVC_FLAG_USE_ASYMETRIC_MOTION_PARTITION;
435 
436  if (hevc_caps.SupportFlags & D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION_SUPPORT_HEVC_FLAG_SAO_FILTER_SUPPORT)
437  config->ConfigurationFlags |= D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION_HEVC_FLAG_ENABLE_SAO_FILTER;
438 
439  if (hevc_caps.SupportFlags & D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION_SUPPORT_HEVC_FLAG_DISABLING_LOOP_FILTER_ACROSS_SLICES_SUPPORT)
440  config->ConfigurationFlags |= D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION_HEVC_FLAG_DISABLE_LOOP_FILTER_ACROSS_SLICES;
441 
442  if (hevc_caps.SupportFlags & D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION_SUPPORT_HEVC_FLAG_TRANSFORM_SKIP_SUPPORT)
443  config->ConfigurationFlags |= D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION_HEVC_FLAG_ENABLE_TRANSFORM_SKIPPING;
444 
445  // Constrained intra prediction configuration
446  if (priv->constrained_intra_pred) {
447  if (hevc_caps.SupportFlags & D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION_SUPPORT_HEVC_FLAG_CONSTRAINED_INTRAPREDICTION_SUPPORT) {
448  config->ConfigurationFlags |= D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION_HEVC_FLAG_USE_CONSTRAINED_INTRAPREDICTION;
449  } else {
450  av_log(avctx, AV_LOG_WARNING, "Constrained intra prediction is not supported by the driver, disabling.\n");
451  priv->constrained_intra_pred = 0;
452  }
453  }
454 
455  if (hevc_caps.SupportFlags & D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION_SUPPORT_HEVC_FLAG_P_FRAMES_IMPLEMENTED_AS_LOW_DELAY_B_FRAMES)
456  ctx->bi_not_empty = 1;
457 
458  // block sizes
459  min_cu_size = d3d12va_encode_hevc_map_cusize(hevc_caps.MinLumaCodingUnitSize);
460  max_cu_size = d3d12va_encode_hevc_map_cusize(hevc_caps.MaxLumaCodingUnitSize);
461 
462  av_log(avctx, AV_LOG_VERBOSE, "Using CTU size %dx%d, "
463  "min CB size %dx%d.\n", max_cu_size, max_cu_size,
464  min_cu_size, min_cu_size);
465 
466  base_ctx->surface_width = FFALIGN(avctx->width, min_cu_size);
467  base_ctx->surface_height = FFALIGN(avctx->height, min_cu_size);
468 
469  return 0;
470 }
471 
473 {
474  FFHWBaseEncodeContext *base_ctx = avctx->priv_data;
476  D3D12VAEncodeHEVCContext *priv = avctx->priv_data;
477  int fixed_qp_idr, fixed_qp_p, fixed_qp_b;
478  int err;
479 
480  err = ff_cbs_init(&priv->cbc, AV_CODEC_ID_HEVC, avctx);
481  if (err < 0)
482  return err;
483 
484  // Rate control
485  if (ctx->rc.Mode == D3D12_VIDEO_ENCODER_RATE_CONTROL_MODE_CQP) {
486  D3D12_VIDEO_ENCODER_RATE_CONTROL_CQP *cqp_ctl;
487  fixed_qp_p = av_clip(ctx->rc_quality, 1, 51);
488  if (avctx->i_quant_factor > 0.0)
489  fixed_qp_idr = av_clip((avctx->i_quant_factor * fixed_qp_p +
490  avctx->i_quant_offset) + 0.5, 1, 51);
491  else
492  fixed_qp_idr = fixed_qp_p;
493  if (avctx->b_quant_factor > 0.0)
494  fixed_qp_b = av_clip((avctx->b_quant_factor * fixed_qp_p +
495  avctx->b_quant_offset) + 0.5, 1, 51);
496  else
497  fixed_qp_b = fixed_qp_p;
498 
499  av_log(avctx, AV_LOG_DEBUG, "Using fixed QP = "
500  "%d / %d / %d for IDR- / P- / B-frames.\n",
501  fixed_qp_idr, fixed_qp_p, fixed_qp_b);
502 
503  ctx->rc.ConfigParams.DataSize = sizeof(D3D12_VIDEO_ENCODER_RATE_CONTROL_CQP);
504  cqp_ctl = av_mallocz(ctx->rc.ConfigParams.DataSize);
505  if (!cqp_ctl)
506  return AVERROR(ENOMEM);
507 
508  cqp_ctl->ConstantQP_FullIntracodedFrame = fixed_qp_idr;
509  cqp_ctl->ConstantQP_InterPredictedFrame_PrevRefOnly = fixed_qp_p;
510  cqp_ctl->ConstantQP_InterPredictedFrame_BiDirectionalRef = fixed_qp_b;
511 
512  ctx->rc.ConfigParams.pConfiguration_CQP = cqp_ctl;
513  }
514 
515  // GOP
516  ctx->gop.DataSize = sizeof(D3D12_VIDEO_ENCODER_SEQUENCE_GOP_STRUCTURE_HEVC);
517  ctx->gop.pHEVCGroupOfPictures = av_mallocz(ctx->gop.DataSize);
518  if (!ctx->gop.pHEVCGroupOfPictures)
519  return AVERROR(ENOMEM);
520 
521  ctx->gop.pHEVCGroupOfPictures->GOPLength = base_ctx->gop_size;
522  ctx->gop.pHEVCGroupOfPictures->PPicturePeriod = base_ctx->b_per_p + 1;
523  // Power of 2
524  if (base_ctx->gop_size & base_ctx->gop_size - 1 == 0)
525  ctx->gop.pHEVCGroupOfPictures->log2_max_pic_order_cnt_lsb_minus4 =
526  FFMAX(av_log2(base_ctx->gop_size) - 4, 0);
527  else
528  ctx->gop.pHEVCGroupOfPictures->log2_max_pic_order_cnt_lsb_minus4 =
529  FFMAX(av_log2(base_ctx->gop_size) - 3, 0);
530 
531  return 0;
532 }
533 
535 {
537  D3D12VAEncodeHEVCContext *priv = avctx->priv_data;
538  int i;
539 
540  ctx->level.DataSize = sizeof(D3D12_VIDEO_ENCODER_LEVEL_TIER_CONSTRAINTS_HEVC);
541  ctx->level.pHEVCLevelSetting = av_mallocz(ctx->level.DataSize);
542  if (!ctx->level.pHEVCLevelSetting)
543  return AVERROR(ENOMEM);
544 
545  for (i = 0; i < FF_ARRAY_ELEMS(hevc_levels); i++) {
546  if (avctx->level == hevc_levels[i].level) {
547  ctx->level.pHEVCLevelSetting->Level = hevc_levels[i].d3d12_level;
548  break;
549  }
550  }
551 
552  if (i == FF_ARRAY_ELEMS(hevc_levels)) {
553  av_log(avctx, AV_LOG_ERROR, "Invalid level %d.\n", avctx->level);
554  return AVERROR(EINVAL);
555  }
556 
557  ctx->level.pHEVCLevelSetting->Tier = priv->units.raw_vps.profile_tier_level.general_tier_flag == 0 ?
558  D3D12_VIDEO_ENCODER_TIER_HEVC_MAIN :
559  D3D12_VIDEO_ENCODER_TIER_HEVC_HIGH;
560 
561  return 0;
562 }
563 
565 {
566  if (!pic->pic_ctl.pHEVCPicData)
567  return;
568 
569  av_freep(&pic->pic_ctl.pHEVCPicData->pList0ReferenceFrames);
570  av_freep(&pic->pic_ctl.pHEVCPicData->pList1ReferenceFrames);
571  av_freep(&pic->pic_ctl.pHEVCPicData->pReferenceFramesReconPictureDescriptors);
572  av_freep(&pic->pic_ctl.pHEVCPicData);
573 }
574 
576  FFHWBaseEncodePicture *base_pic)
577 {
578  FFHWBaseEncodeContext *base_ctx = avctx->priv_data;
579  D3D12VAEncodePicture *pic = base_pic->priv;
580  D3D12VAEncodeHEVCPicture *hpic = base_pic->codec_priv;
581  FFHWBaseEncodePicture *prev = base_pic->prev;
582  D3D12VAEncodeHEVCPicture *hprev = prev ? prev->codec_priv : NULL;
583  D3D12_VIDEO_ENCODER_REFERENCE_PICTURE_DESCRIPTOR_HEVC *pd = NULL;
584  UINT *ref_list0 = NULL, *ref_list1 = NULL;
585  int i, idx = 0;
586 
587  pic->pic_ctl.DataSize = sizeof(D3D12_VIDEO_ENCODER_PICTURE_CONTROL_CODEC_DATA_HEVC);
588  pic->pic_ctl.pHEVCPicData = av_mallocz(pic->pic_ctl.DataSize);
589  if (!pic->pic_ctl.pHEVCPicData)
590  return AVERROR(ENOMEM);
591 
592  if (base_pic->type == FF_HW_PICTURE_TYPE_IDR) {
593  av_assert0(base_pic->display_order == base_pic->encode_order);
594  hpic->last_idr_frame = base_pic->display_order;
595  } else {
596  av_assert0(prev);
597  hpic->last_idr_frame = hprev->last_idr_frame;
598  }
599  hpic->pic_order_cnt = base_pic->display_order - hpic->last_idr_frame;
600 
601  switch(base_pic->type) {
603  pic->pic_ctl.pHEVCPicData->FrameType = D3D12_VIDEO_ENCODER_FRAME_TYPE_HEVC_IDR_FRAME;
604  break;
606  pic->pic_ctl.pHEVCPicData->FrameType = D3D12_VIDEO_ENCODER_FRAME_TYPE_HEVC_I_FRAME;
607  break;
609  pic->pic_ctl.pHEVCPicData->FrameType = D3D12_VIDEO_ENCODER_FRAME_TYPE_HEVC_P_FRAME;
610  break;
612  pic->pic_ctl.pHEVCPicData->FrameType = D3D12_VIDEO_ENCODER_FRAME_TYPE_HEVC_B_FRAME;
613  break;
614  default:
615  av_assert0(0 && "invalid picture type");
616  }
617 
618  pic->pic_ctl.pHEVCPicData->slice_pic_parameter_set_id = 0;
619  pic->pic_ctl.pHEVCPicData->PictureOrderCountNumber = hpic->pic_order_cnt;
620 
621  if (base_pic->type == FF_HW_PICTURE_TYPE_P || base_pic->type == FF_HW_PICTURE_TYPE_B) {
622  pd = av_calloc(MAX_PICTURE_REFERENCES, sizeof(*pd));
623  if (!pd)
624  return AVERROR(ENOMEM);
625 
626  ref_list0 = av_calloc(MAX_PICTURE_REFERENCES, sizeof(*ref_list0));
627  if (!ref_list0)
628  return AVERROR(ENOMEM);
629 
630  pic->pic_ctl.pHEVCPicData->List0ReferenceFramesCount = base_pic->nb_refs[0];
631  for (i = 0; i < base_pic->nb_refs[0]; i++) {
632  FFHWBaseEncodePicture *ref = base_pic->refs[0][i];
634 
635  av_assert0(ref && ref->encode_order < base_pic->encode_order);
636  href = ref->codec_priv;
637 
638  ref_list0[i] = idx;
639  pd[idx].ReconstructedPictureResourceIndex = idx;
640  pd[idx].IsRefUsedByCurrentPic = TRUE;
641  pd[idx].PictureOrderCountNumber = href->pic_order_cnt;
642  idx++;
643  }
644  }
645 
646  if (base_pic->type == FF_HW_PICTURE_TYPE_B) {
647  ref_list1 = av_calloc(MAX_PICTURE_REFERENCES, sizeof(*ref_list1));
648  if (!ref_list1)
649  return AVERROR(ENOMEM);
650 
651  pic->pic_ctl.pHEVCPicData->List1ReferenceFramesCount = base_pic->nb_refs[1];
652  for (i = 0; i < base_pic->nb_refs[1]; i++) {
653  FFHWBaseEncodePicture *ref = base_pic->refs[1][i];
655 
656  av_assert0(ref && ref->encode_order < base_pic->encode_order);
657  href = ref->codec_priv;
658 
659  ref_list1[i] = idx;
660  pd[idx].ReconstructedPictureResourceIndex = idx;
661  pd[idx].IsRefUsedByCurrentPic = TRUE;
662  pd[idx].PictureOrderCountNumber = href->pic_order_cnt;
663  idx++;
664  }
665  }
666 
667  pic->pic_ctl.pHEVCPicData->pList0ReferenceFrames = ref_list0;
668  pic->pic_ctl.pHEVCPicData->pList1ReferenceFrames = ref_list1;
669  pic->pic_ctl.pHEVCPicData->ReferenceFramesReconPictureDescriptorsCount = idx;
670  pic->pic_ctl.pHEVCPicData->pReferenceFramesReconPictureDescriptors = pd;
671 
672  // Process ROI side data if present and supported
673  if (base_ctx->roi_allowed && pic->qp_map && pic->qp_map_size > 0) {
674  pic->pic_ctl.pHEVCPicData->QPMapValuesCount = pic->qp_map_size;
675  pic->pic_ctl.pHEVCPicData->pRateControlQPMap = (INT8 *)pic->qp_map;
676  }
677 
678  return 0;
679 }
680 
683 
684  .d3d12_codec = D3D12_VIDEO_ENCODER_CODEC_HEVC,
685 
686  .flags = FF_HW_FLAG_B_PICTURES |
689 
690  .default_quality = 25,
691 
692  .get_encoder_caps = &d3d12va_encode_hevc_get_encoder_caps,
693 
694  .configure = &d3d12va_encode_hevc_configure,
695 
696  .set_level = &d3d12va_encode_hevc_set_level,
697 
698  .picture_priv_data_size = sizeof(D3D12VAEncodeHEVCPicture),
699 
700  .init_sequence_params = &d3d12va_encode_hevc_init_sequence_params,
701 
702  .init_picture_params = &d3d12va_encode_hevc_init_picture_params,
703 
704  .free_picture_params = &d3d12va_encode_hevc_free_picture_params,
705 
707 };
708 
710 {
712  D3D12VAEncodeHEVCContext *priv = avctx->priv_data;
713 
714  ctx->codec = &d3d12va_encode_type_hevc;
715 
716  if (avctx->profile == AV_PROFILE_UNKNOWN)
717  avctx->profile = priv->profile;
718  if (avctx->level == AV_LEVEL_UNKNOWN)
719  avctx->level = priv->level;
720 
721  if (avctx->level != AV_LEVEL_UNKNOWN && avctx->level & ~0xff) {
722  av_log(avctx, AV_LOG_ERROR, "Invalid level %d: must fit "
723  "in 8-bit unsigned integer.\n", avctx->level);
724  return AVERROR(EINVAL);
725  }
726 
727  if (priv->qp > 0)
728  ctx->explicit_qp = priv->qp;
729 
730  return ff_d3d12va_encode_init(avctx);
731 }
732 
734 {
735  D3D12VAEncodeHEVCContext *priv = avctx->priv_data;
736 
737  ff_cbs_fragment_free(&priv->current_access_unit);
738  ff_cbs_close(&priv->cbc);
739 
740  av_freep(&priv->common.codec_conf.pHEVCConfig);
741  av_freep(&priv->common.gop.pHEVCGroupOfPictures);
742  av_freep(&priv->common.level.pHEVCLevelSetting);
743 
744  return ff_d3d12va_encode_close(avctx);
745 }
746 
747 #define OFFSET(x) offsetof(D3D12VAEncodeHEVCContext, x)
748 #define FLAGS (AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM)
753 
754  { "qp", "Constant QP (for P-frames; scaled by qfactor/qoffset for I/B)",
755  OFFSET(qp), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 52, FLAGS },
756 
757  { "profile", "Set profile (general_profile_idc)",
759  { .i64 = AV_PROFILE_UNKNOWN }, AV_PROFILE_UNKNOWN, 0xff, FLAGS, "profile" },
760 
761 #define PROFILE(name, value) name, NULL, 0, AV_OPT_TYPE_CONST, \
762  { .i64 = value }, 0, 0, FLAGS, "profile"
763  { PROFILE("main", AV_PROFILE_HEVC_MAIN) },
764  { PROFILE("main10", AV_PROFILE_HEVC_MAIN_10) },
765 #undef PROFILE
766 
767  { "tier", "Set tier (general_tier_flag)",
768  OFFSET(unit_opts.tier), AV_OPT_TYPE_INT,
769  { .i64 = 0 }, 0, 1, FLAGS, "tier" },
770  { "main", NULL, 0, AV_OPT_TYPE_CONST,
771  { .i64 = 0 }, 0, 0, FLAGS, "tier" },
772  { "high", NULL, 0, AV_OPT_TYPE_CONST,
773  { .i64 = 1 }, 0, 0, FLAGS, "tier" },
774 
775  { "level", "Set level (general_level_idc)",
777  { .i64 = AV_LEVEL_UNKNOWN }, AV_LEVEL_UNKNOWN, 0xff, FLAGS, "level" },
778 
779 #define LEVEL(name, value) name, NULL, 0, AV_OPT_TYPE_CONST, \
780  { .i64 = value }, 0, 0, FLAGS, "level"
781  { LEVEL("1", 30) },
782  { LEVEL("2", 60) },
783  { LEVEL("2.1", 63) },
784  { LEVEL("3", 90) },
785  { LEVEL("3.1", 93) },
786  { LEVEL("4", 120) },
787  { LEVEL("4.1", 123) },
788  { LEVEL("5", 150) },
789  { LEVEL("5.1", 153) },
790  { LEVEL("5.2", 156) },
791  { LEVEL("6", 180) },
792  { LEVEL("6.1", 183) },
793  { LEVEL("6.2", 186) },
794 #undef LEVEL
795 
796  { "constrained_intra_pred", "Constrained intra prediction (constrained_intra_pred_flag)",
797  OFFSET(constrained_intra_pred), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, FLAGS },
798 
799  { NULL },
800 };
801 
803  { "b", "0" },
804  { "bf", "2" },
805  { "g", "120" },
806  { "i_qfactor", "1" },
807  { "i_qoffset", "0" },
808  { "b_qfactor", "1" },
809  { "b_qoffset", "0" },
810  { "qmin", "-1" },
811  { "qmax", "-1" },
812  { "refs", "0" },
813  { NULL },
814 };
815 
817  .class_name = "hevc_d3d12va",
818  .item_name = av_default_item_name,
819  .option = d3d12va_encode_hevc_options,
820  .version = LIBAVUTIL_VERSION_INT,
821 };
822 
824  .p.name = "hevc_d3d12va",
825  CODEC_LONG_NAME("D3D12VA hevc encoder"),
826  .p.type = AVMEDIA_TYPE_VIDEO,
827  .p.id = AV_CODEC_ID_HEVC,
828  .priv_data_size = sizeof(D3D12VAEncodeHEVCContext),
831  .close = &d3d12va_encode_hevc_close,
832  .p.priv_class = &d3d12va_encode_hevc_class,
833  .p.capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_HARDWARE |
835  .caps_internal = FF_CODEC_CAP_NOT_INIT_THREADSAFE |
837  .defaults = d3d12va_encode_hevc_defaults,
839  .hw_configs = ff_d3d12va_encode_hw_configs,
840  .p.wrapper_name = "d3d12va",
841 };
cbs.h
CODEC_PIXFMTS
#define CODEC_PIXFMTS(...)
Definition: codec_internal.h:392
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:216
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:43
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
d3d12va_encode_hevc_write_sequence_header
static int d3d12va_encode_hevc_write_sequence_header(AVCodecContext *avctx, char *data, size_t *data_len)
Definition: d3d12va_encode_hevc.c:208
H265RawProfileTierLevel::general_level_idc
uint8_t general_level_idc
Definition: cbs_h265.h:61
FFHWBaseEncodePicture::priv
void * priv
Definition: hw_base_encode.h:63
d3d12va_encode_hevc_init_sequence_params
static int d3d12va_encode_hevc_init_sequence_params(AVCodecContext *avctx)
Definition: d3d12va_encode_hevc.c:234
FFHWBaseEncodePicture::codec_priv
void * codec_priv
Definition: hw_base_encode.h:65
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
FF_HW_FLAG_B_PICTURES
@ FF_HW_FLAG_B_PICTURES
Definition: hw_base_encode.h:53
int64_t
long long int64_t
Definition: coverity.c:34
D3D12VAEncodeHEVCLevel::d3d12_level
D3D12_VIDEO_ENCODER_LEVELS_HEVC d3d12_level
Definition: d3d12va_encode_hevc.c:61
FFHWBaseEncodeH265::raw_vps
H265RawVPS raw_vps
Definition: hw_base_encode_h265.h:26
AV_PROFILE_HEVC_MAIN
#define AV_PROFILE_HEVC_MAIN
Definition: defs.h:159
pixdesc.h
d3d12va_encode_hevc_class
static const AVClass d3d12va_encode_hevc_class
Definition: d3d12va_encode_hevc.c:816
CodedBitstreamContext
Context structure for coded bitstream operations.
Definition: cbs.h:226
AVOption
AVOption.
Definition: opt.h:429
D3D12VAEncodeHEVCPicture::last_idr_frame
int64_t last_idr_frame
Definition: d3d12va_encode_hevc.c:39
d3d12va_encode.h
data
const char data[16]
Definition: mxf.c:149
d3d12va_encode_hevc_add_nal
static int d3d12va_encode_hevc_add_nal(AVCodecContext *avctx, CodedBitstreamFragment *au, void *nal_unit)
Definition: d3d12va_encode_hevc.c:190
FF_HW_PICTURE_TYPE_I
@ FF_HW_PICTURE_TYPE_I
Definition: hw_base_encode.h:40
d3d12va_encode_hevc_map_cusize
static uint8_t d3d12va_encode_hevc_map_cusize(D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION_HEVC_CUSIZE cusize)
Definition: d3d12va_encode_hevc.c:140
AVCodecContext::b_quant_offset
float b_quant_offset
qscale offset between IP and B-frames
Definition: avcodec.h:797
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:35
FFCodec
Definition: codec_internal.h:127
AV_LOG_VERBOSE
#define AV_LOG_VERBOSE
Detailed information.
Definition: log.h:226
d3d12va_encode_hevc_write_access_unit
static int d3d12va_encode_hevc_write_access_unit(AVCodecContext *avctx, char *data, size_t *data_len, CodedBitstreamFragment *au)
Definition: d3d12va_encode_hevc.c:164
D3D12VAEncodePicture::qp_map_size
int qp_map_size
Definition: d3d12va_encode.h:63
cbs_h265.h
FFMAX
#define FFMAX(a, b)
Definition: macros.h:47
D3D12VAEncodeHEVCContext
Definition: d3d12va_encode_hevc.c:42
tf_sess_config.config
config
Definition: tf_sess_config.py:33
H265RawSPS
Definition: cbs_h265.h:246
H265RawPPS
Definition: cbs_h265.h:357
FFHWBaseEncodeContext
Definition: hw_base_encode.h:122
d3d12va_encode_hevc_map_tusize
static uint8_t d3d12va_encode_hevc_map_tusize(D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION_HEVC_TUSIZE tusize)
Definition: d3d12va_encode_hevc.c:152
D3D12VAEncodeHEVCContext::current_access_unit
CodedBitstreamFragment current_access_unit
Definition: d3d12va_encode_hevc.c:56
ff_d3d12va_encode_check_encoder_feature_flags
void ff_d3d12va_encode_check_encoder_feature_flags(void *log_ctx, D3D12_VIDEO_ENCODER_VALIDATION_FLAGS flags)
Definition: d3d12va_encode.c: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:806
FFCodecDefault
Definition: codec_internal.h:97
FFCodec::p
AVCodec p
The public AVCodec.
Definition: codec_internal.h:131
FFHWBaseEncodePicture::type
int type
Definition: hw_base_encode.h:78
profile_main10
static const D3D12_VIDEO_ENCODER_PROFILE_HEVC profile_main10
Definition: d3d12va_encode_hevc.c:130
FFHWBaseEncodeH265::raw_pps
H265RawPPS raw_pps
Definition: hw_base_encode_h265.h:28
ff_hw_base_encode_init_params_h265
int ff_hw_base_encode_init_params_h265(FFHWBaseEncodeContext *base_ctx, AVCodecContext *avctx, FFHWBaseEncodeH265 *common, FFHWBaseEncodeH265Opts *opts)
Definition: hw_base_encode_h265.c:26
D3D12VAEncodeHEVCContext::qp
int qp
Definition: d3d12va_encode_hevc.c:46
D3D12VA_ENCODE_RC_OPTIONS
#define D3D12VA_ENCODE_RC_OPTIONS
Definition: d3d12va_encode.h:433
D3D12VAEncodeHEVCContext::level
int level
Definition: d3d12va_encode_hevc.c:48
d3d12va_encode_hevc_free_picture_params
static void d3d12va_encode_hevc_free_picture_params(D3D12VAEncodePicture *pic)
Definition: d3d12va_encode_hevc.c:564
d3d12va_encode_hevc_close
static int d3d12va_encode_hevc_close(AVCodecContext *avctx)
Definition: d3d12va_encode_hevc.c:733
D3D12VAEncodeHEVCContext::common
D3D12VAEncodeContext common
Definition: d3d12va_encode_hevc.c:43
FFHWBaseEncodePicture::prev
struct FFHWBaseEncodePicture * prev
Definition: hw_base_encode.h:101
d3d12va_encode_hevc_get_encoder_caps
static int d3d12va_encode_hevc_get_encoder_caps(AVCodecContext *avctx)
Definition: d3d12va_encode_hevc.c:385
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
FF_HW_PICTURE_TYPE_IDR
@ FF_HW_PICTURE_TYPE_IDR
Definition: hw_base_encode.h:39
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:399
CodedBitstreamFragment
Coded bitstream fragment structure, combining one or more units.
Definition: cbs.h:129
CodedBitstreamFragment::data_size
size_t data_size
The number of bytes in the bitstream.
Definition: cbs.h:142
H265RawVPS::profile_tier_level
H265RawProfileTierLevel profile_tier_level
Definition: cbs_h265.h:195
hevc_config_support_sets
static const D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION_SUPPORT_HEVC hevc_config_support_sets[]
Definition: d3d12va_encode_hevc.c:64
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
D3D12VAEncodeHEVCPicture
Definition: d3d12va_encode_hevc.c:37
FLAGS
#define FLAGS
Definition: d3d12va_encode_hevc.c:748
av_assert0
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:42
D3D12VAEncodeHEVCContext::cbc
CodedBitstreamContext * cbc
Definition: d3d12va_encode_hevc.c:55
AV_LOG_DEBUG
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:231
ctx
static AVFormatContext * ctx
Definition: movenc.c:49
PROFILE
#define PROFILE(name, value)
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
av_mallocz
#define av_mallocz(s)
Definition: tableprint_vlc.h:31
h2645data.h
CODEC_LONG_NAME
#define CODEC_LONG_NAME(str)
Definition: codec_internal.h:332
FFHWBaseEncodeContext::b_per_p
int b_per_p
Definition: hw_base_encode.h:189
hw_base_encode_h265.h
fail
#define fail
Definition: test.h:478
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
FFHWBaseEncodeH265Opts
Definition: hw_base_encode_h265.h:33
AV_LEVEL_UNKNOWN
#define AV_LEVEL_UNKNOWN
Definition: defs.h:209
d3d12va_encode_hevc_set_level
static int d3d12va_encode_hevc_set_level(AVCodecContext *avctx)
Definition: d3d12va_encode_hevc.c:534
FF_CODEC_RECEIVE_PACKET_CB
#define FF_CODEC_RECEIVE_PACKET_CB(func)
Definition: codec_internal.h:367
av_default_item_name
const char * av_default_item_name(void *ptr)
Return the context name.
Definition: log.c:242
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
H265RawProfileTierLevel::general_tier_flag
uint8_t general_tier_flag
Definition: cbs_h265.h:38
D3D12VAEncodeHEVCContext::unit_opts
FFHWBaseEncodeH265Opts unit_opts
Definition: d3d12va_encode_hevc.c:53
AVCodecContext::level
int level
Encoding level descriptor.
Definition: avcodec.h:1646
AV_PROFILE_HEVC_MAIN_10
#define AV_PROFILE_HEVC_MAIN_10
Definition: defs.h:160
H265RawNALUnitHeader
Definition: cbs_h265.h:30
D3D12VAEncodeHEVCContext::constrained_intra_pred
int constrained_intra_pred
Definition: d3d12va_encode_hevc.c:49
D3D12VAEncodeContext::codec_conf
D3D12_VIDEO_ENCODER_CODEC_CONFIGURATION codec_conf
Definition: d3d12va_encode.h:264
D3D12VAEncodeHEVCLevel
Definition: d3d12va_encode_hevc.c:59
init
int(* init)(AVBSFContext *ctx)
Definition: dts2pts.c:579
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:1726
FFHWBaseEncodePicture::nb_refs
int nb_refs[MAX_REFERENCE_LIST_NUM]
Definition: hw_base_encode.h:97
i
#define i(width, name, range_min, range_max)
Definition: cbs_h264.c:63
MAX_DPB_SIZE
#define MAX_DPB_SIZE
Definition: hw_base_encode.h:26
D3D12VAEncodeProfile
Definition: d3d12va_encode.h:66
D3D12VAEncodeHEVCContext::units
FFHWBaseEncodeH265 units
Definition: d3d12va_encode_hevc.c:52
CodedBitstreamFragment::data
uint8_t * data
Pointer to the bitstream form of this fragment.
Definition: cbs.h:135
D3D12VAEncodeHEVCContext::profile
int profile
Definition: d3d12va_encode_hevc.c:47
FFHWBaseEncodeH265
Definition: hw_base_encode_h265.h:25
d3d12va_encode_hevc_init
static int d3d12va_encode_hevc_init(AVCodecContext *avctx)
Definition: d3d12va_encode_hevc.c:709
h265_profile_level.h
d3d12va_encode_hevc_options
static const AVOption d3d12va_encode_hevc_options[]
Definition: d3d12va_encode_hevc.c:749
header
static const uint8_t header[24]
Definition: sdr2.c:68
FFHWBaseEncodePicture::encode_order
int64_t encode_order
Definition: hw_base_encode.h:70
ff_hevc_d3d12va_encoder
const FFCodec ff_hevc_d3d12va_encoder
Definition: d3d12va_encode_hevc.c:823
FFHWBaseEncodeH265Opts::cu_qp_delta_enabled_flag
int cu_qp_delta_enabled_flag
Definition: hw_base_encode_h265.h:36
d3d12va_encode_hevc_defaults
static const FFCodecDefault d3d12va_encode_hevc_defaults[]
Definition: d3d12va_encode_hevc.c:802
FFHWBaseEncodeContext::roi_allowed
int roi_allowed
Definition: hw_base_encode.h:201
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:790
D3D12VAEncodeContext::level
D3D12_VIDEO_ENCODER_LEVEL_SETTING level
Definition: d3d12va_encode.h:270
D3D12VAEncodePicture::qp_map
void * qp_map
Definition: d3d12va_encode.h:62
FFHWBaseEncodeH265Opts::nb_slices
int nb_slices
Definition: hw_base_encode_h265.h:41
d3d12va_encode_hevc_init_picture_params
static int d3d12va_encode_hevc_init_picture_params(AVCodecContext *avctx, FFHWBaseEncodePicture *base_pic)
Definition: d3d12va_encode_hevc.c:575
common.h
AV_CODEC_ID_HEVC
@ AV_CODEC_ID_HEVC
Definition: codec_id.h:228
FFHWBaseEncodePicture::refs
struct FFHWBaseEncodePicture * refs[MAX_REFERENCE_LIST_NUM][MAX_PICTURE_REFERENCES]
Definition: hw_base_encode.h:98
AVCodec::name
const char * name
Name of the codec implementation.
Definition: codec.h:179
FF_HW_FLAG_B_PICTURE_REFERENCES
@ FF_HW_FLAG_B_PICTURE_REFERENCES
Definition: hw_base_encode.h:55
profile
int profile
Definition: mxfenc.c:2299
AVCodecContext::height
int height
Definition: avcodec.h:604
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:150
d3d12va_encode_type_hevc
static const D3D12VAEncodeType d3d12va_encode_type_hevc
Definition: d3d12va_encode_hevc.c:681
profile_main
static const D3D12_VIDEO_ENCODER_PROFILE_HEVC profile_main
Definition: d3d12va_encode_hevc.c:129
D3D12VAEncodeHEVCLevel::level
int level
Definition: d3d12va_encode_hevc.c:60
OFFSET
#define OFFSET(x)
Definition: d3d12va_encode_hevc.c:747
FFHWBaseEncodeContext::surface_height
int surface_height
Definition: hw_base_encode.h:141
AVCodecContext
main external API structure.
Definition: avcodec.h:443
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
FFHWBaseEncodeH265::raw_sps
H265RawSPS raw_sps
Definition: hw_base_encode_h265.h:27
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:1636
AVCodecContext::i_quant_offset
float i_quant_offset
qscale offset between P and I-frames
Definition: avcodec.h:813
ref
static int ref[MAX_W *MAX_W]
Definition: jpeg2000dwt.c:117
D3D_PROFILE_DESC
#define D3D_PROFILE_DESC(name)
Definition: d3d12va_encode_hevc.c:132
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
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:268
desc
const char * desc
Definition: libsvtav1.c:83
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:200
mem.h
D3D12VAEncodeHEVCPicture::pic_order_cnt
int pic_order_cnt
Definition: d3d12va_encode_hevc.c:38
AVPixFmtDescriptor
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
Definition: pixdesc.h:69
LEVEL
#define LEVEL(name, value)
ff_d3d12va_encode_close
int ff_d3d12va_encode_close(AVCodecContext *avctx)
Definition: d3d12va_encode.c:1865
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:1721
AVCodecContext::priv_data
void * priv_data
Definition: avcodec.h:470
AV_OPT_TYPE_BOOL
@ AV_OPT_TYPE_BOOL
Underlying C type is int.
Definition: opt.h:327
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:35
D3D12VAEncodeType::profiles
const D3D12VAEncodeProfile * profiles
List of supported profiles.
Definition: d3d12va_encode.h:299
AVCodecContext::width
int width
picture width / height.
Definition: avcodec.h:604
d3d12va_encode_hevc_configure
static int d3d12va_encode_hevc_configure(AVCodecContext *avctx)
Definition: d3d12va_encode_hevc.c:472
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
HW_BASE_ENCODE_COMMON_OPTIONS
#define HW_BASE_ENCODE_COMMON_OPTIONS
Definition: hw_base_encode.h:243
D3D12VAEncodeType
Definition: d3d12va_encode.h:295
FF_HW_FLAG_NON_IDR_KEY_PICTURES
@ FF_HW_FLAG_NON_IDR_KEY_PICTURES
Definition: hw_base_encode.h:58
d3d12va_encode_hevc_profiles
static const D3D12VAEncodeProfile d3d12va_encode_hevc_profiles[]
Definition: d3d12va_encode_hevc.c:134
hwcontext_d3d12va_internal.h
FFHWBaseEncodePicture::display_order
int64_t display_order
Definition: hw_base_encode.h:69
AV_OPT_TYPE_CONST
@ AV_OPT_TYPE_CONST
Special option type for declaring named constants.
Definition: opt.h:299
FF_HW_PICTURE_TYPE_B
@ FF_HW_PICTURE_TYPE_B
Definition: hw_base_encode.h:42
av_log2
int av_log2(unsigned v)
Definition: intmath.c:26
hevc_levels
static const D3D12VAEncodeHEVCLevel hevc_levels[]
Definition: d3d12va_encode_hevc.c:113
FF_HW_PICTURE_TYPE_P
@ FF_HW_PICTURE_TYPE_P
Definition: hw_base_encode.h:41
MAX_PICTURE_REFERENCES
#define MAX_PICTURE_REFERENCES
Definition: hw_base_encode.h:27