35 .encode_op = VK_VIDEO_CODEC_OPERATION_ENCODE_AV1_BIT_KHR,
37 .extensionName = VK_STD_VULKAN_VIDEO_CODEC_AV1_ENCODE_EXTENSION_NAME,
38 .specVersion = VK_STD_VULKAN_VIDEO_CODEC_AV1_ENCODE_SPEC_VERSION,
88 VkVideoEncodeAV1CapabilitiesKHR
caps;
109 VkVideoEncodeRateControlInfoKHR *rc_info,
110 VkVideoEncodeRateControlLayerInfoKHR *rc_layer)
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,
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,
136 if (rc_info->rateControlMode > VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DISABLED_BIT_KHR) {
141 .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_RATE_CONTROL_LAYER_INFO_KHR,
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,
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,
153 .useMaxFrameSize = 0,
162 static void set_name_slot(
int slot,
int *slot_indices, uint32_t allowed_idx,
int group)
168 if ((slot_indices[
i] == -1) && (allowed_idx & (1 <<
i))) {
169 slot_indices[
i] = slot;
178 VkVideoEncodeInfoKHR *encode_info)
187 VkVideoReferenceSlotInfoKHR *ref_slot;
189 uint32_t ref_name_mask = 0x0;
190 int name_slots[STD_VIDEO_AV1_REFS_PER_FRAME];
192 StdVideoAV1Segmentation *segmentation = &ap->
segmentation;
194 StdVideoAV1Quantization *quantization = &ap->
quantization;
195 StdVideoAV1CDEF *cdef = &ap->
cdef;
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 };
202 VkVideoEncodeAV1PredictionModeKHR pred_mode;
203 VkVideoEncodeAV1RateControlGroupKHR rc_group;
204 int lr_unit_shift = 0;
207 ap->
ext_header = (StdVideoEncodeAV1ExtensionHeader) {
213 .flags = (StdVideoAV1TileInfoFlags) {
218 .context_update_tile_id = 0,
219 .tile_size_bytes_minus_1 = 0,
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;
229 for (
int i = 0;
i < STD_VIDEO_AV1_REFS_PER_FRAME;
i++)
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,
241 *cdef = (StdVideoAV1CDEF) {
242 .cdef_damping_minus_3 = 0,
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;
255 .flags = (StdVideoAV1LoopFilterFlags) {
256 .loop_filter_delta_enabled = 0,
257 .loop_filter_delta_update = 0,
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 },
267 memcpy(
loop_filter->loop_filter_ref_deltas, default_loop_filter_ref_deltas,
268 STD_VIDEO_AV1_TOTAL_REFS_PER_FRAME *
sizeof(int8_t));
270 *quantization = (StdVideoAV1Quantization) {
271 .flags = (StdVideoAV1QuantizationFlags) {
287 ref_slot = (VkVideoReferenceSlotInfoKHR *)encode_info->pSetupReferenceSlot;
289 .flags = (StdVideoEncodeAV1PictureInfoFlags) {
293 .disable_cdf_update = 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,
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,
309 .skip_mode_present = 0,
310 .delta_q_present = 0,
311 .delta_lf_present = 0,
313 .segmentation_enabled = 0,
314 .segmentation_update_map = 0,
315 .segmentation_temporal_update = 0,
316 .segmentation_update_data = 0,
324 .frame_presentation_time = 0,
325 .current_frame_id = ref_slot->slotIndex,
327 .primary_ref_frame = 0,
328 .refresh_frame_flags = 0x0,
332 .interpolation_filter = 0,
333 .TxMode = STD_VIDEO_AV1_TX_MODE_SELECT,
336 .ref_order_hint = { 0 },
337 .ref_frame_idx = { 0 },
339 .delta_frame_id_minus_1 = { 0 },
342 .pQuantization = quantization,
343 .pSegmentation = segmentation,
346 .pLoopRestoration = loop_restoration,
347 .pGlobalMotion = global_motion,
349 .pBufferRemovalTimes =
NULL,
356 ap->
av1pic_info.frame_type = STD_VIDEO_AV1_FRAME_TYPE_KEY;
358 quantization->base_q_idx = enc->
q_idx_idr;
361 pred_mode = VK_VIDEO_ENCODE_AV1_PREDICTION_MODE_INTRA_ONLY_KHR;
362 rc_group = VK_VIDEO_ENCODE_AV1_RATE_CONTROL_GROUP_INTRA_KHR;
366 ap_ref =
ref->codec_priv;
368 ap->
av1pic_info.frame_type = STD_VIDEO_AV1_FRAME_TYPE_INTER;
369 quantization->base_q_idx = enc->
q_idx_p;
382 rc_group = VK_VIDEO_ENCODE_AV1_RATE_CONTROL_GROUP_PREDICTIVE_KHR;
383 pred_mode = VK_VIDEO_ENCODE_AV1_PREDICTION_MODE_SINGLE_REFERENCE_KHR;
384 ref_name_mask = enc->
caps.singleReferenceNameMask;
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;
398 ap_ref =
ref->codec_priv;
406 ap->
av1pic_info.frame_type = STD_VIDEO_AV1_FRAME_TYPE_INTER;
407 quantization->base_q_idx = enc->
q_idx_b;
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;
423 ap_ref =
ref->codec_priv;
432 ap_ref =
ref->codec_priv;
444 .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_PICTURE_INFO_KHR,
446 .predictionMode = pred_mode,
447 .rateControlGroup = rc_group,
448 .constantQIndex = quantization->base_q_idx,
451 .primaryReferenceCdfOnly = 0,
452 .generateObuExtensionHeader = 0,
459 ref_slot = (VkVideoReferenceSlotInfoKHR *)encode_info->pSetupReferenceSlot;
462 ap->
av1dpb_info = (StdVideoEncodeAV1ReferenceInfo) {
463 .flags = (StdVideoEncodeAV1ReferenceInfoFlags) {
464 .disable_frame_end_update_cdf = 0,
465 .segmentation_enabled = 0,
468 .RefFrameId = ref_slot->slotIndex,
476 .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_DPB_SLOT_INFO_KHR,
493 const int chroma_den = 1 << 16;
494 const int max_luma_den = 1 << 8;
495 const int min_luma_den = 1 << 14;
497 memset(obu, 0,
sizeof(*obu));
501 for (
int i = 0;
i < 3;
i++) {
536 memset(obu, 0,
sizeof(*obu));
539 cll->max_cll = cllm->
MaxCLL;
554 memset(obu, 0,
sizeof(*obu));
572 memset(obu, 0,
sizeof(*obu));
589 VkVideoProfileInfoKHR *
profile,
void *pnext)
598 VkVideoEncodeAV1CapabilitiesKHR av1_caps = {
599 .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_CAPABILITIES_KHR,
601 VkVideoEncodeCapabilitiesKHR enc_caps = {
602 .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_CAPABILITIES_KHR,
605 VkVideoCapabilitiesKHR caps = {
606 .sType = VK_STRUCTURE_TYPE_VIDEO_CAPABILITIES_KHR,
612 static const int known_profiles[] = {
627 enc->
profile = (VkVideoEncodeAV1ProfileInfoKHR) {
628 .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_PROFILE_INFO_KHR,
651 "any normal level, using level 7.3 by default.\n");
664 for (
int i = 0;
i < nb_profiles;
i++) {
666 ret = vk->GetPhysicalDeviceVideoCapabilitiesKHR(
s->hwctx->phys_dev,
669 if (
ret == VK_SUCCESS) {
672 last_supported = known_profiles[
i];
684 avctx->
profile = last_supported;
703 "must have initial buffer size (%d) <= "
704 "buffer size (%"PRId64
").\n",
713 if (enc->
common.
opts.
rc_mode == VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DISABLED_BIT_KHR) {
715 enc->
caps.minQIndex, enc->
caps.maxQIndex);
763 .enable_order_hint = 1,
765 .use_128x128_superblock = !!(enc->
caps.superblockSizes & VK_VIDEO_ENCODE_AV1_SUPERBLOCK_SIZE_128_BIT_KHR),
767 .high_bitdepth =
desc->comp[0].depth > 8,
769 .transfer_characteristics = avctx->
color_trc,
774 .subsampling_x =
desc->log2_chroma_w,
775 .subsampling_y =
desc->log2_chroma_h,
788 .operating_points_cnt_minus_1 = 1 - 1,
811 StdVideoAV1SequenceHeader *seq_hdr = &vk_units->
seq_hdr;
815 StdVideoEncodeAV1OperatingPointInfo *operating_points = vk_units->
operating_points;
818 .flags = (StdVideoAV1TimingInfoFlags) {
827 .flags = (StdVideoAV1ColorConfigFlags) {
841 *seq_hdr = (StdVideoAV1SequenceHeader) {
842 .flags = (StdVideoAV1SequenceHeaderFlags) {
878 operating_points[
i] = (StdVideoEncodeAV1OperatingPointInfo) {
879 .flags = (StdVideoEncodeAV1OperatingPointInfoFlags) {
908 VkVideoEncodeAV1SessionParametersCreateInfoKHR av1_params;
919 if (
ctx->session_params)
920 vk->DestroyVideoSessionParametersKHR(
s->hwctx->act_dev,
924 av1_params = (VkVideoEncodeAV1SessionParametersCreateInfoKHR) {
925 .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_SESSION_PARAMETERS_CREATE_INFO_KHR,
926 .pStdSequenceHeader = &vk_units.
seq_hdr,
973 ff_cbs_fragment_free(&obu);
988 VkVideoEncodeSessionParametersGetInfoKHR params_info;
989 VkVideoEncodeSessionParametersFeedbackInfoKHR params_feedback;
992 size_t data_size = 0;
1007 params_info = (VkVideoEncodeSessionParametersGetInfoKHR) {
1008 .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_SESSION_PARAMETERS_GET_INFO_KHR,
1009 .videoSessionParameters =
ctx->session_params,
1011 params_feedback = (VkVideoEncodeSessionParametersFeedbackInfoKHR) {
1012 .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_SESSION_PARAMETERS_FEEDBACK_INFO_KHR,
1015 ret = vk->GetEncodedVideoSessionParametersKHR(
s->hwctx->act_dev, ¶ms_info,
1018 if (
ret == VK_INCOMPLETE ||
1019 (
ret == VK_SUCCESS) && (data_size > 0)) {
1029 ret = vk->GetEncodedVideoSessionParametersKHR(
s->hwctx->act_dev, ¶ms_info,
1032 if (
ret != VK_SUCCESS) {
1038 params_feedback.hasOverrides);
1040 params_feedback.hasOverrides = 1;
1043 if (!params_feedback.hasOverrides)
1061 uint8_t
type,
void *obu_unit)
1065 err = ff_cbs_insert_unit_content(au, -1,
1069 "type = %d.\n",
type);
1077 uint8_t *
data,
size_t *data_len,
1083 ret = ff_cbs_write_fragment_data(enc->
cbs, obu);
1097 uint8_t *
data,
size_t *data_len)
1111 ff_cbs_fragment_reset(obu);
1117 uint8_t *
data,
size_t *data_len)
1131 err = ff_cbs_write_fragment_data(enc->
cbs, obu);
1135 ff_cbs_fragment_reset(obu);
1173 ff_cbs_fragment_reset(obu);
1178 uint8_t *
data,
size_t *data_len)
1194 .payload_size = padding,
1203 ff_cbs_fragment_reset(obu);
1213 .filler_header_size = 4,
1233 enc->
caps = (VkVideoEncodeAV1CapabilitiesKHR) {
1234 .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_CAPABILITIES_KHR,
1237 enc->
quality_props = (VkVideoEncodeAV1QualityLevelPropertiesKHR) {
1238 .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_QUALITY_LEVEL_PROPERTIES_KHR,
1250 !!(enc->
caps.flags & VK_VIDEO_ENCODE_AV1_CAPABILITY_PER_RATE_CONTROL_GROUP_MIN_MAX_Q_INDEX_BIT_KHR));
1252 !!(enc->
caps.flags & VK_VIDEO_ENCODE_AV1_CAPABILITY_GENERATE_OBU_EXTENSION_HEADER_BIT_KHR));
1254 !!(enc->
caps.flags & VK_VIDEO_ENCODE_AV1_CAPABILITY_PRIMARY_REFERENCE_CDF_ONLY_BIT_KHR));
1256 !!(enc->
caps.flags & VK_VIDEO_ENCODE_AV1_CAPABILITY_FRAME_SIZE_OVERRIDE_BIT_KHR));
1258 !!(enc->
caps.flags & VK_VIDEO_ENCODE_AV1_CAPABILITY_MOTION_VECTOR_SCALING_BIT_KHR));
1261 !!(enc->
caps.superblockSizes & VK_VIDEO_ENCODE_AV1_SUPERBLOCK_SIZE_64_BIT_KHR));
1263 !!(enc->
caps.superblockSizes & VK_VIDEO_ENCODE_AV1_SUPERBLOCK_SIZE_128_BIT_KHR));
1265 enc->
caps.maxSingleReferenceCount);
1267 enc->
caps.singleReferenceNameMask);
1269 enc->
caps.maxUnidirectionalCompoundReferenceCount);
1271 enc->
caps.maxUnidirectionalCompoundGroup1ReferenceCount);
1273 enc->
caps.unidirectionalCompoundReferenceNameMask);
1275 enc->
caps.maxBidirectionalCompoundReferenceCount);
1277 enc->
caps.maxBidirectionalCompoundGroup1ReferenceCount);
1279 enc->
caps.maxBidirectionalCompoundGroup2ReferenceCount);
1281 enc->
caps.bidirectionalCompoundReferenceNameMask);
1283 enc->
caps.maxTemporalLayerCount);
1285 enc->
caps.maxSpatialLayerCount);
1287 enc->
caps.maxOperatingPoints);
1289 enc->
caps.minQIndex, enc->
caps.maxQIndex);
1291 enc->
caps.prefersGopRemainingFrames);
1293 enc->
caps.requiresGopRemainingFrames);
1295 enc->
caps.maxLevel);
1297 enc->
caps.codedPictureAlignment.width, enc->
caps.codedPictureAlignment.height);
1299 enc->
caps.maxTiles.width, enc->
caps.maxTiles.height);
1301 enc->
caps.minTileSize.width, enc->
caps.minTileSize.height,
1302 enc->
caps.maxTileSize.width, enc->
caps.maxTileSize.height);
1310 ctx->caps.maxDpbSlots,
1311 enc->
caps.maxBidirectionalCompoundReferenceCount,
1331 size_t data_len =
sizeof(
data);
1336 "for extradata: %d.\n", err);
1367 #define OFFSET(x) offsetof(VulkanEncodeAV1Context, x)
1368 #define FLAGS (AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM)
1373 {
"profile",
"Set profile",
1377 #define PROFILE(name, value) name, NULL, 0, AV_OPT_TYPE_CONST, \
1378 { .i64 = value }, 0, 0, FLAGS, .unit = "profile"
1384 {
"tier",
"Set tier (seq_tier)",
1389 {
"level",
"Set level (level_idc)",
1393 #define LEVEL(name, value) name, NULL, 0, AV_OPT_TYPE_CONST, \
1394 { .i64 = value }, 0, 0, FLAGS, .unit = "level"
1405 {
LEVEL(
"42", 10) },
1406 {
LEVEL(
"43", 11) },
1407 {
LEVEL(
"50", 12) },
1408 {
LEVEL(
"51", 13) },
1409 {
LEVEL(
"52", 14) },
1410 {
LEVEL(
"53", 15) },
1411 {
LEVEL(
"60", 16) },
1412 {
LEVEL(
"61", 17) },
1413 {
LEVEL(
"62", 18) },
1414 {
LEVEL(
"63", 19) },
1415 {
LEVEL(
"70", 20) },
1416 {
LEVEL(
"71", 21) },
1417 {
LEVEL(
"72", 22) },
1418 {
LEVEL(
"73", 23) },
1445 .
p.
name =
"av1_vulkan",
1463 .p.wrapper_name =
"vulkan",