FFmpeg
vulkan_encode_av1.c
Go to the documentation of this file.
1 /*
2  * This file is part of FFmpeg.
3  *
4  * FFmpeg is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * FFmpeg is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with FFmpeg; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17  */
18 
19 #include "libavutil/opt.h"
20 #include "libavutil/mem.h"
21 
22 #include "cbs.h"
23 #include "cbs_av1.h"
24 #include "av1_levels.h"
26 
27 #include "codec_internal.h"
28 #include "vulkan_encode.h"
29 
30 #include "libavutil/avassert.h"
31 
34  .encode_extension = FF_VK_EXT_VIDEO_ENCODE_AV1,
35  .encode_op = VK_VIDEO_CODEC_OPERATION_ENCODE_AV1_BIT_KHR,
36  .ext_props = {
37  .extensionName = VK_STD_VULKAN_VIDEO_CODEC_AV1_ENCODE_EXTENSION_NAME,
38  .specVersion = VK_STD_VULKAN_VIDEO_CODEC_AV1_ENCODE_SPEC_VERSION,
39  },
40 };
41 
42 enum UnitElems {
45 };
46 
47 typedef struct VulkanEncodeAV1Picture {
48  int slot;
50 
52 
53  StdVideoAV1TileInfo tile_info;
54  StdVideoAV1Quantization quantization;
55  StdVideoAV1Segmentation segmentation;
56  StdVideoAV1LoopFilter loop_filter;
57  StdVideoAV1CDEF cdef;
58  StdVideoAV1LoopRestoration loop_restoration;
59  StdVideoAV1GlobalMotion global_motion;
60 
61  StdVideoEncodeAV1PictureInfo av1pic_info;
62  VkVideoEncodeAV1PictureInfoKHR vkav1pic_info;
63 
64  StdVideoEncodeAV1ExtensionHeader ext_header;
65  StdVideoEncodeAV1ReferenceInfo av1dpb_info;
66  VkVideoEncodeAV1DpbSlotInfoKHR vkav1dpb_info;
67 
68  VkVideoEncodeAV1RateControlInfoKHR vkrc_info;
69  VkVideoEncodeAV1RateControlLayerInfoKHR vkrc_layer_info;
70  VkVideoEncodeAV1GopRemainingFrameInfoKHR vkrc_remaining;
72 
73 typedef struct VulkanEncodeAV1Context {
75 
78 
83 
84  VkVideoEncodeAV1ProfileInfoKHR profile;
85 
86  VkVideoEncodeAV1CapabilitiesKHR caps;
87  VkVideoEncodeAV1QualityLevelPropertiesKHR quality_props;
88 
89  uint64_t hrd_buffer_size;
91 
93  int tile_cols;
94  int tile_rows;
95 
96  int seq_tier;
98 
99  int q_idx_idr;
100  int q_idx_p;
101  int q_idx_b;
102 
103  uint8_t *padding_payload;
105 
107  VkVideoEncodeRateControlInfoKHR *rc_info,
108  VkVideoEncodeRateControlLayerInfoKHR *rc_layer)
109 {
110  VulkanEncodeAV1Context *enc = avctx->priv_data;
113 
114  /* This can be easy to calculate */
115  ap->vkrc_remaining = (VkVideoEncodeAV1GopRemainingFrameInfoKHR) {
116  .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_GOP_REMAINING_FRAME_INFO_KHR,
117  .useGopRemainingFrames = 0,
118  .gopRemainingIntra = 0,
119  .gopRemainingPredictive = 0,
120  .gopRemainingBipredictive = 0,
121  };
122 
123  ap->vkrc_info = (VkVideoEncodeAV1RateControlInfoKHR) {
124  .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_RATE_CONTROL_INFO_KHR,
125  .flags = VK_VIDEO_ENCODE_AV1_RATE_CONTROL_REFERENCE_PATTERN_FLAT_BIT_KHR |
126  VK_VIDEO_ENCODE_AV1_RATE_CONTROL_REGULAR_GOP_BIT_KHR,
127  .gopFrameCount = ctx->base.gop_size,
128  .keyFramePeriod = ctx->base.gop_size,
129  .consecutiveBipredictiveFrameCount = FFMAX(ctx->base.b_per_p - 1, 0),
130  .temporalLayerCount = 0,
131  };
132  rc_info->pNext = &ap->vkrc_info;
133 
134  if (rc_info->rateControlMode > VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DISABLED_BIT_KHR) {
135  rc_info->virtualBufferSizeInMs = (enc->hrd_buffer_size * 1000LL) / avctx->bit_rate;
136  rc_info->initialVirtualBufferSizeInMs = (enc->initial_buffer_fullness * 1000LL) / avctx->bit_rate;
137 
138  ap->vkrc_layer_info = (VkVideoEncodeAV1RateControlLayerInfoKHR) {
139  .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_RATE_CONTROL_LAYER_INFO_KHR,
140 
141  .useMinQIndex = avctx->qmin > 0,
142  .minQIndex.intraQIndex = avctx->qmin > 0 ? avctx->qmin : 0,
143  .minQIndex.predictiveQIndex = avctx->qmin > 0 ? avctx->qmin : 0,
144  .minQIndex.bipredictiveQIndex = avctx->qmin > 0 ? avctx->qmin : 0,
145 
146  .useMaxQIndex = avctx->qmax > 0,
147  .maxQIndex.intraQIndex = avctx->qmax > 0 ? avctx->qmax : 0,
148  .maxQIndex.predictiveQIndex = avctx->qmax > 0 ? avctx->qmax : 0,
149  .maxQIndex.bipredictiveQIndex = avctx->qmax > 0 ? avctx->qmax : 0,
150 
151  .useMaxFrameSize = 0,
152  };
153  rc_layer->pNext = &ap->vkrc_layer_info;
154  ap->vkrc_info.temporalLayerCount = 1;
155  }
156 
157  return 0;
158 }
159 
160 static void set_name_slot(int slot, int *slot_indices, uint32_t allowed_idx, int group)
161 {
162  int from = group ? AV1_REF_FRAME_GOLDEN : 0;
164 
165  for (int i = from; i < to; i++) {
166  if ((slot_indices[i] == -1) && (allowed_idx & (1 << i))) {
167  slot_indices[i] = slot;
168  return;
169  }
170  }
171 
172  av_assert0(0);
173 }
174 
175 
177  VkVideoEncodeInfoKHR *encode_info)
178 {
179  VulkanEncodeAV1Context *enc = avctx->priv_data;
181  FFHWBaseEncodeContext *base_ctx = &ctx->base;
182 
185  VulkanEncodeAV1Picture *ap_ref;
186  VkVideoReferenceSlotInfoKHR *ref_slot;
187 
188  uint32_t ref_name_mask = 0x0;
189  int name_slots[STD_VIDEO_AV1_REFS_PER_FRAME];
190 
191  StdVideoAV1Segmentation *segmentation = &ap->segmentation;
192  StdVideoAV1LoopFilter *loop_filter = &ap->loop_filter;
193  StdVideoAV1Quantization *quantization = &ap->quantization;
194  StdVideoAV1CDEF *cdef = &ap->cdef;
195  StdVideoAV1LoopRestoration *loop_restoration = &ap->loop_restoration;
196  StdVideoAV1GlobalMotion *global_motion = &ap->global_motion;
197  StdVideoAV1TileInfo *tile_info = &ap->tile_info;
198  static const int8_t default_loop_filter_ref_deltas[STD_VIDEO_AV1_TOTAL_REFS_PER_FRAME] =
199  { 1, 0, 0, 0, -1, 0, -1, -1 };
200 
201  VkVideoEncodeAV1PredictionModeKHR pred_mode;
202  VkVideoEncodeAV1RateControlGroupKHR rc_group;
203  int lr_unit_shift = 0;
204  int lr_uv_shift = 0;
205 
206  ap->ext_header = (StdVideoEncodeAV1ExtensionHeader) {
207  .temporal_id = 0,
208  .spatial_id = 0,
209  };
210 
211  *tile_info = (StdVideoAV1TileInfo) {
212  .flags = (StdVideoAV1TileInfoFlags) {
213  .uniform_tile_spacing_flag = enc->uniform_tile,
214  },
215  .TileCols = enc->tile_cols,
216  .TileRows = enc->tile_rows,
217  .context_update_tile_id = 0,
218  .tile_size_bytes_minus_1 = 0,
219  };
220 
221  for (int i = 0; i < STD_VIDEO_AV1_TOTAL_REFS_PER_FRAME; i++) {
222  global_motion->GmType[i] = 0;
223  for (int j = 0; j < STD_VIDEO_AV1_GLOBAL_MOTION_PARAMS; j++) {
224  global_motion->gm_params[i][j] = 0;
225  }
226  }
227 
228  for (int i = 0; i < STD_VIDEO_AV1_REFS_PER_FRAME; i++)
229  name_slots[i] = -1;
230 
231  *loop_restoration = (StdVideoAV1LoopRestoration) {
232  .FrameRestorationType[0] = STD_VIDEO_AV1_FRAME_RESTORATION_TYPE_NONE,
233  .FrameRestorationType[1] = STD_VIDEO_AV1_FRAME_RESTORATION_TYPE_NONE,
234  .FrameRestorationType[2] = STD_VIDEO_AV1_FRAME_RESTORATION_TYPE_NONE,
235  .LoopRestorationSize[0] = 1 + lr_unit_shift,
236  .LoopRestorationSize[1] = 1 + lr_unit_shift - lr_uv_shift,
237  .LoopRestorationSize[2] = 1 + lr_unit_shift - lr_uv_shift,
238  };
239 
240  *cdef = (StdVideoAV1CDEF) {
241  .cdef_damping_minus_3 = 0,
242  .cdef_bits = 0,
243  };
244 
245  for (int i = 0; i < STD_VIDEO_AV1_MAX_SEGMENTS; i++) {
246  segmentation->FeatureEnabled[i] = 0x0;
247  for (int j = 0; j < STD_VIDEO_AV1_SEG_LVL_MAX; j++) {
248  segmentation->FeatureEnabled[i] |= 0x0;
249  segmentation->FeatureData[i][j] = 0;
250  }
251  }
252 
253  *loop_filter = (StdVideoAV1LoopFilter) {
254  .flags = (StdVideoAV1LoopFilterFlags) {
255  .loop_filter_delta_enabled = 0,
256  .loop_filter_delta_update = 0,
257  },
258  .loop_filter_level = { 0 },
259  .loop_filter_sharpness = 0,
260  .update_ref_delta = 0,
261  .loop_filter_ref_deltas = { 0 },
262  .update_mode_delta = 0,
263  .loop_filter_mode_deltas = { 0 },
264  };
265  loop_filter->update_mode_delta = 1;
266  memcpy(loop_filter->loop_filter_ref_deltas, default_loop_filter_ref_deltas,
267  STD_VIDEO_AV1_TOTAL_REFS_PER_FRAME * sizeof(int8_t));
268 
269  *quantization = (StdVideoAV1Quantization) {
270  .flags = (StdVideoAV1QuantizationFlags) {
271  .using_qmatrix = 0,
272  .diff_uv_delta = 0,
273  /* Reserved */
274  },
275  .base_q_idx = 0, /* Set later */
276  .DeltaQYDc = 0,
277  .DeltaQUDc = 0,
278  .DeltaQUAc = 0,
279  .DeltaQVDc = 0,
280  .DeltaQVAc = 0,
281  .qm_y = 0,
282  .qm_u = 0,
283  .qm_v = 0,
284  };
285 
286  ref_slot = (VkVideoReferenceSlotInfoKHR *)encode_info->pSetupReferenceSlot;
287  ap->av1pic_info = (StdVideoEncodeAV1PictureInfo) {
288  .flags = (StdVideoEncodeAV1PictureInfoFlags) {
289  .error_resilient_mode = (pic->type == FF_HW_PICTURE_TYPE_I ||
290  pic->type == FF_HW_PICTURE_TYPE_IDR) &&
291  (pic->display_order <= pic->encode_order),
292  .disable_cdf_update = 0,
293  .use_superres = 0,
294  .render_and_frame_size_different = 0,
295  .allow_screen_content_tools = 0,
296  .is_filter_switchable = 0,
297  .force_integer_mv = 0,
298  .frame_size_override_flag = 0,
299  .buffer_removal_time_present_flag = 0,
300  .allow_intrabc = 0,
301  .frame_refs_short_signaling = 0,
302  .allow_high_precision_mv = 0,
303  .is_motion_mode_switchable = 0,
304  .use_ref_frame_mvs = 0,
305  .disable_frame_end_update_cdf = 0,
306  .allow_warped_motion = 0,
307  .reduced_tx_set = 0,
308  .skip_mode_present = 0,
309  .delta_q_present = 0,
310  .delta_lf_present = 0,
311  .delta_lf_multi = 0,
312  .segmentation_enabled = 0,
313  .segmentation_update_map = 0,
314  .segmentation_temporal_update = 0,
315  .segmentation_update_data = 0,
316  .UsesLr = 0,
317  .usesChromaLr = 0,
318  .show_frame = pic->display_order <= pic->encode_order,
319  .showable_frame = 0,
320  /* Reserved */
321  },
322  .frame_type = 0, // set later
323  .frame_presentation_time = 0,
324  .current_frame_id = ref_slot->slotIndex,
325  .order_hint = 0, // set later
326  .primary_ref_frame = 0, // set later
327  .refresh_frame_flags = 0x0, // set later
328  .coded_denom = 0,
329  .render_width_minus_1 = base_ctx->surface_width - 1,
330  .render_height_minus_1 = base_ctx->surface_height - 1,
331  .interpolation_filter = 0,
332  .TxMode = STD_VIDEO_AV1_TX_MODE_SELECT,
333  .delta_q_res = 0,
334  .delta_lf_res = 0,
335  .ref_order_hint = { 0 }, // set later
336  .ref_frame_idx = { 0 }, // set later
337  /* Reserved */
338  .delta_frame_id_minus_1 = { 0 },
339 
340 // .pTileInfo = tile_info, TODO FIX
341  .pQuantization = quantization,
342  .pSegmentation = segmentation,
343  .pLoopFilter = loop_filter,
344  .pCDEF = cdef,
345  .pLoopRestoration = loop_restoration,
346  .pGlobalMotion = global_motion,
347  .pExtensionHeader = &ap->ext_header,
348  .pBufferRemovalTimes = NULL,
349  };
350 
351  switch (pic->type) {
354  av_assert0(pic->nb_refs[0] == 0 || pic->nb_refs[1]);
355  ap->av1pic_info.frame_type = STD_VIDEO_AV1_FRAME_TYPE_KEY;
356  ap->av1pic_info.refresh_frame_flags = 0xFF;
357  quantization->base_q_idx = enc->q_idx_idr;
358  ap->slot = 0;
359  ap->last_idr_frame = pic->display_order;
360  pred_mode = VK_VIDEO_ENCODE_AV1_PREDICTION_MODE_INTRA_ONLY_KHR;
361  rc_group = VK_VIDEO_ENCODE_AV1_RATE_CONTROL_GROUP_INTRA_KHR;
362  break;
364  ref = pic->refs[0][pic->nb_refs[0] - 1];
365  ap_ref = ref->codec_priv;
366 
367  ap->av1pic_info.frame_type = STD_VIDEO_AV1_FRAME_TYPE_INTER;
368  quantization->base_q_idx = enc->q_idx_p;
369 
370  ap->last_idr_frame = ap_ref->last_idr_frame;
371  ap->slot = !ap_ref->slot;
372 
373  ap->av1pic_info.refresh_frame_flags = 1 << ap->slot;
374 
375  /** set the nearest frame in L0 as all reference frame. */
376  for (int i = 0; i < AV1_REFS_PER_FRAME; i++)
377  ap->av1pic_info.ref_frame_idx[i] = ap_ref->slot;
378 
379  ap->av1pic_info.primary_ref_frame = ap_ref->slot;
380  ap->av1pic_info.ref_order_hint[ap_ref->slot] = ref->display_order - ap_ref->last_idr_frame;
381  rc_group = VK_VIDEO_ENCODE_AV1_RATE_CONTROL_GROUP_PREDICTIVE_KHR;
382  pred_mode = VK_VIDEO_ENCODE_AV1_PREDICTION_MODE_SINGLE_REFERENCE_KHR;
383  ref_name_mask = enc->caps.singleReferenceNameMask;
384  set_name_slot(ap_ref->av1pic_info.current_frame_id, name_slots, ref_name_mask, 0);
385 
386 // vpic->ref_frame_ctrl_l0.fields.search_idx0 = AV1_REF_FRAME_LAST;
387 
388  /** set the 2nd nearest frame in L0 as Golden frame. */
389  if ((pic->nb_refs[0] > 1) &&
390  ((enc->caps.maxSingleReferenceCount > 1) ||
391  (enc->caps.maxUnidirectionalCompoundReferenceCount > 0))) {
392  if (enc->caps.maxUnidirectionalCompoundReferenceCount) {
393  pred_mode = VK_VIDEO_ENCODE_AV1_PREDICTION_MODE_UNIDIRECTIONAL_COMPOUND_KHR;
394  ref_name_mask = enc->caps.unidirectionalCompoundReferenceNameMask;
395  }
396  ref = pic->refs[0][pic->nb_refs[0] - 2];
397  ap_ref = ref->codec_priv;
398  ap->av1pic_info.ref_frame_idx[3] = ap_ref->slot;
399  ap->av1pic_info.ref_order_hint[ap_ref->slot] = ref->display_order - ap_ref->last_idr_frame;
400 // vpic->ref_frame_ctrl_l0.fields.search_idx1 = AV1_REF_FRAME_GOLDEN;
401  set_name_slot(ap_ref->av1pic_info.current_frame_id, name_slots, ref_name_mask, 0);
402  }
403  break;
405  ap->av1pic_info.frame_type = STD_VIDEO_AV1_FRAME_TYPE_INTER;
406  quantization->base_q_idx = enc->q_idx_b;
407  ap->av1pic_info.refresh_frame_flags = 0x0;
408 
409  rc_group = VK_VIDEO_ENCODE_AV1_RATE_CONTROL_GROUP_BIPREDICTIVE_KHR;
410  pred_mode = VK_VIDEO_ENCODE_AV1_PREDICTION_MODE_BIDIRECTIONAL_COMPOUND_KHR;
411  ref_name_mask = enc->caps.bidirectionalCompoundReferenceNameMask;
412 
413 // fh->reference_select = 1;
414  /** B frame will not be referenced, disable its recon frame. */
415 // vpic->picture_flags.bits.disable_frame_recon = 1;
416 
417  /** Use LAST_FRAME and BWDREF_FRAME for reference. */
418 // vpic->ref_frame_ctrl_l0.fields.search_idx0 = AV1_REF_FRAME_LAST;
419 // vpic->ref_frame_ctrl_l1.fields.search_idx0 = AV1_REF_FRAME_BWDREF;
420 
421  ref = pic->refs[0][pic->nb_refs[0] - 1];
422  ap_ref = ref->codec_priv;
423  ap->last_idr_frame = ap_ref->last_idr_frame;
424  ap->av1pic_info.primary_ref_frame = ap_ref->slot;
425  ap->av1pic_info.ref_order_hint[ap_ref->slot] = ref->display_order - ap_ref->last_idr_frame;
426  for (int i = 0; i < AV1_REF_FRAME_GOLDEN; i++)
427  ap->av1pic_info.ref_frame_idx[i] = ap_ref->slot;
428  set_name_slot(ap_ref->av1pic_info.current_frame_id, name_slots, ref_name_mask, 0);
429 
430  ref = pic->refs[1][pic->nb_refs[1] - 1];
431  ap_ref = ref->codec_priv;
432  ap->av1pic_info.ref_order_hint[ap_ref->slot] = ref->display_order - ap_ref->last_idr_frame;
433  for (int i = AV1_REF_FRAME_GOLDEN; i < AV1_REFS_PER_FRAME; i++)
434  ap->av1pic_info.ref_frame_idx[i] = ap_ref->slot;
435  set_name_slot(ap_ref->av1pic_info.current_frame_id, name_slots, ref_name_mask, 1);
436  break;
437  }
438 
439  ap->av1pic_info.flags.showable_frame = ap->av1pic_info.frame_type != STD_VIDEO_AV1_FRAME_TYPE_KEY;
440  ap->av1pic_info.order_hint = pic->display_order - ap->last_idr_frame;
441 
442  ap->vkav1pic_info = (VkVideoEncodeAV1PictureInfoKHR) {
443  .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_PICTURE_INFO_KHR,
444  .pNext = NULL,
445  .predictionMode = pred_mode,
446  .rateControlGroup = rc_group,
447  .constantQIndex = quantization->base_q_idx,
448  .pStdPictureInfo = &ap->av1pic_info,
449  // .referenceNameSlotIndices is set below
450  .primaryReferenceCdfOnly = 0,
451  .generateObuExtensionHeader = 0,
452  };
453  encode_info->pNext = &ap->vkav1pic_info;
454 
455  for (int i = 0; i < FF_ARRAY_ELEMS(ap->vkav1pic_info.referenceNameSlotIndices); i++)
456  ap->vkav1pic_info.referenceNameSlotIndices[i] = name_slots[i];
457 
458  ref_slot = (VkVideoReferenceSlotInfoKHR *)encode_info->pSetupReferenceSlot;
459  ref_slot->pNext = &ap->vkav1dpb_info;
460 
461  ap->av1dpb_info = (StdVideoEncodeAV1ReferenceInfo) {
462  .flags = (StdVideoEncodeAV1ReferenceInfoFlags) {
463  .disable_frame_end_update_cdf = 0,
464  .segmentation_enabled = 0,
465  /* Reserved */
466  },
467  .RefFrameId = ref_slot->slotIndex,
468  .frame_type = ap->av1pic_info.frame_type,
469  .OrderHint = pic->display_order - ap->last_idr_frame,
470  /* Reserved */
471  .pExtensionHeader = &ap->ext_header,
472  };
473 
474  ap->vkav1dpb_info = (VkVideoEncodeAV1DpbSlotInfoKHR) {
475  .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_DPB_SLOT_INFO_KHR,
476  .pStdReferenceInfo = &ap->av1dpb_info,
477  };
478 
479  ap->units_needed = 0;
480  if (pic->type == FF_HW_PICTURE_TYPE_IDR) {
481  AVFrameSideData *sd = NULL;
485  if (sd) {
488  if (mdm->has_primaries && mdm->has_luminance) {
489  AV1RawOBU *obu = &enc->meta_mastering_obu;
490  AV1RawMetadata *md = &obu->obu.metadata;
491  AV1RawMetadataHDRMDCV *mdcv = &md->metadata.hdr_mdcv;
492  const int chroma_den = 1 << 16;
493  const int max_luma_den = 1 << 8;
494  const int min_luma_den = 1 << 14;
495 
496  memset(obu, 0, sizeof(*obu));
498  md->metadata_type = AV1_METADATA_TYPE_HDR_MDCV;
499 
500  for (int i = 0; i < 3; i++) {
501  mdcv->primary_chromaticity_x[i] =
502  av_rescale(mdm->display_primaries[i][0].num, chroma_den,
503  mdm->display_primaries[i][0].den);
504  mdcv->primary_chromaticity_y[i] =
505  av_rescale(mdm->display_primaries[i][1].num, chroma_den,
506  mdm->display_primaries[i][1].den);
507  }
508 
510  av_rescale(mdm->white_point[0].num, chroma_den,
511  mdm->white_point[0].den);
513  av_rescale(mdm->white_point[1].num, chroma_den,
514  mdm->white_point[1].den);
515 
516  mdcv->luminance_max =
517  av_rescale(mdm->max_luminance.num, max_luma_den,
518  mdm->max_luminance.den);
519  mdcv->luminance_min =
520  av_rescale(mdm->min_luminance.num, min_luma_den,
521  mdm->min_luminance.den);
523  }
524  }
525 
529  if (sd) {
531  AV1RawOBU *obu = &enc->meta_cll_obu;
532  AV1RawMetadata *md = &obu->obu.metadata;
533  AV1RawMetadataHDRCLL *cll = &md->metadata.hdr_cll;
534 
535  memset(obu, 0, sizeof(*obu));
536  obu->header.obu_type = AV1_OBU_METADATA;
537  md->metadata_type = AV1_METADATA_TYPE_HDR_CLL;
538  cll->max_cll = cllm->MaxCLL;
539  cll->max_fall = cllm->MaxFALL;
540 
542  }
543  }
544 
545  return 0;
546 }
547 
548 static int init_profile(AVCodecContext *avctx,
549  VkVideoProfileInfoKHR *profile, void *pnext)
550 {
551  VkResult ret;
552  VulkanEncodeAV1Context *enc = avctx->priv_data;
554  FFVulkanContext *s = &ctx->s;
555  FFVulkanFunctions *vk = &ctx->s.vkfn;
556  FFHWBaseEncodeContext *base_ctx = &ctx->base;
557 
558  VkVideoEncodeAV1CapabilitiesKHR av1_caps = {
559  .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_CAPABILITIES_KHR,
560  };
561  VkVideoEncodeCapabilitiesKHR enc_caps = {
562  .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_CAPABILITIES_KHR,
563  .pNext = &av1_caps,
564  };
565  VkVideoCapabilitiesKHR caps = {
566  .sType = VK_STRUCTURE_TYPE_VIDEO_CAPABILITIES_KHR,
567  .pNext = &enc_caps,
568  };
569 
570  /* In order of preference */
571  int last_supported = AV_PROFILE_UNKNOWN;
572  static const int known_profiles[] = {
576  };
577  int nb_profiles = FF_ARRAY_ELEMS(known_profiles);
578 
579  const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(s->frames->sw_format);
580  if (!desc)
581  return AVERROR(EINVAL);
582 
583  if (s->frames->sw_format == AV_PIX_FMT_NV12 ||
584  s->frames->sw_format == AV_PIX_FMT_P010)
585  nb_profiles = 1;
586 
587  enc->profile = (VkVideoEncodeAV1ProfileInfoKHR) {
588  .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_PROFILE_INFO_KHR,
589  .pNext = pnext,
590  .stdProfile = ff_vk_av1_profile_to_vk(avctx->profile),
591  };
592  profile->pNext = &enc->profile;
593 
594  /* Set level */
595  if (avctx->level == AV_LEVEL_UNKNOWN) {
596  const AV1LevelDescriptor *level;
597  float framerate = 0.0;
598 
599  if (avctx->framerate.num > 0 && avctx->framerate.den > 0)
600  framerate = av_q2d(avctx->framerate);
601 
602  level = ff_av1_guess_level(avctx->bit_rate, enc->seq_tier,
603  base_ctx->surface_width, base_ctx->surface_height,
604  enc->tile_rows * enc->tile_cols,
605  enc->tile_cols, framerate);
606  if (level) {
607  av_log(avctx, AV_LOG_VERBOSE, "Using level %s.\n", level->name);
608  enc->seq_level_idx = ff_vk_av1_level_to_vk(level->level_idx);
609  } else {
610  av_log(avctx, AV_LOG_VERBOSE, "Stream will not conform to "
611  "any normal level, using level 7.3 by default.\n");
612  enc->seq_level_idx = STD_VIDEO_AV1_LEVEL_7_3;
613  enc->seq_tier = 1;
614  }
615  } else {
617  }
618 
619  /* User has explicitly specified a profile. */
620  if (avctx->profile != AV_PROFILE_UNKNOWN)
621  return 0;
622 
623  av_log(avctx, AV_LOG_DEBUG, "Supported profiles:\n");
624  for (int i = 0; i < nb_profiles; i++) {
625  enc->profile.stdProfile = ff_vk_av1_profile_to_vk(known_profiles[i]);
626  ret = vk->GetPhysicalDeviceVideoCapabilitiesKHR(s->hwctx->phys_dev,
627  profile,
628  &caps);
629  if (ret == VK_SUCCESS) {
630  av_log(avctx, AV_LOG_DEBUG, " %s\n",
631  avcodec_profile_name(avctx->codec_id, known_profiles[i]));
632  last_supported = known_profiles[i];
633  }
634  }
635 
636  if (last_supported == AV_PROFILE_UNKNOWN) {
637  av_log(avctx, AV_LOG_ERROR, "No supported profiles for given format\n");
638  return AVERROR(ENOTSUP);
639  }
640 
641  enc->profile.stdProfile = ff_vk_av1_profile_to_vk(last_supported);
642  av_log(avctx, AV_LOG_VERBOSE, "Using profile %s\n",
643  avcodec_profile_name(avctx->codec_id, last_supported));
644  avctx->profile = last_supported;
645 
646  return 0;
647 }
648 
650 {
651  VulkanEncodeAV1Context *enc = avctx->priv_data;
652 
653  if (avctx->rc_buffer_size)
654  enc->hrd_buffer_size = avctx->rc_buffer_size;
655  else if (avctx->rc_max_rate > 0)
656  enc->hrd_buffer_size = avctx->rc_max_rate;
657  else
658  enc->hrd_buffer_size = avctx->bit_rate;
659 
660  if (avctx->rc_initial_buffer_occupancy) {
661  if (avctx->rc_initial_buffer_occupancy > enc->hrd_buffer_size) {
662  av_log(avctx, AV_LOG_ERROR, "Invalid RC buffer settings: "
663  "must have initial buffer size (%d) <= "
664  "buffer size (%"PRId64").\n",
666  return AVERROR(EINVAL);
667  }
669  } else {
670  enc->initial_buffer_fullness = enc->hrd_buffer_size * 3 / 4;
671  }
672 
673  if (enc->common.opts.rc_mode == VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DISABLED_BIT_KHR) {
674  enc->q_idx_p = av_clip(enc->common.opts.qp,
675  enc->caps.minQIndex, enc->caps.maxQIndex);
676  if (fabs(avctx->i_quant_factor) > 0.0)
677  enc->q_idx_idr =
678  av_clip((fabs(avctx->i_quant_factor) * enc->q_idx_p +
679  avctx->i_quant_offset) + 0.5,
680  0, 255);
681  else
682  enc->q_idx_idr = enc->q_idx_p;
683 
684  if (fabs(avctx->b_quant_factor) > 0.0)
685  enc->q_idx_b =
686  av_clip((fabs(avctx->b_quant_factor) * enc->q_idx_p +
687  avctx->b_quant_offset) + 0.5,
688  0, 255);
689  else
690  enc->q_idx_b = enc->q_idx_p;
691  } else {
692  /** Arbitrary value */
693  enc->q_idx_idr = enc->q_idx_p = enc->q_idx_b = 128;
694  }
695 
696  return 0;
697 }
698 
700 {
701  VulkanEncodeAV1Context *enc = avctx->priv_data;
703  FFVulkanContext *s = &ctx->s;
704  FFHWBaseEncodeContext *base_ctx = &ctx->base;
705 
706  AV1RawOBU *seq_obu = &enc->seq_hdr_obu;
707  AV1RawSequenceHeader *seq = &seq_obu->obu.sequence_header;
708 
709  const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(s->frames->sw_format);
710  if (!desc)
711  return AVERROR(EINVAL);
712 
714  *seq = (AV1RawSequenceHeader) {
715  .seq_profile = avctx->profile,
716  .seq_force_integer_mv = seq->seq_force_screen_content_tools ?
719  .frame_width_bits_minus_1 = av_log2(base_ctx->surface_width),
720  .frame_height_bits_minus_1 = av_log2(base_ctx->surface_height),
721  .max_frame_width_minus_1 = base_ctx->surface_width - 1,
722  .max_frame_height_minus_1 = base_ctx->surface_height - 1,
723  .enable_order_hint = 1,
724  .order_hint_bits_minus_1 = av_clip_intp2(av_log2(ctx->base.gop_size), 3),
725  .use_128x128_superblock = !!(enc->caps.superblockSizes & VK_VIDEO_ENCODE_AV1_SUPERBLOCK_SIZE_128_BIT_KHR),
727  .high_bitdepth = desc->comp[0].depth > 8,
728  .color_primaries = avctx->color_primaries,
729  .transfer_characteristics = avctx->color_trc,
730  .matrix_coefficients = avctx->colorspace,
731  .color_description_present_flag = (avctx->color_primaries != AVCOL_PRI_UNSPECIFIED ||
732  avctx->color_trc != AVCOL_TRC_UNSPECIFIED ||
734  .subsampling_x = desc->log2_chroma_w,
735  .subsampling_y = desc->log2_chroma_h,
736  .chroma_sample_position = avctx->chroma_sample_location == AVCHROMA_LOC_LEFT ?
741  },
742 
743  /* Operating point */
744  .seq_tier = { enc->seq_tier },
745  .seq_level_idx = { enc->seq_level_idx },
746  .decoder_buffer_delay = { base_ctx->decode_delay },
747  .encoder_buffer_delay = { base_ctx->output_delay },
748  .operating_points_cnt_minus_1 = 1 - 1,
749  };
750 
751  return 0;
752 }
753 
754 typedef struct VulkanAV1Units {
755  StdVideoAV1SequenceHeader seq_hdr;
756  StdVideoAV1TimingInfo timing_info;
757  StdVideoAV1ColorConfig color_config;
758 
759  StdVideoEncodeAV1DecoderModelInfo decoder_model;
760  StdVideoEncodeAV1OperatingPointInfo operating_points[AV1_MAX_OPERATING_POINTS];
763 
765 {
766  VulkanEncodeAV1Context *enc = avctx->priv_data;
767 
768  AV1RawOBU *seq_obu = &enc->seq_hdr_obu;
769  AV1RawSequenceHeader *seq = &seq_obu->obu.sequence_header;
770 
771  StdVideoAV1SequenceHeader *seq_hdr = &vk_units->seq_hdr;
772  StdVideoAV1TimingInfo *timing_info = &vk_units->timing_info;
773  StdVideoAV1ColorConfig *color_config = &vk_units->color_config;
774 
775  StdVideoEncodeAV1OperatingPointInfo *operating_points = vk_units->operating_points;
776 
777  *timing_info = (StdVideoAV1TimingInfo) {
778  .flags = (StdVideoAV1TimingInfoFlags) {
779  .equal_picture_interval = seq->timing_info.equal_picture_interval,
780  },
781  .num_units_in_display_tick = seq->timing_info.num_units_in_display_tick,
782  .time_scale = seq->timing_info.time_scale,
783  .num_ticks_per_picture_minus_1 = seq->timing_info.num_ticks_per_picture_minus_1,
784  };
785 
786  *color_config = (StdVideoAV1ColorConfig) {
787  .flags = (StdVideoAV1ColorConfigFlags) {
788  .mono_chrome = seq->color_config.mono_chrome,
789  .color_range = seq->color_config.color_range,
790  .separate_uv_delta_q = seq->color_config.separate_uv_delta_q,
791  },
792  .BitDepth = seq->color_config.twelve_bit ? 12 :
793  seq->color_config.high_bitdepth ? 10 : 8,
794  .subsampling_x = seq->color_config.subsampling_x,
795  .subsampling_y = seq->color_config.subsampling_y,
796  .color_primaries = seq->color_config.color_primaries,
797  .transfer_characteristics = seq->color_config.transfer_characteristics,
798  .matrix_coefficients = seq->color_config.matrix_coefficients,
799  };
800 
801  *seq_hdr = (StdVideoAV1SequenceHeader) {
802  .flags = (StdVideoAV1SequenceHeaderFlags) {
803  .still_picture = seq->still_picture,
804  .reduced_still_picture_header = seq->reduced_still_picture_header,
805  .use_128x128_superblock = seq->use_128x128_superblock,
806  .enable_filter_intra = seq->enable_filter_intra,
807  .enable_intra_edge_filter = seq->enable_intra_edge_filter,
808  .enable_interintra_compound = seq->enable_interintra_compound,
809  .enable_masked_compound = seq->enable_masked_compound,
810  .enable_warped_motion = seq->enable_warped_motion,
811  .enable_dual_filter = seq->enable_dual_filter,
812  .enable_order_hint = seq->enable_order_hint,
813  .enable_jnt_comp = seq->enable_jnt_comp,
814  .enable_ref_frame_mvs = seq->enable_ref_frame_mvs,
815  .frame_id_numbers_present_flag = seq->frame_id_numbers_present_flag,
816  .enable_superres = seq->enable_superres,
817  .enable_cdef = seq->enable_cdef,
818  .enable_restoration = seq->enable_restoration,
819  .film_grain_params_present = seq->film_grain_params_present,
820  .timing_info_present_flag = seq->timing_info_present_flag,
821  .initial_display_delay_present_flag = seq->initial_display_delay_present_flag,
822  },
823  .seq_profile = seq->seq_profile,
824  .frame_width_bits_minus_1 = seq->frame_width_bits_minus_1,
825  .frame_height_bits_minus_1 = seq->frame_height_bits_minus_1,
826  .max_frame_width_minus_1 = seq->max_frame_width_minus_1,
827  .max_frame_height_minus_1 = seq->max_frame_height_minus_1,
828  .delta_frame_id_length_minus_2 = seq->delta_frame_id_length_minus_2,
829  .additional_frame_id_length_minus_1 = seq->additional_frame_id_length_minus_1,
830  .order_hint_bits_minus_1 = seq->order_hint_bits_minus_1,
831  .seq_force_integer_mv = seq->seq_force_integer_mv,
832  .seq_force_screen_content_tools = seq->seq_force_screen_content_tools,
833  .pTimingInfo = timing_info,
834  .pColorConfig = color_config,
835  };
836 
837  for (int i = 0; i <= seq->operating_points_cnt_minus_1; i++) {
838  operating_points[i] = (StdVideoEncodeAV1OperatingPointInfo) {
839  .flags = (StdVideoEncodeAV1OperatingPointInfoFlags) {
840  .decoder_model_present_for_this_op = seq->decoder_model_present_for_this_op[i],
841  .low_delay_mode_flag = seq->low_delay_mode_flag[i],
842  .initial_display_delay_present_for_this_op = seq->initial_display_delay_present_for_this_op[i],
843  /* Reserved */
844  },
845  .operating_point_idc = seq->operating_point_idc[i],
846  .seq_level_idx = seq->seq_level_idx[i],
847  .seq_tier = seq->seq_tier[i],
848  .decoder_buffer_delay = seq->decoder_buffer_delay[i],
849  .encoder_buffer_delay = seq->encoder_buffer_delay[i],
850  .initial_display_delay_minus_1 = seq->initial_display_delay_minus_1[i],
851  };
852  }
854 
855  return 0;
856 }
857 
859 {
860  int err;
861  VulkanEncodeAV1Context *enc = avctx->priv_data;
863  FFVulkanContext *s = &ctx->s;
864  FFVulkanFunctions *vk = &ctx->s.vkfn;
865 
866  VulkanAV1Units vk_units = { 0 };
867 
868  VkVideoEncodeAV1SessionParametersCreateInfoKHR av1_params;
869 
870  /* Convert it to Vulkan */
871  err = base_unit_to_vk(avctx, &vk_units);
872  if (err < 0) {
873  av_log(avctx, AV_LOG_ERROR, "Unable to convert sequence header to Vulkan: %s\n",
874  av_err2str(err));
875  return err;
876  }
877 
878  /* Destroy the session params */
879  if (ctx->session_params)
880  vk->DestroyVideoSessionParametersKHR(s->hwctx->act_dev,
881  ctx->session_params,
882  s->hwctx->alloc);
883 
884  av1_params = (VkVideoEncodeAV1SessionParametersCreateInfoKHR) {
885  .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_SESSION_PARAMETERS_CREATE_INFO_KHR,
886  .pStdSequenceHeader = &vk_units.seq_hdr,
887  .pStdDecoderModelInfo = &vk_units.decoder_model,
888  .pStdOperatingPoints = vk_units.operating_points,
889  .stdOperatingPointCount = vk_units.nb_operating_points,
890  };
891 
892  return ff_vulkan_encode_create_session_params(avctx, ctx, &av1_params);
893 }
894 
896  const uint8_t *data, size_t size)
897 {
898  int err;
899  VulkanEncodeAV1Context *enc = avctx->priv_data;
900  AV1RawOBU *seq_obu = &enc->seq_hdr_obu;
901  AV1RawSequenceHeader *seq = &seq_obu->obu.sequence_header;
902 
904  CodedBitstreamFragment obu = { 0 };
905 
906  err = ff_cbs_init(&cbs, AV_CODEC_ID_AV1, avctx);
907  if (err < 0)
908  return err;
909 
910  err = ff_cbs_read(cbs, &obu, NULL, data, size);
911  if (err < 0) {
912  av_log(avctx, AV_LOG_ERROR, "Unable to parse feedback units, bad drivers: %s\n",
913  av_err2str(err));
914  return err;
915  }
916 
917  /* If PPS has an override, just copy it entirely. */
918  for (int i = 0; i < obu.nb_units; i++) {
919  if (obu.units[i].type == AV1_OBU_SEQUENCE_HEADER) {
920  AV1RawOBU *f_seq_obu = obu.units[i].content;
921  AV1RawSequenceHeader *f_seq = &f_seq_obu->obu.sequence_header;
930  }
931  }
932 
933  ff_cbs_fragment_free(&obu);
934  ff_cbs_close(&cbs);
935 
936  return 0;
937 }
938 
939 static int init_base_units(AVCodecContext *avctx)
940 {
941  int err;
942  VkResult ret;
943  VulkanEncodeAV1Context *enc = avctx->priv_data;
945  FFVulkanContext *s = &ctx->s;
946  FFVulkanFunctions *vk = &ctx->s.vkfn;
947 
948  VkVideoEncodeSessionParametersGetInfoKHR params_info;
949  VkVideoEncodeSessionParametersFeedbackInfoKHR params_feedback;
950 
951  void *data = NULL;
952  size_t data_size = 0;
953 
954  /* Generate SPS/PPS unit info */
955  err = init_sequence_headers(avctx);
956  if (err < 0) {
957  av_log(avctx, AV_LOG_ERROR, "Unable to initialize sequence header: %s\n",
958  av_err2str(err));
959  return err;
960  }
961 
962  /* Create session parameters from them */
963  err = create_session_params(avctx);
964  if (err < 0)
965  return err;
966 
967  params_info = (VkVideoEncodeSessionParametersGetInfoKHR) {
968  .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_SESSION_PARAMETERS_GET_INFO_KHR,
969  .videoSessionParameters = ctx->session_params,
970  };
971  params_feedback = (VkVideoEncodeSessionParametersFeedbackInfoKHR) {
972  .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_SESSION_PARAMETERS_FEEDBACK_INFO_KHR,
973  };
974 
975  ret = vk->GetEncodedVideoSessionParametersKHR(s->hwctx->act_dev, &params_info,
976  &params_feedback,
977  &data_size, data);
978  if (ret == VK_INCOMPLETE ||
979  (ret == VK_SUCCESS) && (data_size > 0)) {
980  data = av_mallocz(data_size);
981  if (!data)
982  return AVERROR(ENOMEM);
983  } else {
984  av_log(avctx, AV_LOG_ERROR, "Unable to get feedback for AV1 sequence header = %"SIZE_SPECIFIER"\n",
985  data_size);
986  return err;
987  }
988 
989  ret = vk->GetEncodedVideoSessionParametersKHR(s->hwctx->act_dev, &params_info,
990  &params_feedback,
991  &data_size, data);
992  if (ret != VK_SUCCESS) {
993  av_log(avctx, AV_LOG_ERROR, "Error writing feedback units\n");
994  return err;
995  }
996 
997  av_log(avctx, AV_LOG_VERBOSE, "Feedback units written, overrides: %i\n",
998  params_feedback.hasOverrides);
999 
1000  params_feedback.hasOverrides = 1;
1001 
1002  /* No need to sync any overrides */
1003  if (!params_feedback.hasOverrides)
1004  return 0;
1005 
1006  /* Parse back tne units and override */
1007  err = parse_feedback_units(avctx, data, data_size);
1008  if (err < 0)
1009  return err;
1010 
1011  /* Create final session parameters */
1012  err = create_session_params(avctx);
1013  if (err < 0)
1014  return err;
1015 
1016  return 0;
1017 }
1018 
1021  uint8_t type, void *obu_unit)
1022 {
1023  int err;
1024 
1025  err = ff_cbs_insert_unit_content(au, -1,
1026  type, obu_unit, NULL);
1027  if (err < 0) {
1028  av_log(avctx, AV_LOG_ERROR, "Failed to add OBU unit: "
1029  "type = %d.\n", type);
1030  return err;
1031  }
1032 
1033  return err;
1034 }
1035 
1037  uint8_t *data, size_t *data_len,
1039 {
1040  VulkanEncodeAV1Context *enc = avctx->priv_data;
1041  int ret;
1042 
1043  ret = ff_cbs_write_fragment_data(enc->cbs, obu);
1044  if (ret < 0) {
1045  av_log(avctx, AV_LOG_ERROR, "Failed to write packed header.\n");
1046  return ret;
1047  }
1048 
1049  memcpy(data, obu->data, obu->data_size);
1050  *data_len = obu->data_size;
1051 
1052  return 0;
1053 }
1054 
1056  FFHWBaseEncodePicture *base_pic,
1057  uint8_t *data, size_t *data_len)
1058 {
1059  int err;
1060  VulkanEncodeAV1Context *enc = avctx->priv_data;
1062 
1063  err = vulkan_encode_av1_add_obu(avctx, obu,
1065  if (err < 0)
1066  goto fail;
1067 
1068  err = vulkan_encode_av1_write_obu(avctx, data, data_len, obu);
1069 
1070 fail:
1071  ff_cbs_fragment_reset(obu);
1072  return err;
1073 }
1074 
1076  FFHWBaseEncodePicture *base_pic,
1077  uint8_t *data, size_t *data_len)
1078 {
1079  int err;
1080  VulkanEncodeAV1Context *enc = avctx->priv_data;
1081  VulkanEncodeAV1Picture *ap = base_pic->codec_priv;
1083 
1085  err = vulkan_encode_av1_add_obu(avctx, obu,
1087  &enc->meta_mastering_obu);
1088  if (err < 0)
1089  goto fail;
1090  }
1091 
1093  err = vulkan_encode_av1_add_obu(avctx, obu,
1095  &enc->meta_cll_obu);
1096  if (err < 0)
1097  goto fail;
1098  }
1099 
1100  if (ap->units_needed) {
1101  err = vulkan_encode_av1_write_obu(avctx, data, data_len, obu);
1102  if (err < 0)
1103  goto fail;
1104  } else {
1105  err = 0;
1106  *data_len = 0;
1107  }
1108 
1109 fail:
1110  ff_cbs_fragment_reset(obu);
1111  return err;
1112 }
1113 
1114 static int write_padding(AVCodecContext *avctx, uint32_t padding,
1115  uint8_t *data, size_t *data_len)
1116 {
1117  int err;
1118  VulkanEncodeAV1Context *enc = avctx->priv_data;
1120 
1121  AV1RawOBU padding_obu = { 0 };
1122  AV1RawPadding *raw_padding = &padding_obu.obu.padding;
1123 
1124  if (!padding)
1125  padding = 16;
1126 
1127  /* 2 byte header + 1 byte trailing bits */
1128  padding_obu.header.obu_type = AV1_OBU_PADDING;
1129  *raw_padding = (AV1RawPadding) {
1130  .payload = enc->padding_payload,
1131  .payload_size = padding,
1132  };
1133 
1134  err = vulkan_encode_av1_add_obu(avctx, obu, AV1_OBU_PADDING, &padding_obu);
1135  if (err < 0)
1136  goto fail;
1137 
1138  err = vulkan_encode_av1_write_obu(avctx, data, data_len, obu);
1139 fail:
1140  ff_cbs_fragment_reset(obu);
1141  return err;
1142 }
1143 
1144 static const FFVulkanCodec enc_cb = {
1149  .picture_priv_data_size = sizeof(VulkanEncodeAV1Picture),
1150  .filler_header_size = 4,
1157 };
1158 
1160 {
1161  int err;
1162  VulkanEncodeAV1Context *enc = avctx->priv_data;
1163  FFVulkanEncodeContext *ctx = &enc->common;
1164  FFHWBaseEncodeContext *base_ctx = &ctx->base;
1165  int flags;
1166 
1167  if (avctx->profile == AV_PROFILE_UNKNOWN)
1168  avctx->profile = enc->common.opts.profile;
1169 
1170  enc->caps = (VkVideoEncodeAV1CapabilitiesKHR) {
1171  .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_CAPABILITIES_KHR,
1172  };
1173 
1174  enc->quality_props = (VkVideoEncodeAV1QualityLevelPropertiesKHR) {
1175  .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_QUALITY_LEVEL_PROPERTIES_KHR,
1176  };
1177 
1178  err = ff_vulkan_encode_init(avctx, &enc->common,
1180  &enc->caps, &enc->quality_props);
1181  if (err < 0)
1182  return err;
1183 
1184  av_log(avctx, AV_LOG_VERBOSE, "AV1 encoder capabilities:\n");
1185  av_log(avctx, AV_LOG_VERBOSE, " Standard capability flags:\n");
1186  av_log(avctx, AV_LOG_VERBOSE, " per_rate_control_group_min_max_q_index: %i\n",
1187  !!(enc->caps.flags & VK_VIDEO_ENCODE_AV1_CAPABILITY_PER_RATE_CONTROL_GROUP_MIN_MAX_Q_INDEX_BIT_KHR));
1188  av_log(avctx, AV_LOG_VERBOSE, " generate_obu_extension_header: %i\n",
1189  !!(enc->caps.flags & VK_VIDEO_ENCODE_AV1_CAPABILITY_GENERATE_OBU_EXTENSION_HEADER_BIT_KHR));
1190  av_log(avctx, AV_LOG_VERBOSE, " primary_reference_cdf_only: %i\n",
1191  !!(enc->caps.flags & VK_VIDEO_ENCODE_AV1_CAPABILITY_PRIMARY_REFERENCE_CDF_ONLY_BIT_KHR));
1192  av_log(avctx, AV_LOG_VERBOSE, " frame_size_override: %i\n",
1193  !!(enc->caps.flags & VK_VIDEO_ENCODE_AV1_CAPABILITY_FRAME_SIZE_OVERRIDE_BIT_KHR));
1194  av_log(avctx, AV_LOG_VERBOSE, " motion_vector_scaling: %i\n",
1195  !!(enc->caps.flags & VK_VIDEO_ENCODE_AV1_CAPABILITY_MOTION_VECTOR_SCALING_BIT_KHR));
1196  av_log(avctx, AV_LOG_VERBOSE, " Capabilities:\n");
1197  av_log(avctx, AV_LOG_VERBOSE, " 64x64 superblocks: %i\n",
1198  !!(enc->caps.superblockSizes & VK_VIDEO_ENCODE_AV1_SUPERBLOCK_SIZE_64_BIT_KHR));
1199  av_log(avctx, AV_LOG_VERBOSE, " 128x128 superblocks: %i\n",
1200  !!(enc->caps.superblockSizes & VK_VIDEO_ENCODE_AV1_SUPERBLOCK_SIZE_128_BIT_KHR));
1201  av_log(avctx, AV_LOG_VERBOSE, " maxSingleReferenceCount: %i\n",
1202  enc->caps.maxSingleReferenceCount);
1203  av_log(avctx, AV_LOG_VERBOSE, " singleReferenceNameMask: 0x%x\n",
1204  enc->caps.singleReferenceNameMask);
1205  av_log(avctx, AV_LOG_VERBOSE, " maxUnidirectionalCompoundReferenceCount: %i\n",
1206  enc->caps.maxUnidirectionalCompoundReferenceCount);
1207  av_log(avctx, AV_LOG_VERBOSE, " maxUnidirectionalCompoundGroup1ReferenceCount: %i\n",
1208  enc->caps.maxUnidirectionalCompoundGroup1ReferenceCount);
1209  av_log(avctx, AV_LOG_VERBOSE, " unidirectionalCompoundReferenceNameMask: 0x%x\n",
1210  enc->caps.unidirectionalCompoundReferenceNameMask);
1211  av_log(avctx, AV_LOG_VERBOSE, " maxBidirectionalCompoundReferenceCount: %i\n",
1212  enc->caps.maxBidirectionalCompoundReferenceCount);
1213  av_log(avctx, AV_LOG_VERBOSE, " maxBidirectionalCompoundGroup1ReferenceCount: %i\n",
1214  enc->caps.maxBidirectionalCompoundGroup1ReferenceCount);
1215  av_log(avctx, AV_LOG_VERBOSE, " maxBidirectionalCompoundGroup2ReferenceCount: %i\n",
1216  enc->caps.maxBidirectionalCompoundGroup2ReferenceCount);
1217  av_log(avctx, AV_LOG_VERBOSE, " bidirectionalCompoundReferenceNameMask: 0x%x\n",
1218  enc->caps.bidirectionalCompoundReferenceNameMask);
1219  av_log(avctx, AV_LOG_VERBOSE, " maxTemporalLayerCount: %i\n",
1220  enc->caps.maxTemporalLayerCount);
1221  av_log(avctx, AV_LOG_VERBOSE, " maxSpatialLayerCount: %i\n",
1222  enc->caps.maxSpatialLayerCount);
1223  av_log(avctx, AV_LOG_VERBOSE, " maxOperatingPoints: %i\n",
1224  enc->caps.maxOperatingPoints);
1225  av_log(avctx, AV_LOG_VERBOSE, " min/max Qindex: [%i, %i]\n",
1226  enc->caps.minQIndex, enc->caps.maxQIndex);
1227  av_log(avctx, AV_LOG_VERBOSE, " prefersGopRemainingFrames: %i\n",
1228  enc->caps.prefersGopRemainingFrames);
1229  av_log(avctx, AV_LOG_VERBOSE, " requiresGopRemainingFrames: %i\n",
1230  enc->caps.requiresGopRemainingFrames);
1231  av_log(avctx, AV_LOG_VERBOSE, " maxLevel: %i\n",
1232  enc->caps.maxLevel);
1233  av_log(avctx, AV_LOG_VERBOSE, " codedPictureAlignment: %ix%i\n",
1234  enc->caps.codedPictureAlignment.width, enc->caps.codedPictureAlignment.height);
1235  av_log(avctx, AV_LOG_VERBOSE, " maxTiles: %ix%i\n",
1236  enc->caps.maxTiles.width, enc->caps.maxTiles.height);
1237  av_log(avctx, AV_LOG_VERBOSE, " Tile size: %ix%i to %ix%i\n",
1238  enc->caps.minTileSize.width, enc->caps.minTileSize.height,
1239  enc->caps.maxTileSize.width, enc->caps.maxTileSize.height);
1240 
1241  err = init_enc_options(avctx);
1242  if (err < 0)
1243  return err;
1244 
1245  flags = ctx->codec->flags;
1246  err = ff_hw_base_init_gop_structure(base_ctx, avctx,
1247  ctx->caps.maxDpbSlots,
1248  enc->caps.maxBidirectionalCompoundReferenceCount,
1249  flags, 0);
1250  if (err < 0)
1251  return err;
1252 
1253  base_ctx->output_delay = base_ctx->b_per_p;
1254  base_ctx->decode_delay = base_ctx->max_b_depth;
1255 
1256  /* Create units and session parameters */
1257  err = init_base_units(avctx);
1258  if (err < 0)
1259  return err;
1260 
1261  /* Init CBS */
1262  err = ff_cbs_init(&enc->cbs, AV_CODEC_ID_AV1, avctx);
1263  if (err < 0)
1264  return err;
1265 
1266  if (avctx->flags & AV_CODEC_FLAG_GLOBAL_HEADER) {
1267  uint8_t data[4096];
1268  size_t data_len = sizeof(data);
1269 
1270  err = write_sequence_header(avctx, NULL, data, &data_len);
1271  if (err < 0) {
1272  av_log(avctx, AV_LOG_ERROR, "Failed to write sequence header "
1273  "for extradata: %d.\n", err);
1274  return err;
1275  } else {
1276  avctx->extradata_size = data_len;
1277  avctx->extradata = av_mallocz(avctx->extradata_size +
1279  if (!avctx->extradata) {
1280  err = AVERROR(ENOMEM);
1281  return err;
1282  }
1283  memcpy(avctx->extradata, data, avctx->extradata_size);
1284  }
1285  }
1286 
1287  enc->padding_payload = av_mallocz(2*ctx->caps.minBitstreamBufferOffsetAlignment);
1288  if (!enc->padding_payload)
1289  return AVERROR(ENOMEM);
1290 
1291  memset(enc->padding_payload, 0xaa, 2*ctx->caps.minBitstreamBufferOffsetAlignment);
1292 
1293  return 0;
1294 }
1295 
1297 {
1298  VulkanEncodeAV1Context *enc = avctx->priv_data;
1299  av_free(enc->padding_payload);
1301  return 0;
1302 }
1303 
1304 #define OFFSET(x) offsetof(VulkanEncodeAV1Context, x)
1305 #define FLAGS (AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM)
1309 
1310  { "profile", "Set profile",
1311  OFFSET(common.opts.profile), AV_OPT_TYPE_INT,
1312  { .i64 = AV_PROFILE_UNKNOWN }, AV_PROFILE_UNKNOWN, 0xffff, FLAGS, .unit = "profile" },
1313 
1314 #define PROFILE(name, value) name, NULL, 0, AV_OPT_TYPE_CONST, \
1315  { .i64 = value }, 0, 0, FLAGS, .unit = "profile"
1316  { PROFILE("main", AV_PROFILE_AV1_MAIN) },
1317  { PROFILE("high", AV_PROFILE_AV1_HIGH) },
1318  { PROFILE("professional", AV_PROFILE_AV1_PROFESSIONAL) },
1319 #undef PROFILE
1320 
1321  { "tier", "Set tier (seq_tier)",
1322  OFFSET(common.opts.tier), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, FLAGS, .unit = "tier" },
1323  { "main", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = 0 }, 0, 0, FLAGS, .unit = "tier" },
1324  { "high", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = 1 }, 0, 0, FLAGS, .unit = "tier" },
1325 
1326  { "level", "Set level (level_idc)",
1327  OFFSET(common.opts.level), AV_OPT_TYPE_INT,
1328  { .i64 = AV_LEVEL_UNKNOWN }, AV_LEVEL_UNKNOWN, 0xff, FLAGS, .unit = "level" },
1329 
1330 #define LEVEL(name, value) name, NULL, 0, AV_OPT_TYPE_CONST, \
1331  { .i64 = value }, 0, 0, FLAGS, .unit = "level"
1332  { LEVEL("20", 0) },
1333  { LEVEL("21", 1) },
1334  { LEVEL("22", 2) },
1335  { LEVEL("23", 3) },
1336  { LEVEL("30", 4) },
1337  { LEVEL("31", 5) },
1338  { LEVEL("32", 6) },
1339  { LEVEL("33", 7) },
1340  { LEVEL("40", 8) },
1341  { LEVEL("41", 9) },
1342  { LEVEL("42", 10) },
1343  { LEVEL("43", 11) },
1344  { LEVEL("50", 12) },
1345  { LEVEL("51", 13) },
1346  { LEVEL("52", 14) },
1347  { LEVEL("53", 15) },
1348  { LEVEL("60", 16) },
1349  { LEVEL("61", 17) },
1350  { LEVEL("62", 18) },
1351  { LEVEL("63", 19) },
1352  { LEVEL("70", 20) },
1353  { LEVEL("71", 21) },
1354  { LEVEL("72", 22) },
1355  { LEVEL("73", 23) },
1356 #undef LEVEL
1357 
1358  { "units", "Set units to include", OFFSET(unit_elems), AV_OPT_TYPE_FLAGS, { .i64 = UNIT_MASTERING_DISPLAY | UNIT_CONTENT_LIGHT_LEVEL }, 0, INT_MAX, FLAGS, "units" },
1359  { "hdr", "Include HDR metadata for mastering display colour volume and content light level information", 0, AV_OPT_TYPE_CONST, { .i64 = UNIT_MASTERING_DISPLAY | UNIT_CONTENT_LIGHT_LEVEL }, INT_MIN, INT_MAX, FLAGS, "units" },
1360 
1361  { NULL },
1362 };
1363 
1365  { "b", "0" },
1366  { "bf", "2" },
1367  { "g", "300" },
1368  { "qmin", "1" },
1369  { "qmax", "255" },
1370  { NULL },
1371 };
1372 
1374  .class_name = "av1_vulkan",
1375  .item_name = av_default_item_name,
1376  .option = vulkan_encode_av1_options,
1377  .version = LIBAVUTIL_VERSION_INT,
1378 };
1379 
1381  .p.name = "av1_vulkan",
1382  CODEC_LONG_NAME("AV1 (Vulkan)"),
1383  .p.type = AVMEDIA_TYPE_VIDEO,
1384  .p.id = AV_CODEC_ID_AV1,
1385  .priv_data_size = sizeof(VulkanEncodeAV1Context),
1388  .close = &vulkan_encode_av1_close,
1389  .p.priv_class = &vulkan_encode_av1_class,
1390  .p.capabilities = AV_CODEC_CAP_DELAY |
1395  .caps_internal = FF_CODEC_CAP_INIT_CLEANUP,
1396  .defaults = vulkan_encode_av1_defaults,
1397  .p.pix_fmts = (const enum AVPixelFormat[]) {
1400  },
1401  .hw_configs = ff_vulkan_encode_hw_configs,
1402  .p.wrapper_name = "vulkan",
1403 };
flags
const SwsFlags flags[]
Definition: swscale.c:61
FF_HW_FLAG_B_PICTURE_REFERENCES
@ FF_HW_FLAG_B_PICTURE_REFERENCES
Definition: hw_base_encode.h:55
AVMasteringDisplayMetadata::has_primaries
int has_primaries
Flag indicating whether the display primaries (and white point) are set.
Definition: mastering_display_metadata.h:62
FFHWBaseEncodeContext::output_delay
int64_t output_delay
Definition: hw_base_encode.h:169
cbs.h
AV1RawTimingInfo::num_units_in_display_tick
uint32_t num_units_in_display_tick
Definition: cbs_av1.h:68
FLAGS
#define FLAGS
Definition: vulkan_encode_av1.c:1305
AV1RawTimingInfo::time_scale
uint32_t time_scale
Definition: cbs_av1.h:69
AV1RawSequenceHeader::seq_force_integer_mv
uint8_t seq_force_integer_mv
Definition: cbs_av1.h:129
VulkanEncodeAV1Context::unit_elems
enum UnitElems unit_elems
Definition: vulkan_encode_av1.c:79
VulkanEncodeAV1Picture::ext_header
StdVideoEncodeAV1ExtensionHeader ext_header
Definition: vulkan_encode_av1.c:64
AVMasteringDisplayMetadata::max_luminance
AVRational max_luminance
Max luminance of mastering display (cd/m^2).
Definition: mastering_display_metadata.h:57
AVPixelFormat
AVPixelFormat
Pixel format.
Definition: pixfmt.h:71
ff_vk_enc_av1_desc
const FFVulkanEncodeDescriptor ff_vk_enc_av1_desc
Definition: vulkan_encode_av1.c:32
level
uint8_t level
Definition: svq3.c:208
AV1RawColorConfig::color_primaries
uint8_t color_primaries
Definition: cbs_av1.h:56
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
AV1RawSequenceHeader::encoder_buffer_delay
uint32_t encoder_buffer_delay[AV1_MAX_OPERATING_POINTS]
Definition: cbs_av1.h:100
AV1RawSequenceHeader::seq_level_idx
uint8_t seq_level_idx[AV1_MAX_OPERATING_POINTS]
Definition: cbs_av1.h:96
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
VulkanEncodeAV1Context::seq_hdr_obu
AV1RawOBU seq_hdr_obu
Definition: vulkan_encode_av1.c:80
LEVEL
#define LEVEL(name, value)
AVCodecContext::colorspace
enum AVColorSpace colorspace
YUV colorspace type.
Definition: avcodec.h:659
AV1RawSequenceHeader::timing_info_present_flag
uint8_t timing_info_present_flag
Definition: cbs_av1.h:87
VulkanEncodeAV1Picture::quantization
StdVideoAV1Quantization quantization
Definition: vulkan_encode_av1.c:54
AV1RawSequenceHeader
Definition: cbs_av1.h:82
ff_vulkan_encode_hw_configs
const AVCodecHWConfigInternal *const ff_vulkan_encode_hw_configs[]
Paperwork.
Definition: vulkan_encode.c:26
AV1RawColorConfig::color_range
uint8_t color_range
Definition: cbs_av1.h:60
av_frame_get_side_data
AVFrameSideData * av_frame_get_side_data(const AVFrame *frame, enum AVFrameSideDataType type)
Definition: frame.c:657
FF_HW_PICTURE_TYPE_IDR
@ FF_HW_PICTURE_TYPE_IDR
Definition: hw_base_encode.h:39
VulkanEncodeAV1Context::meta_cll_obu
AV1RawOBU meta_cll_obu
Definition: vulkan_encode_av1.c:81
init_pic_rc
static int init_pic_rc(AVCodecContext *avctx, FFHWBaseEncodePicture *pic, VkVideoEncodeRateControlInfoKHR *rc_info, VkVideoEncodeRateControlLayerInfoKHR *rc_layer)
Definition: vulkan_encode_av1.c:106
FFHWBaseEncodePicture::codec_priv
void * codec_priv
Definition: hw_base_encode.h:65
AV1RawMetadataHDRMDCV::primary_chromaticity_x
uint16_t primary_chromaticity_x[3]
Definition: cbs_av1.h:337
AV1RawSequenceHeader::initial_display_delay_present_for_this_op
uint8_t initial_display_delay_present_for_this_op[AV1_MAX_OPERATING_POINTS]
Definition: cbs_av1.h:102
av_pix_fmt_desc_get
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
Definition: pixdesc.c:3441
AV_CODEC_CAP_HARDWARE
#define AV_CODEC_CAP_HARDWARE
Codec is backed by a hardware implementation.
Definition: codec.h:130
AVMasteringDisplayMetadata::display_primaries
AVRational display_primaries[3][2]
CIE 1931 xy chromaticity coords of color primaries (r, g, b order).
Definition: mastering_display_metadata.h:42
AVMasteringDisplayMetadata::has_luminance
int has_luminance
Flag indicating whether the luminance (min_ and max_) have been set.
Definition: mastering_display_metadata.h:67
AV1RawSequenceHeader::operating_point_idc
uint16_t operating_point_idc[AV1_MAX_OPERATING_POINTS]
Definition: cbs_av1.h:95
CodedBitstreamUnit::content
void * content
Pointer to the decomposed form of this unit.
Definition: cbs.h:114
int64_t
long long int64_t
Definition: coverity.c:34
AV1RawPadding
Definition: cbs_av1.h:406
ff_av1_guess_level
const AV1LevelDescriptor * ff_av1_guess_level(int64_t bitrate, int tier, int width, int height, int tiles, int tile_cols, float fps)
Guess the level of a stream from some parameters.
Definition: av1_levels.c:48
md
#define md
Definition: vf_colormatrix.c:101
UnitElems
UnitElems
Definition: vulkan_encode_av1.c:42
AVContentLightMetadata::MaxCLL
unsigned MaxCLL
Max content light level (cd/m^2).
Definition: mastering_display_metadata.h:111
AVCodecContext::color_trc
enum AVColorTransferCharacteristic color_trc
Color Transfer Characteristic.
Definition: avcodec.h:652
VulkanEncodeAV1Context::q_idx_idr
int q_idx_idr
Definition: vulkan_encode_av1.c:99
CodedBitstreamContext
Context structure for coded bitstream operations.
Definition: cbs.h:226
VulkanEncodeAV1Context::meta_mastering_obu
AV1RawOBU meta_mastering_obu
Definition: vulkan_encode_av1.c:82
AVOption
AVOption.
Definition: opt.h:429
AVCOL_TRC_UNSPECIFIED
@ AVCOL_TRC_UNSPECIFIED
Definition: pixfmt.h:664
vulkan_encode_av1_write_obu
static int vulkan_encode_av1_write_obu(AVCodecContext *avctx, uint8_t *data, size_t *data_len, CodedBitstreamFragment *obu)
Definition: vulkan_encode_av1.c:1036
ff_vk_av1_profile_to_vk
StdVideoAV1Profile ff_vk_av1_profile_to_vk(int profile)
Definition: vulkan_video.c:281
data
const char data[16]
Definition: mxf.c:149
AV1RawSequenceHeader::timing_info
AV1RawTimingInfo timing_info
Definition: cbs_av1.h:92
AVCodecContext::b_quant_offset
float b_quant_offset
qscale offset between IP and B-frames
Definition: avcodec.h:785
FFCodec
Definition: codec_internal.h:127
VulkanEncodeAV1Context::padding_payload
uint8_t * padding_payload
Definition: vulkan_encode_av1.c:103
AV1RawSequenceHeader::frame_id_numbers_present_flag
uint8_t frame_id_numbers_present_flag
Definition: cbs_av1.h:110
AV_LOG_VERBOSE
#define AV_LOG_VERBOSE
Detailed information.
Definition: log.h:226
CodedBitstreamUnit::type
CodedBitstreamUnitType type
Codec-specific type of this unit.
Definition: cbs.h:81
VulkanAV1Units::operating_points
StdVideoEncodeAV1OperatingPointInfo operating_points[AV1_MAX_OPERATING_POINTS]
Definition: vulkan_encode_av1.c:760
VulkanEncodeAV1Context::cbs
CodedBitstreamContext * cbs
Definition: vulkan_encode_av1.c:76
VulkanEncodeAV1Picture::units_needed
enum UnitElems units_needed
Definition: vulkan_encode_av1.c:51
FFMAX
#define FFMAX(a, b)
Definition: macros.h:47
VulkanAV1Units::color_config
StdVideoAV1ColorConfig color_config
Definition: vulkan_encode_av1.c:757
avcodec_profile_name
const char * avcodec_profile_name(enum AVCodecID codec_id, int profile)
Return a name for the specified profile, if available.
Definition: utils.c:439
AV_PROFILE_AV1_PROFESSIONAL
#define AV_PROFILE_AV1_PROFESSIONAL
Definition: defs.h:171
FFVulkanEncodeDescriptor
Definition: vulkan_encode.h:31
VulkanEncodeAV1Picture::segmentation
StdVideoAV1Segmentation segmentation
Definition: vulkan_encode_av1.c:55
AVCodecContext::qmax
int qmax
maximum quantizer
Definition: avcodec.h:1241
AV1RawOBU::header
AV1RawOBUHeader header
Definition: cbs_av1.h:414
AV1RawOBU::obu
union AV1RawOBU::@77 obu
AV_PIX_FMT_VULKAN
@ AV_PIX_FMT_VULKAN
Vulkan hardware images.
Definition: pixfmt.h:379
AV1RawSequenceHeader::seq_profile
uint8_t seq_profile
Definition: cbs_av1.h:83
VulkanEncodeAV1Context
Definition: vulkan_encode_av1.c:73
AV1RawColorConfig::subsampling_y
uint8_t subsampling_y
Definition: cbs_av1.h:62
AV1_CSP_COLOCATED
@ AV1_CSP_COLOCATED
Definition: av1.h:135
AV_CODEC_FLAG_GLOBAL_HEADER
#define AV_CODEC_FLAG_GLOBAL_HEADER
Place global headers in extradata instead of every keyframe.
Definition: avcodec.h:318
AV1RawColorConfig::separate_uv_delta_q
uint8_t separate_uv_delta_q
Definition: cbs_av1.h:64
AVContentLightMetadata
Content light level needed by to transmit HDR over HDMI (CTA-861.3).
Definition: mastering_display_metadata.h:107
FFHWBaseEncodeContext
Definition: hw_base_encode.h:122
VulkanEncodeAV1Picture::vkrc_remaining
VkVideoEncodeAV1GopRemainingFrameInfoKHR vkrc_remaining
Definition: vulkan_encode_av1.c:70
AVCodecContext::framerate
AVRational framerate
Definition: avcodec.h:551
AV1RawColorConfig
Definition: cbs_av1.h:50
AV1RawSequenceHeader::film_grain_params_present
uint8_t film_grain_params_present
Definition: cbs_av1.h:139
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
VulkanEncodeAV1Picture::av1pic_info
StdVideoEncodeAV1PictureInfo av1pic_info
Definition: vulkan_encode_av1.c:61
VulkanAV1Units::timing_info
StdVideoAV1TimingInfo timing_info
Definition: vulkan_encode_av1.c:756
FFHWBaseEncodePicture::type
int type
Definition: hw_base_encode.h:78
VulkanAV1Units::seq_hdr
StdVideoAV1SequenceHeader seq_hdr
Definition: vulkan_encode_av1.c:755
VULKAN_ENCODE_COMMON_OPTIONS
#define VULKAN_ENCODE_COMMON_OPTIONS
Definition: vulkan_encode.h:197
vulkan_encode_av1_defaults
static const FFCodecDefault vulkan_encode_av1_defaults[]
Definition: vulkan_encode_av1.c:1364
tile_info
static int FUNC() tile_info(CodedBitstreamContext *ctx, RWContext *rw, APVRawTileInfo *current, const APVRawFrameHeader *fh)
Definition: cbs_apv_syntax_template.c:111
AV1RawSequenceHeader::enable_ref_frame_mvs
uint8_t enable_ref_frame_mvs
Definition: cbs_av1.h:124
fail
#define fail()
Definition: checkasm.h:199
AV1RawSequenceHeader::enable_filter_intra
uint8_t enable_filter_intra
Definition: cbs_av1.h:115
write_extra_headers
static int write_extra_headers(AVCodecContext *avctx, FFHWBaseEncodePicture *base_pic, uint8_t *data, size_t *data_len)
Definition: vulkan_encode_av1.c:1075
AV1RawSequenceHeader::decoder_model_present_for_this_op
uint8_t decoder_model_present_for_this_op[AV1_MAX_OPERATING_POINTS]
Definition: cbs_av1.h:98
create_session_params
static int create_session_params(AVCodecContext *avctx)
Definition: vulkan_encode_av1.c:858
AVCodecContext::flags
int flags
AV_CODEC_FLAG_*.
Definition: avcodec.h:488
VulkanAV1Units::decoder_model
StdVideoEncodeAV1DecoderModelInfo decoder_model
Definition: vulkan_encode_av1.c:759
FFHWBaseEncodePicture::input_image
AVFrame * input_image
Definition: hw_base_encode.h:83
type
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf type
Definition: writing_filters.txt:86
AV1RawSequenceHeader::delta_frame_id_length_minus_2
uint8_t delta_frame_id_length_minus_2
Definition: cbs_av1.h:111
init_enc_options
static int init_enc_options(AVCodecContext *avctx)
Definition: vulkan_encode_av1.c:649
AV1RawMetadataHDRMDCV
Definition: cbs_av1.h:336
AV_CODEC_CAP_ENCODER_FLUSH
#define AV_CODEC_CAP_ENCODER_FLUSH
This encoder can be flushed using avcodec_flush_buffers().
Definition: codec.h:151
VulkanEncodeAV1Context::uniform_tile
int uniform_tile
Definition: vulkan_encode_av1.c:92
ff_hw_base_init_gop_structure
int ff_hw_base_init_gop_structure(FFHWBaseEncodeContext *ctx, AVCodecContext *avctx, uint32_t ref_l0, uint32_t ref_l1, int flags, int prediction_pre_only)
Definition: hw_base_encode.c:662
VulkanEncodeAV1Context::seq_tier
int seq_tier
Definition: vulkan_encode_av1.c:96
AV1_REF_FRAME_GOLDEN
@ AV1_REF_FRAME_GOLDEN
Definition: av1.h:66
AVRational::num
int num
Numerator.
Definition: rational.h:59
VulkanEncodeAV1Picture::vkrc_layer_info
VkVideoEncodeAV1RateControlLayerInfoKHR vkrc_layer_info
Definition: vulkan_encode_av1.c:69
AV1_METADATA_TYPE_HDR_CLL
@ AV1_METADATA_TYPE_HDR_CLL
Definition: av1.h:44
VulkanEncodeAV1Picture::global_motion
StdVideoAV1GlobalMotion global_motion
Definition: vulkan_encode_av1.c:59
CodedBitstreamFragment::units
CodedBitstreamUnit * units
Pointer to an array of units of length nb_units_allocated.
Definition: cbs.h:175
VulkanAV1Units::nb_operating_points
int nb_operating_points
Definition: vulkan_encode_av1.c:761
cbs_av1.h
avassert.h
AVCodecContext::color_primaries
enum AVColorPrimaries color_primaries
Chromaticity coordinates of the source primaries.
Definition: avcodec.h:645
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:210
AV1RawSequenceHeader::enable_masked_compound
uint8_t enable_masked_compound
Definition: cbs_av1.h:118
AV1RawSequenceHeader::initial_display_delay_minus_1
uint8_t initial_display_delay_minus_1[AV1_MAX_OPERATING_POINTS]
Definition: cbs_av1.h:103
FF_ARRAY_ELEMS
#define FF_ARRAY_ELEMS(a)
Definition: sinewin_tablegen.c:29
av_cold
#define av_cold
Definition: attributes.h:90
AV_PROFILE_UNKNOWN
#define AV_PROFILE_UNKNOWN
Definition: defs.h:65
AVCodecContext::rc_initial_buffer_occupancy
int rc_initial_buffer_occupancy
Number of bits which should be loaded into the rc buffer before decoding starts.
Definition: avcodec.h:1298
AVCodecContext::extradata_size
int extradata_size
Definition: avcodec.h:515
CodedBitstreamFragment
Coded bitstream fragment structure, combining one or more units.
Definition: cbs.h:129
AVMasteringDisplayMetadata::white_point
AVRational white_point[2]
CIE 1931 xy chromaticity coords of white point.
Definition: mastering_display_metadata.h:47
s
#define s(width, name)
Definition: cbs_vp9.c:198
VulkanEncodeAV1Context::initial_buffer_fullness
uint64_t initial_buffer_fullness
Definition: vulkan_encode_av1.c:90
vulkan_encode_av1_class
static const AVClass vulkan_encode_av1_class
Definition: vulkan_encode_av1.c:1373
CodedBitstreamFragment::data_size
size_t data_size
The number of bytes in the bitstream.
Definition: cbs.h:142
AVFormatContext::flags
int flags
Flags modifying the (de)muxer behaviour.
Definition: avformat.h:1415
color_config
static int FUNC() color_config(CodedBitstreamContext *ctx, RWContext *rw, AV1RawColorConfig *current, int seq_profile)
Definition: cbs_av1_syntax_template.c:77
enc_cb
static const FFVulkanCodec enc_cb
Definition: vulkan_encode_av1.c:1144
av_q2d
static double av_q2d(AVRational a)
Convert an AVRational to a double.
Definition: rational.h:104
FFHWBaseEncodeContext::max_b_depth
int max_b_depth
Definition: hw_base_encode.h:188
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
from
const char * from
Definition: jacosubdec.c:66
av_assert0
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:41
VulkanEncodeAV1Context::tile_rows
int tile_rows
Definition: vulkan_encode_av1.c:94
VulkanEncodeAV1Picture::slot
int slot
Definition: vulkan_encode_av1.c:48
AV_LOG_DEBUG
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:231
ctx
AVFormatContext * ctx
Definition: movenc.c:49
VulkanEncodeAV1Context::quality_props
VkVideoEncodeAV1QualityLevelPropertiesKHR quality_props
Definition: vulkan_encode_av1.c:87
AV1RawColorConfig::transfer_characteristics
uint8_t transfer_characteristics
Definition: cbs_av1.h:57
AV1RawSequenceHeader::seq_tier
uint8_t seq_tier[AV1_MAX_OPERATING_POINTS]
Definition: cbs_av1.h:97
AVCodecContext::rc_max_rate
int64_t rc_max_rate
maximum bitrate
Definition: avcodec.h:1270
AV1RawSequenceHeader::decoder_buffer_delay
uint32_t decoder_buffer_delay[AV1_MAX_OPERATING_POINTS]
Definition: cbs_av1.h:99
AV1RawMetadataHDRCLL
Definition: cbs_av1.h:331
AVCOL_PRI_UNSPECIFIED
@ AVCOL_PRI_UNSPECIFIED
Definition: pixfmt.h:639
FF_HW_FLAG_SLICE_CONTROL
@ FF_HW_FLAG_SLICE_CONTROL
Definition: hw_base_encode.h:47
CODEC_LONG_NAME
#define CODEC_LONG_NAME(str)
Definition: codec_internal.h:326
FFVkEncodeCommonOptions::qp
int qp
Definition: vulkan_encode.h:151
AVCodecContext::codec_id
enum AVCodecID codec_id
Definition: avcodec.h:441
FFHWBaseEncodeContext::b_per_p
int b_per_p
Definition: hw_base_encode.h:189
if
if(ret)
Definition: filter_design.txt:179
AVCodecContext::rc_buffer_size
int rc_buffer_size
decoder bitstream buffer size
Definition: avcodec.h:1255
VulkanEncodeAV1Picture::vkrc_info
VkVideoEncodeAV1RateControlInfoKHR vkrc_info
Definition: vulkan_encode_av1.c:68
framerate
float framerate
Definition: av1_levels.c:29
LIBAVUTIL_VERSION_INT
#define LIBAVUTIL_VERSION_INT
Definition: version.h:85
AV1RawMetadata
Definition: cbs_av1.h:394
AV1RawOBU
Definition: cbs_av1.h:413
AVClass
Describe the class of an AVClass context structure.
Definition: log.h:76
fabs
static __device__ float fabs(float a)
Definition: cuda_runtime.h:182
NULL
#define NULL
Definition: coverity.c:32
av_clip_intp2
#define av_clip_intp2
Definition: common.h:121
AV_CODEC_ID_AV1
@ AV_CODEC_ID_AV1
Definition: codec_id.h:284
AVCHROMA_LOC_LEFT
@ AVCHROMA_LOC_LEFT
MPEG-2/4 4:2:0, H.264 default for 4:2:0.
Definition: pixfmt.h:788
AV_LEVEL_UNKNOWN
#define AV_LEVEL_UNKNOWN
Definition: defs.h:209
AVCHROMA_LOC_TOPLEFT
@ AVCHROMA_LOC_TOPLEFT
ITU-R 601, SMPTE 274M 296M S314M(DV 4:1:1), mpeg2 4:2:2.
Definition: pixfmt.h:790
AV1_SELECT_INTEGER_MV
@ AV1_SELECT_INTEGER_MV
Definition: av1.h:99
FF_CODEC_RECEIVE_PACKET_CB
#define FF_CODEC_RECEIVE_PACKET_CB(func)
Definition: codec_internal.h:361
AVCodecContext::bit_rate
int64_t bit_rate
the average bitrate
Definition: avcodec.h:481
av_default_item_name
const char * av_default_item_name(void *ptr)
Return the context name.
Definition: log.c:240
init_sequence_headers
static av_cold int init_sequence_headers(AVCodecContext *avctx)
Definition: vulkan_encode_av1.c:699
AV1_CSP_VERTICAL
@ AV1_CSP_VERTICAL
Definition: av1.h:134
AV_FRAME_DATA_MASTERING_DISPLAY_METADATA
@ AV_FRAME_DATA_MASTERING_DISPLAY_METADATA
Mastering display metadata associated with a video frame.
Definition: frame.h:120
VulkanEncodeAV1Context::q_idx_b
int q_idx_b
Definition: vulkan_encode_av1.c:101
AV1RawSequenceHeader::enable_jnt_comp
uint8_t enable_jnt_comp
Definition: cbs_av1.h:123
VulkanEncodeAV1Context::common
FFVulkanEncodeContext common
Definition: vulkan_encode_av1.c:74
VulkanEncodeAV1Picture::vkav1pic_info
VkVideoEncodeAV1PictureInfoKHR vkav1pic_info
Definition: vulkan_encode_av1.c:62
FFVulkanContext
Definition: vulkan.h:274
VK_ENC_FLAG_NO_DELAY
#define VK_ENC_FLAG_NO_DELAY
Definition: vulkan_encode.h:97
AVCodecContext::level
int level
Encoding level descriptor.
Definition: avcodec.h:1628
AV1RawSequenceHeader::seq_force_screen_content_tools
uint8_t seq_force_screen_content_tools
Definition: cbs_av1.h:127
FF_HW_PICTURE_TYPE_B
@ FF_HW_PICTURE_TYPE_B
Definition: hw_base_encode.h:42
FFVulkanEncodeContext::opts
FFVkEncodeCommonOptions opts
Definition: vulkan_encode.h:182
AV1RawSequenceHeader::max_frame_height_minus_1
uint16_t max_frame_height_minus_1
Definition: cbs_av1.h:108
base_unit_to_vk
static av_cold int base_unit_to_vk(AVCodecContext *avctx, VulkanAV1Units *vk_units)
Definition: vulkan_encode_av1.c:764
VulkanEncodeAV1Picture
Definition: vulkan_encode_av1.c:47
vulkan_encode_av1_close
static av_cold int vulkan_encode_av1_close(AVCodecContext *avctx)
Definition: vulkan_encode_av1.c:1296
FFVulkanEncodeContext
Definition: vulkan_encode.h:165
init
int(* init)(AVBSFContext *ctx)
Definition: dts2pts.c:368
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
to
const char * to
Definition: webvttdec.c:35
AV1RawMetadataHDRMDCV::luminance_max
uint32_t luminance_max
Definition: cbs_av1.h:341
VulkanEncodeAV1Picture::cdef
StdVideoAV1CDEF cdef
Definition: vulkan_encode_av1.c:57
FFVkEncodeCommonOptions::rc_mode
VkVideoEncodeRateControlModeFlagBitsKHR rc_mode
Definition: vulkan_encode.h:161
codec_internal.h
AV1RawTimingInfo::num_ticks_per_picture_minus_1
uint32_t num_ticks_per_picture_minus_1
Definition: cbs_av1.h:72
FFHWBaseEncodePicture::nb_refs
int nb_refs[MAX_REFERENCE_LIST_NUM]
Definition: hw_base_encode.h:97
set_name_slot
static void set_name_slot(int slot, int *slot_indices, uint32_t allowed_idx, int group)
Definition: vulkan_encode_av1.c:160
AV1RawMetadataHDRMDCV::white_point_chromaticity_x
uint16_t white_point_chromaticity_x
Definition: cbs_av1.h:339
av_err2str
#define av_err2str(errnum)
Convenience macro, the return value should be used only directly in function arguments but never stan...
Definition: error.h:122
OFFSET
#define OFFSET(x)
Definition: vulkan_encode_av1.c:1304
FFHWBaseEncodeContext::decode_delay
int64_t decode_delay
Definition: hw_base_encode.h:173
size
int size
Definition: twinvq_data.h:10344
AV1RawOBU::sequence_header
AV1RawSequenceHeader sequence_header
Definition: cbs_av1.h:419
VulkanEncodeAV1Context::current_access_unit
CodedBitstreamFragment current_access_unit
Definition: vulkan_encode_av1.c:77
CodedBitstreamFragment::data
uint8_t * data
Pointer to the bitstream form of this fragment.
Definition: cbs.h:135
AV1RawSequenceHeader::use_128x128_superblock
uint8_t use_128x128_superblock
Definition: cbs_av1.h:114
AV1RawSequenceHeader::frame_height_bits_minus_1
uint8_t frame_height_bits_minus_1
Definition: cbs_av1.h:106
AVFrameSideData::data
uint8_t * data
Definition: frame.h:278
AV1_OBU_SEQUENCE_HEADER
@ AV1_OBU_SEQUENCE_HEADER
Definition: av1.h:30
VulkanEncodeAV1Picture::av1dpb_info
StdVideoEncodeAV1ReferenceInfo av1dpb_info
Definition: vulkan_encode_av1.c:65
VulkanEncodeAV1Context::seq_level_idx
int seq_level_idx
Definition: vulkan_encode_av1.c:97
VulkanEncodeAV1Picture::tile_info
StdVideoAV1TileInfo tile_info
Definition: vulkan_encode_av1.c:53
AV1LevelDescriptor
Definition: av1_levels.h:26
FFHWBaseEncodePicture::encode_order
int64_t encode_order
Definition: hw_base_encode.h:70
AV1RawSequenceHeader::seq_choose_integer_mv
uint8_t seq_choose_integer_mv
Definition: cbs_av1.h:128
AV1RawSequenceHeader::still_picture
uint8_t still_picture
Definition: cbs_av1.h:84
VulkanEncodeAV1Picture::loop_restoration
StdVideoAV1LoopRestoration loop_restoration
Definition: vulkan_encode_av1.c:58
AV1RawSequenceHeader::initial_display_delay_present_flag
uint8_t initial_display_delay_present_flag
Definition: cbs_av1.h:89
AV_PROFILE_AV1_HIGH
#define AV_PROFILE_AV1_HIGH
Definition: defs.h:170
VulkanEncodeAV1Context::hrd_buffer_size
uint64_t hrd_buffer_size
Definition: vulkan_encode_av1.c:89
AV1RawSequenceHeader::enable_interintra_compound
uint8_t enable_interintra_compound
Definition: cbs_av1.h:117
write_padding
static int write_padding(AVCodecContext *avctx, uint32_t padding, uint8_t *data, size_t *data_len)
Definition: vulkan_encode_av1.c:1114
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
loop_filter
static void loop_filter(const H264Context *h, H264SliceContext *sl, int start_x, int end_x)
Definition: h264_slice.c:2432
AV1RawMetadataHDRMDCV::luminance_min
uint32_t luminance_min
Definition: cbs_av1.h:342
AV1RawOBU::metadata
AV1RawMetadata metadata
Definition: cbs_av1.h:427
FFVkEncodeCommonOptions::profile
int profile
Definition: vulkan_encode.h:153
VulkanEncodeAV1Picture::loop_filter
StdVideoAV1LoopFilter loop_filter
Definition: vulkan_encode_av1.c:56
init_profile
static int init_profile(AVCodecContext *avctx, VkVideoProfileInfoKHR *profile, void *pnext)
Definition: vulkan_encode_av1.c:548
parse_feedback_units
static int parse_feedback_units(AVCodecContext *avctx, const uint8_t *data, size_t size)
Definition: vulkan_encode_av1.c:895
AV_FRAME_DATA_CONTENT_LIGHT_LEVEL
@ AV_FRAME_DATA_CONTENT_LIGHT_LEVEL
Content light level (based on CTA-861.3).
Definition: frame.h:137
AV1_OBU_PADDING
@ AV1_OBU_PADDING
Definition: av1.h:39
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:256
AV1RawSequenceHeader::enable_dual_filter
uint8_t enable_dual_filter
Definition: cbs_av1.h:120
ff_av1_vulkan_encoder
const FFCodec ff_av1_vulkan_encoder
Definition: vulkan_encode_av1.c:1380
AV1RawSequenceHeader::enable_superres
uint8_t enable_superres
Definition: cbs_av1.h:133
AVCodecContext::extradata
uint8_t * extradata
Out-of-band global headers that may be used by some codecs.
Definition: avcodec.h:514
AV1_METADATA_TYPE_HDR_MDCV
@ AV1_METADATA_TYPE_HDR_MDCV
Definition: av1.h:45
ff_vulkan_encode_receive_packet
int ff_vulkan_encode_receive_packet(AVCodecContext *avctx, AVPacket *pkt)
Encode.
Definition: vulkan_encode.c:541
ff_vk_av1_level_to_vk
StdVideoAV1Level ff_vk_av1_level_to_vk(int level)
Definition: vulkan_video.c:229
AV1_SELECT_SCREEN_CONTENT_TOOLS
@ AV1_SELECT_SCREEN_CONTENT_TOOLS
Definition: av1.h:98
AV1RawTimingInfo::equal_picture_interval
uint8_t equal_picture_interval
Definition: cbs_av1.h:71
AV1RawSequenceHeader::enable_intra_edge_filter
uint8_t enable_intra_edge_filter
Definition: cbs_av1.h:116
write_sequence_headers
static int write_sequence_headers(AVCodecContext *avctx, FFHWBaseEncodePicture *base_pic, uint8_t *data, size_t *data_len)
Definition: vulkan_encode_h264.c:1228
AV1RawSequenceHeader::max_frame_width_minus_1
uint16_t max_frame_width_minus_1
Definition: cbs_av1.h:107
FFHWBaseEncodePicture::refs
struct FFHWBaseEncodePicture * refs[MAX_REFERENCE_LIST_NUM][MAX_PICTURE_REFERENCES]
Definition: hw_base_encode.h:98
AV1RawSequenceHeader::color_config
AV1RawColorConfig color_config
Definition: cbs_av1.h:137
vulkan_encode.h
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
AVCodecContext::chroma_sample_location
enum AVChromaLocation chroma_sample_location
This defines the location of chroma samples.
Definition: avcodec.h:676
AVMasteringDisplayMetadata
Mastering display metadata capable of representing the color volume of the display used to master the...
Definition: mastering_display_metadata.h:38
profile
int profile
Definition: mxfenc.c:2278
AVCOL_SPC_UNSPECIFIED
@ AVCOL_SPC_UNSPECIFIED
Definition: pixfmt.h:693
AV1RawSequenceHeader::enable_order_hint
uint8_t enable_order_hint
Definition: cbs_av1.h:122
av_rescale
int64_t av_rescale(int64_t a, int64_t b, int64_t c)
Rescale a 64-bit integer with rounding to nearest.
Definition: mathematics.c:129
FFVulkanEncodeDescriptor::codec_id
enum AVCodecID codec_id
Definition: vulkan_encode.h:32
PROFILE
#define PROFILE(name, value)
ret
ret
Definition: filter_design.txt:187
AV1RawColorConfig::subsampling_x
uint8_t subsampling_x
Definition: cbs_av1.h:61
AV_PIX_FMT_NV12
@ AV_PIX_FMT_NV12
planar YUV 4:2:0, 12bpp, 1 plane for Y and 1 plane for the UV components, which are interleaved (firs...
Definition: pixfmt.h:96
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
AV1RawColorConfig::high_bitdepth
uint8_t high_bitdepth
Definition: cbs_av1.h:51
VulkanEncodeAV1Context::profile
VkVideoEncodeAV1ProfileInfoKHR profile
Definition: vulkan_encode_av1.c:84
FF_HW_PICTURE_TYPE_P
@ FF_HW_PICTURE_TYPE_P
Definition: hw_base_encode.h:41
AV_INPUT_BUFFER_PADDING_SIZE
#define AV_INPUT_BUFFER_PADDING_SIZE
Definition: defs.h:40
SIZE_SPECIFIER
#define SIZE_SPECIFIER
Definition: internal.h:129
AV1RawSequenceHeader::frame_width_bits_minus_1
uint8_t frame_width_bits_minus_1
Definition: cbs_av1.h:105
AV1RawSequenceHeader::enable_warped_motion
uint8_t enable_warped_motion
Definition: cbs_av1.h:119
FFHWBaseEncodeContext::surface_height
int surface_height
Definition: hw_base_encode.h:141
AVCodecContext
main external API structure.
Definition: avcodec.h:431
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:1055
AVCodecContext::qmin
int qmin
minimum quantizer
Definition: avcodec.h:1234
AVRational::den
int den
Denominator.
Definition: rational.h:60
UNIT_MASTERING_DISPLAY
@ UNIT_MASTERING_DISPLAY
Definition: vulkan_encode_av1.c:43
AV_PIX_FMT_NONE
@ AV_PIX_FMT_NONE
Definition: pixfmt.h:72
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
ff_vulkan_encode_init
av_cold int ff_vulkan_encode_init(AVCodecContext *avctx, FFVulkanEncodeContext *ctx, const FFVulkanEncodeDescriptor *vk_desc, const FFVulkanCodec *codec, void *codec_caps, void *quality_pnext)
Initialize encoder.
Definition: vulkan_encode.c:700
AV1RawColorConfig::mono_chrome
uint8_t mono_chrome
Definition: cbs_av1.h:53
av1_levels.h
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
AV1RawSequenceHeader::seq_choose_screen_content_tools
uint8_t seq_choose_screen_content_tools
Definition: cbs_av1.h:126
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
AVMasteringDisplayMetadata::min_luminance
AVRational min_luminance
Min luminance of mastering display (cd/m^2).
Definition: mastering_display_metadata.h:52
VulkanEncodeAV1Context::tile_cols
int tile_cols
Definition: vulkan_encode_av1.c:93
FFHWBaseEncodeContext::surface_width
int surface_width
Definition: hw_base_encode.h:140
AV1RawSequenceHeader::order_hint_bits_minus_1
uint8_t order_hint_bits_minus_1
Definition: cbs_av1.h:131
AV1RawColorConfig::matrix_coefficients
uint8_t matrix_coefficients
Definition: cbs_av1.h:58
FF_HW_FLAG_B_PICTURES
@ FF_HW_FLAG_B_PICTURES
Definition: hw_base_encode.h:53
AV1RawMetadataHDRMDCV::white_point_chromaticity_y
uint16_t white_point_chromaticity_y
Definition: cbs_av1.h:340
AV1_CSP_UNKNOWN
@ AV1_CSP_UNKNOWN
Definition: av1.h:133
AV_PIX_FMT_P010
#define AV_PIX_FMT_P010
Definition: pixfmt.h:602
desc
const char * desc
Definition: libsvtav1.c:79
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:200
mem.h
ff_vulkan_encode_uninit
av_cold void ff_vulkan_encode_uninit(FFVulkanEncodeContext *ctx)
Uninitialize encoder.
Definition: vulkan_encode.c:31
mastering_display_metadata.h
AVFrameSideData
Structure to hold side data for an AVFrame.
Definition: frame.h:276
AVPixFmtDescriptor
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
Definition: pixdesc.h:69
AV1RawMetadataHDRMDCV::primary_chromaticity_y
uint16_t primary_chromaticity_y[3]
Definition: cbs_av1.h:338
vulkan_encode_av1_options
static const AVOption vulkan_encode_av1_options[]
Definition: vulkan_encode_av1.c:1306
AV1RawSequenceHeader::enable_restoration
uint8_t enable_restoration
Definition: cbs_av1.h:135
VulkanEncodeAV1Context::q_idx_p
int q_idx_p
Definition: vulkan_encode_av1.c:100
AV1RawColorConfig::twelve_bit
uint8_t twelve_bit
Definition: cbs_av1.h:52
av_free
#define av_free(p)
Definition: tableprint_vlc.h:34
timing_info
static int FUNC() timing_info(CodedBitstreamContext *ctx, RWContext *rw, AV1RawTimingInfo *current)
Definition: cbs_av1_syntax_template.c:158
AV1RawSequenceHeader::operating_points_cnt_minus_1
uint8_t operating_points_cnt_minus_1
Definition: cbs_av1.h:90
FFVulkanCodec::flags
int flags
Codec feature flags.
Definition: vulkan_encode.h:94
AVContentLightMetadata::MaxFALL
unsigned MaxFALL
Max average light level per frame (cd/m^2).
Definition: mastering_display_metadata.h:116
AVCodecContext::priv_data
void * priv_data
Definition: avcodec.h:458
AV1RawSequenceHeader::additional_frame_id_length_minus_1
uint8_t additional_frame_id_length_minus_1
Definition: cbs_av1.h:112
AV1_MAX_OPERATING_POINTS
@ AV1_MAX_OPERATING_POINTS
Definition: av1.h:74
AV1RawSequenceHeader::enable_cdef
uint8_t enable_cdef
Definition: cbs_av1.h:134
AV1RawSequenceHeader::reduced_still_picture_header
uint8_t reduced_still_picture_header
Definition: cbs_av1.h:85
FFVulkanCodec
Definition: vulkan_encode.h:90
AV_OPT_TYPE_FLAGS
@ AV_OPT_TYPE_FLAGS
Underlying C type is unsigned int.
Definition: opt.h:255
vulkan_encode_av1_init
static av_cold int vulkan_encode_av1_init(AVCodecContext *avctx)
Definition: vulkan_encode_av1.c:1159
VulkanEncodeAV1Context::caps
VkVideoEncodeAV1CapabilitiesKHR caps
Definition: vulkan_encode_av1.c:86
init_base_units
static int init_base_units(AVCodecContext *avctx)
Definition: vulkan_encode_av1.c:939
AV1RawPadding::payload
uint8_t * payload
Definition: cbs_av1.h:407
VulkanAV1Units
Definition: vulkan_encode_av1.c:754
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
AV1RawSequenceHeader::low_delay_mode_flag
uint8_t low_delay_mode_flag[AV1_MAX_OPERATING_POINTS]
Definition: cbs_av1.h:101
FF_VK_EXT_VIDEO_ENCODE_AV1
#define FF_VK_EXT_VIDEO_ENCODE_AV1
Definition: vulkan_functions.h:68
HW_BASE_ENCODE_COMMON_OPTIONS
#define HW_BASE_ENCODE_COMMON_OPTIONS
Definition: hw_base_encode.h:243
VulkanEncodeAV1Picture::vkav1dpb_info
VkVideoEncodeAV1DpbSlotInfoKHR vkav1dpb_info
Definition: vulkan_encode_av1.c:66
UNIT_CONTENT_LIGHT_LEVEL
@ UNIT_CONTENT_LIGHT_LEVEL
Definition: vulkan_encode_av1.c:44
write_filler
static int write_filler(AVCodecContext *avctx, uint32_t filler, uint8_t *data, size_t *data_len)
Definition: vulkan_encode_h264.c:1325
FFHWBaseEncodePicture::display_order
int64_t display_order
Definition: hw_base_encode.h:69
AV_PROFILE_AV1_MAIN
#define AV_PROFILE_AV1_MAIN
Definition: defs.h:169
AV_OPT_TYPE_CONST
@ AV_OPT_TYPE_CONST
Special option type for declaring named constants.
Definition: opt.h:299
AV1_REFS_PER_FRAME
@ AV1_REFS_PER_FRAME
Definition: av1.h:85
AV1RawOBU::padding
AV1RawPadding padding
Definition: cbs_av1.h:430
av_log2
int av_log2(unsigned v)
Definition: intmath.c:26
FFVulkanFunctions
Definition: vulkan_functions.h:276
AV1_OBU_METADATA
@ AV1_OBU_METADATA
Definition: av1.h:34
ff_vulkan_encode_create_session_params
int ff_vulkan_encode_create_session_params(AVCodecContext *avctx, FFVulkanEncodeContext *ctx, void *codec_params_pnext)
Create session parameters.
Definition: vulkan_encode.c:1022
VulkanEncodeAV1Picture::last_idr_frame
int64_t last_idr_frame
Definition: vulkan_encode_av1.c:49
FF_HW_PICTURE_TYPE_I
@ FF_HW_PICTURE_TYPE_I
Definition: hw_base_encode.h:40
CodedBitstreamFragment::nb_units
int nb_units
Number of units in this fragment.
Definition: cbs.h:160
init_pic_params
static int init_pic_params(AVCodecContext *avctx, FFHWBaseEncodePicture *pic, VkVideoEncodeInfoKHR *encode_info)
Definition: vulkan_encode_av1.c:176
vulkan_encode_av1_add_obu
static int vulkan_encode_av1_add_obu(AVCodecContext *avctx, CodedBitstreamFragment *au, uint8_t type, void *obu_unit)
Definition: vulkan_encode_av1.c:1019
AV1RawOBUHeader::obu_type
uint8_t obu_type
Definition: cbs_av1.h:40