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,
162static int 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;
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;
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));
554 memset(obu, 0,
sizeof(*obu));
572 memset(obu, 0,
sizeof(*obu));
589 VkVideoProfileInfoKHR *
profile,
void *pnext)
597 VkVideoEncodeAV1CapabilitiesKHR av1_caps = {
598 .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_CAPABILITIES_KHR,
600 VkVideoEncodeCapabilitiesKHR enc_caps = {
601 .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_CAPABILITIES_KHR,
604 VkVideoCapabilitiesKHR caps = {
605 .sType = VK_STRUCTURE_TYPE_VIDEO_CAPABILITIES_KHR,
611 static const int known_profiles[] = {
626 enc->
profile = (VkVideoEncodeAV1ProfileInfoKHR) {
627 .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_PROFILE_INFO_KHR,
638 for (
int i = 0;
i < nb_profiles;
i++) {
640 ret = vk->GetPhysicalDeviceVideoCapabilitiesKHR(
s->hwctx->phys_dev,
643 if (ret == VK_SUCCESS) {
646 last_supported = known_profiles[
i];
658 avctx->
profile = last_supported;
677 "must have initial buffer size (%d) <= "
678 "buffer size (%"PRId64
").\n",
687 if (enc->
common.
opts.
rc_mode == VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DISABLED_BIT_KHR) {
689 enc->
caps.minQIndex, enc->
caps.maxQIndex);
745 "any normal level, using level 7.3 by default.\n");
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)) {
1024 av_log(avctx,
AV_LOG_ERROR,
"Unable to get feedback for AV1 sequence header = %zu\n",
1029 ret = vk->GetEncodedVideoSessionParametersKHR(
s->hwctx->act_dev, ¶ms_info,
1032 if (ret != VK_SUCCESS) {
1039 params_feedback.hasOverrides);
1041 params_feedback.hasOverrides = 1;
1045 if (!params_feedback.hasOverrides)
1063 uint8_t
type,
void *obu_unit)
1067 err = ff_cbs_insert_unit_content(au, -1,
1071 "type = %d.\n",
type);
1079 uint8_t *
data,
size_t *data_len,
1085 ret = ff_cbs_write_fragment_data(enc->
cbs, obu);
1099 uint8_t *
data,
size_t *data_len)
1113 ff_cbs_fragment_reset(obu);
1119 uint8_t *
data,
size_t *data_len)
1133 err = ff_cbs_write_fragment_data(enc->
cbs, obu);
1137 ff_cbs_fragment_reset(obu);
1175 ff_cbs_fragment_reset(obu);
1180 uint8_t *
data,
size_t *data_len)
1196 .payload_size = padding,
1205 ff_cbs_fragment_reset(obu);
1215 .filler_header_size = 4,
1237 enc->
caps = (VkVideoEncodeAV1CapabilitiesKHR) {
1238 .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_CAPABILITIES_KHR,
1241 enc->
quality_props = (VkVideoEncodeAV1QualityLevelPropertiesKHR) {
1242 .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_QUALITY_LEVEL_PROPERTIES_KHR,
1254 !!(enc->
caps.flags & VK_VIDEO_ENCODE_AV1_CAPABILITY_PER_RATE_CONTROL_GROUP_MIN_MAX_Q_INDEX_BIT_KHR));
1256 !!(enc->
caps.flags & VK_VIDEO_ENCODE_AV1_CAPABILITY_GENERATE_OBU_EXTENSION_HEADER_BIT_KHR));
1258 !!(enc->
caps.flags & VK_VIDEO_ENCODE_AV1_CAPABILITY_PRIMARY_REFERENCE_CDF_ONLY_BIT_KHR));
1260 !!(enc->
caps.flags & VK_VIDEO_ENCODE_AV1_CAPABILITY_FRAME_SIZE_OVERRIDE_BIT_KHR));
1262 !!(enc->
caps.flags & VK_VIDEO_ENCODE_AV1_CAPABILITY_MOTION_VECTOR_SCALING_BIT_KHR));
1265 !!(enc->
caps.superblockSizes & VK_VIDEO_ENCODE_AV1_SUPERBLOCK_SIZE_64_BIT_KHR));
1267 !!(enc->
caps.superblockSizes & VK_VIDEO_ENCODE_AV1_SUPERBLOCK_SIZE_128_BIT_KHR));
1269 enc->
caps.maxSingleReferenceCount);
1271 enc->
caps.singleReferenceNameMask);
1273 enc->
caps.maxUnidirectionalCompoundReferenceCount);
1275 enc->
caps.maxUnidirectionalCompoundGroup1ReferenceCount);
1277 enc->
caps.unidirectionalCompoundReferenceNameMask);
1279 enc->
caps.maxBidirectionalCompoundReferenceCount);
1281 enc->
caps.maxBidirectionalCompoundGroup1ReferenceCount);
1283 enc->
caps.maxBidirectionalCompoundGroup2ReferenceCount);
1285 enc->
caps.bidirectionalCompoundReferenceNameMask);
1287 enc->
caps.maxTemporalLayerCount);
1289 enc->
caps.maxSpatialLayerCount);
1291 enc->
caps.maxOperatingPoints);
1293 enc->
caps.minQIndex, enc->
caps.maxQIndex);
1295 enc->
caps.prefersGopRemainingFrames);
1297 enc->
caps.requiresGopRemainingFrames);
1299 enc->
caps.maxLevel);
1301 enc->
caps.codedPictureAlignment.width, enc->
caps.codedPictureAlignment.height);
1303 enc->
caps.maxTiles.width, enc->
caps.maxTiles.height);
1305 enc->
caps.minTileSize.width, enc->
caps.minTileSize.height,
1306 enc->
caps.maxTileSize.width, enc->
caps.maxTileSize.height);
1314 ctx->caps.maxDpbSlots,
1315 enc->
caps.maxBidirectionalCompoundReferenceCount,
1335 size_t data_len =
sizeof(
data);
1340 "for extradata: %d.\n", err);
1368 ff_cbs_close(&enc->
cbs);
1375#define OFFSET(x) offsetof(VulkanEncodeAV1Context, x)
1376#define FLAGS (AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM)
1381 {
"profile",
"Set profile",
1385#define PROFILE(name, value) name, NULL, 0, AV_OPT_TYPE_CONST, \
1386 { .i64 = value }, 0, 0, FLAGS, .unit = "profile"
1392 {
"tier",
"Set tier (seq_tier)",
1397 {
"level",
"Set level (level_idc)",
1401#define LEVEL(name, value) name, NULL, 0, AV_OPT_TYPE_CONST, \
1402 { .i64 = value }, 0, 0, FLAGS, .unit = "level"
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) },
1446 .class_name =
"av1_vulkan",
1453 .p.name =
"av1_vulkan",
1471 .p.wrapper_name =
"vulkan",
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.
simple assert() macros that are a bit more flexible than ISO C assert().
#define av_assert0(cond)
assert() equivalent, that is always enabled.
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,...)
#define i(width, name, range_min, range_max)
#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...
static __device__ float fabs(float a)
#define AV_PROFILE_AV1_HIGH
#define AV_PROFILE_UNKNOWN
#define AV_PROFILE_AV1_MAIN
#define AV_PROFILE_AV1_PROFESSIONAL
int(* init)(AVBSFContext *ctx)
@ AV_OPT_TYPE_CONST
Special option type for declaring named constants.
@ AV_OPT_TYPE_FLAGS
Underlying C type is unsigned int.
@ AV_OPT_TYPE_INT
Underlying C type is int.
#define AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE
This encoder can reorder user opaque values from input AVFrames and return them with corresponding ou...
#define AV_CODEC_CAP_ENCODER_FLUSH
This encoder can be flushed using avcodec_flush_buffers().
#define AV_CODEC_CAP_DELAY
Encoder or decoder requires flushing with NULL input at the end in order to give the complete and cor...
const char * avcodec_profile_name(enum AVCodecID codec_id, int profile)
Return a name for the specified profile, if available.
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
#define AV_CODEC_FLAG_GLOBAL_HEADER
Place global headers in extradata instead of every keyframe.
#define AV_CODEC_CAP_HARDWARE
Codec is backed by a hardware implementation.
#define AV_INPUT_BUFFER_PADDING_SIZE
Required number of additionally allocated bytes at the end of the input bitstream for decoding.
#define AVERROR_EXTERNAL
Generic error in an external library.
#define av_err2str(errnum)
Convenience macro, the return value should be used only directly in function arguments but never stan...
AVFrameSideData * av_frame_get_side_data(const AVFrame *frame, enum AVFrameSideDataType type)
@ AV_FRAME_DATA_CONTENT_LIGHT_LEVEL
Content light level (based on CTA-861.3).
@ AV_FRAME_DATA_MASTERING_DISPLAY_METADATA
Mastering display metadata associated with a video frame.
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
#define AV_LOG_VERBOSE
Detailed information.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
const char * av_default_item_name(void *ptr)
Return the context name.
static double av_q2d(AVRational a)
Convert an AVRational to a double.
int64_t av_rescale(int64_t a, int64_t b, int64_t c)
Rescale a 64-bit integer with rounding to nearest.
#define LIBAVUTIL_VERSION_INT
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
@ AV1_METADATA_TYPE_HDR_MDCV
@ AV1_METADATA_TYPE_HDR_CLL
@ AV1_OBU_SEQUENCE_HEADER
@ AV1_SELECT_SCREEN_CONTENT_TOOLS
@ AV1_MAX_OPERATING_POINTS
@ AV1_TOTAL_REFS_PER_FRAME
Memory handling functions.
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
@ AVCHROMA_LOC_TOPLEFT
ITU-R 601, SMPTE 274M 296M S314M(DV 4:1:1), mpeg2 4:2:2.
@ AVCHROMA_LOC_LEFT
MPEG-2/4 4:2:0, H.264 default for 4:2:0.
@ 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...
@ AV_PIX_FMT_VULKAN
Vulkan hardware images.
#define FF_ARRAY_ELEMS(a)
uint8_t matrix_coefficients
uint8_t transfer_characteristics
uint8_t separate_uv_delta_q
AV1RawFrameHeader frame_header
AV1RawSequenceHeader sequence_header
union AV1RawOBU::@016362317061177152367125047142162076164261250366 obu
uint32_t num_units_in_display_tick
uint32_t num_ticks_per_picture_minus_1
uint8_t equal_picture_interval
Describe the class of an AVClass context structure.
main external API structure.
int rc_buffer_size
decoder bitstream buffer size
float b_quant_offset
qscale offset between IP and B-frames
enum AVColorPrimaries color_primaries
Chromaticity coordinates of the source primaries.
int qmin
minimum quantizer
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...
int level
Encoding level descriptor.
int64_t bit_rate
the average bitrate
int rc_initial_buffer_occupancy
Number of bits which should be loaded into the rc buffer before decoding starts.
enum AVColorSpace colorspace
YUV colorspace type.
int64_t rc_max_rate
maximum bitrate
int qmax
maximum quantizer
enum AVColorTransferCharacteristic color_trc
Color Transfer Characteristic.
int flags
AV_CODEC_FLAG_*.
uint8_t * extradata
Out-of-band global headers that may be used by some codecs.
enum AVChromaLocation chroma_sample_location
This defines the location of chroma samples.
float i_quant_factor
qscale factor between P- and I-frames If > 0 then the last P-frame quantizer will be used (q = lastp_...
float i_quant_offset
qscale offset between P and I-frames
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.
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
Context structure for coded bitstream operations.
void * priv_data
Internal codec-specific data.
Coded bitstream fragment structure, combining one or more units.
CodedBitstreamUnit * units
Pointer to an array of units of length nb_units_allocated.
int nb_units
Number of units in this fragment.
size_t data_size
The number of bytes in the bitstream.
uint8_t * data
Pointer to the bitstream form of this fragment.
void * content
Pointer to the decomposed form of this unit.
CodedBitstreamUnitType type
Codec-specific type of this unit.
int nb_refs[MAX_REFERENCE_LIST_NUM]
struct FFHWBaseEncodePicture * refs[MAX_REFERENCE_LIST_NUM][MAX_PICTURE_REFERENCES]
VkVideoEncodeRateControlModeFlagBitsKHR rc_mode
FFVkEncodeCommonOptions opts
int non_independent_frame
StdVideoAV1SequenceHeader seq_hdr
StdVideoAV1TimingInfo timing_info
StdVideoEncodeAV1OperatingPointInfo operating_points[AV1_MAX_OPERATING_POINTS]
StdVideoAV1ColorConfig color_config
StdVideoEncodeAV1DecoderModelInfo decoder_model
AV1RawOBU meta_mastering_obu
FFVulkanEncodeContext common
CodedBitstreamFragment current_access_unit
CodedBitstreamContext * cbs
VkVideoEncodeAV1QualityLevelPropertiesKHR quality_props
uint8_t * padding_payload
enum UnitElems unit_elems
VkVideoEncodeAV1CapabilitiesKHR caps
VkVideoEncodeAV1ProfileInfoKHR profile
uint64_t initial_buffer_fullness
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
enum UnitElems units_needed
StdVideoAV1Segmentation segmentation
static int ref[MAX_W *MAX_W]
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
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
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)