29 .queue_flags = VK_QUEUE_VIDEO_DECODE_BIT_KHR,
30 .decode_op = VK_VIDEO_CODEC_OPERATION_DECODE_AV1_BIT_KHR,
32 .extensionName = VK_STD_VULKAN_VIDEO_CODEC_AV1_DECODE_EXTENSION_NAME,
33 .specVersion = VK_STD_VULKAN_VIDEO_CODEC_AV1_DECODE_SPEC_VERSION,
75 VkVideoReferenceSlotInfoKHR *ref_slot,
76 VkVideoPictureResourceInfoKHR *
ref,
77 StdVideoDecodeAV1ReferenceInfo *vkav1_std_ref,
78 VkVideoDecodeAV1DpbSlotInfoKHR *vkav1_ref,
79 const AV1Frame *pic,
int is_current,
int has_grain,
80 const uint8_t *saved_order_hints)
92 *vkav1_std_ref = (StdVideoDecodeAV1ReferenceInfo) {
93 .flags = (StdVideoDecodeAV1ReferenceInfoFlags) {
102 if (saved_order_hints) {
104 for (
int i = 1;
i < STD_VIDEO_AV1_TOTAL_REFS_PER_FRAME;
i++)
105 vkav1_std_ref->SavedOrderHints[
i - 1] = saved_order_hints[
i];
107 for (
int i = 0;
i < STD_VIDEO_AV1_TOTAL_REFS_PER_FRAME;
i++)
108 vkav1_std_ref->SavedOrderHints[
i] = saved_order_hints[
i];
111 *vkav1_ref = (VkVideoDecodeAV1DpbSlotInfoKHR) {
112 .sType = VK_STRUCTURE_TYPE_VIDEO_DECODE_AV1_DPB_SLOT_INFO_KHR,
113 .pStdReferenceInfo = vkav1_std_ref,
120 *
ref = (VkVideoPictureResourceInfoKHR) {
121 .sType = VK_STRUCTURE_TYPE_VIDEO_PICTURE_RESOURCE_INFO_KHR,
122 .codedOffset = (VkOffset2D){ 0, 0 },
123 .codedExtent = (VkExtent2D){ pic->
f->
width, pic->
f->
height },
124 .baseArrayLayer = ((has_grain || dec->
dedicated_dpb) &&
ctx->common.layered_dpb) ?
126 .imageViewBinding = vkpic->
view.
ref[0],
129 *ref_slot = (VkVideoReferenceSlotInfoKHR) {
130 .sType = VK_STRUCTURE_TYPE_VIDEO_REFERENCE_SLOT_INFO_KHR,
133 .pPictureResource =
ref,
143 StdVideoAV1TimingInfo *av1_timing_info,
144 StdVideoAV1ColorConfig *av1_color_config,
145 StdVideoAV1SequenceHeader *av1_sequence_header)
150 *av1_timing_info = (StdVideoAV1TimingInfo) {
151 .flags = (StdVideoAV1TimingInfoFlags) {
159 *av1_color_config = (StdVideoAV1ColorConfig) {
160 .flags = (StdVideoAV1ColorConfigFlags) {
174 *av1_sequence_header = (StdVideoAV1SequenceHeader) {
175 .flags = (StdVideoAV1SequenceHeaderFlags) {
206 .pTimingInfo = av1_timing_info,
207 .pColorConfig = av1_color_config,
218 StdVideoAV1SequenceHeader av1_sequence_header;
219 StdVideoAV1TimingInfo av1_timing_info;
220 StdVideoAV1ColorConfig av1_color_config;
221 VkVideoDecodeAV1SessionParametersCreateInfoKHR av1_params;
222 VkVideoSessionParametersCreateInfoKHR session_params_create;
225 &av1_sequence_header);
227 av1_params = (VkVideoDecodeAV1SessionParametersCreateInfoKHR) {
228 .sType = VK_STRUCTURE_TYPE_VIDEO_DECODE_AV1_SESSION_PARAMETERS_CREATE_INFO_KHR,
229 .pStdSequenceHeader = &av1_sequence_header,
231 session_params_create = (VkVideoSessionParametersCreateInfoKHR) {
232 .sType = VK_STRUCTURE_TYPE_VIDEO_SESSION_PARAMETERS_CREATE_INFO_KHR,
233 .pNext = &av1_params,
234 .videoSession =
ctx->common.session,
235 .videoSessionParametersTemplate = VK_NULL_HANDLE,
258 uint32_t frame_id_alloc_mask = 0;
269 StdVideoAV1FrameRestorationType remap_lr_type[4] = { STD_VIDEO_AV1_FRAME_RESTORATION_TYPE_NONE,
270 STD_VIDEO_AV1_FRAME_RESTORATION_TYPE_SWITCHABLE,
271 STD_VIDEO_AV1_FRAME_RESTORATION_TYPE_WIENER,
272 STD_VIDEO_AV1_FRAME_RESTORATION_TYPE_SGRPROJ };
275 for (
int i = 0;
i < STD_VIDEO_AV1_NUM_REF_FRAMES;
i++) {
278 frame_id_alloc_mask |= 1 << rp->
frame_id;
281 if (!ap->frame_id_set) {
282 unsigned slot_idx = 0;
283 for (
unsigned i = 0;
i < 32;
i++) {
284 if (!(frame_id_alloc_mask & (1 <<
i))) {
289 ap->frame_id = slot_idx;
290 ap->frame_id_set = 1;
291 frame_id_alloc_mask |= (1 << slot_idx);
294 ap->ref_frame_sign_bias_mask = 0x0;
295 for (
int i = 0;
i < STD_VIDEO_AV1_TOTAL_REFS_PER_FRAME;
i++)
296 ap->ref_frame_sign_bias_mask |= pic->ref_frame_sign_bias[
i] <<
i;
298 for (
int i = 0;
i < STD_VIDEO_AV1_REFS_PER_FRAME;
i++) {
299 const int idx = pic->raw_frame_header->ref_frame_idx[
i];
307 for (
int j = 0; j < ref_count; j++) {
308 if (vp->ref_slots[j].slotIndex == hp->
frame_id) {
316 err =
vk_av1_fill_pict(avctx, &ap->ref_src[ref_count], &vp->ref_slots[ref_count],
317 &vp->refs[ref_count], &ap->std_refs[ref_count], &ap->vkav1_refs[ref_count],
328 pic, 1, apply_grain,
NULL);
332 ap->av1_pic_info = (VkVideoDecodeAV1PictureInfoKHR) {
333 .sType = VK_STRUCTURE_TYPE_VIDEO_DECODE_AV1_PICTURE_INFO_KHR,
334 .pStdPictureInfo = &ap->std_pic_info,
335 .frameHeaderOffset = 0,
337 .pTileOffsets =
NULL,
338 .pTileSizes = ap->tile_sizes,
341 for (
int i = 0;
i < STD_VIDEO_AV1_REFS_PER_FRAME;
i++) {
342 const int idx = pic->raw_frame_header->ref_frame_idx[
i];
349 ap->av1_pic_info.referenceNameSlotIndices[
i] = hp->
frame_id;
352 vp->decode_info = (VkVideoDecodeInfoKHR) {
353 .sType = VK_STRUCTURE_TYPE_VIDEO_DECODE_INFO_KHR,
354 .pNext = &ap->av1_pic_info,
356 .pSetupReferenceSlot = &vp->ref_slot,
357 .referenceSlotCount = ref_count,
358 .pReferenceSlots = vp->ref_slots,
359 .dstPictureResource = (VkVideoPictureResourceInfoKHR) {
360 .sType = VK_STRUCTURE_TYPE_VIDEO_PICTURE_RESOURCE_INFO_KHR,
361 .codedOffset = (VkOffset2D){ 0, 0 },
362 .codedExtent = (VkExtent2D){ pic->f->width, pic->f->height },
364 .imageViewBinding = vp->view.out[0],
368 ap->tile_info = (StdVideoAV1TileInfo) {
369 .flags = (StdVideoAV1TileInfoFlags) {
370 .uniform_tile_spacing_flag =
frame_header->uniform_tile_spacing_flag,
374 .context_update_tile_id =
frame_header->context_update_tile_id,
375 .tile_size_bytes_minus_1 =
frame_header->tile_size_bytes_minus1,
376 .pWidthInSbsMinus1 = ap->width_in_sbs_minus1,
377 .pHeightInSbsMinus1 = ap->height_in_sbs_minus1,
378 .pMiColStarts = ap->mi_col_starts,
379 .pMiRowStarts = ap->mi_row_starts,
382 ap->quantization = (StdVideoAV1Quantization) {
396 ap->loop_filter = (StdVideoAV1LoopFilter) {
397 .
flags = (StdVideoAV1LoopFilterFlags) {
398 .loop_filter_delta_enabled =
frame_header->loop_filter_delta_enabled,
399 .loop_filter_delta_update =
frame_header->loop_filter_delta_update,
401 .loop_filter_sharpness =
frame_header->loop_filter_sharpness,
404 for (
int i = 0;
i < STD_VIDEO_AV1_MAX_LOOP_FILTER_STRENGTHS;
i++)
405 ap->loop_filter.loop_filter_level[
i] =
frame_header->loop_filter_level[
i];
406 for (
int i = 0;
i < STD_VIDEO_AV1_LOOP_FILTER_ADJUSTMENTS;
i++)
407 ap->loop_filter.loop_filter_mode_deltas[
i] =
frame_header->loop_filter_mode_deltas[
i];
409 ap->cdef = (StdVideoAV1CDEF) {
410 .cdef_damping_minus_3 =
frame_header->cdef_damping_minus_3,
414 ap->loop_restoration = (StdVideoAV1LoopRestoration) {
415 .FrameRestorationType[0] = remap_lr_type[
frame_header->lr_type[0]],
416 .FrameRestorationType[1] = remap_lr_type[
frame_header->lr_type[1]],
417 .FrameRestorationType[2] = remap_lr_type[
frame_header->lr_type[2]],
418 .LoopRestorationSize[0] = 1 +
frame_header->lr_unit_shift,
423 ap->film_grain = (StdVideoAV1FilmGrain) {
424 .
flags = (StdVideoAV1FilmGrainFlags) {
425 .chroma_scaling_from_luma = film_grain->chroma_scaling_from_luma,
426 .overlap_flag = film_grain->overlap_flag,
427 .clip_to_restricted_range = film_grain->clip_to_restricted_range,
429 .grain_scaling_minus_8 = film_grain->grain_scaling_minus_8,
430 .ar_coeff_lag = film_grain->ar_coeff_lag,
431 .ar_coeff_shift_minus_6 = film_grain->ar_coeff_shift_minus_6,
432 .grain_scale_shift = film_grain->grain_scale_shift,
433 .grain_seed = film_grain->grain_seed,
434 .film_grain_params_ref_idx = film_grain->film_grain_params_ref_idx,
435 .num_y_points = film_grain->num_y_points,
436 .num_cb_points = film_grain->num_cb_points,
437 .num_cr_points = film_grain->num_cr_points,
438 .cb_mult = film_grain->cb_mult,
439 .cb_luma_mult = film_grain->cb_luma_mult,
440 .cb_offset = film_grain->cb_offset,
441 .cr_mult = film_grain->cr_mult,
442 .cr_luma_mult = film_grain->cr_luma_mult,
443 .cr_offset = film_grain->cr_offset,
447 ap->std_pic_info = (StdVideoDecodeAV1PictureInfo) {
448 .flags = (StdVideoDecodeAV1PictureInfoFlags) {
449 .error_resilient_mode =
frame_header->error_resilient_mode,
452 .render_and_frame_size_different =
frame_header->render_and_frame_size_different,
453 .allow_screen_content_tools =
frame_header->allow_screen_content_tools,
454 .is_filter_switchable =
frame_header->is_filter_switchable,
455 .force_integer_mv = pic->force_integer_mv,
456 .frame_size_override_flag =
frame_header->frame_size_override_flag,
457 .buffer_removal_time_present_flag =
frame_header->buffer_removal_time_present_flag,
459 .frame_refs_short_signaling =
frame_header->frame_refs_short_signaling,
460 .allow_high_precision_mv =
frame_header->allow_high_precision_mv,
461 .is_motion_mode_switchable =
frame_header->is_motion_mode_switchable,
463 .disable_frame_end_update_cdf =
frame_header->disable_frame_end_update_cdf,
464 .allow_warped_motion =
frame_header->allow_warped_motion,
471 .segmentation_enabled =
frame_header->segmentation_enabled,
472 .segmentation_update_map =
frame_header->segmentation_update_map,
473 .segmentation_temporal_update =
frame_header->segmentation_temporal_update,
474 .segmentation_update_data =
frame_header->segmentation_update_data,
476 .apply_grain = apply_grain,
482 .refresh_frame_flags =
frame_header->refresh_frame_flags,
483 .interpolation_filter =
frame_header->interpolation_filter,
487 .SkipModeFrame[0] =
s->cur_frame.skip_mode_frame_idx[0],
488 .SkipModeFrame[1] =
s->cur_frame.skip_mode_frame_idx[1],
490 .pTileInfo = &ap->tile_info,
491 .pQuantization = &ap->quantization,
492 .pSegmentation = &ap->segmentation,
493 .pLoopFilter = &ap->loop_filter,
495 .pLoopRestoration = &ap->loop_restoration,
496 .pGlobalMotion = &ap->global_motion,
497 .pFilmGrain = apply_grain ? &ap->film_grain :
NULL,
500 for (
int i = 0;
i < 64;
i++) {
501 ap->width_in_sbs_minus1[
i] =
frame_header->width_in_sbs_minus_1[
i];
502 ap->height_in_sbs_minus1[
i] =
frame_header->height_in_sbs_minus_1[
i];
503 ap->mi_col_starts[
i] =
frame_header->tile_start_col_sb[
i] << sb_shift;
504 ap->mi_row_starts[
i] =
frame_header->tile_start_row_sb[
i] << sb_shift;
507 for (
int i = 0;
i < STD_VIDEO_AV1_MAX_SEGMENTS;
i++) {
508 ap->segmentation.FeatureEnabled[
i] = 0x0;
509 for (
int j = 0; j < STD_VIDEO_AV1_SEG_LVL_MAX; j++) {
510 ap->segmentation.FeatureEnabled[
i] |= (
frame_header->feature_enabled[
i][j] << j);
511 ap->segmentation.FeatureData[
i][j] =
frame_header->feature_value[
i][j];
515 if (dec->quirk_av1_offset)
516 for (
int i = 1;
i < STD_VIDEO_AV1_TOTAL_REFS_PER_FRAME;
i++)
517 ap->std_pic_info.OrderHints[
i - 1] = pic->order_hints[
i];
519 for (
int i = 0;
i < STD_VIDEO_AV1_TOTAL_REFS_PER_FRAME;
i++)
520 ap->std_pic_info.OrderHints[
i] = pic->order_hints[
i];
522 for (
int i = 0;
i < STD_VIDEO_AV1_TOTAL_REFS_PER_FRAME;
i++) {
523 ap->loop_filter.loop_filter_ref_deltas[
i] =
frame_header->loop_filter_ref_deltas[
i];
524 ap->global_motion.GmType[
i] =
s->cur_frame.gm_type[
i];
525 for (
int j = 0; j < STD_VIDEO_AV1_GLOBAL_MOTION_PARAMS; j++) {
526 ap->global_motion.gm_params[
i][j] =
s->cur_frame.gm_params[
i][j];
530 for (
int i = 0;
i < STD_VIDEO_AV1_MAX_CDEF_FILTER_STRENGTHS;
i++) {
531 ap->cdef.cdef_y_pri_strength[
i] =
frame_header->cdef_y_pri_strength[
i];
532 ap->cdef.cdef_y_sec_strength[
i] =
frame_header->cdef_y_sec_strength[
i];
533 ap->cdef.cdef_uv_pri_strength[
i] =
frame_header->cdef_uv_pri_strength[
i];
534 ap->cdef.cdef_uv_sec_strength[
i] =
frame_header->cdef_uv_sec_strength[
i];
538 for (
int i = 0;
i < STD_VIDEO_AV1_MAX_NUM_Y_POINTS;
i++) {
539 ap->film_grain.point_y_value[
i] = film_grain->point_y_value[
i];
540 ap->film_grain.point_y_scaling[
i] = film_grain->point_y_scaling[
i];
543 for (
int i = 0;
i < STD_VIDEO_AV1_MAX_NUM_CB_POINTS;
i++) {
544 ap->film_grain.point_cb_value[
i] = film_grain->point_cb_value[
i];
545 ap->film_grain.point_cb_scaling[
i] = film_grain->point_cb_scaling[
i];
546 ap->film_grain.point_cr_value[
i] = film_grain->point_cr_value[
i];
547 ap->film_grain.point_cr_scaling[
i] = film_grain->point_cr_scaling[
i];
550 for (
int i = 0;
i < STD_VIDEO_AV1_MAX_NUM_POS_LUMA;
i++)
551 ap->film_grain.ar_coeffs_y_plus_128[
i] = film_grain->ar_coeffs_y_plus_128[
i];
553 for (
int i = 0;
i < STD_VIDEO_AV1_MAX_NUM_POS_CHROMA;
i++) {
554 ap->film_grain.ar_coeffs_cb_plus_128[
i] = film_grain->ar_coeffs_cb_plus_128[
i];
555 ap->film_grain.ar_coeffs_cr_plus_128[
i] = film_grain->ar_coeffs_cr_plus_128[
i];
577 for (
int i =
s->tg_start; i <= s->tg_end;
i++) {
581 data +
s->tile_group_info[
i].tile_offset,
582 s->tile_group_info[
i].tile_size, 0,
604 #ifdef VK_KHR_video_maintenance2
605 StdVideoAV1SequenceHeader av1_sequence_header;
606 StdVideoAV1TimingInfo av1_timing_info;
607 StdVideoAV1ColorConfig av1_color_config;
608 VkVideoDecodeAV1InlineSessionParametersInfoKHR av1_params;
612 &av1_sequence_header);
613 av1_params = (VkVideoDecodeAV1InlineSessionParametersInfoKHR) {
614 .sType = VK_STRUCTURE_TYPE_VIDEO_DECODE_AV1_INLINE_SESSION_PARAMETERS_INFO_KHR,
615 .pStdSequenceHeader = &av1_sequence_header,
655 .
p.
name =
"av1_vulkan",