FFmpeg
Loading...
Searching...
No Matches
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
33 .codec_id = AV_CODEC_ID_AV1,
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
46
47typedef 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
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
162static int 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 i;
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
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.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 ap->av1pic_info.primary_ref_frame =
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.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 ap->av1pic_info.primary_ref_frame =
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;
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++) {
503 av_rescale(mdm->display_primaries[i][0].num, chroma_den,
504 mdm->display_primaries[i][0].den);
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));
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;
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
588static 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
597 VkVideoEncodeAV1CapabilitiesKHR av1_caps = {
598 .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_CAPABILITIES_KHR,
599 };
600 VkVideoEncodeCapabilitiesKHR enc_caps = {
601 .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_CAPABILITIES_KHR,
602 .pNext = &av1_caps,
603 };
604 VkVideoCapabilitiesKHR caps = {
605 .sType = VK_STRUCTURE_TYPE_VIDEO_CAPABILITIES_KHR,
606 .pNext = &enc_caps,
607 };
608
609 /* In order of preference */
610 int last_supported = AV_PROFILE_UNKNOWN;
611 static const int known_profiles[] = {
615 };
616 int nb_profiles = FF_ARRAY_ELEMS(known_profiles);
617
618 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(s->frames->sw_format);
619 if (!desc)
620 return AVERROR(EINVAL);
621
622 if (s->frames->sw_format == AV_PIX_FMT_NV12 ||
623 s->frames->sw_format == AV_PIX_FMT_P010)
624 nb_profiles = 1;
625
626 enc->profile = (VkVideoEncodeAV1ProfileInfoKHR) {
627 .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_PROFILE_INFO_KHR,
628 .pNext = pnext,
629 .stdProfile = ff_vk_av1_profile_to_vk(avctx->profile),
630 };
631 profile->pNext = &enc->profile;
632
633 /* User has explicitly specified a profile. */
634 if (avctx->profile != AV_PROFILE_UNKNOWN)
635 return 0;
636
637 av_log(avctx, AV_LOG_DEBUG, "Supported profiles:\n");
638 for (int i = 0; i < nb_profiles; i++) {
639 enc->profile.stdProfile = ff_vk_av1_profile_to_vk(known_profiles[i]);
640 ret = vk->GetPhysicalDeviceVideoCapabilitiesKHR(s->hwctx->phys_dev,
641 profile,
642 &caps);
643 if (ret == VK_SUCCESS) {
644 av_log(avctx, AV_LOG_DEBUG, " %s\n",
645 avcodec_profile_name(avctx->codec_id, known_profiles[i]));
646 last_supported = known_profiles[i];
647 }
648 }
649
650 if (last_supported == AV_PROFILE_UNKNOWN) {
651 av_log(avctx, AV_LOG_ERROR, "No supported profiles for given format\n");
652 return AVERROR(ENOTSUP);
653 }
654
655 enc->profile.stdProfile = ff_vk_av1_profile_to_vk(last_supported);
656 av_log(avctx, AV_LOG_VERBOSE, "Using profile %s\n",
657 avcodec_profile_name(avctx->codec_id, last_supported));
658 avctx->profile = last_supported;
659
660 return 0;
661}
662
664{
665 VulkanEncodeAV1Context *enc = avctx->priv_data;
666
667 if (avctx->rc_buffer_size)
668 enc->hrd_buffer_size = avctx->rc_buffer_size;
669 else if (avctx->rc_max_rate > 0)
670 enc->hrd_buffer_size = avctx->rc_max_rate;
671 else
672 enc->hrd_buffer_size = avctx->bit_rate;
673
674 if (avctx->rc_initial_buffer_occupancy) {
676 av_log(avctx, AV_LOG_ERROR, "Invalid RC buffer settings: "
677 "must have initial buffer size (%d) <= "
678 "buffer size (%"PRId64").\n",
680 return AVERROR(EINVAL);
681 }
683 } else {
684 enc->initial_buffer_fullness = enc->hrd_buffer_size * 3 / 4;
685 }
686
687 if (enc->common.opts.rc_mode == VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DISABLED_BIT_KHR) {
688 enc->q_idx_p = av_clip(enc->common.opts.qp,
689 enc->caps.minQIndex, enc->caps.maxQIndex);
690 if (fabs(avctx->i_quant_factor) > 0.0)
691 enc->q_idx_idr =
692 av_clip((fabs(avctx->i_quant_factor) * enc->q_idx_p +
693 avctx->i_quant_offset) + 0.5,
694 0, 255);
695 else
696 enc->q_idx_idr = enc->q_idx_p;
697
698 if (fabs(avctx->b_quant_factor) > 0.0)
699 enc->q_idx_b =
700 av_clip((fabs(avctx->b_quant_factor) * enc->q_idx_p +
701 avctx->b_quant_offset) + 0.5,
702 0, 255);
703 else
704 enc->q_idx_b = enc->q_idx_p;
705 } else {
706 /** Arbitrary value */
707 enc->q_idx_idr = enc->q_idx_p = enc->q_idx_b = 128;
708 }
709
710 return 0;
711}
712
714{
715 VulkanEncodeAV1Context *enc = avctx->priv_data;
717 FFVulkanContext *s = &ctx->s;
718 FFHWBaseEncodeContext *base_ctx = &ctx->base;
719
720 AV1RawOBU *seq_obu = &enc->seq_hdr_obu;
722
723 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(s->frames->sw_format);
724 if (!desc)
725 return AVERROR(EINVAL);
726
727 enc->seq_tier = enc->common.opts.tier;
728
729 if (avctx->level == AV_LEVEL_UNKNOWN) {
731 float framerate = 0.0;
732
733 if (avctx->framerate.num > 0 && avctx->framerate.den > 0)
734 framerate = av_q2d(avctx->framerate);
735
737 base_ctx->surface_width, base_ctx->surface_height,
738 enc->tile_rows * enc->tile_cols,
739 enc->tile_cols, framerate);
740 if (level) {
741 av_log(avctx, AV_LOG_VERBOSE, "Using level %s.\n", level->name);
742 enc->seq_level_idx = level->level_idx;
743 } else {
744 av_log(avctx, AV_LOG_VERBOSE, "Stream will not conform to "
745 "any normal level, using level 7.3 by default.\n");
746 enc->seq_level_idx = STD_VIDEO_AV1_LEVEL_7_3;
747 enc->seq_tier = 1;
748 }
749 } else {
750 enc->seq_level_idx = avctx->level;
751 }
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 ||
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
794typedef 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;
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;
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
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 = %zu\n",
1025 data_size);
1026 return AVERROR_EXTERNAL;
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 err = AVERROR_EXTERNAL;
1035 goto end;
1036 }
1037
1038 av_log(avctx, AV_LOG_VERBOSE, "Feedback units written, overrides: %i\n",
1039 params_feedback.hasOverrides);
1040
1041 params_feedback.hasOverrides = 1;
1042
1043 /* No need to sync any overrides */
1044 err = 0;
1045 if (!params_feedback.hasOverrides)
1046 goto end;
1047
1048 /* Parse back tne units and override */
1049 err = parse_feedback_units(avctx, data, data_size);
1050 if (err < 0)
1051 goto end;
1052
1053 /* Create final session parameters */
1054 err = create_session_params(avctx);
1055
1056end:
1057 av_free(data);
1058 return err;
1059}
1060
1063 uint8_t type, void *obu_unit)
1064{
1065 int err;
1066
1067 err = ff_cbs_insert_unit_content(au, -1,
1068 type, obu_unit, NULL);
1069 if (err < 0) {
1070 av_log(avctx, AV_LOG_ERROR, "Failed to add OBU unit: "
1071 "type = %d.\n", type);
1072 return err;
1073 }
1074
1075 return err;
1076}
1077
1079 uint8_t *data, size_t *data_len,
1081{
1082 VulkanEncodeAV1Context *enc = avctx->priv_data;
1083 int ret;
1084
1085 ret = ff_cbs_write_fragment_data(enc->cbs, obu);
1086 if (ret < 0) {
1087 av_log(avctx, AV_LOG_ERROR, "Failed to write packed header.\n");
1088 return ret;
1089 }
1090
1091 memcpy(data, obu->data, obu->data_size);
1092 *data_len = obu->data_size;
1093
1094 return 0;
1095}
1096
1098 FFHWBaseEncodePicture *base_pic,
1099 uint8_t *data, size_t *data_len)
1100{
1101 int err;
1102 VulkanEncodeAV1Context *enc = avctx->priv_data;
1104
1105 err = vulkan_encode_av1_add_obu(avctx, obu,
1107 if (err < 0)
1108 goto fail;
1109
1110 err = vulkan_encode_av1_write_obu(avctx, data, data_len, obu);
1111
1112fail:
1113 ff_cbs_fragment_reset(obu);
1114 return err;
1115}
1116
1118 FFHWBaseEncodePicture *base_pic,
1119 uint8_t *data, size_t *data_len)
1120{
1121 int err;
1122 VulkanEncodeAV1Context *enc = avctx->priv_data;
1123 VulkanEncodeAV1Picture *ap = base_pic->codec_priv;
1124 FFVulkanEncodePicture *vp = base_pic->priv;
1126
1127 if (vp->non_independent_frame) {
1129 if (err < 0)
1130 goto fail;
1131
1132 // Only for tracking ref frame in context, not to be output
1133 err = ff_cbs_write_fragment_data(enc->cbs, obu);
1134 if (err < 0)
1135 goto fail;
1136
1137 ff_cbs_fragment_reset(obu);
1138 ((CodedBitstreamAV1Context *)enc->cbs->priv_data)->seen_frame_header = 0;
1139
1141 if (err < 0)
1142 goto fail;
1143
1144 err = vulkan_encode_av1_write_obu(avctx, vp->tail_data, &vp->tail_size, obu);
1145 if (err < 0)
1146 goto fail;
1147 }
1148
1150 err = vulkan_encode_av1_add_obu(avctx, obu,
1152 &enc->meta_mastering_obu);
1153 if (err < 0)
1154 goto fail;
1155 }
1156
1158 err = vulkan_encode_av1_add_obu(avctx, obu,
1160 &enc->meta_cll_obu);
1161 if (err < 0)
1162 goto fail;
1163 }
1164
1165 if (ap->units_needed) {
1166 err = vulkan_encode_av1_write_obu(avctx, data, data_len, obu);
1167 if (err < 0)
1168 goto fail;
1169 } else {
1170 err = 0;
1171 *data_len = 0;
1172 }
1173
1174fail:
1175 ff_cbs_fragment_reset(obu);
1176 return err;
1177}
1178
1179static int write_padding(AVCodecContext *avctx, uint32_t padding,
1180 uint8_t *data, size_t *data_len)
1181{
1182 int err;
1183 VulkanEncodeAV1Context *enc = avctx->priv_data;
1185
1186 AV1RawOBU padding_obu = { 0 };
1187 AV1RawPadding *raw_padding = &padding_obu.obu.padding;
1188
1189 if (!padding)
1190 padding = 16;
1191
1192 /* 2 byte header + 1 byte trailing bits */
1193 padding_obu.header.obu_type = AV1_OBU_PADDING;
1194 *raw_padding = (AV1RawPadding) {
1195 .payload = enc->padding_payload,
1196 .payload_size = padding,
1197 };
1198
1199 err = vulkan_encode_av1_add_obu(avctx, obu, AV1_OBU_PADDING, &padding_obu);
1200 if (err < 0)
1201 goto fail;
1202
1203 err = vulkan_encode_av1_write_obu(avctx, data, data_len, obu);
1204fail:
1205 ff_cbs_fragment_reset(obu);
1206 return err;
1207}
1208
1223
1225{
1226 int err;
1227 VulkanEncodeAV1Context *enc = avctx->priv_data;
1229 FFHWBaseEncodeContext *base_ctx = &ctx->base;
1230 int flags;
1231
1232 if (avctx->profile == AV_PROFILE_UNKNOWN)
1233 avctx->profile = enc->common.opts.profile;
1234 if (avctx->level == AV_LEVEL_UNKNOWN)
1235 avctx->level = enc->common.opts.level;
1236
1237 enc->caps = (VkVideoEncodeAV1CapabilitiesKHR) {
1238 .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_CAPABILITIES_KHR,
1239 };
1240
1241 enc->quality_props = (VkVideoEncodeAV1QualityLevelPropertiesKHR) {
1242 .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_QUALITY_LEVEL_PROPERTIES_KHR,
1243 };
1244
1245 err = ff_vulkan_encode_init(avctx, &enc->common,
1247 &enc->caps, &enc->quality_props);
1248 if (err < 0)
1249 return err;
1250
1251 av_log(avctx, AV_LOG_VERBOSE, "AV1 encoder capabilities:\n");
1252 av_log(avctx, AV_LOG_VERBOSE, " Standard capability flags:\n");
1253 av_log(avctx, AV_LOG_VERBOSE, " per_rate_control_group_min_max_q_index: %i\n",
1254 !!(enc->caps.flags & VK_VIDEO_ENCODE_AV1_CAPABILITY_PER_RATE_CONTROL_GROUP_MIN_MAX_Q_INDEX_BIT_KHR));
1255 av_log(avctx, AV_LOG_VERBOSE, " generate_obu_extension_header: %i\n",
1256 !!(enc->caps.flags & VK_VIDEO_ENCODE_AV1_CAPABILITY_GENERATE_OBU_EXTENSION_HEADER_BIT_KHR));
1257 av_log(avctx, AV_LOG_VERBOSE, " primary_reference_cdf_only: %i\n",
1258 !!(enc->caps.flags & VK_VIDEO_ENCODE_AV1_CAPABILITY_PRIMARY_REFERENCE_CDF_ONLY_BIT_KHR));
1259 av_log(avctx, AV_LOG_VERBOSE, " frame_size_override: %i\n",
1260 !!(enc->caps.flags & VK_VIDEO_ENCODE_AV1_CAPABILITY_FRAME_SIZE_OVERRIDE_BIT_KHR));
1261 av_log(avctx, AV_LOG_VERBOSE, " motion_vector_scaling: %i\n",
1262 !!(enc->caps.flags & VK_VIDEO_ENCODE_AV1_CAPABILITY_MOTION_VECTOR_SCALING_BIT_KHR));
1263 av_log(avctx, AV_LOG_VERBOSE, " Capabilities:\n");
1264 av_log(avctx, AV_LOG_VERBOSE, " 64x64 superblocks: %i\n",
1265 !!(enc->caps.superblockSizes & VK_VIDEO_ENCODE_AV1_SUPERBLOCK_SIZE_64_BIT_KHR));
1266 av_log(avctx, AV_LOG_VERBOSE, " 128x128 superblocks: %i\n",
1267 !!(enc->caps.superblockSizes & VK_VIDEO_ENCODE_AV1_SUPERBLOCK_SIZE_128_BIT_KHR));
1268 av_log(avctx, AV_LOG_VERBOSE, " maxSingleReferenceCount: %i\n",
1269 enc->caps.maxSingleReferenceCount);
1270 av_log(avctx, AV_LOG_VERBOSE, " singleReferenceNameMask: 0x%x\n",
1271 enc->caps.singleReferenceNameMask);
1272 av_log(avctx, AV_LOG_VERBOSE, " maxUnidirectionalCompoundReferenceCount: %i\n",
1273 enc->caps.maxUnidirectionalCompoundReferenceCount);
1274 av_log(avctx, AV_LOG_VERBOSE, " maxUnidirectionalCompoundGroup1ReferenceCount: %i\n",
1275 enc->caps.maxUnidirectionalCompoundGroup1ReferenceCount);
1276 av_log(avctx, AV_LOG_VERBOSE, " unidirectionalCompoundReferenceNameMask: 0x%x\n",
1277 enc->caps.unidirectionalCompoundReferenceNameMask);
1278 av_log(avctx, AV_LOG_VERBOSE, " maxBidirectionalCompoundReferenceCount: %i\n",
1279 enc->caps.maxBidirectionalCompoundReferenceCount);
1280 av_log(avctx, AV_LOG_VERBOSE, " maxBidirectionalCompoundGroup1ReferenceCount: %i\n",
1281 enc->caps.maxBidirectionalCompoundGroup1ReferenceCount);
1282 av_log(avctx, AV_LOG_VERBOSE, " maxBidirectionalCompoundGroup2ReferenceCount: %i\n",
1283 enc->caps.maxBidirectionalCompoundGroup2ReferenceCount);
1284 av_log(avctx, AV_LOG_VERBOSE, " bidirectionalCompoundReferenceNameMask: 0x%x\n",
1285 enc->caps.bidirectionalCompoundReferenceNameMask);
1286 av_log(avctx, AV_LOG_VERBOSE, " maxTemporalLayerCount: %i\n",
1287 enc->caps.maxTemporalLayerCount);
1288 av_log(avctx, AV_LOG_VERBOSE, " maxSpatialLayerCount: %i\n",
1289 enc->caps.maxSpatialLayerCount);
1290 av_log(avctx, AV_LOG_VERBOSE, " maxOperatingPoints: %i\n",
1291 enc->caps.maxOperatingPoints);
1292 av_log(avctx, AV_LOG_VERBOSE, " min/max Qindex: [%i, %i]\n",
1293 enc->caps.minQIndex, enc->caps.maxQIndex);
1294 av_log(avctx, AV_LOG_VERBOSE, " prefersGopRemainingFrames: %i\n",
1295 enc->caps.prefersGopRemainingFrames);
1296 av_log(avctx, AV_LOG_VERBOSE, " requiresGopRemainingFrames: %i\n",
1297 enc->caps.requiresGopRemainingFrames);
1298 av_log(avctx, AV_LOG_VERBOSE, " maxLevel: %i\n",
1299 enc->caps.maxLevel);
1300 av_log(avctx, AV_LOG_VERBOSE, " codedPictureAlignment: %ix%i\n",
1301 enc->caps.codedPictureAlignment.width, enc->caps.codedPictureAlignment.height);
1302 av_log(avctx, AV_LOG_VERBOSE, " maxTiles: %ix%i\n",
1303 enc->caps.maxTiles.width, enc->caps.maxTiles.height);
1304 av_log(avctx, AV_LOG_VERBOSE, " Tile size: %ix%i to %ix%i\n",
1305 enc->caps.minTileSize.width, enc->caps.minTileSize.height,
1306 enc->caps.maxTileSize.width, enc->caps.maxTileSize.height);
1307
1308 err = init_enc_options(avctx);
1309 if (err < 0)
1310 return err;
1311
1312 flags = ctx->codec->flags;
1313 err = ff_hw_base_init_gop_structure(base_ctx, avctx,
1314 ctx->caps.maxDpbSlots,
1315 enc->caps.maxBidirectionalCompoundReferenceCount,
1316 flags, 0);
1317 if (err < 0)
1318 return err;
1319
1320 base_ctx->output_delay = base_ctx->b_per_p;
1321 base_ctx->decode_delay = base_ctx->max_b_depth;
1322
1323 /* Create units and session parameters */
1324 err = init_base_units(avctx);
1325 if (err < 0)
1326 return err;
1327
1328 /* Init CBS */
1329 err = ff_cbs_init(&enc->cbs, AV_CODEC_ID_AV1, avctx);
1330 if (err < 0)
1331 return err;
1332
1333 if (avctx->flags & AV_CODEC_FLAG_GLOBAL_HEADER) {
1334 uint8_t data[4096];
1335 size_t data_len = sizeof(data);
1336
1337 err = write_sequence_header(avctx, NULL, data, &data_len);
1338 if (err < 0) {
1339 av_log(avctx, AV_LOG_ERROR, "Failed to write sequence header "
1340 "for extradata: %d.\n", err);
1341 return err;
1342 } else {
1343 avctx->extradata_size = data_len;
1344 avctx->extradata = av_mallocz(avctx->extradata_size +
1346 if (!avctx->extradata) {
1347 err = AVERROR(ENOMEM);
1348 return err;
1349 }
1350 memcpy(avctx->extradata, data, avctx->extradata_size);
1351 }
1352 }
1353
1354 enc->padding_payload = av_mallocz(2*ctx->caps.minBitstreamBufferOffsetAlignment);
1355 if (!enc->padding_payload)
1356 return AVERROR(ENOMEM);
1357
1358 memset(enc->padding_payload, 0xaa, 2*ctx->caps.minBitstreamBufferOffsetAlignment);
1359
1360 return 0;
1361}
1362
1364{
1365 VulkanEncodeAV1Context *enc = avctx->priv_data;
1366
1367 ff_cbs_fragment_free(&enc->current_access_unit);
1368 ff_cbs_close(&enc->cbs);
1369
1372 return 0;
1373}
1374
1375#define OFFSET(x) offsetof(VulkanEncodeAV1Context, x)
1376#define FLAGS (AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM)
1380
1381 { "profile", "Set profile",
1382 OFFSET(common.opts.profile), AV_OPT_TYPE_INT,
1383 { .i64 = AV_PROFILE_UNKNOWN }, AV_PROFILE_UNKNOWN, 0xffff, FLAGS, .unit = "profile" },
1384
1385#define PROFILE(name, value) name, NULL, 0, AV_OPT_TYPE_CONST, \
1386 { .i64 = value }, 0, 0, FLAGS, .unit = "profile"
1387 { PROFILE("main", AV_PROFILE_AV1_MAIN) },
1388 { PROFILE("high", AV_PROFILE_AV1_HIGH) },
1389 { PROFILE("professional", AV_PROFILE_AV1_PROFESSIONAL) },
1390#undef PROFILE
1391
1392 { "tier", "Set tier (seq_tier)",
1393 OFFSET(common.opts.tier), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, FLAGS, .unit = "tier" },
1394 { "main", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = 0 }, 0, 0, FLAGS, .unit = "tier" },
1395 { "high", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = 1 }, 0, 0, FLAGS, .unit = "tier" },
1396
1397 { "level", "Set level (level_idc)",
1398 OFFSET(common.opts.level), AV_OPT_TYPE_INT,
1399 { .i64 = AV_LEVEL_UNKNOWN }, AV_LEVEL_UNKNOWN, 0xff, FLAGS, .unit = "level" },
1400
1401#define LEVEL(name, value) name, NULL, 0, AV_OPT_TYPE_CONST, \
1402 { .i64 = value }, 0, 0, FLAGS, .unit = "level"
1403 { LEVEL("20", 0) },
1404 { LEVEL("21", 1) },
1405 { LEVEL("22", 2) },
1406 { LEVEL("23", 3) },
1407 { LEVEL("30", 4) },
1408 { LEVEL("31", 5) },
1409 { LEVEL("32", 6) },
1410 { LEVEL("33", 7) },
1411 { LEVEL("40", 8) },
1412 { LEVEL("41", 9) },
1413 { LEVEL("42", 10) },
1414 { LEVEL("43", 11) },
1415 { LEVEL("50", 12) },
1416 { LEVEL("51", 13) },
1417 { LEVEL("52", 14) },
1418 { LEVEL("53", 15) },
1419 { LEVEL("60", 16) },
1420 { LEVEL("61", 17) },
1421 { LEVEL("62", 18) },
1422 { LEVEL("63", 19) },
1423 { LEVEL("70", 20) },
1424 { LEVEL("71", 21) },
1425 { LEVEL("72", 22) },
1426 { LEVEL("73", 23) },
1427#undef LEVEL
1428
1429 { "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" },
1430 { "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" },
1431
1432 { NULL },
1433};
1434
1436 { "b", "0" },
1437 { "bf", "2" },
1438 { "g", "300" },
1439 { "qmin", "1" },
1440 { "qmax", "255" },
1441 { "refs", "0" },
1442 { NULL },
1443};
1444
1446 .class_name = "av1_vulkan",
1447 .item_name = av_default_item_name,
1448 .option = vulkan_encode_av1_options,
1449 .version = LIBAVUTIL_VERSION_INT,
1450};
1451
1453 .p.name = "av1_vulkan",
1454 CODEC_LONG_NAME("AV1 (Vulkan)"),
1455 .p.type = AVMEDIA_TYPE_VIDEO,
1456 .p.id = AV_CODEC_ID_AV1,
1457 .priv_data_size = sizeof(VulkanEncodeAV1Context),
1460 .close = &vulkan_encode_av1_close,
1461 .p.priv_class = &vulkan_encode_av1_class,
1462 .p.capabilities = AV_CODEC_CAP_DELAY |
1467 .caps_internal = FF_CODEC_CAP_INIT_CLEANUP,
1468 .defaults = vulkan_encode_av1_defaults,
1470 .hw_configs = ff_vulkan_encode_hw_configs,
1471 .p.wrapper_name = "vulkan",
1472};
const FFCodec ff_av1_vulkan_encoder
static AVFormatContext * ctx
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
simple assert() macros that are a bit more flexible than ISO C assert().
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition avassert.h:42
static int FUNC tile_info(CodedBitstreamContext *ctx, RWContext *rw, APVRawTileInfo *current, const APVRawFrameHeader *fh)
static int FUNC color_config(CodedBitstreamContext *ctx, RWContext *rw, AV1RawColorConfig *current, int seq_profile)
static int FUNC timing_info(CodedBitstreamContext *ctx, RWContext *rw, AV1RawTimingInfo *current)
#define flags(name, subs,...)
Definition cbs_h264.c:74
#define i(width, name, range_min, range_max)
Definition cbs_h264.c:63
#define s(width, name)
Definition cbs_vp9.c:198
#define FLAGS
Definition cmdutils.c:598
#define CODEC_PIXFMTS(...)
#define FF_CODEC_RECEIVE_PACKET_CB(func)
#define CODEC_LONG_NAME(str)
#define FF_CODEC_CAP_INIT_CLEANUP
The codec allows calling the close function for deallocation even if the init function returned a fai...
#define av_clip_intp2
Definition common.h:121
#define av_clip
Definition common.h:100
#define NULL
Definition coverity.c:32
long long int64_t
Definition coverity.c:34
static __device__ float fabs(float a)
#define AV_PROFILE_AV1_HIGH
Definition defs.h:170
#define AV_PROFILE_UNKNOWN
Definition defs.h:65
#define AV_LEVEL_UNKNOWN
Definition defs.h:209
#define AV_PROFILE_AV1_MAIN
Definition defs.h:169
#define AV_PROFILE_AV1_PROFESSIONAL
Definition defs.h:171
int(* init)(AVBSFContext *ctx)
Definition dts2pts.c:608
#define fail
Definition test.h:479
@ AV_OPT_TYPE_CONST
Special option type for declaring named constants.
Definition opt.h:298
@ AV_OPT_TYPE_FLAGS
Underlying C type is unsigned int.
Definition opt.h:254
@ AV_OPT_TYPE_INT
Underlying C type is int.
Definition opt.h:258
#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:147
#define AV_CODEC_CAP_ENCODER_FLUSH
This encoder can be flushed using avcodec_flush_buffers().
Definition codec.h:154
#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:79
const char * avcodec_profile_name(enum AVCodecID codec_id, int profile)
Return a name for the specified profile, if available.
Definition utils.c:446
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
Definition codec.h:49
#define AV_CODEC_FLAG_GLOBAL_HEADER
Place global headers in extradata instead of every keyframe.
Definition avcodec.h:318
#define AV_CODEC_CAP_HARDWARE
Codec is backed by a hardware implementation.
Definition codec.h:133
@ AV_CODEC_ID_AV1
Definition codec_id.h:275
#define AV_INPUT_BUFFER_PADDING_SIZE
Required number of additionally allocated bytes at the end of the input bitstream for decoding.
Definition defs.h:40
#define AVERROR_EXTERNAL
Generic error in an external library.
Definition error.h:59
#define av_err2str(errnum)
Convenience macro, the return value should be used only directly in function arguments but never stan...
Definition error.h:122
#define AVERROR(e)
Definition error.h:45
AVFrameSideData * av_frame_get_side_data(const AVFrame *frame, enum AVFrameSideDataType type)
Definition frame.c:659
@ AV_FRAME_DATA_CONTENT_LIGHT_LEVEL
Content light level (based on CTA-861.3).
Definition frame.h:137
@ AV_FRAME_DATA_MASTERING_DISPLAY_METADATA
Mastering display metadata associated with a video frame.
Definition frame.h:120
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition log.h:231
#define AV_LOG_VERBOSE
Detailed information.
Definition log.h:226
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition log.h:210
const char * av_default_item_name(void *ptr)
Return the context name.
Definition log.c:241
static double av_q2d(AVRational a)
Convert an AVRational to a double.
Definition rational.h:104
int64_t av_rescale(int64_t a, int64_t b, int64_t c)
Rescale a 64-bit integer with rounding to nearest.
@ AVMEDIA_TYPE_VIDEO
Definition avutil.h:200
#define LIBAVUTIL_VERSION_INT
Definition version.h:85
static void loop_filter(const H264Context *h, H264SliceContext *sl, int start_x, int end_x)
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)
#define HW_BASE_ENCODE_COMMON_OPTIONS
@ FF_HW_FLAG_SLICE_CONTROL
@ FF_HW_FLAG_B_PICTURE_REFERENCES
@ FF_HW_FLAG_B_PICTURES
@ FF_HW_PICTURE_TYPE_P
@ FF_HW_PICTURE_TYPE_I
@ FF_HW_PICTURE_TYPE_B
@ FF_HW_PICTURE_TYPE_IDR
cl_device_type type
#define av_log2
Definition intmath.h:84
@ AV1_METADATA_TYPE_HDR_MDCV
Definition av1.h:45
@ AV1_METADATA_TYPE_HDR_CLL
Definition av1.h:44
@ AV1_REF_FRAME_GOLDEN
Definition av1.h:66
@ AV1_OBU_METADATA
Definition av1.h:34
@ AV1_OBU_FRAME_HEADER
Definition av1.h:32
@ AV1_OBU_PADDING
Definition av1.h:39
@ AV1_OBU_SEQUENCE_HEADER
Definition av1.h:30
@ AV1_FRAME_INTER
Definition av1.h:54
@ AV1_CSP_COLOCATED
Definition av1.h:135
@ AV1_CSP_VERTICAL
Definition av1.h:134
@ AV1_CSP_UNKNOWN
Definition av1.h:133
@ AV1_SELECT_SCREEN_CONTENT_TOOLS
Definition av1.h:98
@ AV1_MAX_OPERATING_POINTS
Definition av1.h:74
@ AV1_SELECT_INTEGER_MV
Definition av1.h:99
@ AV1_REFS_PER_FRAME
Definition av1.h:85
@ AV1_TOTAL_REFS_PER_FRAME
Definition av1.h:86
const char * from
Definition jacosubdec.c:64
const char * to
Definition webvttdec.c:36
#define av_cold
Definition attributes.h:117
const char * desc
Definition libsvtav1.c:83
#define FFMAX(a, b)
Definition macros.h:47
Memory handling functions.
const char data[16]
Definition mxf.c:149
int profile
Definition mxfenc.c:2299
AVOptions.
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
Definition pixdesc.c:3460
@ AVCHROMA_LOC_TOPLEFT
ITU-R 601, SMPTE 274M 296M S314M(DV 4:1:1), mpeg2 4:2:2.
Definition pixfmt.h:806
@ AVCHROMA_LOC_LEFT
MPEG-2/4 4:2:0, H.264 default for 4:2:0.
Definition pixfmt.h:804
#define AV_PIX_FMT_P010
Definition pixfmt.h:608
@ 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
@ AV_PIX_FMT_VULKAN
Vulkan hardware images.
Definition pixfmt.h:379
@ AVCOL_PRI_UNSPECIFIED
Definition pixfmt.h:645
@ AVCOL_TRC_UNSPECIFIED
Definition pixfmt.h:675
@ AVCOL_SPC_UNSPECIFIED
Definition pixfmt.h:709
#define FF_ARRAY_ELEMS(a)
uint8_t twelve_bit
Definition cbs_av1.h:52
uint8_t matrix_coefficients
Definition cbs_av1.h:58
uint8_t subsampling_x
Definition cbs_av1.h:61
uint8_t high_bitdepth
Definition cbs_av1.h:51
uint8_t mono_chrome
Definition cbs_av1.h:53
uint8_t color_range
Definition cbs_av1.h:60
uint8_t transfer_characteristics
Definition cbs_av1.h:57
uint8_t subsampling_y
Definition cbs_av1.h:62
uint8_t separate_uv_delta_q
Definition cbs_av1.h:64
uint8_t color_primaries
Definition cbs_av1.h:56
uint8_t frame_type
Definition cbs_av1.h:180
uint16_t render_height_minus_1
Definition cbs_av1.h:203
uint8_t frame_to_show_map_idx
Definition cbs_av1.h:176
uint16_t render_width_minus_1
Definition cbs_av1.h:202
uint16_t frame_height_minus_1
Definition cbs_av1.h:198
int8_t loop_filter_ref_deltas[AV1_TOTAL_REFS_PER_FRAME]
Definition cbs_av1.h:269
uint8_t refresh_frame_flags
Definition cbs_av1.h:207
uint8_t show_existing_frame
Definition cbs_av1.h:175
uint16_t frame_width_minus_1
Definition cbs_av1.h:197
uint16_t white_point_chromaticity_y
Definition cbs_av1.h:340
uint16_t white_point_chromaticity_x
Definition cbs_av1.h:339
uint32_t luminance_max
Definition cbs_av1.h:341
uint16_t primary_chromaticity_y[3]
Definition cbs_av1.h:338
uint32_t luminance_min
Definition cbs_av1.h:342
uint16_t primary_chromaticity_x[3]
Definition cbs_av1.h:337
uint8_t obu_has_size_field
Definition cbs_av1.h:42
uint8_t obu_type
Definition cbs_av1.h:40
AV1RawFrameHeader frame_header
Definition cbs_av1.h:420
AV1RawOBUHeader header
Definition cbs_av1.h:414
AV1RawSequenceHeader sequence_header
Definition cbs_av1.h:419
union AV1RawOBU::@016362317061177152367125047142162076164261250366 obu
uint8_t use_128x128_superblock
Definition cbs_av1.h:114
uint8_t enable_ref_frame_mvs
Definition cbs_av1.h:124
uint8_t seq_choose_screen_content_tools
Definition cbs_av1.h:126
uint8_t frame_id_numbers_present_flag
Definition cbs_av1.h:110
uint8_t enable_dual_filter
Definition cbs_av1.h:120
uint8_t enable_restoration
Definition cbs_av1.h:135
uint8_t reduced_still_picture_header
Definition cbs_av1.h:85
uint8_t enable_intra_edge_filter
Definition cbs_av1.h:116
uint16_t max_frame_height_minus_1
Definition cbs_av1.h:108
uint8_t enable_filter_intra
Definition cbs_av1.h:115
uint8_t timing_info_present_flag
Definition cbs_av1.h:87
uint8_t seq_force_integer_mv
Definition cbs_av1.h:129
uint8_t seq_profile
Definition cbs_av1.h:83
uint8_t film_grain_params_present
Definition cbs_av1.h:139
uint8_t initial_display_delay_present_flag
Definition cbs_av1.h:89
uint8_t enable_jnt_comp
Definition cbs_av1.h:123
uint32_t decoder_buffer_delay[AV1_MAX_OPERATING_POINTS]
Definition cbs_av1.h:99
uint8_t enable_interintra_compound
Definition cbs_av1.h:117
AV1RawColorConfig color_config
Definition cbs_av1.h:137
uint8_t additional_frame_id_length_minus_1
Definition cbs_av1.h:112
uint8_t enable_masked_compound
Definition cbs_av1.h:118
uint8_t still_picture
Definition cbs_av1.h:84
uint8_t delta_frame_id_length_minus_2
Definition cbs_av1.h:111
uint16_t operating_point_idc[AV1_MAX_OPERATING_POINTS]
Definition cbs_av1.h:95
uint8_t enable_superres
Definition cbs_av1.h:133
uint8_t frame_height_bits_minus_1
Definition cbs_av1.h:106
uint8_t initial_display_delay_present_for_this_op[AV1_MAX_OPERATING_POINTS]
Definition cbs_av1.h:102
uint8_t decoder_model_present_for_this_op[AV1_MAX_OPERATING_POINTS]
Definition cbs_av1.h:98
uint8_t enable_warped_motion
Definition cbs_av1.h:119
uint8_t seq_choose_integer_mv
Definition cbs_av1.h:128
uint8_t order_hint_bits_minus_1
Definition cbs_av1.h:131
uint8_t low_delay_mode_flag[AV1_MAX_OPERATING_POINTS]
Definition cbs_av1.h:101
uint32_t encoder_buffer_delay[AV1_MAX_OPERATING_POINTS]
Definition cbs_av1.h:100
uint8_t frame_width_bits_minus_1
Definition cbs_av1.h:105
uint8_t seq_tier[AV1_MAX_OPERATING_POINTS]
Definition cbs_av1.h:97
AV1RawTimingInfo timing_info
Definition cbs_av1.h:92
uint8_t seq_level_idx[AV1_MAX_OPERATING_POINTS]
Definition cbs_av1.h:96
uint16_t max_frame_width_minus_1
Definition cbs_av1.h:107
uint8_t enable_order_hint
Definition cbs_av1.h:122
uint8_t seq_force_screen_content_tools
Definition cbs_av1.h:127
uint8_t initial_display_delay_minus_1[AV1_MAX_OPERATING_POINTS]
Definition cbs_av1.h:103
uint8_t operating_points_cnt_minus_1
Definition cbs_av1.h:90
uint32_t time_scale
Definition cbs_av1.h:69
uint32_t num_units_in_display_tick
Definition cbs_av1.h:68
uint32_t num_ticks_per_picture_minus_1
Definition cbs_av1.h:72
uint8_t equal_picture_interval
Definition cbs_av1.h:71
Describe the class of an AVClass context structure.
Definition log.h:76
main external API structure.
Definition avcodec.h:443
int rc_buffer_size
decoder bitstream buffer size
Definition avcodec.h:1273
float b_quant_offset
qscale offset between IP and B-frames
Definition avcodec.h:797
enum AVColorPrimaries color_primaries
Chromaticity coordinates of the source primaries.
Definition avcodec.h:657
int qmin
minimum quantizer
Definition avcodec.h:1252
float b_quant_factor
qscale factor between IP and B-frames If > 0 then the last P-frame quantizer will be used (q= lastp_q...
Definition avcodec.h:790
AVRational framerate
Definition avcodec.h:563
int level
Encoding level descriptor.
Definition avcodec.h:1646
int64_t bit_rate
the average bitrate
Definition avcodec.h:493
int rc_initial_buffer_occupancy
Number of bits which should be loaded into the rc buffer before decoding starts.
Definition avcodec.h:1316
int profile
profile
Definition avcodec.h:1636
enum AVColorSpace colorspace
YUV colorspace type.
Definition avcodec.h:671
int64_t rc_max_rate
maximum bitrate
Definition avcodec.h:1288
int qmax
maximum quantizer
Definition avcodec.h:1259
enum AVColorTransferCharacteristic color_trc
Color Transfer Characteristic.
Definition avcodec.h:664
int flags
AV_CODEC_FLAG_*.
Definition avcodec.h:500
uint8_t * extradata
Out-of-band global headers that may be used by some codecs.
Definition avcodec.h:526
enum AVChromaLocation chroma_sample_location
This defines the location of chroma samples.
Definition avcodec.h:688
enum AVCodecID codec_id
Definition avcodec.h:453
int extradata_size
Definition avcodec.h:527
float i_quant_factor
qscale factor between P- and I-frames If > 0 then the last P-frame quantizer will be used (q = lastp_...
Definition avcodec.h:806
void * priv_data
Definition avcodec.h:470
float i_quant_offset
qscale offset between P and I-frames
Definition avcodec.h:813
Content light level needed by to transmit HDR over HDMI (CTA-861.3).
unsigned MaxFALL
Max average light level per frame (cd/m^2).
unsigned MaxCLL
Max content light level (cd/m^2).
Structure to hold side data for an AVFrame.
Definition frame.h:327
uint8_t * data
Definition frame.h:329
Mastering display metadata capable of representing the color volume of the display used to master the...
int has_primaries
Flag indicating whether the display primaries (and white point) are set.
AVRational max_luminance
Max luminance of mastering display (cd/m^2).
AVRational min_luminance
Min luminance of mastering display (cd/m^2).
AVRational display_primaries[3][2]
CIE 1931 xy chromaticity coords of color primaries (r, g, b order).
AVRational white_point[2]
CIE 1931 xy chromaticity coords of white point.
int has_luminance
Flag indicating whether the luminance (min_ and max_) have been set.
AVOption.
Definition opt.h:428
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
Definition pixdesc.h:69
int num
Numerator.
Definition rational.h:59
int den
Denominator.
Definition rational.h:60
Context structure for coded bitstream operations.
Definition cbs.h:226
void * priv_data
Internal codec-specific data.
Definition cbs.h:247
Coded bitstream fragment structure, combining one or more units.
Definition cbs.h:129
CodedBitstreamUnit * units
Pointer to an array of units of length nb_units_allocated.
Definition cbs.h:175
int nb_units
Number of units in this fragment.
Definition cbs.h:160
size_t data_size
The number of bytes in the bitstream.
Definition cbs.h:142
uint8_t * data
Pointer to the bitstream form of this fragment.
Definition cbs.h:135
void * content
Pointer to the decomposed form of this unit.
Definition cbs.h:114
CodedBitstreamUnitType type
Codec-specific type of this unit.
Definition cbs.h:81
int nb_refs[MAX_REFERENCE_LIST_NUM]
struct FFHWBaseEncodePicture * refs[MAX_REFERENCE_LIST_NUM][MAX_PICTURE_REFERENCES]
VkVideoEncodeRateControlModeFlagBitsKHR rc_mode
FFVkEncodeCommonOptions opts
StdVideoAV1SequenceHeader seq_hdr
StdVideoAV1TimingInfo timing_info
StdVideoEncodeAV1OperatingPointInfo operating_points[AV1_MAX_OPERATING_POINTS]
StdVideoAV1ColorConfig color_config
StdVideoEncodeAV1DecoderModelInfo decoder_model
FFVulkanEncodeContext common
CodedBitstreamFragment current_access_unit
CodedBitstreamContext * cbs
VkVideoEncodeAV1QualityLevelPropertiesKHR quality_props
VkVideoEncodeAV1CapabilitiesKHR caps
VkVideoEncodeAV1ProfileInfoKHR profile
StdVideoAV1TileInfo tile_info
VkVideoEncodeAV1RateControlInfoKHR vkrc_info
StdVideoEncodeAV1ExtensionHeader ext_header
StdVideoAV1GlobalMotion global_motion
StdVideoAV1LoopFilter loop_filter
VkVideoEncodeAV1RateControlLayerInfoKHR vkrc_layer_info
StdVideoEncodeAV1PictureInfo av1pic_info
StdVideoAV1Quantization quantization
VkVideoEncodeAV1PictureInfoKHR vkav1pic_info
StdVideoAV1LoopRestoration loop_restoration
VkVideoEncodeAV1DpbSlotInfoKHR vkav1dpb_info
StdVideoEncodeAV1ReferenceInfo av1dpb_info
VkVideoEncodeAV1GopRemainingFrameInfoKHR vkrc_remaining
StdVideoAV1Segmentation segmentation
uint8_t level
Definition svq3.c:208
#define av_free(p)
#define av_mallocz(s)
#define av_log(a,...)
float framerate
Definition av1_levels.c:29
static int ref[MAX_W *MAX_W]
int size
#define md
const AVCodecHWConfigInternal *const ff_vulkan_encode_hw_configs[]
Paperwork.
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.
av_cold void ff_vulkan_encode_uninit(FFVulkanEncodeContext *ctx)
Uninitialize encoder.
static int init_pic_rc(AVCodecContext *avctx, FFHWBaseEncodePicture *pic, VkVideoEncodeRateControlInfoKHR *rc_info, VkVideoEncodeRateControlLayerInfoKHR *rc_layer)
int ff_vulkan_encode_receive_packet(AVCodecContext *avctx, AVPacket *pkt)
Encode.
int ff_vulkan_encode_create_session_params(AVCodecContext *avctx, FFVulkanEncodeContext *ctx, void *codec_params_pnext)
Create session parameters.
#define VULKAN_ENCODE_COMMON_OPTIONS
#define VK_ENC_FLAG_NO_DELAY
const FFVulkanEncodeDescriptor ff_vk_enc_av1_desc
static int write_sequence_header(AVCodecContext *avctx, FFHWBaseEncodePicture *base_pic, uint8_t *data, size_t *data_len)
static int create_session_params(AVCodecContext *avctx)
static int write_padding(AVCodecContext *avctx, uint32_t padding, uint8_t *data, size_t *data_len)
static av_cold int vulkan_encode_av1_init(AVCodecContext *avctx)
static const AVOption vulkan_encode_av1_options[]
static int parse_feedback_units(AVCodecContext *avctx, const uint8_t *data, size_t size)
@ UNIT_CONTENT_LIGHT_LEVEL
@ UNIT_MASTERING_DISPLAY
static int init_profile(AVCodecContext *avctx, VkVideoProfileInfoKHR *profile, void *pnext)
#define LEVEL(name, value)
static int init_enc_options(AVCodecContext *avctx)
static av_cold int base_unit_to_vk(AVCodecContext *avctx, VulkanAV1Units *vk_units)
static int set_name_slot(int slot, int *slot_indices, uint32_t allowed_idx, int group)
static int vulkan_encode_av1_add_obu(AVCodecContext *avctx, CodedBitstreamFragment *au, uint8_t type, void *obu_unit)
static int init_pic_rc(AVCodecContext *avctx, FFHWBaseEncodePicture *pic, VkVideoEncodeRateControlInfoKHR *rc_info, VkVideoEncodeRateControlLayerInfoKHR *rc_layer)
static av_cold int vulkan_encode_av1_close(AVCodecContext *avctx)
static int write_extra_headers(AVCodecContext *avctx, FFHWBaseEncodePicture *base_pic, uint8_t *data, size_t *data_len)
static int init_pic_params(AVCodecContext *avctx, FFHWBaseEncodePicture *pic, VkVideoEncodeInfoKHR *encode_info)
#define PROFILE(name, value)
static const FFVulkanCodec enc_cb
#define OFFSET(x)
static const AVClass vulkan_encode_av1_class
static av_cold int init_sequence_headers(AVCodecContext *avctx)
static int init_base_units(AVCodecContext *avctx)
static int vulkan_encode_av1_write_obu(AVCodecContext *avctx, uint8_t *data, size_t *data_len, CodedBitstreamFragment *obu)
static const FFCodecDefault vulkan_encode_av1_defaults[]
static int write_filler(AVCodecContext *avctx, uint32_t filler, uint8_t *data, size_t *data_len)
static int write_sequence_headers(AVCodecContext *avctx, FFHWBaseEncodePicture *base_pic, uint8_t *data, size_t *data_len)
#define FF_VK_EXT_VIDEO_ENCODE_AV1
StdVideoAV1Profile ff_vk_av1_profile_to_vk(int profile)