39 vk->DestroyImageView(
ctx->s.hwctx->act_dev, vp->
in.
view,
43 vk->DestroyImageView(
ctx->s.hwctx->act_dev, vp->
dpb.
view,
46 vp->
in.
view = VK_NULL_HANDLE;
61 if (
ctx->session_params)
62 vk->DestroyVideoSessionParametersKHR(
s->hwctx->act_dev,
91 if (
ctx->codec->picture_priv_data_size > 0) {
100 vkf, vkfc->format[0], VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR);
105 if (!
ctx->common.layered_dpb) {
110 rvkf,
ctx->pic_format, VK_IMAGE_USAGE_VIDEO_ENCODE_DPB_BIT_KHR);
131 VkVideoEncodeRateControlInfoKHR *rc_info,
132 VkVideoEncodeRateControlLayerInfoKHR *rc_layer )
136 *rc_info = (VkVideoEncodeRateControlInfoKHR) {
137 .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_RATE_CONTROL_INFO_KHR,
138 .rateControlMode =
ctx->opts.rc_mode,
141 if (
ctx->opts.rc_mode > VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DISABLED_BIT_KHR) {
142 *rc_layer = (VkVideoEncodeRateControlLayerInfoKHR) {
143 .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_RATE_CONTROL_LAYER_INFO_KHR,
149 rc_info->layerCount++;
150 rc_info->pLayers = rc_layer;
153 return ctx->codec->init_pic_rc(avctx, pic, rc_info, rc_layer);
162 const size_t size_align =
ctx->caps.minBitstreamBufferSizeAlignment;
168 int err, max_pkt_size;
174 VkCommandBuffer cmd_buf;
175 VkImageMemoryBarrier2 img_bar[37];
179 VkVideoBeginCodingInfoKHR encode_start;
181 .sType = VK_STRUCTURE_TYPE_VIDEO_END_CODING_INFO_KHR,
184 VkVideoEncodeRateControlLayerInfoKHR rc_layer;
185 VkVideoEncodeRateControlInfoKHR rc_info;
186 VkVideoEncodeQualityLevelInfoKHR q_info;
187 VkVideoCodingControlInfoKHR encode_ctrl;
189 VkVideoReferenceSlotInfoKHR ref_slot[37];
190 VkVideoEncodeInfoKHR encode_info;
193 max_pkt_size =
FFALIGN(3 *
ctx->base.surface_width *
ctx->base.surface_height + (1 << 16),
194 ctx->caps.minBitstreamBufferSizeAlignment);
197 VK_BUFFER_USAGE_VIDEO_ENCODE_DST_BIT_KHR,
198 &
ctx->profile_list, max_pkt_size,
199 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
200 ctx->s.host_cached_flag);
207 err =
init_pic_rc(avctx, base_pic, &rc_info, &rc_layer);
211 q_info = (VkVideoEncodeQualityLevelInfoKHR) {
212 .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_QUALITY_LEVEL_INFO_KHR,
214 .qualityLevel =
ctx->opts.quality,
216 encode_ctrl = (VkVideoCodingControlInfoKHR) {
217 .sType = VK_STRUCTURE_TYPE_VIDEO_CODING_CONTROL_INFO_KHR,
219 .
flags = VK_VIDEO_CODING_CONTROL_ENCODE_QUALITY_LEVEL_BIT_KHR |
220 VK_VIDEO_CODING_CONTROL_ENCODE_RATE_CONTROL_BIT_KHR |
221 VK_VIDEO_CODING_CONTROL_RESET_BIT_KHR,
224 for (
int i = 0;
i <
ctx->caps.maxDpbSlots;
i++) {
227 ctx->slots[
i] = base_pic;
234 vp->
dpb_res = (VkVideoPictureResourceInfoKHR) {
235 .sType = VK_STRUCTURE_TYPE_VIDEO_PICTURE_RESOURCE_INFO_KHR,
237 .codedOffset = { 0 },
238 .codedExtent = (VkExtent2D){ avctx->
width, avctx->
height },
239 .baseArrayLayer =
ctx->common.layered_dpb ? slot_index : 0,
240 .imageViewBinding = vp->
dpb.
view,
243 vp->
dpb_slot = (VkVideoReferenceSlotInfoKHR) {
244 .sType = VK_STRUCTURE_TYPE_VIDEO_REFERENCE_SLOT_INFO_KHR,
246 .slotIndex = slot_index,
247 .pPictureResource = &vp->
dpb_res,
250 encode_info = (VkVideoEncodeInfoKHR) {
251 .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_INFO_KHR,
254 .srcPictureResource = (VkVideoPictureResourceInfoKHR) {
255 .sType = VK_STRUCTURE_TYPE_VIDEO_PICTURE_RESOURCE_INFO_KHR,
257 .codedOffset = { 0, 0 },
261 .imageViewBinding = vp->
in.
view,
263 .pSetupReferenceSlot = &vp->
dpb_slot,
264 .referenceSlotCount = 0,
265 .pReferenceSlots = ref_slot,
266 .dstBuffer = sd_buf->
buf,
267 .dstBufferOffset = 0,
268 .dstBufferRange = sd_buf->
size,
269 .precedingExternallyEncodedBytes = 0,
273 for (
int j = 0; j < base_pic->
nb_refs[
i]; j++) {
276 ref_slot[encode_info.referenceSlotCount++] = rvp->
dpb_slot;
282 ref_slot[encode_info.referenceSlotCount] = vp->
dpb_slot;
283 ref_slot[encode_info.referenceSlotCount].slotIndex = -1;
286 err =
ctx->codec->init_pic_params(avctx, base_pic,
291 encode_start = (VkVideoBeginCodingInfoKHR) {
292 .sType = VK_STRUCTURE_TYPE_VIDEO_BEGIN_CODING_INFO_KHR,
294 .videoSession =
ctx->common.session,
295 .videoSessionParameters =
ctx->session_params,
296 .referenceSlotCount = encode_info.referenceSlotCount + 1,
297 .pReferenceSlots = ref_slot,
302 uint8_t *hdr_dst = sd_buf->
mapped_mem + encode_info.dstBufferOffset;
303 size_t data_size = encode_info.dstBufferRange;
304 err =
ctx->codec->write_sequence_headers(avctx, base_pic, hdr_dst, &data_size);
307 encode_info.dstBufferOffset += data_size;
308 encode_info.dstBufferRange -= data_size;
312 if (
ctx->codec->write_extra_headers) {
313 uint8_t *hdr_dst = sd_buf->
mapped_mem + encode_info.dstBufferOffset;
314 size_t data_size = encode_info.dstBufferRange;
315 err =
ctx->codec->write_extra_headers(avctx, base_pic, hdr_dst, &data_size);
318 encode_info.dstBufferOffset += data_size;
319 encode_info.dstBufferRange -= data_size;
323 if (
ctx->codec->write_filler) {
324 uint8_t *hdr_dst = sd_buf->
mapped_mem + encode_info.dstBufferOffset;
325 size_t data_size = encode_info.dstBufferRange;
327 uint32_t
offset = encode_info.dstBufferOffset;
328 size_t offset_align =
ctx->caps.minBitstreamBufferOffsetAlignment;
333 while (filler_data < ctx->codec->filler_header_size)
334 filler_data += offset_align;
336 filler_data -=
ctx->codec->filler_header_size;
338 err =
ctx->codec->write_filler(avctx, filler_data,
339 hdr_dst, &data_size);
343 encode_info.dstBufferOffset += data_size;
344 encode_info.dstBufferRange -= data_size;
351 encode_info.dstBufferRange -= size_align;
352 encode_info.dstBufferRange =
FFALIGN(encode_info.dstBufferRange,
365 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
366 VK_PIPELINE_STAGE_2_VIDEO_ENCODE_BIT_KHR);
371 img_bar[nb_img_bar] = (VkImageMemoryBarrier2) {
372 .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER_2,
374 .srcStageMask = VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
375 .srcAccessMask = vkf->access[0],
376 .dstStageMask = VK_PIPELINE_STAGE_2_VIDEO_ENCODE_BIT_KHR,
377 .dstAccessMask = VK_ACCESS_2_VIDEO_ENCODE_READ_BIT_KHR,
378 .oldLayout = vkf->layout[0],
379 .newLayout = VK_IMAGE_LAYOUT_VIDEO_ENCODE_SRC_KHR,
380 .srcQueueFamilyIndex = vkf->queue_family[0],
381 .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
382 .image = vkf->img[0],
383 .subresourceRange = (VkImageSubresourceRange) {
390 &img_bar[nb_img_bar], &nb_img_bar);
392 if (!
ctx->common.layered_dpb) {
397 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
398 VK_PIPELINE_STAGE_2_VIDEO_ENCODE_BIT_KHR);
404 for (
int j = 0; j < base_pic->
nb_refs[
i]; j++) {
407 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
408 VK_PIPELINE_STAGE_2_VIDEO_ENCODE_BIT_KHR);
415 VK_PIPELINE_STAGE_2_VIDEO_ENCODE_BIT_KHR,
416 VK_PIPELINE_STAGE_2_VIDEO_ENCODE_BIT_KHR);
422 vk->CmdPipelineBarrier2(cmd_buf, &(VkDependencyInfo) {
423 .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
424 .pImageMemoryBarriers = img_bar,
425 .imageMemoryBarrierCount = nb_img_bar,
429 vk->CmdBeginVideoCodingKHR(cmd_buf, &encode_start);
432 if (!
ctx->session_reset) {
433 vk->CmdControlVideoCodingKHR(cmd_buf, &encode_ctrl);
434 ctx->session_reset++;
438 vk->CmdBeginQuery(cmd_buf,
ctx->enc_pool.query_pool, exec->
query_idx + 0, 0);
439 vk->CmdEncodeVideoKHR(cmd_buf, &encode_info);
440 vk->CmdEndQuery(cmd_buf,
ctx->enc_pool.query_pool, exec->
query_idx + 0);
443 vk->CmdEndVideoCodingKHR(cmd_buf, &
encode_end);
489 uint32_t *query_data;
494 if (
ret == VK_NOT_READY) {
500 if (
ret != VK_NOT_READY &&
ret != VK_SUCCESS) {
506 if (query_data[2] != VK_QUERY_RESULT_STATUS_COMPLETE_KHR) {
512 if (!(sd_buf->
flags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT)) {
514 VkMappedMemoryRange invalidate_buf;
520 if (
ctx->s.props.properties.limits.nonCoherentAtomSize >
521 ctx->caps.minBitstreamBufferOffsetAlignment && offs &&
522 (
FFALIGN(offs,
ctx->s.props.properties.limits.nonCoherentAtomSize) != offs)) {
523 offs -=
ctx->s.props.properties.limits.nonCoherentAtomSize;
524 offs =
FFALIGN(
FFMAX(offs, 0),
ctx->s.props.properties.limits.nonCoherentAtomSize);
527 invalidate_buf = (VkMappedMemoryRange) {
528 .sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE,
529 .memory = sd_buf->
mem,
531 .size = VK_WHOLE_SIZE,
534 vk->FlushMappedMemoryRanges(
ctx->s.hwctx->act_dev, 1, &invalidate_buf);
539 size_t prev_buf_size = vp->
slices_offset + query_data[0] + query_data[1];
541 ctx->prev_buf_size = prev_buf_size;
556 if (
ctx->prev_buf_ref) {
558 size_t prev_size =
ctx->prev_buf_size;
632 hwfc->
tiling = VK_IMAGE_TILING_OPTIMAL;
633 hwfc->
usage = VK_IMAGE_USAGE_VIDEO_ENCODE_DPB_BIT_KHR;
635 if (
ctx->common.layered_dpb)
645 if (
ctx->common.layered_dpb) {
647 if (!
ctx->common.layered_frame)
651 ctx->common.layered_frame, 0);
656 &
ctx->common.layered_view,
657 &
ctx->common.layered_aspect,
659 hwfc->
format[0], VK_IMAGE_USAGE_VIDEO_ENCODE_DPB_BIT_KHR);
672 ctx->explicit_qp =
ctx->opts.qp;
681 if (
ctx->explicit_qp >= 0) {
682 ctx->opts.rc_mode = VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DISABLED_BIT_KHR;
688 ctx->opts.rc_mode = VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DISABLED_BIT_KHR;
690 if (
ctx->enc_caps.rateControlModes & VK_VIDEO_ENCODE_RATE_CONTROL_MODE_VBR_BIT_KHR)
691 ctx->opts.rc_mode = VK_VIDEO_ENCODE_RATE_CONTROL_MODE_VBR_BIT_KHR;
692 else if (
ctx->enc_caps.rateControlModes & VK_VIDEO_ENCODE_RATE_CONTROL_MODE_CBR_BIT_KHR)
693 ctx->opts.rc_mode = VK_VIDEO_ENCODE_RATE_CONTROL_MODE_CBR_BIT_KHR;
695 ctx->opts.rc_mode = VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DEFAULT_KHR;
697 ctx->explicit_qp = 18;
698 ctx->opts.rc_mode = VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DISABLED_BIT_KHR;
702 }
else if (
ctx->opts.rc_mode != VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DISABLED_BIT_KHR &&
708 if (
ctx->opts.rc_mode && !(
ctx->enc_caps.rateControlModes &
ctx->opts.rc_mode)) {
709 static const char *rc_modes[] = {
710 [VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DEFAULT_KHR] =
"default",
711 [VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DISABLED_BIT_KHR] =
"cqp",
712 [VK_VIDEO_ENCODE_RATE_CONTROL_MODE_CBR_BIT_KHR] =
"cbr",
713 [VK_VIDEO_ENCODE_RATE_CONTROL_MODE_VBR_BIT_KHR] =
"vbr",
718 for (
int i = VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DISABLED_BIT_KHR;
719 i <= VK_VIDEO_ENCODE_RATE_CONTROL_MODE_VBR_BIT_KHR;
i <<= 1) {
720 if (!(
ctx->enc_caps.rateControlModes &
i))
738 size_t data_len =
sizeof(
data);
740 err =
ctx->codec->write_sequence_headers(avctx,
NULL,
data, &data_len);
743 "for extradata: %d.\n", err);
763 void *codec_caps,
void *quality_pnext)
773 VkVideoFormatPropertiesKHR *ret_info;
774 uint32_t nb_out_fmts = 0;
775 const uint32_t feedback_flags = VK_VIDEO_ENCODE_FEEDBACK_BITSTREAM_BUFFER_OFFSET_BIT_KHR |
776 VK_VIDEO_ENCODE_FEEDBACK_BITSTREAM_BYTES_WRITTEN_BIT_KHR;
778 VkPhysicalDeviceVideoEncodeQualityLevelInfoKHR quality_info;
780 VkQueryPoolVideoEncodeFeedbackCreateInfoKHR query_create;
782 VkVideoSessionCreateInfoKHR session_create = {
783 .sType = VK_STRUCTURE_TYPE_VIDEO_SESSION_CREATE_INFO_KHR,
785 VkPhysicalDeviceVideoFormatInfoKHR fmt_info = {
786 .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_FORMAT_INFO_KHR,
787 .pNext = &
ctx->profile_list,
792 "required to associate the encoding device.\n");
801 s->hwfc =
s->frames->hwctx;
804 s->hwctx =
s->device->hwctx;
811 s->hwctx->nb_enabled_dev_extensions);
815 VK_KHR_VIDEO_ENCODE_QUEUE_EXTENSION_NAME);
819 VK_KHR_VIDEO_MAINTENANCE_1_EXTENSION_NAME);
846 ctx->usage_info = (VkVideoEncodeUsageInfoKHR) {
847 .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_USAGE_INFO_KHR,
848 .videoUsageHints =
ctx->opts.usage,
849 .videoContentHints =
ctx->opts.content,
850 .tuningMode =
ctx->opts.tune,
854 ctx->profile.sType = VK_STRUCTURE_TYPE_VIDEO_PROFILE_INFO_KHR;
855 ctx->profile.pNext = &
ctx->usage_info;
859 ctx->profile.chromaBitDepth =
ctx->profile.lumaBitDepth;
866 ctx->profile_list.sType = VK_STRUCTURE_TYPE_VIDEO_PROFILE_LIST_INFO_KHR;
867 ctx->profile_list.profileCount = 1;
868 ctx->profile_list.pProfiles = &
ctx->profile;
871 ctx->enc_caps.sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_CAPABILITIES_KHR;
872 ctx->enc_caps.pNext = codec_caps;
873 ctx->caps.sType = VK_STRUCTURE_TYPE_VIDEO_CAPABILITIES_KHR;
874 ctx->caps.pNext = &
ctx->enc_caps;
876 ret = vk->GetPhysicalDeviceVideoCapabilitiesKHR(
s->hwctx->phys_dev,
879 if (
ret == VK_ERROR_VIDEO_PROFILE_OPERATION_NOT_SUPPORTED_KHR) {
881 "%s profile \"%s\" not supported!\n",
885 }
else if (
ret == VK_ERROR_VIDEO_PROFILE_FORMAT_NOT_SUPPORTED_KHR) {
887 "format (%s) not supported!\n",
890 }
else if (
ret == VK_ERROR_FEATURE_NOT_PRESENT ||
891 ret == VK_ERROR_FORMAT_NOT_SUPPORTED) {
893 }
else if (
ret != VK_SUCCESS) {
897 if ((
ctx->enc_caps.supportedEncodeFeedbackFlags & feedback_flags) !=
900 "Driver does not support required encode feedback flags "
901 "(BUFFER_OFFSET and BYTES_WRITTEN).\n");
910 query_create = (VkQueryPoolVideoEncodeFeedbackCreateInfoKHR) {
911 .sType = VK_STRUCTURE_TYPE_QUERY_POOL_VIDEO_ENCODE_FEEDBACK_CREATE_INFO_KHR,
912 .pNext = &
ctx->profile,
913 .encodeFeedbackFlags = feedback_flags,
916 1, VK_QUERY_TYPE_VIDEO_ENCODE_FEEDBACK_KHR, 0,
921 if (
ctx->opts.quality >
ctx->enc_caps.maxQualityLevels) {
924 ctx->opts.quality,
ctx->enc_caps.maxQualityLevels);
929 quality_info = (VkPhysicalDeviceVideoEncodeQualityLevelInfoKHR) {
930 .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_ENCODE_QUALITY_LEVEL_INFO_KHR,
931 .pVideoProfile = &
ctx->profile,
932 .qualityLevel =
ctx->opts.quality,
934 ctx->quality_props = (VkVideoEncodeQualityLevelPropertiesKHR) {
935 .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_QUALITY_LEVEL_PROPERTIES_KHR,
936 .pNext = quality_pnext,
938 ret = vk->GetPhysicalDeviceVideoEncodeQualityLevelPropertiesKHR(
s->hwctx->phys_dev,
940 &
ctx->quality_props);
941 if (
ret != VK_SUCCESS)
949 ctx->caps.minCodedExtent.width,
ctx->caps.maxCodedExtent.width);
951 ctx->caps.minCodedExtent.height,
ctx->caps.maxCodedExtent.height);
953 ctx->caps.pictureAccessGranularity.width);
955 ctx->caps.pictureAccessGranularity.height);
957 ctx->caps.minBitstreamBufferOffsetAlignment);
959 ctx->caps.minBitstreamBufferSizeAlignment);
961 ctx->caps.maxDpbSlots);
963 ctx->caps.maxActiveReferencePictures);
964 av_log(avctx,
AV_LOG_VERBOSE,
" Codec header version: %i.%i.%i (driver), %i.%i.%i (compiled)\n",
968 ctx->enc_caps.maxQualityLevels);
970 ctx->enc_caps.encodeInputPictureGranularity.width);
972 ctx->enc_caps.encodeInputPictureGranularity.height);
976 ctx->caps.
flags & VK_VIDEO_CAPABILITY_PROTECTED_CONTENT_BIT_KHR ?
978 ctx->caps.
flags & VK_VIDEO_CAPABILITY_SEPARATE_REFERENCE_IMAGES_BIT_KHR ?
979 " separate_references" :
"");
983 FFALIGN(avctx->
width,
ctx->enc_caps.encodeInputPictureGranularity.width);
996 av_log(avctx,
AV_LOG_ERROR,
"Input of %ix%i too large for encoder limits: %ix%i max\n",
998 ctx->caps.minCodedExtent.width,
ctx->caps.minCodedExtent.height);
1002 fmt_info.imageUsage = VK_IMAGE_USAGE_VIDEO_ENCODE_DPB_BIT_KHR;
1004 ctx->common.layered_dpb = !(
ctx->caps.
flags & VK_VIDEO_CAPABILITY_SEPARATE_REFERENCE_IMAGES_BIT_KHR);
1007 ret = vk->GetPhysicalDeviceVideoFormatPropertiesKHR(
s->hwctx->phys_dev,
1009 &nb_out_fmts,
NULL);
1010 if (
ret == VK_ERROR_FORMAT_NOT_SUPPORTED ||
1011 (!nb_out_fmts &&
ret == VK_SUCCESS)) {
1013 }
else if (
ret != VK_SUCCESS) {
1019 ret_info =
av_mallocz(
sizeof(*ret_info)*nb_out_fmts);
1023 for (
int i = 0;
i < nb_out_fmts;
i++)
1024 ret_info[
i].sType = VK_STRUCTURE_TYPE_VIDEO_FORMAT_PROPERTIES_KHR;
1026 ret = vk->GetPhysicalDeviceVideoFormatPropertiesKHR(
s->hwctx->phys_dev,
1028 &nb_out_fmts, ret_info);
1029 if (
ret == VK_ERROR_FORMAT_NOT_SUPPORTED ||
1030 (!nb_out_fmts &&
ret == VK_SUCCESS)) {
1033 }
else if (
ret != VK_SUCCESS) {
1041 for (
i = 0;
i < nb_out_fmts;
i++)
1044 for (
i = 0;
i < nb_out_fmts;
i++) {
1046 ctx->pic_format = ret_info[
i].format;
1053 if (
i == nb_out_fmts) {
1060 session_create.pVideoProfile = &
ctx->profile;
1061 session_create.
flags = 0x0;
1062 session_create.queueFamilyIndex =
ctx->qf_enc->idx;
1063 session_create.maxCodedExtent =
ctx->caps.maxCodedExtent;
1064 session_create.maxDpbSlots =
ctx->caps.maxDpbSlots;
1065 session_create.maxActiveReferencePictures =
ctx->caps.maxActiveReferencePictures;
1066 session_create.pictureFormat =
ctx->pic_format;
1067 session_create.referencePictureFormat = session_create.pictureFormat;
1068 session_create.pStdHeaderVersion = &vk_desc->
ext_props;
1092 void *codec_params_pnext)
1098 VkVideoEncodeQualityLevelInfoKHR q_info;
1099 VkVideoSessionParametersCreateInfoKHR session_params_create;
1101 q_info = (VkVideoEncodeQualityLevelInfoKHR) {
1102 .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_QUALITY_LEVEL_INFO_KHR,
1103 .pNext = codec_params_pnext,
1104 .qualityLevel =
ctx->opts.quality,
1106 session_params_create = (VkVideoSessionParametersCreateInfoKHR) {
1107 .sType = VK_STRUCTURE_TYPE_VIDEO_SESSION_PARAMETERS_CREATE_INFO_KHR,
1109 .videoSession =
ctx->common.session,
1110 .videoSessionParametersTemplate = VK_NULL_HANDLE,
1114 ret = vk->CreateVideoSessionParametersKHR(
s->hwctx->act_dev, &session_params_create,
1115 s->hwctx->alloc, &
ctx->session_params);
1116 if (
ret != VK_SUCCESS) {
1117 av_log(avctx,
AV_LOG_ERROR,
"Unable to create Vulkan video session parameters: %s!\n",