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 
85 
86  VkVideoEncodeAV1ProfileInfoKHR profile;
87 
88  VkVideoEncodeAV1CapabilitiesKHR caps;
89  VkVideoEncodeAV1QualityLevelPropertiesKHR quality_props;
90 
91  uint64_t hrd_buffer_size;
93 
95  int tile_cols;
96  int tile_rows;
97 
98  int seq_tier;
100 
102  int q_idx_p;
103  int q_idx_b;
104 
105  uint8_t *padding_payload;
107 
109  VkVideoEncodeRateControlInfoKHR *rc_info,
110  VkVideoEncodeRateControlLayerInfoKHR *rc_layer)
111 {
112  VulkanEncodeAV1Context *enc = avctx->priv_data;
115 
116  /* This can be easy to calculate */
117  ap->vkrc_remaining = (VkVideoEncodeAV1GopRemainingFrameInfoKHR) {
118  .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_GOP_REMAINING_FRAME_INFO_KHR,
119  .useGopRemainingFrames = 0,
120  .gopRemainingIntra = 0,
121  .gopRemainingPredictive = 0,
122  .gopRemainingBipredictive = 0,
123  };
124 
125  ap->vkrc_info = (VkVideoEncodeAV1RateControlInfoKHR) {
126  .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_RATE_CONTROL_INFO_KHR,
127  .flags = VK_VIDEO_ENCODE_AV1_RATE_CONTROL_REFERENCE_PATTERN_FLAT_BIT_KHR |
128  VK_VIDEO_ENCODE_AV1_RATE_CONTROL_REGULAR_GOP_BIT_KHR,
129  .gopFrameCount = ctx->base.gop_size,
130  .keyFramePeriod = ctx->base.gop_size,
131  .consecutiveBipredictiveFrameCount = FFMAX(ctx->base.b_per_p - 1, 0),
132  .temporalLayerCount = 0,
133  };
134  rc_info->pNext = &ap->vkrc_info;
135 
136  if (rc_info->rateControlMode > VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DISABLED_BIT_KHR) {
137  rc_info->virtualBufferSizeInMs = (enc->hrd_buffer_size * 1000LL) / avctx->bit_rate;
138  rc_info->initialVirtualBufferSizeInMs = (enc->initial_buffer_fullness * 1000LL) / avctx->bit_rate;
139 
140  ap->vkrc_layer_info = (VkVideoEncodeAV1RateControlLayerInfoKHR) {
141  .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_RATE_CONTROL_LAYER_INFO_KHR,
142 
143  .useMinQIndex = avctx->qmin > 0,
144  .minQIndex.intraQIndex = avctx->qmin > 0 ? avctx->qmin : 0,
145  .minQIndex.predictiveQIndex = avctx->qmin > 0 ? avctx->qmin : 0,
146  .minQIndex.bipredictiveQIndex = avctx->qmin > 0 ? avctx->qmin : 0,
147 
148  .useMaxQIndex = avctx->qmax > 0,
149  .maxQIndex.intraQIndex = avctx->qmax > 0 ? avctx->qmax : 0,
150  .maxQIndex.predictiveQIndex = avctx->qmax > 0 ? avctx->qmax : 0,
151  .maxQIndex.bipredictiveQIndex = avctx->qmax > 0 ? avctx->qmax : 0,
152 
153  .useMaxFrameSize = 0,
154  };
155  rc_layer->pNext = &ap->vkrc_layer_info;
156  ap->vkrc_info.temporalLayerCount = 1;
157  }
158 
159  return 0;
160 }
161 
162 static void set_name_slot(int slot, int *slot_indices, uint32_t allowed_idx, int group)
163 {
164  int from = group ? AV1_REF_FRAME_GOLDEN : 0;
166 
167  for (int i = from; i < to; i++) {
168  if ((slot_indices[i] == -1) && (allowed_idx & (1 << i))) {
169  slot_indices[i] = slot;
170  return;
171  }
172  }
173 
174  av_assert0(0);
175 }
176 
178  VkVideoEncodeInfoKHR *encode_info)
179 {
180  VulkanEncodeAV1Context *enc = avctx->priv_data;
182  FFHWBaseEncodeContext *base_ctx = &ctx->base;
183 
186  VulkanEncodeAV1Picture *ap_ref;
187  VkVideoReferenceSlotInfoKHR *ref_slot;
188 
189  uint32_t ref_name_mask = 0x0;
190  int name_slots[STD_VIDEO_AV1_REFS_PER_FRAME];
191 
192  StdVideoAV1Segmentation *segmentation = &ap->segmentation;
193  StdVideoAV1LoopFilter *loop_filter = &ap->loop_filter;
194  StdVideoAV1Quantization *quantization = &ap->quantization;
195  StdVideoAV1CDEF *cdef = &ap->cdef;
196  StdVideoAV1LoopRestoration *loop_restoration = &ap->loop_restoration;
197  StdVideoAV1GlobalMotion *global_motion = &ap->global_motion;
198  StdVideoAV1TileInfo *tile_info = &ap->tile_info;
199  static const int8_t default_loop_filter_ref_deltas[STD_VIDEO_AV1_TOTAL_REFS_PER_FRAME] =
200  { 1, 0, 0, 0, -1, 0, -1, -1 };
201 
202  VkVideoEncodeAV1PredictionModeKHR pred_mode;
203  VkVideoEncodeAV1RateControlGroupKHR rc_group;
204  int lr_unit_shift = 0;
205  int lr_uv_shift = 0;
206 
207  ap->ext_header = (StdVideoEncodeAV1ExtensionHeader) {
208  .temporal_id = 0,
209  .spatial_id = 0,
210  };
211 
212  *tile_info = (StdVideoAV1TileInfo) {
213  .flags = (StdVideoAV1TileInfoFlags) {
214  .uniform_tile_spacing_flag = enc->uniform_tile,
215  },
216  .TileCols = enc->tile_cols,
217  .TileRows = enc->tile_rows,
218  .context_update_tile_id = 0,
219  .tile_size_bytes_minus_1 = 0,
220  };
221 
222  for (int i = 0; i < STD_VIDEO_AV1_TOTAL_REFS_PER_FRAME; i++) {
223  global_motion->GmType[i] = 0;
224  for (int j = 0; j < STD_VIDEO_AV1_GLOBAL_MOTION_PARAMS; j++) {
225  global_motion->gm_params[i][j] = 0;
226  }
227  }
228 
229  for (int i = 0; i < STD_VIDEO_AV1_REFS_PER_FRAME; i++)
230  name_slots[i] = -1;
231 
232  *loop_restoration = (StdVideoAV1LoopRestoration) {
233  .FrameRestorationType[0] = STD_VIDEO_AV1_FRAME_RESTORATION_TYPE_NONE,
234  .FrameRestorationType[1] = STD_VIDEO_AV1_FRAME_RESTORATION_TYPE_NONE,
235  .FrameRestorationType[2] = STD_VIDEO_AV1_FRAME_RESTORATION_TYPE_NONE,
236  .LoopRestorationSize[0] = 1 + lr_unit_shift,
237  .LoopRestorationSize[1] = 1 + lr_unit_shift - lr_uv_shift,
238  .LoopRestorationSize[2] = 1 + lr_unit_shift - lr_uv_shift,
239  };
240 
241  *cdef = (StdVideoAV1CDEF) {
242  .cdef_damping_minus_3 = 0,
243  .cdef_bits = 0,
244  };
245 
246  for (int i = 0; i < STD_VIDEO_AV1_MAX_SEGMENTS; i++) {
247  segmentation->FeatureEnabled[i] = 0x0;
248  for (int j = 0; j < STD_VIDEO_AV1_SEG_LVL_MAX; j++) {
249  segmentation->FeatureEnabled[i] |= 0x0;
250  segmentation->FeatureData[i][j] = 0;
251  }
252  }
253 
254  *loop_filter = (StdVideoAV1LoopFilter) {
255  .flags = (StdVideoAV1LoopFilterFlags) {
256  .loop_filter_delta_enabled = 0,
257  .loop_filter_delta_update = 0,
258  },
259  .loop_filter_level = { 0 },
260  .loop_filter_sharpness = 0,
261  .update_ref_delta = 0,
262  .loop_filter_ref_deltas = { 0 },
263  .update_mode_delta = 0,
264  .loop_filter_mode_deltas = { 0 },
265  };
266  loop_filter->update_mode_delta = 1;
267  memcpy(loop_filter->loop_filter_ref_deltas, default_loop_filter_ref_deltas,
268  STD_VIDEO_AV1_TOTAL_REFS_PER_FRAME * sizeof(int8_t));
269 
270  *quantization = (StdVideoAV1Quantization) {
271  .flags = (StdVideoAV1QuantizationFlags) {
272  .using_qmatrix = 0,
273  .diff_uv_delta = 0,
274  /* Reserved */
275  },
276  .base_q_idx = 0, /* Set later */
277  .DeltaQYDc = 0,
278  .DeltaQUDc = 0,
279  .DeltaQUAc = 0,
280  .DeltaQVDc = 0,
281  .DeltaQVAc = 0,
282  .qm_y = 0,
283  .qm_u = 0,
284  .qm_v = 0,
285  };
286 
287  ref_slot = (VkVideoReferenceSlotInfoKHR *)encode_info->pSetupReferenceSlot;
288  ap->av1pic_info = (StdVideoEncodeAV1PictureInfo) {
289  .flags = (StdVideoEncodeAV1PictureInfoFlags) {
290  .error_resilient_mode = (pic->type == FF_HW_PICTURE_TYPE_I ||
291  pic->type == FF_HW_PICTURE_TYPE_IDR) &&
292  (pic->display_order <= pic->encode_order),
293  .disable_cdf_update = 0,
294  .use_superres = 0,
295  .render_and_frame_size_different = 0,
296  .allow_screen_content_tools = 0,
297  .is_filter_switchable = 0,
298  .force_integer_mv = 0,
299  .frame_size_override_flag = 0,
300  .buffer_removal_time_present_flag = 0,
301  .allow_intrabc = 0,
302  .frame_refs_short_signaling = 0,
303  .allow_high_precision_mv = 0,
304  .is_motion_mode_switchable = 0,
305  .use_ref_frame_mvs = 0,
306  .disable_frame_end_update_cdf = 0,
307  .allow_warped_motion = 0,
308  .reduced_tx_set = 0,
309  .skip_mode_present = 0,
310  .delta_q_present = 0,
311  .delta_lf_present = 0,
312  .delta_lf_multi = 0,
313  .segmentation_enabled = 0,
314  .segmentation_update_map = 0,
315  .segmentation_temporal_update = 0,
316  .segmentation_update_data = 0,
317  .UsesLr = 0,
318  .usesChromaLr = 0,
319  .show_frame = pic->display_order <= pic->encode_order,
320  .showable_frame = 0,
321  /* Reserved */
322  },
323  .frame_type = 0, // set later
324  .frame_presentation_time = 0,
325  .current_frame_id = ref_slot->slotIndex,
326  .order_hint = 0, // set later
327  .primary_ref_frame = 0, // set later
328  .refresh_frame_flags = 0x0, // set later
329  .coded_denom = 0,
330  .render_width_minus_1 = base_ctx->surface_width - 1,
331  .render_height_minus_1 = base_ctx->surface_height - 1,
332  .interpolation_filter = 0,
333  .TxMode = STD_VIDEO_AV1_TX_MODE_SELECT,
334  .delta_q_res = 0,
335  .delta_lf_res = 0,
336  .ref_order_hint = { 0 }, // set later
337  .ref_frame_idx = { 0 }, // set later
338  /* Reserved */
339  .delta_frame_id_minus_1 = { 0 },
340 
341 // .pTileInfo = tile_info, TODO FIX
342  .pQuantization = quantization,
343  .pSegmentation = segmentation,
344  .pLoopFilter = loop_filter,
345  .pCDEF = cdef,
346  .pLoopRestoration = loop_restoration,
347  .pGlobalMotion = global_motion,
348  .pExtensionHeader = &ap->ext_header,
349  .pBufferRemovalTimes = NULL,
350  };
351 
352  switch (pic->type) {
355  av_assert0(pic->nb_refs[0] == 0 || pic->nb_refs[1]);
356  ap->av1pic_info.frame_type = STD_VIDEO_AV1_FRAME_TYPE_KEY;
357  ap->av1pic_info.refresh_frame_flags = 0xFF;
358  quantization->base_q_idx = enc->q_idx_idr;
359  ap->slot = 0;
360  ap->last_idr_frame = pic->display_order;
361  pred_mode = VK_VIDEO_ENCODE_AV1_PREDICTION_MODE_INTRA_ONLY_KHR;
362  rc_group = VK_VIDEO_ENCODE_AV1_RATE_CONTROL_GROUP_INTRA_KHR;
363  break;
365  ref = pic->refs[0][pic->nb_refs[0] - 1];
366  ap_ref = ref->codec_priv;
367 
368  ap->av1pic_info.frame_type = STD_VIDEO_AV1_FRAME_TYPE_INTER;
369  quantization->base_q_idx = enc->q_idx_p;
370 
371  ap->last_idr_frame = ap_ref->last_idr_frame;
372  ap->slot = !ap_ref->slot;
373 
374  ap->av1pic_info.refresh_frame_flags = 1 << ap->slot;
375 
376  /** set the nearest frame in L0 as all reference frame. */
377  for (int i = 0; i < AV1_REFS_PER_FRAME; i++)
378  ap->av1pic_info.ref_frame_idx[i] = ap_ref->slot;
379 
380  ap->av1pic_info.primary_ref_frame = ap_ref->slot;
381  ap->av1pic_info.ref_order_hint[ap_ref->slot] = ref->display_order - ap_ref->last_idr_frame;
382  rc_group = VK_VIDEO_ENCODE_AV1_RATE_CONTROL_GROUP_PREDICTIVE_KHR;
383  pred_mode = VK_VIDEO_ENCODE_AV1_PREDICTION_MODE_SINGLE_REFERENCE_KHR;
384  ref_name_mask = enc->caps.singleReferenceNameMask;
385  set_name_slot(ap_ref->av1pic_info.current_frame_id, name_slots, ref_name_mask, 0);
386 
387 // vpic->ref_frame_ctrl_l0.fields.search_idx0 = AV1_REF_FRAME_LAST;
388 
389  /** set the 2nd nearest frame in L0 as Golden frame. */
390  if ((pic->nb_refs[0] > 1) &&
391  ((enc->caps.maxSingleReferenceCount > 1) ||
392  (enc->caps.maxUnidirectionalCompoundReferenceCount > 0))) {
393  if (enc->caps.maxUnidirectionalCompoundReferenceCount) {
394  pred_mode = VK_VIDEO_ENCODE_AV1_PREDICTION_MODE_UNIDIRECTIONAL_COMPOUND_KHR;
395  ref_name_mask = enc->caps.unidirectionalCompoundReferenceNameMask;
396  }
397  ref = pic->refs[0][pic->nb_refs[0] - 2];
398  ap_ref = ref->codec_priv;
399  ap->av1pic_info.ref_frame_idx[3] = ap_ref->slot;
400  ap->av1pic_info.ref_order_hint[ap_ref->slot] = ref->display_order - ap_ref->last_idr_frame;
401 // vpic->ref_frame_ctrl_l0.fields.search_idx1 = AV1_REF_FRAME_GOLDEN;
402  set_name_slot(ap_ref->av1pic_info.current_frame_id, name_slots, ref_name_mask, 0);
403  }
404  break;
406  ap->av1pic_info.frame_type = STD_VIDEO_AV1_FRAME_TYPE_INTER;
407  quantization->base_q_idx = enc->q_idx_b;
408  ap->av1pic_info.refresh_frame_flags = 0x0;
409 
410  rc_group = VK_VIDEO_ENCODE_AV1_RATE_CONTROL_GROUP_BIPREDICTIVE_KHR;
411  pred_mode = VK_VIDEO_ENCODE_AV1_PREDICTION_MODE_BIDIRECTIONAL_COMPOUND_KHR;
412  ref_name_mask = enc->caps.bidirectionalCompoundReferenceNameMask;
413 
414 // fh->reference_select = 1;
415  /** B frame will not be referenced, disable its recon frame. */
416 // vpic->picture_flags.bits.disable_frame_recon = 1;
417 
418  /** Use LAST_FRAME and BWDREF_FRAME for reference. */
419 // vpic->ref_frame_ctrl_l0.fields.search_idx0 = AV1_REF_FRAME_LAST;
420 // vpic->ref_frame_ctrl_l1.fields.search_idx0 = AV1_REF_FRAME_BWDREF;
421 
422  ref = pic->refs[0][pic->nb_refs[0] - 1];
423  ap_ref = ref->codec_priv;
424  ap->last_idr_frame = ap_ref->last_idr_frame;
425  ap->av1pic_info.primary_ref_frame = ap_ref->slot;
426  ap->av1pic_info.ref_order_hint[ap_ref->slot] = ref->display_order - ap_ref->last_idr_frame;
427  for (int i = 0; i < AV1_REF_FRAME_GOLDEN; i++)
428  ap->av1pic_info.ref_frame_idx[i] = ap_ref->slot;
429  set_name_slot(ap_ref->av1pic_info.current_frame_id, name_slots, ref_name_mask, 0);
430 
431  ref = pic->refs[1][pic->nb_refs[1] - 1];
432  ap_ref = ref->codec_priv;
433  ap->av1pic_info.ref_order_hint[ap_ref->slot] = ref->display_order - ap_ref->last_idr_frame;
434  for (int i = AV1_REF_FRAME_GOLDEN; i < AV1_REFS_PER_FRAME; i++)
435  ap->av1pic_info.ref_frame_idx[i] = ap_ref->slot;
436  set_name_slot(ap_ref->av1pic_info.current_frame_id, name_slots, ref_name_mask, 1);
437  break;
438  }
439 
440  ap->av1pic_info.flags.showable_frame = ap->av1pic_info.frame_type != STD_VIDEO_AV1_FRAME_TYPE_KEY;
441  ap->av1pic_info.order_hint = pic->display_order - ap->last_idr_frame;
442 
443  ap->vkav1pic_info = (VkVideoEncodeAV1PictureInfoKHR) {
444  .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_PICTURE_INFO_KHR,
445  .pNext = NULL,
446  .predictionMode = pred_mode,
447  .rateControlGroup = rc_group,
448  .constantQIndex = quantization->base_q_idx,
449  .pStdPictureInfo = &ap->av1pic_info,
450  // .referenceNameSlotIndices is set below
451  .primaryReferenceCdfOnly = 0,
452  .generateObuExtensionHeader = 0,
453  };
454  encode_info->pNext = &ap->vkav1pic_info;
455 
456  for (int i = 0; i < FF_ARRAY_ELEMS(ap->vkav1pic_info.referenceNameSlotIndices); i++)
457  ap->vkav1pic_info.referenceNameSlotIndices[i] = name_slots[i];
458 
459  ref_slot = (VkVideoReferenceSlotInfoKHR *)encode_info->pSetupReferenceSlot;
460  ref_slot->pNext = &ap->vkav1dpb_info;
461 
462  ap->av1dpb_info = (StdVideoEncodeAV1ReferenceInfo) {
463  .flags = (StdVideoEncodeAV1ReferenceInfoFlags) {
464  .disable_frame_end_update_cdf = 0,
465  .segmentation_enabled = 0,
466  /* Reserved */
467  },
468  .RefFrameId = ref_slot->slotIndex,
469  .frame_type = ap->av1pic_info.frame_type,
470  .OrderHint = pic->display_order - ap->last_idr_frame,
471  /* Reserved */
472  .pExtensionHeader = &ap->ext_header,
473  };
474 
475  ap->vkav1dpb_info = (VkVideoEncodeAV1DpbSlotInfoKHR) {
476  .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_DPB_SLOT_INFO_KHR,
477  .pStdReferenceInfo = &ap->av1dpb_info,
478  };
479 
480  ap->units_needed = 0;
481  if (pic->type == FF_HW_PICTURE_TYPE_IDR) {
482  AVFrameSideData *sd = NULL;
486  if (sd) {
489  if (mdm->has_primaries && mdm->has_luminance) {
490  AV1RawOBU *obu = &enc->meta_mastering_obu;
491  AV1RawMetadata *md = &obu->obu.metadata;
492  AV1RawMetadataHDRMDCV *mdcv = &md->metadata.hdr_mdcv;
493  const int chroma_den = 1 << 16;
494  const int max_luma_den = 1 << 8;
495  const int min_luma_den = 1 << 14;
496 
497  memset(obu, 0, sizeof(*obu));
499  md->metadata_type = AV1_METADATA_TYPE_HDR_MDCV;
500 
501  for (int i = 0; i < 3; i++) {
502  mdcv->primary_chromaticity_x[i] =
503  av_rescale(mdm->display_primaries[i][0].num, chroma_den,
504  mdm->display_primaries[i][0].den);
505  mdcv->primary_chromaticity_y[i] =
506  av_rescale(mdm->display_primaries[i][1].num, chroma_den,
507  mdm->display_primaries[i][1].den);
508  }
509 
511  av_rescale(mdm->white_point[0].num, chroma_den,
512  mdm->white_point[0].den);
514  av_rescale(mdm->white_point[1].num, chroma_den,
515  mdm->white_point[1].den);
516 
517  mdcv->luminance_max =
518  av_rescale(mdm->max_luminance.num, max_luma_den,
519  mdm->max_luminance.den);
520  mdcv->luminance_min =
521  av_rescale(mdm->min_luminance.num, min_luma_den,
522  mdm->min_luminance.den);
524  }
525  }
526 
530  if (sd) {
532  AV1RawOBU *obu = &enc->meta_cll_obu;
533  AV1RawMetadata *md = &obu->obu.metadata;
534  AV1RawMetadataHDRCLL *cll = &md->metadata.hdr_cll;
535 
536  memset(obu, 0, sizeof(*obu));
537  obu->header.obu_type = AV1_OBU_METADATA;
538  md->metadata_type = AV1_METADATA_TYPE_HDR_CLL;
539  cll->max_cll = cllm->MaxCLL;
540  cll->max_fall = cllm->MaxFALL;
541 
543  }
544  }
545 
546  FFVulkanEncodePicture *vp = pic->priv;
547  vp->tail_size = 0;
549  if (vp->non_independent_frame) {
550  AV1RawOBU *obu = &enc->hidden_obu;
551  AV1RawFrameHeader *fh = &obu->obu.frame_header;
552 
553  /** hidden frame header */
554  memset(obu, 0, sizeof(*obu));
556  obu->header.obu_has_size_field = 1;
557 
559  fh->refresh_frame_flags = 1 << ap->slot;
560  fh->frame_width_minus_1 = base_ctx->surface_width - 1;
561  fh->frame_height_minus_1 = base_ctx->surface_height - 1;
564 
565  memcpy(fh->loop_filter_ref_deltas, default_loop_filter_ref_deltas,
566  AV1_TOTAL_REFS_PER_FRAME * sizeof(int8_t));
567 
568  obu = &enc->tail_obu;
569  fh = &obu->obu.frame_header;
570 
571  /** tail frame header */
572  memset(obu, 0, sizeof(*obu));
574  obu->header.obu_has_size_field = 1;
575 
576  fh->show_existing_frame = 1;
577  fh->frame_to_show_map_idx = ap->slot != 0;
579  fh->frame_width_minus_1 = base_ctx->surface_width - 1;
580  fh->frame_height_minus_1 = base_ctx->surface_height - 1;
583  }
584 
585  return 0;
586 }
587 
588 static int init_profile(AVCodecContext *avctx,
589  VkVideoProfileInfoKHR *profile, void *pnext)
590 {
591  VkResult ret;
592  VulkanEncodeAV1Context *enc = avctx->priv_data;
594  FFVulkanContext *s = &ctx->s;
595  FFVulkanFunctions *vk = &ctx->s.vkfn;
596  FFHWBaseEncodeContext *base_ctx = &ctx->base;
597 
598  VkVideoEncodeAV1CapabilitiesKHR av1_caps = {
599  .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_CAPABILITIES_KHR,
600  };
601  VkVideoEncodeCapabilitiesKHR enc_caps = {
602  .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_CAPABILITIES_KHR,
603  .pNext = &av1_caps,
604  };
605  VkVideoCapabilitiesKHR caps = {
606  .sType = VK_STRUCTURE_TYPE_VIDEO_CAPABILITIES_KHR,
607  .pNext = &enc_caps,
608  };
609 
610  /* In order of preference */
611  int last_supported = AV_PROFILE_UNKNOWN;
612  static const int known_profiles[] = {
616  };
617  int nb_profiles = FF_ARRAY_ELEMS(known_profiles);
618 
619  const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(s->frames->sw_format);
620  if (!desc)
621  return AVERROR(EINVAL);
622 
623  if (s->frames->sw_format == AV_PIX_FMT_NV12 ||
624  s->frames->sw_format == AV_PIX_FMT_P010)
625  nb_profiles = 1;
626 
627  enc->profile = (VkVideoEncodeAV1ProfileInfoKHR) {
628  .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_PROFILE_INFO_KHR,
629  .pNext = pnext,
630  .stdProfile = ff_vk_av1_profile_to_vk(avctx->profile),
631  };
632  profile->pNext = &enc->profile;
633 
634  /* Set level */
635  if (avctx->level == AV_LEVEL_UNKNOWN) {
636  const AV1LevelDescriptor *level;
637  float framerate = 0.0;
638 
639  if (avctx->framerate.num > 0 && avctx->framerate.den > 0)
640  framerate = av_q2d(avctx->framerate);
641 
642  level = ff_av1_guess_level(avctx->bit_rate, enc->seq_tier,
643  base_ctx->surface_width, base_ctx->surface_height,
644  enc->tile_rows * enc->tile_cols,
645  enc->tile_cols, framerate);
646  if (level) {
647  av_log(avctx, AV_LOG_VERBOSE, "Using level %s.\n", level->name);
648  enc->seq_level_idx = level->level_idx;
649  } else {
650  av_log(avctx, AV_LOG_VERBOSE, "Stream will not conform to "
651  "any normal level, using level 7.3 by default.\n");
652  enc->seq_level_idx = STD_VIDEO_AV1_LEVEL_7_3;
653  enc->seq_tier = 1;
654  }
655  } else {
657  }
658 
659  /* User has explicitly specified a profile. */
660  if (avctx->profile != AV_PROFILE_UNKNOWN)
661  return 0;
662 
663  av_log(avctx, AV_LOG_DEBUG, "Supported profiles:\n");
664  for (int i = 0; i < nb_profiles; i++) {
665  enc->profile.stdProfile = ff_vk_av1_profile_to_vk(known_profiles[i]);
666  ret = vk->GetPhysicalDeviceVideoCapabilitiesKHR(s->hwctx->phys_dev,
667  profile,
668  &caps);
669  if (ret == VK_SUCCESS) {
670  av_log(avctx, AV_LOG_DEBUG, " %s\n",
671  avcodec_profile_name(avctx->codec_id, known_profiles[i]));
672  last_supported = known_profiles[i];
673  }
674  }
675 
676  if (last_supported == AV_PROFILE_UNKNOWN) {
677  av_log(avctx, AV_LOG_ERROR, "No supported profiles for given format\n");
678  return AVERROR(ENOTSUP);
679  }
680 
681  enc->profile.stdProfile = ff_vk_av1_profile_to_vk(last_supported);
682  av_log(avctx, AV_LOG_VERBOSE, "Using profile %s\n",
683  avcodec_profile_name(avctx->codec_id, last_supported));
684  avctx->profile = last_supported;
685 
686  return 0;
687 }
688 
690 {
691  VulkanEncodeAV1Context *enc = avctx->priv_data;
692 
693  if (avctx->rc_buffer_size)
694  enc->hrd_buffer_size = avctx->rc_buffer_size;
695  else if (avctx->rc_max_rate > 0)
696  enc->hrd_buffer_size = avctx->rc_max_rate;
697  else
698  enc->hrd_buffer_size = avctx->bit_rate;
699 
700  if (avctx->rc_initial_buffer_occupancy) {
701  if (avctx->rc_initial_buffer_occupancy > enc->hrd_buffer_size) {
702  av_log(avctx, AV_LOG_ERROR, "Invalid RC buffer settings: "
703  "must have initial buffer size (%d) <= "
704  "buffer size (%"PRId64").\n",
706  return AVERROR(EINVAL);
707  }
709  } else {
710  enc->initial_buffer_fullness = enc->hrd_buffer_size * 3 / 4;
711  }
712 
713  if (enc->common.opts.rc_mode == VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DISABLED_BIT_KHR) {
714  enc->q_idx_p = av_clip(enc->common.opts.qp,
715  enc->caps.minQIndex, enc->caps.maxQIndex);
716  if (fabs(avctx->i_quant_factor) > 0.0)
717  enc->q_idx_idr =
718  av_clip((fabs(avctx->i_quant_factor) * enc->q_idx_p +
719  avctx->i_quant_offset) + 0.5,
720  0, 255);
721  else
722  enc->q_idx_idr = enc->q_idx_p;
723 
724  if (fabs(avctx->b_quant_factor) > 0.0)
725  enc->q_idx_b =
726  av_clip((fabs(avctx->b_quant_factor) * enc->q_idx_p +
727  avctx->b_quant_offset) + 0.5,
728  0, 255);
729  else
730  enc->q_idx_b = enc->q_idx_p;
731  } else {
732  /** Arbitrary value */
733  enc->q_idx_idr = enc->q_idx_p = enc->q_idx_b = 128;
734  }
735 
736  return 0;
737 }
738 
740 {
741  VulkanEncodeAV1Context *enc = avctx->priv_data;
743  FFVulkanContext *s = &ctx->s;
744  FFHWBaseEncodeContext *base_ctx = &ctx->base;
745 
746  AV1RawOBU *seq_obu = &enc->seq_hdr_obu;
747  AV1RawSequenceHeader *seq = &seq_obu->obu.sequence_header;
748 
749  const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(s->frames->sw_format);
750  if (!desc)
751  return AVERROR(EINVAL);
752 
754  *seq = (AV1RawSequenceHeader) {
755  .seq_profile = avctx->profile,
756  .seq_force_integer_mv = seq->seq_force_screen_content_tools ?
759  .frame_width_bits_minus_1 = av_log2(base_ctx->surface_width),
760  .frame_height_bits_minus_1 = av_log2(base_ctx->surface_height),
761  .max_frame_width_minus_1 = base_ctx->surface_width - 1,
762  .max_frame_height_minus_1 = base_ctx->surface_height - 1,
763  .enable_order_hint = 1,
764  .order_hint_bits_minus_1 = av_clip_intp2(av_log2(ctx->base.gop_size), 3),
765  .use_128x128_superblock = !!(enc->caps.superblockSizes & VK_VIDEO_ENCODE_AV1_SUPERBLOCK_SIZE_128_BIT_KHR),
767  .high_bitdepth = desc->comp[0].depth > 8,
768  .color_primaries = avctx->color_primaries,
769  .transfer_characteristics = avctx->color_trc,
770  .matrix_coefficients = avctx->colorspace,
771  .color_description_present_flag = (avctx->color_primaries != AVCOL_PRI_UNSPECIFIED ||
772  avctx->color_trc != AVCOL_TRC_UNSPECIFIED ||
774  .subsampling_x = desc->log2_chroma_w,
775  .subsampling_y = desc->log2_chroma_h,
776  .chroma_sample_position = avctx->chroma_sample_location == AVCHROMA_LOC_LEFT ?
781  },
782 
783  /* Operating point */
784  .seq_tier = { enc->seq_tier },
785  .seq_level_idx = { enc->seq_level_idx },
786  .decoder_buffer_delay = { base_ctx->decode_delay },
787  .encoder_buffer_delay = { base_ctx->output_delay },
788  .operating_points_cnt_minus_1 = 1 - 1,
789  };
790 
791  return 0;
792 }
793 
794 typedef struct VulkanAV1Units {
795  StdVideoAV1SequenceHeader seq_hdr;
796  StdVideoAV1TimingInfo timing_info;
797  StdVideoAV1ColorConfig color_config;
798 
799  StdVideoEncodeAV1DecoderModelInfo decoder_model;
800  StdVideoEncodeAV1OperatingPointInfo operating_points[AV1_MAX_OPERATING_POINTS];
803 
805 {
806  VulkanEncodeAV1Context *enc = avctx->priv_data;
807 
808  AV1RawOBU *seq_obu = &enc->seq_hdr_obu;
809  AV1RawSequenceHeader *seq = &seq_obu->obu.sequence_header;
810 
811  StdVideoAV1SequenceHeader *seq_hdr = &vk_units->seq_hdr;
812  StdVideoAV1TimingInfo *timing_info = &vk_units->timing_info;
813  StdVideoAV1ColorConfig *color_config = &vk_units->color_config;
814 
815  StdVideoEncodeAV1OperatingPointInfo *operating_points = vk_units->operating_points;
816 
817  *timing_info = (StdVideoAV1TimingInfo) {
818  .flags = (StdVideoAV1TimingInfoFlags) {
819  .equal_picture_interval = seq->timing_info.equal_picture_interval,
820  },
821  .num_units_in_display_tick = seq->timing_info.num_units_in_display_tick,
822  .time_scale = seq->timing_info.time_scale,
823  .num_ticks_per_picture_minus_1 = seq->timing_info.num_ticks_per_picture_minus_1,
824  };
825 
826  *color_config = (StdVideoAV1ColorConfig) {
827  .flags = (StdVideoAV1ColorConfigFlags) {
828  .mono_chrome = seq->color_config.mono_chrome,
829  .color_range = seq->color_config.color_range,
830  .separate_uv_delta_q = seq->color_config.separate_uv_delta_q,
831  },
832  .BitDepth = seq->color_config.twelve_bit ? 12 :
833  seq->color_config.high_bitdepth ? 10 : 8,
834  .subsampling_x = seq->color_config.subsampling_x,
835  .subsampling_y = seq->color_config.subsampling_y,
836  .color_primaries = seq->color_config.color_primaries,
837  .transfer_characteristics = seq->color_config.transfer_characteristics,
838  .matrix_coefficients = seq->color_config.matrix_coefficients,
839  };
840 
841  *seq_hdr = (StdVideoAV1SequenceHeader) {
842  .flags = (StdVideoAV1SequenceHeaderFlags) {
843  .still_picture = seq->still_picture,
844  .reduced_still_picture_header = seq->reduced_still_picture_header,
845  .use_128x128_superblock = seq->use_128x128_superblock,
846  .enable_filter_intra = seq->enable_filter_intra,
847  .enable_intra_edge_filter = seq->enable_intra_edge_filter,
848  .enable_interintra_compound = seq->enable_interintra_compound,
849  .enable_masked_compound = seq->enable_masked_compound,
850  .enable_warped_motion = seq->enable_warped_motion,
851  .enable_dual_filter = seq->enable_dual_filter,
852  .enable_order_hint = seq->enable_order_hint,
853  .enable_jnt_comp = seq->enable_jnt_comp,
854  .enable_ref_frame_mvs = seq->enable_ref_frame_mvs,
855  .frame_id_numbers_present_flag = seq->frame_id_numbers_present_flag,
856  .enable_superres = seq->enable_superres,
857  .enable_cdef = seq->enable_cdef,
858  .enable_restoration = seq->enable_restoration,
859  .film_grain_params_present = seq->film_grain_params_present,
860  .timing_info_present_flag = seq->timing_info_present_flag,
861  .initial_display_delay_present_flag = seq->initial_display_delay_present_flag,
862  },
863  .seq_profile = seq->seq_profile,
864  .frame_width_bits_minus_1 = seq->frame_width_bits_minus_1,
865  .frame_height_bits_minus_1 = seq->frame_height_bits_minus_1,
866  .max_frame_width_minus_1 = seq->max_frame_width_minus_1,
867  .max_frame_height_minus_1 = seq->max_frame_height_minus_1,
868  .delta_frame_id_length_minus_2 = seq->delta_frame_id_length_minus_2,
869  .additional_frame_id_length_minus_1 = seq->additional_frame_id_length_minus_1,
870  .order_hint_bits_minus_1 = seq->order_hint_bits_minus_1,
871  .seq_force_integer_mv = seq->seq_force_integer_mv,
872  .seq_force_screen_content_tools = seq->seq_force_screen_content_tools,
873  .pTimingInfo = timing_info,
874  .pColorConfig = color_config,
875  };
876 
877  for (int i = 0; i <= seq->operating_points_cnt_minus_1; i++) {
878  operating_points[i] = (StdVideoEncodeAV1OperatingPointInfo) {
879  .flags = (StdVideoEncodeAV1OperatingPointInfoFlags) {
880  .decoder_model_present_for_this_op = seq->decoder_model_present_for_this_op[i],
881  .low_delay_mode_flag = seq->low_delay_mode_flag[i],
882  .initial_display_delay_present_for_this_op = seq->initial_display_delay_present_for_this_op[i],
883  /* Reserved */
884  },
885  .operating_point_idc = seq->operating_point_idc[i],
886  .seq_level_idx = seq->seq_level_idx[i],
887  .seq_tier = seq->seq_tier[i],
888  .decoder_buffer_delay = seq->decoder_buffer_delay[i],
889  .encoder_buffer_delay = seq->encoder_buffer_delay[i],
890  .initial_display_delay_minus_1 = seq->initial_display_delay_minus_1[i],
891  };
892  }
894 
895  return 0;
896 }
897 
899 {
900  int err;
901  VulkanEncodeAV1Context *enc = avctx->priv_data;
903  FFVulkanContext *s = &ctx->s;
904  FFVulkanFunctions *vk = &ctx->s.vkfn;
905 
906  VulkanAV1Units vk_units = { 0 };
907 
908  VkVideoEncodeAV1SessionParametersCreateInfoKHR av1_params;
909 
910  /* Convert it to Vulkan */
911  err = base_unit_to_vk(avctx, &vk_units);
912  if (err < 0) {
913  av_log(avctx, AV_LOG_ERROR, "Unable to convert sequence header to Vulkan: %s\n",
914  av_err2str(err));
915  return err;
916  }
917 
918  /* Destroy the session params */
919  if (ctx->session_params)
920  vk->DestroyVideoSessionParametersKHR(s->hwctx->act_dev,
921  ctx->session_params,
922  s->hwctx->alloc);
923 
924  av1_params = (VkVideoEncodeAV1SessionParametersCreateInfoKHR) {
925  .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_SESSION_PARAMETERS_CREATE_INFO_KHR,
926  .pStdSequenceHeader = &vk_units.seq_hdr,
927  .pStdDecoderModelInfo = &vk_units.decoder_model,
928  .pStdOperatingPoints = vk_units.operating_points,
929  .stdOperatingPointCount = vk_units.nb_operating_points,
930  };
931 
932  return ff_vulkan_encode_create_session_params(avctx, ctx, &av1_params);
933 }
934 
936  const uint8_t *data, size_t size)
937 {
938  int err;
939  VulkanEncodeAV1Context *enc = avctx->priv_data;
940  AV1RawOBU *seq_obu = &enc->seq_hdr_obu;
941  AV1RawSequenceHeader *seq = &seq_obu->obu.sequence_header;
942 
944  CodedBitstreamFragment obu = { 0 };
945 
946  err = ff_cbs_init(&cbs, AV_CODEC_ID_AV1, avctx);
947  if (err < 0)
948  return err;
949 
950  err = ff_cbs_read(cbs, &obu, NULL, data, size);
951  if (err < 0) {
952  av_log(avctx, AV_LOG_ERROR, "Unable to parse feedback units, bad drivers: %s\n",
953  av_err2str(err));
954  return err;
955  }
956 
957  /* If PPS has an override, just copy it entirely. */
958  for (int i = 0; i < obu.nb_units; i++) {
959  if (obu.units[i].type == AV1_OBU_SEQUENCE_HEADER) {
960  AV1RawOBU *f_seq_obu = obu.units[i].content;
961  AV1RawSequenceHeader *f_seq = &f_seq_obu->obu.sequence_header;
970  }
971  }
972 
973  ff_cbs_fragment_free(&obu);
974  ff_cbs_close(&cbs);
975 
976  return 0;
977 }
978 
979 static int init_base_units(AVCodecContext *avctx)
980 {
981  int err;
982  VkResult ret;
983  VulkanEncodeAV1Context *enc = avctx->priv_data;
985  FFVulkanContext *s = &ctx->s;
986  FFVulkanFunctions *vk = &ctx->s.vkfn;
987 
988  VkVideoEncodeSessionParametersGetInfoKHR params_info;
989  VkVideoEncodeSessionParametersFeedbackInfoKHR params_feedback;
990 
991  void *data = NULL;
992  size_t data_size = 0;
993 
994  /* Generate SPS/PPS unit info */
995  err = init_sequence_headers(avctx);
996  if (err < 0) {
997  av_log(avctx, AV_LOG_ERROR, "Unable to initialize sequence header: %s\n",
998  av_err2str(err));
999  return err;
1000  }
1001 
1002  /* Create session parameters from them */
1003  err = create_session_params(avctx);
1004  if (err < 0)
1005  return err;
1006 
1007  params_info = (VkVideoEncodeSessionParametersGetInfoKHR) {
1008  .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_SESSION_PARAMETERS_GET_INFO_KHR,
1009  .videoSessionParameters = ctx->session_params,
1010  };
1011  params_feedback = (VkVideoEncodeSessionParametersFeedbackInfoKHR) {
1012  .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_SESSION_PARAMETERS_FEEDBACK_INFO_KHR,
1013  };
1014 
1015  ret = vk->GetEncodedVideoSessionParametersKHR(s->hwctx->act_dev, &params_info,
1016  &params_feedback,
1017  &data_size, data);
1018  if (ret == VK_INCOMPLETE ||
1019  (ret == VK_SUCCESS) && (data_size > 0)) {
1020  data = av_mallocz(data_size);
1021  if (!data)
1022  return AVERROR(ENOMEM);
1023  } else {
1024  av_log(avctx, AV_LOG_ERROR, "Unable to get feedback for AV1 sequence header = %"SIZE_SPECIFIER"\n",
1025  data_size);
1026  return err;
1027  }
1028 
1029  ret = vk->GetEncodedVideoSessionParametersKHR(s->hwctx->act_dev, &params_info,
1030  &params_feedback,
1031  &data_size, data);
1032  if (ret != VK_SUCCESS) {
1033  av_log(avctx, AV_LOG_ERROR, "Error writing feedback units\n");
1034  return err;
1035  }
1036 
1037  av_log(avctx, AV_LOG_VERBOSE, "Feedback units written, overrides: %i\n",
1038  params_feedback.hasOverrides);
1039 
1040  params_feedback.hasOverrides = 1;
1041 
1042  /* No need to sync any overrides */
1043  if (!params_feedback.hasOverrides)
1044  return 0;
1045 
1046  /* Parse back tne units and override */
1047  err = parse_feedback_units(avctx, data, data_size);
1048  if (err < 0)
1049  return err;
1050 
1051  /* Create final session parameters */
1052  err = create_session_params(avctx);
1053  if (err < 0)
1054  return err;
1055 
1056  return 0;
1057 }
1058 
1061  uint8_t type, void *obu_unit)
1062 {
1063  int err;
1064 
1065  err = ff_cbs_insert_unit_content(au, -1,
1066  type, obu_unit, NULL);
1067  if (err < 0) {
1068  av_log(avctx, AV_LOG_ERROR, "Failed to add OBU unit: "
1069  "type = %d.\n", type);
1070  return err;
1071  }
1072 
1073  return err;
1074 }
1075 
1077  uint8_t *data, size_t *data_len,
1079 {
1080  VulkanEncodeAV1Context *enc = avctx->priv_data;
1081  int ret;
1082 
1083  ret = ff_cbs_write_fragment_data(enc->cbs, obu);
1084  if (ret < 0) {
1085  av_log(avctx, AV_LOG_ERROR, "Failed to write packed header.\n");
1086  return ret;
1087  }
1088 
1089  memcpy(data, obu->data, obu->data_size);
1090  *data_len = obu->data_size;
1091 
1092  return 0;
1093 }
1094 
1096  FFHWBaseEncodePicture *base_pic,
1097  uint8_t *data, size_t *data_len)
1098 {
1099  int err;
1100  VulkanEncodeAV1Context *enc = avctx->priv_data;
1102 
1103  err = vulkan_encode_av1_add_obu(avctx, obu,
1105  if (err < 0)
1106  goto fail;
1107 
1108  err = vulkan_encode_av1_write_obu(avctx, data, data_len, obu);
1109 
1110 fail:
1111  ff_cbs_fragment_reset(obu);
1112  return err;
1113 }
1114 
1116  FFHWBaseEncodePicture *base_pic,
1117  uint8_t *data, size_t *data_len)
1118 {
1119  int err;
1120  VulkanEncodeAV1Context *enc = avctx->priv_data;
1121  VulkanEncodeAV1Picture *ap = base_pic->codec_priv;
1122  FFVulkanEncodePicture *vp = base_pic->priv;
1124 
1125  if (vp->non_independent_frame) {
1126  err = vulkan_encode_av1_add_obu(avctx, obu, AV1_OBU_FRAME_HEADER, &enc->hidden_obu);
1127  if (err < 0)
1128  goto fail;
1129 
1130  // Only for tracking ref frame in context, not to be output
1131  err = ff_cbs_write_fragment_data(enc->cbs, obu);
1132  if (err < 0)
1133  goto fail;
1134 
1135  ff_cbs_fragment_reset(obu);
1136  ((CodedBitstreamAV1Context *)enc->cbs->priv_data)->seen_frame_header = 0;
1137 
1138  err = vulkan_encode_av1_add_obu(avctx, obu, AV1_OBU_FRAME_HEADER, &enc->tail_obu);
1139  if (err < 0)
1140  goto fail;
1141 
1142  err = vulkan_encode_av1_write_obu(avctx, vp->tail_data, &vp->tail_size, obu);
1143  if (err < 0)
1144  goto fail;
1145  }
1146 
1148  err = vulkan_encode_av1_add_obu(avctx, obu,
1150  &enc->meta_mastering_obu);
1151  if (err < 0)
1152  goto fail;
1153  }
1154 
1156  err = vulkan_encode_av1_add_obu(avctx, obu,
1158  &enc->meta_cll_obu);
1159  if (err < 0)
1160  goto fail;
1161  }
1162 
1163  if (ap->units_needed) {
1164  err = vulkan_encode_av1_write_obu(avctx, data, data_len, obu);
1165  if (err < 0)
1166  goto fail;
1167  } else {
1168  err = 0;
1169  *data_len = 0;
1170  }
1171 
1172 fail:
1173  ff_cbs_fragment_reset(obu);
1174  return err;
1175 }
1176 
1177 static int write_padding(AVCodecContext *avctx, uint32_t padding,
1178  uint8_t *data, size_t *data_len)
1179 {
1180  int err;
1181  VulkanEncodeAV1Context *enc = avctx->priv_data;
1183 
1184  AV1RawOBU padding_obu = { 0 };
1185  AV1RawPadding *raw_padding = &padding_obu.obu.padding;
1186 
1187  if (!padding)
1188  padding = 16;
1189 
1190  /* 2 byte header + 1 byte trailing bits */
1191  padding_obu.header.obu_type = AV1_OBU_PADDING;
1192  *raw_padding = (AV1RawPadding) {
1193  .payload = enc->padding_payload,
1194  .payload_size = padding,
1195  };
1196 
1197  err = vulkan_encode_av1_add_obu(avctx, obu, AV1_OBU_PADDING, &padding_obu);
1198  if (err < 0)
1199  goto fail;
1200 
1201  err = vulkan_encode_av1_write_obu(avctx, data, data_len, obu);
1202 fail:
1203  ff_cbs_fragment_reset(obu);
1204  return err;
1205 }
1206 
1207 static const FFVulkanCodec enc_cb = {
1212  .picture_priv_data_size = sizeof(VulkanEncodeAV1Picture),
1213  .filler_header_size = 4,
1220 };
1221 
1223 {
1224  int err;
1225  VulkanEncodeAV1Context *enc = avctx->priv_data;
1226  FFVulkanEncodeContext *ctx = &enc->common;
1227  FFHWBaseEncodeContext *base_ctx = &ctx->base;
1228  int flags;
1229 
1230  if (avctx->profile == AV_PROFILE_UNKNOWN)
1231  avctx->profile = enc->common.opts.profile;
1232 
1233  enc->caps = (VkVideoEncodeAV1CapabilitiesKHR) {
1234  .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_CAPABILITIES_KHR,
1235  };
1236 
1237  enc->quality_props = (VkVideoEncodeAV1QualityLevelPropertiesKHR) {
1238  .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_QUALITY_LEVEL_PROPERTIES_KHR,
1239  };
1240 
1241  err = ff_vulkan_encode_init(avctx, &enc->common,
1243  &enc->caps, &enc->quality_props);
1244  if (err < 0)
1245  return err;
1246 
1247  av_log(avctx, AV_LOG_VERBOSE, "AV1 encoder capabilities:\n");
1248  av_log(avctx, AV_LOG_VERBOSE, " Standard capability flags:\n");
1249  av_log(avctx, AV_LOG_VERBOSE, " per_rate_control_group_min_max_q_index: %i\n",
1250  !!(enc->caps.flags & VK_VIDEO_ENCODE_AV1_CAPABILITY_PER_RATE_CONTROL_GROUP_MIN_MAX_Q_INDEX_BIT_KHR));
1251  av_log(avctx, AV_LOG_VERBOSE, " generate_obu_extension_header: %i\n",
1252  !!(enc->caps.flags & VK_VIDEO_ENCODE_AV1_CAPABILITY_GENERATE_OBU_EXTENSION_HEADER_BIT_KHR));
1253  av_log(avctx, AV_LOG_VERBOSE, " primary_reference_cdf_only: %i\n",
1254  !!(enc->caps.flags & VK_VIDEO_ENCODE_AV1_CAPABILITY_PRIMARY_REFERENCE_CDF_ONLY_BIT_KHR));
1255  av_log(avctx, AV_LOG_VERBOSE, " frame_size_override: %i\n",
1256  !!(enc->caps.flags & VK_VIDEO_ENCODE_AV1_CAPABILITY_FRAME_SIZE_OVERRIDE_BIT_KHR));
1257  av_log(avctx, AV_LOG_VERBOSE, " motion_vector_scaling: %i\n",
1258  !!(enc->caps.flags & VK_VIDEO_ENCODE_AV1_CAPABILITY_MOTION_VECTOR_SCALING_BIT_KHR));
1259  av_log(avctx, AV_LOG_VERBOSE, " Capabilities:\n");
1260  av_log(avctx, AV_LOG_VERBOSE, " 64x64 superblocks: %i\n",
1261  !!(enc->caps.superblockSizes & VK_VIDEO_ENCODE_AV1_SUPERBLOCK_SIZE_64_BIT_KHR));
1262  av_log(avctx, AV_LOG_VERBOSE, " 128x128 superblocks: %i\n",
1263  !!(enc->caps.superblockSizes & VK_VIDEO_ENCODE_AV1_SUPERBLOCK_SIZE_128_BIT_KHR));
1264  av_log(avctx, AV_LOG_VERBOSE, " maxSingleReferenceCount: %i\n",
1265  enc->caps.maxSingleReferenceCount);
1266  av_log(avctx, AV_LOG_VERBOSE, " singleReferenceNameMask: 0x%x\n",
1267  enc->caps.singleReferenceNameMask);
1268  av_log(avctx, AV_LOG_VERBOSE, " maxUnidirectionalCompoundReferenceCount: %i\n",
1269  enc->caps.maxUnidirectionalCompoundReferenceCount);
1270  av_log(avctx, AV_LOG_VERBOSE, " maxUnidirectionalCompoundGroup1ReferenceCount: %i\n",
1271  enc->caps.maxUnidirectionalCompoundGroup1ReferenceCount);
1272  av_log(avctx, AV_LOG_VERBOSE, " unidirectionalCompoundReferenceNameMask: 0x%x\n",
1273  enc->caps.unidirectionalCompoundReferenceNameMask);
1274  av_log(avctx, AV_LOG_VERBOSE, " maxBidirectionalCompoundReferenceCount: %i\n",
1275  enc->caps.maxBidirectionalCompoundReferenceCount);
1276  av_log(avctx, AV_LOG_VERBOSE, " maxBidirectionalCompoundGroup1ReferenceCount: %i\n",
1277  enc->caps.maxBidirectionalCompoundGroup1ReferenceCount);
1278  av_log(avctx, AV_LOG_VERBOSE, " maxBidirectionalCompoundGroup2ReferenceCount: %i\n",
1279  enc->caps.maxBidirectionalCompoundGroup2ReferenceCount);
1280  av_log(avctx, AV_LOG_VERBOSE, " bidirectionalCompoundReferenceNameMask: 0x%x\n",
1281  enc->caps.bidirectionalCompoundReferenceNameMask);
1282  av_log(avctx, AV_LOG_VERBOSE, " maxTemporalLayerCount: %i\n",
1283  enc->caps.maxTemporalLayerCount);
1284  av_log(avctx, AV_LOG_VERBOSE, " maxSpatialLayerCount: %i\n",
1285  enc->caps.maxSpatialLayerCount);
1286  av_log(avctx, AV_LOG_VERBOSE, " maxOperatingPoints: %i\n",
1287  enc->caps.maxOperatingPoints);
1288  av_log(avctx, AV_LOG_VERBOSE, " min/max Qindex: [%i, %i]\n",
1289  enc->caps.minQIndex, enc->caps.maxQIndex);
1290  av_log(avctx, AV_LOG_VERBOSE, " prefersGopRemainingFrames: %i\n",
1291  enc->caps.prefersGopRemainingFrames);
1292  av_log(avctx, AV_LOG_VERBOSE, " requiresGopRemainingFrames: %i\n",
1293  enc->caps.requiresGopRemainingFrames);
1294  av_log(avctx, AV_LOG_VERBOSE, " maxLevel: %i\n",
1295  enc->caps.maxLevel);
1296  av_log(avctx, AV_LOG_VERBOSE, " codedPictureAlignment: %ix%i\n",
1297  enc->caps.codedPictureAlignment.width, enc->caps.codedPictureAlignment.height);
1298  av_log(avctx, AV_LOG_VERBOSE, " maxTiles: %ix%i\n",
1299  enc->caps.maxTiles.width, enc->caps.maxTiles.height);
1300  av_log(avctx, AV_LOG_VERBOSE, " Tile size: %ix%i to %ix%i\n",
1301  enc->caps.minTileSize.width, enc->caps.minTileSize.height,
1302  enc->caps.maxTileSize.width, enc->caps.maxTileSize.height);
1303 
1304  err = init_enc_options(avctx);
1305  if (err < 0)
1306  return err;
1307 
1308  flags = ctx->codec->flags;
1309  err = ff_hw_base_init_gop_structure(base_ctx, avctx,
1310  ctx->caps.maxDpbSlots,
1311  enc->caps.maxBidirectionalCompoundReferenceCount,
1312  flags, 0);
1313  if (err < 0)
1314  return err;
1315 
1316  base_ctx->output_delay = base_ctx->b_per_p;
1317  base_ctx->decode_delay = base_ctx->max_b_depth;
1318 
1319  /* Create units and session parameters */
1320  err = init_base_units(avctx);
1321  if (err < 0)
1322  return err;
1323 
1324  /* Init CBS */
1325  err = ff_cbs_init(&enc->cbs, AV_CODEC_ID_AV1, avctx);
1326  if (err < 0)
1327  return err;
1328 
1329  if (avctx->flags & AV_CODEC_FLAG_GLOBAL_HEADER) {
1330  uint8_t data[4096];
1331  size_t data_len = sizeof(data);
1332 
1333  err = write_sequence_header(avctx, NULL, data, &data_len);
1334  if (err < 0) {
1335  av_log(avctx, AV_LOG_ERROR, "Failed to write sequence header "
1336  "for extradata: %d.\n", err);
1337  return err;
1338  } else {
1339  avctx->extradata_size = data_len;
1340  avctx->extradata = av_mallocz(avctx->extradata_size +
1342  if (!avctx->extradata) {
1343  err = AVERROR(ENOMEM);
1344  return err;
1345  }
1346  memcpy(avctx->extradata, data, avctx->extradata_size);
1347  }
1348  }
1349 
1350  enc->padding_payload = av_mallocz(2*ctx->caps.minBitstreamBufferOffsetAlignment);
1351  if (!enc->padding_payload)
1352  return AVERROR(ENOMEM);
1353 
1354  memset(enc->padding_payload, 0xaa, 2*ctx->caps.minBitstreamBufferOffsetAlignment);
1355 
1356  return 0;
1357 }
1358 
1360 {
1361  VulkanEncodeAV1Context *enc = avctx->priv_data;
1362  av_free(enc->padding_payload);
1364  return 0;
1365 }
1366 
1367 #define OFFSET(x) offsetof(VulkanEncodeAV1Context, x)
1368 #define FLAGS (AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM)
1372 
1373  { "profile", "Set profile",
1374  OFFSET(common.opts.profile), AV_OPT_TYPE_INT,
1375  { .i64 = AV_PROFILE_UNKNOWN }, AV_PROFILE_UNKNOWN, 0xffff, FLAGS, .unit = "profile" },
1376 
1377 #define PROFILE(name, value) name, NULL, 0, AV_OPT_TYPE_CONST, \
1378  { .i64 = value }, 0, 0, FLAGS, .unit = "profile"
1379  { PROFILE("main", AV_PROFILE_AV1_MAIN) },
1380  { PROFILE("high", AV_PROFILE_AV1_HIGH) },
1381  { PROFILE("professional", AV_PROFILE_AV1_PROFESSIONAL) },
1382 #undef PROFILE
1383 
1384  { "tier", "Set tier (seq_tier)",
1385  OFFSET(common.opts.tier), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, FLAGS, .unit = "tier" },
1386  { "main", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = 0 }, 0, 0, FLAGS, .unit = "tier" },
1387  { "high", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = 1 }, 0, 0, FLAGS, .unit = "tier" },
1388 
1389  { "level", "Set level (level_idc)",
1390  OFFSET(common.opts.level), AV_OPT_TYPE_INT,
1391  { .i64 = AV_LEVEL_UNKNOWN }, AV_LEVEL_UNKNOWN, 0xff, FLAGS, .unit = "level" },
1392 
1393 #define LEVEL(name, value) name, NULL, 0, AV_OPT_TYPE_CONST, \
1394  { .i64 = value }, 0, 0, FLAGS, .unit = "level"
1395  { LEVEL("20", 0) },
1396  { LEVEL("21", 1) },
1397  { LEVEL("22", 2) },
1398  { LEVEL("23", 3) },
1399  { LEVEL("30", 4) },
1400  { LEVEL("31", 5) },
1401  { LEVEL("32", 6) },
1402  { LEVEL("33", 7) },
1403  { LEVEL("40", 8) },
1404  { LEVEL("41", 9) },
1405  { LEVEL("42", 10) },
1406  { LEVEL("43", 11) },
1407  { LEVEL("50", 12) },
1408  { LEVEL("51", 13) },
1409  { LEVEL("52", 14) },
1410  { LEVEL("53", 15) },
1411  { LEVEL("60", 16) },
1412  { LEVEL("61", 17) },
1413  { LEVEL("62", 18) },
1414  { LEVEL("63", 19) },
1415  { LEVEL("70", 20) },
1416  { LEVEL("71", 21) },
1417  { LEVEL("72", 22) },
1418  { LEVEL("73", 23) },
1419 #undef LEVEL
1420 
1421  { "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" },
1422  { "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" },
1423 
1424  { NULL },
1425 };
1426 
1428  { "b", "0" },
1429  { "bf", "2" },
1430  { "g", "300" },
1431  { "qmin", "1" },
1432  { "qmax", "255" },
1433  { "refs", "0" },
1434  { NULL },
1435 };
1436 
1438  .class_name = "av1_vulkan",
1439  .item_name = av_default_item_name,
1440  .option = vulkan_encode_av1_options,
1441  .version = LIBAVUTIL_VERSION_INT,
1442 };
1443 
1445  .p.name = "av1_vulkan",
1446  CODEC_LONG_NAME("AV1 (Vulkan)"),
1447  .p.type = AVMEDIA_TYPE_VIDEO,
1448  .p.id = AV_CODEC_ID_AV1,
1449  .priv_data_size = sizeof(VulkanEncodeAV1Context),
1452  .close = &vulkan_encode_av1_close,
1453  .p.priv_class = &vulkan_encode_av1_class,
1454  .p.capabilities = AV_CODEC_CAP_DELAY |
1459  .caps_internal = FF_CODEC_CAP_INIT_CLEANUP,
1460  .defaults = vulkan_encode_av1_defaults,
1462  .hw_configs = ff_vulkan_encode_hw_configs,
1463  .p.wrapper_name = "vulkan",
1464 };
flags
const SwsFlags flags[]
Definition: swscale.c:61
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:1368
AV1RawTimingInfo::time_scale
uint32_t time_scale
Definition: cbs_av1.h:69
CODEC_PIXFMTS
#define CODEC_PIXFMTS(...)
Definition: codec_internal.h:392
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
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)
CodedBitstreamContext::priv_data
void * priv_data
Internal codec-specific data.
Definition: cbs.h:247
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:659
FFHWBaseEncodePicture::priv
void * priv
Definition: hw_base_encode.h:63
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:108
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:3456
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
FF_HW_PICTURE_TYPE_P
@ FF_HW_PICTURE_TYPE_P
Definition: hw_base_encode.h:41
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:101
FFVulkanEncodePicture::tail_data
char tail_data[16]
Definition: vulkan_encode.h:62
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:669
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:1076
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:105
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:800
VulkanEncodeAV1Context::cbs
CodedBitstreamContext * cbs
Definition: vulkan_encode_av1.c:76
FF_HW_PICTURE_TYPE_I
@ FF_HW_PICTURE_TYPE_I
Definition: hw_base_encode.h:40
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:797
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
FF_HW_FLAG_B_PICTURE_REFERENCES
@ FF_HW_FLAG_B_PICTURE_REFERENCES
Definition: hw_base_encode.h:55
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
FF_HW_PICTURE_TYPE_B
@ FF_HW_PICTURE_TYPE_B
Definition: hw_base_encode.h:42
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
AV1RawFrameHeader::loop_filter_ref_deltas
int8_t loop_filter_ref_deltas[AV1_TOTAL_REFS_PER_FRAME]
Definition: cbs_av1.h:269
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:796
FFHWBaseEncodePicture::type
int type
Definition: hw_base_encode.h:78
VulkanAV1Units::seq_hdr
StdVideoAV1SequenceHeader seq_hdr
Definition: vulkan_encode_av1.c:795
VULKAN_ENCODE_COMMON_OPTIONS
#define VULKAN_ENCODE_COMMON_OPTIONS
Definition: vulkan_encode.h:204
vulkan_encode_av1_defaults
static const FFCodecDefault vulkan_encode_av1_defaults[]
Definition: vulkan_encode_av1.c:1427
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:207
AV1_OBU_FRAME_HEADER
@ AV1_OBU_FRAME_HEADER
Definition: av1.h:32
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:1115
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:898
AVCodecContext::flags
int flags
AV_CODEC_FLAG_*.
Definition: avcodec.h:488
VulkanAV1Units::decoder_model
StdVideoEncodeAV1DecoderModelInfo decoder_model
Definition: vulkan_encode_av1.c:799
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:689
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:94
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:98
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:801
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:106
FFVulkanEncodePicture::non_independent_frame
int non_independent_frame
Definition: vulkan_encode.h:61
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
AV1RawFrameHeader::render_width_minus_1
uint16_t render_width_minus_1
Definition: cbs_av1.h:202
s
#define s(width, name)
Definition: cbs_vp9.c:198
VulkanEncodeAV1Context::initial_buffer_fullness
uint64_t initial_buffer_fullness
Definition: vulkan_encode_av1.c:92
vulkan_encode_av1_class
static const AVClass vulkan_encode_av1_class
Definition: vulkan_encode_av1.c:1437
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:1207
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
AV1_TOTAL_REFS_PER_FRAME
@ AV1_TOTAL_REFS_PER_FRAME
Definition: av1.h:86
VulkanEncodeAV1Context::tile_rows
int tile_rows
Definition: vulkan_encode_av1.c:96
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
AV1RawFrameHeader::frame_width_minus_1
uint16_t frame_width_minus_1
Definition: cbs_av1.h:197
ctx
AVFormatContext * ctx
Definition: movenc.c:49
VulkanEncodeAV1Context::quality_props
VkVideoEncodeAV1QualityLevelPropertiesKHR quality_props
Definition: vulkan_encode_av1.c:89
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
CODEC_LONG_NAME
#define CODEC_LONG_NAME(str)
Definition: codec_internal.h:332
FFVkEncodeCommonOptions::qp
int qp
Definition: vulkan_encode.h:155
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
AV1_FRAME_INTER
@ AV1_FRAME_INTER
Definition: av1.h:54
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
AV1RawFrameHeader
Definition: cbs_av1.h:174
AVCHROMA_LOC_LEFT
@ AVCHROMA_LOC_LEFT
MPEG-2/4 4:2:0, H.264 default for 4:2:0.
Definition: pixfmt.h:798
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:800
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:367
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:241
init_sequence_headers
static av_cold int init_sequence_headers(AVCodecContext *avctx)
Definition: vulkan_encode_av1.c:739
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:103
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:101
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
FFVulkanEncodePicture::tail_size
size_t tail_size
Definition: vulkan_encode.h:63
FFVulkanEncodeContext::opts
FFVkEncodeCommonOptions opts
Definition: vulkan_encode.h:186
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:804
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:1359
FFVulkanEncodeContext
Definition: vulkan_encode.h:169
init
int(* init)(AVBSFContext *ctx)
Definition: dts2pts.c:550
AV_CODEC_CAP_DR1
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
Definition: codec.h:52
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
AV1RawFrameHeader::refresh_frame_flags
uint8_t refresh_frame_flags
Definition: cbs_av1.h:207
FFVkEncodeCommonOptions::rc_mode
VkVideoEncodeRateControlModeFlagBitsKHR rc_mode
Definition: vulkan_encode.h:165
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:162
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:1367
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:284
VulkanEncodeAV1Context::hidden_obu
AV1RawOBU hidden_obu
Definition: vulkan_encode_av1.c:83
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:99
VulkanEncodeAV1Picture::tile_info
StdVideoAV1TileInfo tile_info
Definition: vulkan_encode_av1.c:53
AV1LevelDescriptor
Definition: av1_levels.h:26
FF_HW_FLAG_SLICE_CONTROL
@ FF_HW_FLAG_SLICE_CONTROL
Definition: hw_base_encode.h:47
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:91
AV1RawSequenceHeader::enable_interintra_compound
uint8_t enable_interintra_compound
Definition: cbs_av1.h:117
AV1RawOBU::frame_header
AV1RawFrameHeader frame_header
Definition: cbs_av1.h:420
write_padding
static int write_padding(AVCodecContext *avctx, uint32_t padding, uint8_t *data, size_t *data_len)
Definition: vulkan_encode_av1.c:1177
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:157
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:588
parse_feedback_units
static int parse_feedback_units(AVCodecContext *avctx, const uint8_t *data, size_t size)
Definition: vulkan_encode_av1.c:935
AV1RawFrameHeader::frame_to_show_map_idx
uint8_t frame_to_show_map_idx
Definition: cbs_av1.h:176
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:1444
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:580
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
FF_HW_FLAG_B_PICTURES
@ FF_HW_FLAG_B_PICTURES
Definition: hw_base_encode.h:53
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:2297
AVCOL_SPC_UNSPECIFIED
@ AVCOL_SPC_UNSPECIFIED
Definition: pixfmt.h:703
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:86
VulkanEncodeAV1Context::tail_obu
AV1RawOBU tail_obu
Definition: vulkan_encode_av1.c:84
AV_INPUT_BUFFER_PADDING_SIZE
#define AV_INPUT_BUFFER_PADDING_SIZE
Definition: defs.h:40
SIZE_SPECIFIER
#define SIZE_SPECIFIER
Definition: internal.h:119
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:1095
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_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:739
AV1RawColorConfig::mono_chrome
uint8_t mono_chrome
Definition: cbs_av1.h:53
av1_levels.h
AV1RawFrameHeader::frame_height_minus_1
uint16_t frame_height_minus_1
Definition: cbs_av1.h:198
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:95
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
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
AV1RawFrameHeader::show_existing_frame
uint8_t show_existing_frame
Definition: cbs_av1.h:175
desc
const char * desc
Definition: libsvtav1.c:78
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:200
FF_HW_PICTURE_TYPE_IDR
@ FF_HW_PICTURE_TYPE_IDR
Definition: hw_base_encode.h:39
mem.h
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:282
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:1369
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:102
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:98
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:94
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:1222
VulkanEncodeAV1Context::caps
VkVideoEncodeAV1CapabilitiesKHR caps
Definition: vulkan_encode_av1.c:88
init_base_units
static int init_base_units(AVCodecContext *avctx)
Definition: vulkan_encode_av1.c:979
AV1RawPadding::payload
uint8_t * payload
Definition: cbs_av1.h:407
VulkanAV1Units
Definition: vulkan_encode_av1.c:794
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:69
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
AV1RawOBUHeader::obu_has_size_field
uint8_t obu_has_size_field
Definition: cbs_av1.h:42
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:277
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:1061
VulkanEncodeAV1Picture::last_idr_frame
int64_t last_idr_frame
Definition: vulkan_encode_av1.c:49
FFVulkanEncodePicture
Definition: vulkan_encode.h:39
CodedBitstreamFragment::nb_units
int nb_units
Number of units in this fragment.
Definition: cbs.h:160
AV1RawFrameHeader::render_height_minus_1
uint16_t render_height_minus_1
Definition: cbs_av1.h:203
init_pic_params
static int init_pic_params(AVCodecContext *avctx, FFHWBaseEncodePicture *pic, VkVideoEncodeInfoKHR *encode_info)
Definition: vulkan_encode_av1.c:177
AV1RawFrameHeader::frame_type
uint8_t frame_type
Definition: cbs_av1.h:180
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:1059
CodedBitstreamAV1Context
Definition: cbs_av1.h:457
AV1RawOBUHeader::obu_type
uint8_t obu_type
Definition: cbs_av1.h:40