FFmpeg
Loading...
Searching...
No Matches
vulkan_encode_h265.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/internal.h"
20#include "libavutil/opt.h"
21#include "libavutil/mem.h"
22
23#include "cbs.h"
24#include "cbs_h265.h"
25#include "atsc_a53.h"
27
28#include "codec_internal.h"
29#include "version.h"
30#include "hw_base_encode_h265.h"
31
32#include "vulkan_encode.h"
33
40
42 .codec_id = AV_CODEC_ID_H265,
43 .encode_extension = FF_VK_EXT_VIDEO_ENCODE_H265,
44 .encode_op = VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR,
45 .ext_props = {
46 .extensionName = VK_STD_VULKAN_VIDEO_CODEC_H265_ENCODE_EXTENSION_NAME,
47 .specVersion = VK_STD_VULKAN_VIDEO_CODEC_H265_ENCODE_SPEC_VERSION,
48 },
49};
50
54 uint16_t idr_pic_id;
59
61
62 VkVideoEncodeH265RateControlInfoKHR vkrc_info;
63 VkVideoEncodeH265RateControlLayerInfoKHR vkrc_layer_info;
64
65 StdVideoEncodeH265PictureInfo h265pic_info;
66 VkVideoEncodeH265PictureInfoKHR vkh265pic_info;
67
68 StdVideoEncodeH265WeightTable slice_wt;
69 StdVideoEncodeH265SliceSegmentHeader slice_hdr;
70 VkVideoEncodeH265NaluSliceSegmentInfoKHR vkslice;
71
72 StdVideoEncodeH265ReferenceInfo h265dpb_info;
73 VkVideoEncodeH265DpbSlotInfoKHR vkh265dpb_info;
74
75 StdVideoEncodeH265ReferenceListsInfo ref_list_info;
76 StdVideoEncodeH265LongTermRefPics l_rps;
77 StdVideoH265ShortTermRefPicSet s_rps;
79
110
112 VkVideoEncodeRateControlInfoKHR *rc_info,
113 VkVideoEncodeRateControlLayerInfoKHR *rc_layer)
114{
118
119 hp->vkrc_info = (VkVideoEncodeH265RateControlInfoKHR) {
120 .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_RATE_CONTROL_INFO_KHR,
121 .flags = VK_VIDEO_ENCODE_H265_RATE_CONTROL_REFERENCE_PATTERN_FLAT_BIT_KHR |
122 VK_VIDEO_ENCODE_H265_RATE_CONTROL_REGULAR_GOP_BIT_KHR,
123 .idrPeriod = ctx->base.gop_size,
124 .gopFrameCount = ctx->base.gop_size,
125 .consecutiveBFrameCount = FFMAX(ctx->base.b_per_p - 1, 0),
126 .subLayerCount = 0,
127 };
128 rc_info->pNext = &hp->vkrc_info;
129
130 if (rc_info->rateControlMode > VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DISABLED_BIT_KHR) {
131 rc_info->virtualBufferSizeInMs = (enc->hrd_buffer_size * 1000LL) / avctx->bit_rate;
132 rc_info->initialVirtualBufferSizeInMs = (enc->initial_buffer_fullness * 1000LL) / avctx->bit_rate;
133
134 hp->vkrc_layer_info = (VkVideoEncodeH265RateControlLayerInfoKHR) {
135 .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_RATE_CONTROL_LAYER_INFO_KHR,
136
137 .useMinQp = avctx->qmin > 0,
138 .minQp.qpI = avctx->qmin > 0 ? avctx->qmin : 0,
139 .minQp.qpP = avctx->qmin > 0 ? avctx->qmin : 0,
140 .minQp.qpB = avctx->qmin > 0 ? avctx->qmin : 0,
141
142 .useMaxQp = avctx->qmax > 0,
143 .maxQp.qpI = avctx->qmax > 0 ? avctx->qmax : 0,
144 .maxQp.qpP = avctx->qmax > 0 ? avctx->qmax : 0,
145 .maxQp.qpB = avctx->qmax > 0 ? avctx->qmax : 0,
146
147 .useMaxFrameSize = 0,
148 };
149 rc_layer->pNext = &hp->vkrc_layer_info;
150 hp->vkrc_info.subLayerCount = 1;
151 }
152
153 return 0;
154}
155
158{
161 FFHWBaseEncodePicture *prev = pic->prev;
162 VulkanEncodeH265Picture *hprev = prev ? prev->codec_priv : NULL;
163
164 if (pic->type == FF_HW_PICTURE_TYPE_IDR) {
166
167 hp->last_idr_frame = pic->display_order;
168
169 hp->slice_type = STD_VIDEO_H265_SLICE_TYPE_I;
170 hp->pic_type = STD_VIDEO_H265_PICTURE_TYPE_IDR;
171 } else {
172 av_assert0(prev);
173 hp->last_idr_frame = hprev->last_idr_frame;
174
175 if (pic->type == FF_HW_PICTURE_TYPE_I) {
176 hp->slice_type = STD_VIDEO_H265_SLICE_TYPE_I;
177 hp->pic_type = STD_VIDEO_H265_PICTURE_TYPE_I;
178 } else if (pic->type == FF_HW_PICTURE_TYPE_P) {
179 av_assert0(pic->refs[0]);
180 hp->slice_type = STD_VIDEO_H265_SLICE_TYPE_P;
181 hp->pic_type = STD_VIDEO_H265_PICTURE_TYPE_P;
182 } else {
183 FFHWBaseEncodePicture *irap_ref;
184 av_assert0(pic->refs[0][0] && pic->refs[1][0]);
185 for (irap_ref = pic; irap_ref; irap_ref = irap_ref->refs[1][0]) {
186 if (irap_ref->type == FF_HW_PICTURE_TYPE_I)
187 break;
188 }
189 hp->slice_type = STD_VIDEO_H265_SLICE_TYPE_B;
190 hp->pic_type = STD_VIDEO_H265_PICTURE_TYPE_B;
191 }
192 }
194
195 hp->units_needed = 0;
196
197 if (enc->unit_elems & UNIT_AUD) {
198 hp->units_needed |= UNIT_AUD;
199 enc->raw_aud = (H265RawAUD) {
200 .nal_unit_header = {
201 .nal_unit_type = HEVC_NAL_AUD,
202 .nuh_layer_id = 0,
203 .nuh_temporal_id_plus1 = 1,
204 },
205 .pic_type = hp->pic_type,
206 };
207 }
208
209 // Only look for the metadata on I/IDR frame on the output. We
210 // may force an IDR frame on the output where the metadata gets
211 // changed on the input frame.
214 AVFrameSideData *sd =
217
218 if (sd) {
220
221 // SEI is needed when both the primaries and luminance are set
222 if (mdm->has_primaries && mdm->has_luminance) {
225 const int mapping[3] = {1, 2, 0};
226 const int chroma_den = 50000;
227 const int luma_den = 10000;
228
229 for (int i = 0; i < 3; i++) {
230 const int j = mapping[i];
231 mdcv->display_primaries_x[i] =
232 FFMIN(lrint(chroma_den *
233 av_q2d(mdm->display_primaries[j][0])),
234 chroma_den);
235 mdcv->display_primaries_y[i] =
236 FFMIN(lrint(chroma_den *
237 av_q2d(mdm->display_primaries[j][1])),
238 chroma_den);
239 }
240
241 mdcv->white_point_x =
242 FFMIN(lrint(chroma_den * av_q2d(mdm->white_point[0])),
243 chroma_den);
244 mdcv->white_point_y =
245 FFMIN(lrint(chroma_den * av_q2d(mdm->white_point[1])),
246 chroma_den);
247
249 lrint(luma_den * av_q2d(mdm->max_luminance));
251 FFMIN(lrint(luma_den * av_q2d(mdm->min_luminance)),
253
255 }
256 }
257 }
258
263
264 if (sd) {
267
268 clli->max_content_light_level = FFMIN(clm->MaxCLL, 65535);
269 clli->max_pic_average_light_level = FFMIN(clm->MaxFALL, 65535);
270
272 }
273 }
274
275 if (enc->unit_elems & UNIT_SEI_A53_CC) {
276 int err;
277 size_t sei_a53cc_len;
279 err = ff_alloc_a53_sei(pic->input_image, 0, &enc->sei_a53cc_data, &sei_a53cc_len);
280 if (err < 0)
281 return err;
282 if (enc->sei_a53cc_data != NULL) {
284 enc->sei_a53cc.data = (uint8_t *)enc->sei_a53cc_data + 1;
285 enc->sei_a53cc.data_length = sei_a53cc_len - 1;
286
288 }
289 }
290
291 return 0;
292}
293
294static void setup_slices(AVCodecContext *avctx,
296{
299
300 hp->slice_wt = (StdVideoEncodeH265WeightTable) {
301 .flags = (StdVideoEncodeH265WeightTableFlags) {
302 .luma_weight_l0_flag = 0,
303 .chroma_weight_l0_flag = 0,
304 .luma_weight_l1_flag = 0,
305 .chroma_weight_l1_flag = 0,
306 },
307 .luma_log2_weight_denom = 0,
308 .delta_chroma_log2_weight_denom = 0,
309 .delta_luma_weight_l0 = { 0 },
310 .luma_offset_l0 = { 0 },
311 .delta_chroma_weight_l0 = { { 0 } },
312 .delta_chroma_offset_l0 = { { 0 } },
313 .delta_luma_weight_l1 = { 0 },
314 .luma_offset_l1 = { 0 },
315 .delta_chroma_weight_l1 = { { 0 } },
316 .delta_chroma_offset_l1 = { { 0 } },
317 };
318
319 hp->slice_hdr = (StdVideoEncodeH265SliceSegmentHeader) {
320 .flags = (StdVideoEncodeH265SliceSegmentHeaderFlags) {
321 .first_slice_segment_in_pic_flag = 1,
322 .dependent_slice_segment_flag = 0,
323 .slice_sao_luma_flag = enc->units.raw_sps.sample_adaptive_offset_enabled_flag,
324 .slice_sao_chroma_flag = enc->units.raw_sps.sample_adaptive_offset_enabled_flag,
325 .num_ref_idx_active_override_flag = 0,
326 .mvd_l1_zero_flag = 0,
327 .cabac_init_flag = 0,
328 .cu_chroma_qp_offset_enabled_flag = 0,
329 .deblocking_filter_override_flag = 0,
330 .slice_deblocking_filter_disabled_flag = 0,
331 .collocated_from_l0_flag = 1,
332 .slice_loop_filter_across_slices_enabled_flag = 0,
333 /* Reserved */
334 },
335 .slice_type = hp->slice_type,
336 .slice_segment_address = 0,
337 .collocated_ref_idx = 0,
338 .MaxNumMergeCand = 5,
339 .slice_cb_qp_offset = 0,
340 .slice_cr_qp_offset = 0,
341 .slice_beta_offset_div2 = 0,
342 .slice_tc_offset_div2 = 0,
343 .slice_act_y_qp_offset = 0,
344 .slice_act_cb_qp_offset = 0,
345 .slice_act_cr_qp_offset = 0,
346 .slice_qp_delta = 0, /* Filled in below */
347 /* Reserved */
348 .pWeightTable = NULL, // &hp->slice_wt,
349 };
350
351 hp->vkslice = (VkVideoEncodeH265NaluSliceSegmentInfoKHR) {
352 .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_NALU_SLICE_SEGMENT_INFO_KHR,
353 .pNext = NULL,
354 .constantQp = pic->type == FF_HW_PICTURE_TYPE_B ? enc->fixed_qp_b :
355 pic->type == FF_HW_PICTURE_TYPE_P ? enc->fixed_qp_p :
356 enc->fixed_qp_idr,
357 .pStdSliceSegmentHeader = &hp->slice_hdr,
358 };
359
360 if (enc->common.opts.rc_mode != VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DISABLED_BIT_KHR)
361 hp->vkslice.constantQp = 0;
362
363 hp->slice_hdr.slice_qp_delta = hp->vkslice.constantQp -
364 (enc->units.raw_pps.init_qp_minus26 + 26);
365
366 hp->vkh265pic_info.pNaluSliceSegmentEntries = &hp->vkslice;
367 hp->vkh265pic_info.naluSliceSegmentEntryCount = 1;
368}
369
370static void setup_refs(AVCodecContext *avctx,
372 VkVideoEncodeInfoKHR *encode_info)
373{
374 int i, j;
377
378 hp->ref_list_info = (StdVideoEncodeH265ReferenceListsInfo) {
379 .flags = (StdVideoEncodeH265ReferenceListsInfoFlags) {
380 .ref_pic_list_modification_flag_l0 = 0,
381 .ref_pic_list_modification_flag_l1 = 0,
382 /* Reserved */
383 },
384 /* May be overridden during setup_slices() */
385 .num_ref_idx_l0_active_minus1 = pic->nb_refs[0] - 1,
386 .num_ref_idx_l1_active_minus1 = pic->nb_refs[1] - 1,
387 /* Reserved */
388 .list_entry_l0 = { 0 },
389 .list_entry_l1 = { 0 },
390 };
391
392 for (i = 0; i < STD_VIDEO_H265_MAX_NUM_LIST_REF; i++)
393 hp->ref_list_info.RefPicList0[i] = hp->ref_list_info.RefPicList1[i] = -1;
394
395 /* Note: really not sure */
396 for (i = 0; i < pic->nb_refs[0]; i++) {
397 VkVideoReferenceSlotInfoKHR *slot_info;
398 slot_info = (VkVideoReferenceSlotInfoKHR *)&encode_info->pReferenceSlots[i];
399 hp->ref_list_info.RefPicList0[i] = slot_info->slotIndex;
400 }
401
402 /* Note: really not sure */
403 for (i = 0; i < pic->nb_refs[1]; i++) {
404 VkVideoReferenceSlotInfoKHR *slot_info;
405 slot_info = (VkVideoReferenceSlotInfoKHR *)&encode_info->pReferenceSlots[pic->nb_refs[0] + i];
406 hp->ref_list_info.RefPicList1[i] = slot_info->slotIndex;
407 }
408
409 hp->h265pic_info.pRefLists = &hp->ref_list_info;
410
411 if (pic->type != FF_HW_PICTURE_TYPE_IDR) {
412 StdVideoH265ShortTermRefPicSet *rps;
414 int rps_poc[MAX_DPB_SIZE];
415 int rps_used[MAX_DPB_SIZE];
416 int poc, rps_pics;
417
418 hp->h265pic_info.flags.short_term_ref_pic_set_sps_flag = 0;
419
420 rps = &hp->s_rps;
421 memset(rps, 0, sizeof(*rps));
422
423 rps_pics = 0;
424 for (i = 0; i < MAX_REFERENCE_LIST_NUM; i++) {
425 for (j = 0; j < pic->nb_refs[i]; j++) {
426 strp = pic->refs[i][j]->codec_priv;
427 rps_poc[rps_pics] = strp->pic_order_cnt;
428 rps_used[rps_pics] = 1;
429 ++rps_pics;
430 }
431 }
432
433 for (i = 0; i < pic->nb_dpb_pics; i++) {
434 if (pic->dpb[i] == pic)
435 continue;
436
437 for (j = 0; j < pic->nb_refs[0]; j++) {
438 if (pic->dpb[i] == pic->refs[0][j])
439 break;
440 }
441 if (j < pic->nb_refs[0])
442 continue;
443
444 for (j = 0; j < pic->nb_refs[1]; j++) {
445 if (pic->dpb[i] == pic->refs[1][j])
446 break;
447 }
448 if (j < pic->nb_refs[1])
449 continue;
450
451 strp = pic->dpb[i]->codec_priv;
452 rps_poc[rps_pics] = strp->pic_order_cnt;
453 rps_used[rps_pics] = 0;
454 ++rps_pics;
455 }
456
457 for (i = 1; i < rps_pics; i++) {
458 for (j = i; j > 0; j--) {
459 if (rps_poc[j] > rps_poc[j - 1])
460 break;
461 av_assert0(rps_poc[j] != rps_poc[j - 1]);
462 FFSWAP(int, rps_poc[j], rps_poc[j - 1]);
463 FFSWAP(int, rps_used[j], rps_used[j - 1]);
464 }
465 }
466
467 av_log(avctx, AV_LOG_DEBUG, "RPS for POC %d:", hp->pic_order_cnt);
468 for (i = 0; i < rps_pics; i++)
469 av_log(avctx, AV_LOG_DEBUG, " (%d,%d)", rps_poc[i], rps_used[i]);
470
471 av_log(avctx, AV_LOG_DEBUG, "\n");
472
473 for (i = 0; i < rps_pics; i++) {
474 av_assert0(rps_poc[i] != hp->pic_order_cnt);
475 if (rps_poc[i] > hp->pic_order_cnt)
476 break;
477 }
478
479 rps->num_negative_pics = i;
480 rps->used_by_curr_pic_s0_flag = 0x0;
481 poc = hp->pic_order_cnt;
482 for (j = i - 1; j >= 0; j--) {
483 rps->delta_poc_s0_minus1[i - 1 - j] = poc - rps_poc[j] - 1;
484 rps->used_by_curr_pic_s0_flag |= rps_used[j] << (i - 1 - j);
485 poc = rps_poc[j];
486 }
487
488 rps->num_positive_pics = rps_pics - i;
489 rps->used_by_curr_pic_s1_flag = 0x0;
490 poc = hp->pic_order_cnt;
491 for (j = i; j < rps_pics; j++) {
492 rps->delta_poc_s1_minus1[j - i] = rps_poc[j] - poc - 1;
493 rps->used_by_curr_pic_s1_flag |= rps_used[j] << (j - i);
494 poc = rps_poc[j];
495 }
496
497 hp->l_rps.num_long_term_sps = 0;
498 hp->l_rps.num_long_term_pics = 0;
499
500 // when this flag is not present, it is inerred to 1.
501 hp->slice_hdr.flags.collocated_from_l0_flag = 1;
502 hp->h265pic_info.flags.slice_temporal_mvp_enabled_flag =
504 if (hp->h265pic_info.flags.slice_temporal_mvp_enabled_flag) {
505 if (hp->slice_hdr.slice_type == STD_VIDEO_H265_SLICE_TYPE_B)
506 hp->slice_hdr.flags.collocated_from_l0_flag = 1;
507 hp->slice_hdr.collocated_ref_idx = 0;
508 }
509
510 hp->slice_hdr.flags.num_ref_idx_active_override_flag = 0;
511 hp->ref_list_info.num_ref_idx_l0_active_minus1 = enc->units.raw_pps.num_ref_idx_l0_default_active_minus1;
512 hp->ref_list_info.num_ref_idx_l1_active_minus1 = enc->units.raw_pps.num_ref_idx_l1_default_active_minus1;
513 }
514
515 hp->h265pic_info.pShortTermRefPicSet = &hp->s_rps;
516 hp->h265pic_info.pLongTermRefPics = &hp->l_rps;
517}
518
520 VkVideoEncodeInfoKHR *encode_info)
521{
522 int err;
524 FFVulkanEncodePicture *vp = pic->priv;
526 VkVideoReferenceSlotInfoKHR *ref_slot;
527
528 err = vk_enc_h265_update_pic_info(avctx, pic);
529 if (err < 0)
530 return err;
531
532 hp->vkh265pic_info = (VkVideoEncodeH265PictureInfoKHR) {
533 .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_PICTURE_INFO_KHR,
534 .pNext = NULL,
535 .pNaluSliceSegmentEntries = NULL, // Filled in during setup_slices()
536 .naluSliceSegmentEntryCount = 0, // Filled in during setup_slices()
537 .pStdPictureInfo = &hp->h265pic_info,
538 };
539
540 hp->h265pic_info = (StdVideoEncodeH265PictureInfo) {
541 .flags = (StdVideoEncodeH265PictureInfoFlags) {
542 .is_reference = pic->is_reference,
543 .IrapPicFlag = pic->type == FF_HW_PICTURE_TYPE_IDR,
544 .used_for_long_term_reference = 0,
545 .discardable_flag = 0,
546 .cross_layer_bla_flag = 0,
547 .pic_output_flag = 1,
548 .no_output_of_prior_pics_flag = 0,
549 .short_term_ref_pic_set_sps_flag = 0,
550 .slice_temporal_mvp_enabled_flag = enc->units.raw_sps.sps_temporal_mvp_enabled_flag,
551 /* Reserved */
552 },
553 .pic_type = hp->pic_type,
554 .sps_video_parameter_set_id = 0,
555 .pps_seq_parameter_set_id = 0,
556 .pps_pic_parameter_set_id = 0,
557 .short_term_ref_pic_set_idx = 0,
558 .PicOrderCntVal = hp->pic_order_cnt,
559 .TemporalId = 0,
560 /* Reserved */
561 .pRefLists = NULL, // Filled in during setup_refs
562 .pShortTermRefPicSet = NULL,
563 .pLongTermRefPics = NULL,
564 };
565 encode_info->pNext = &hp->vkh265pic_info;
566
567 hp->h265dpb_info = (StdVideoEncodeH265ReferenceInfo) {
568 .flags = (StdVideoEncodeH265ReferenceInfoFlags) {
569 .used_for_long_term_reference = 0,
570 .unused_for_reference = 0,
571 /* Reserved */
572 },
573 .pic_type = hp->h265pic_info.pic_type,
574 .PicOrderCntVal = hp->h265pic_info.PicOrderCntVal,
575 .TemporalId = hp->h265pic_info.TemporalId,
576 };
577 hp->vkh265dpb_info = (VkVideoEncodeH265DpbSlotInfoKHR) {
578 .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_DPB_SLOT_INFO_KHR,
579 .pStdReferenceInfo = &hp->h265dpb_info,
580 };
581
582 vp->dpb_slot.pNext = &hp->vkh265dpb_info;
583
584 ref_slot = (VkVideoReferenceSlotInfoKHR *)encode_info->pSetupReferenceSlot;
585 ref_slot->pNext = &hp->vkh265dpb_info;
586
587 setup_refs(avctx, pic, encode_info);
588
589 setup_slices(avctx, pic);
590
591 return 0;
592}
593
594static int init_profile(AVCodecContext *avctx,
595 VkVideoProfileInfoKHR *profile, void *pnext)
596{
597 VkResult ret;
600 FFVulkanContext *s = &ctx->s;
601 FFVulkanFunctions *vk = &ctx->s.vkfn;
602 VkVideoEncodeH265CapabilitiesKHR h265_caps = {
603 .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_CAPABILITIES_KHR,
604 };
605 VkVideoEncodeCapabilitiesKHR enc_caps = {
606 .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_CAPABILITIES_KHR,
607 .pNext = &h265_caps,
608 };
609 VkVideoCapabilitiesKHR caps = {
610 .sType = VK_STRUCTURE_TYPE_VIDEO_CAPABILITIES_KHR,
611 .pNext = &enc_caps,
612 };
613
614 /* In order of preference */
615 int last_supported = AV_PROFILE_UNKNOWN;
616 static const int known_profiles[] = {
620 };
621 int nb_profiles = FF_ARRAY_ELEMS(known_profiles);
622
623 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(s->frames->sw_format);
624 if (!desc)
625 return AVERROR(EINVAL);
626
627 if (s->frames->sw_format == AV_PIX_FMT_NV12)
628 nb_profiles = 1;
629 else if (s->frames->sw_format == AV_PIX_FMT_P010)
630 nb_profiles = 2;
631
632 enc->profile = (VkVideoEncodeH265ProfileInfoKHR) {
633 .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_PROFILE_INFO_KHR,
634 .pNext = pnext,
635 .stdProfileIdc = ff_vk_h265_profile_to_vk(avctx->profile),
636 };
637 profile->pNext = &enc->profile;
638
639 /* Set level */
640 if (avctx->level == AV_LEVEL_UNKNOWN)
641 avctx->level = enc->common.opts.level;
642
643 /* User has explicitly specified a profile. */
644 if (avctx->profile != AV_PROFILE_UNKNOWN)
645 return 0;
646
647 av_log(avctx, AV_LOG_DEBUG, "Supported profiles:\n");
648 for (int i = 0; i < nb_profiles; i++) {
649 enc->profile.stdProfileIdc = ff_vk_h265_profile_to_vk(known_profiles[i]);
650 ret = vk->GetPhysicalDeviceVideoCapabilitiesKHR(s->hwctx->phys_dev,
651 profile,
652 &caps);
653 if (ret == VK_SUCCESS) {
654 av_log(avctx, AV_LOG_DEBUG, " %s\n",
655 avcodec_profile_name(avctx->codec_id, known_profiles[i]));
656 last_supported = known_profiles[i];
657 }
658 }
659
660 if (last_supported == AV_PROFILE_UNKNOWN) {
661 av_log(avctx, AV_LOG_ERROR, "No supported profiles for given format\n");
662 return AVERROR(ENOTSUP);
663 }
664
665 enc->profile.stdProfileIdc = ff_vk_h265_profile_to_vk(last_supported);
666 av_log(avctx, AV_LOG_VERBOSE, "Using profile %s\n",
667 avcodec_profile_name(avctx->codec_id, last_supported));
668 avctx->profile = last_supported;
669
670 return 0;
671}
672
674{
676
677 if (avctx->rc_buffer_size)
678 enc->hrd_buffer_size = avctx->rc_buffer_size;
679 else if (avctx->rc_max_rate > 0)
680 enc->hrd_buffer_size = avctx->rc_max_rate;
681 else
682 enc->hrd_buffer_size = avctx->bit_rate;
683
684 if (avctx->rc_initial_buffer_occupancy) {
686 av_log(avctx, AV_LOG_ERROR, "Invalid RC buffer settings: "
687 "must have initial buffer size (%d) <= "
688 "buffer size (%"PRId64").\n",
690 return AVERROR(EINVAL);
691 }
693 } else {
694 enc->initial_buffer_fullness = enc->hrd_buffer_size * 3 / 4;
695 }
696
697 if (enc->common.opts.rc_mode == VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DISABLED_BIT_KHR) {
698 enc->fixed_qp_p = av_clip(enc->common.opts.qp,
699 enc->caps.minQp, enc->caps.maxQp);
700
701 if (avctx->i_quant_factor > 0.0)
702 enc->fixed_qp_idr = av_clip((avctx->i_quant_factor * enc->fixed_qp_p +
703 avctx->i_quant_offset) + 0.5,
704 enc->caps.minQp, enc->caps.maxQp);
705 else
706 enc->fixed_qp_idr = enc->fixed_qp_p;
707
708 if (avctx->b_quant_factor > 0.0)
709 enc->fixed_qp_b = av_clip((avctx->b_quant_factor * enc->fixed_qp_p +
710 avctx->b_quant_offset) + 0.5,
711 enc->caps.minQp, enc->caps.maxQp);
712 else
713 enc->fixed_qp_b = enc->fixed_qp_p;
714
715 av_log(avctx, AV_LOG_DEBUG, "Using fixed QP = "
716 "%d / %d / %d for IDR- / P- / B-frames.\n",
717 enc->fixed_qp_idr, enc->fixed_qp_p, enc->fixed_qp_b);
718 } else {
719 enc->fixed_qp_idr = 26;
720 enc->fixed_qp_p = 26;
721 enc->fixed_qp_b = 26;
722 }
723
724 return 0;
725}
726
728{
729 int err;
732 FFHWBaseEncodeContext *base_ctx = &ctx->base;
733
734 FFHWBaseEncodeH265 *units = &enc->units;
735 FFHWBaseEncodeH265Opts *unit_opts = &enc->unit_opts;
736
737 int max_ctb_size;
738 unsigned min_tb_size;
739 unsigned max_tb_size;
740 unsigned max_transform_hierarchy;
741
742 unit_opts->tier = enc->common.opts.tier;
743 unit_opts->fixed_qp_idr = enc->fixed_qp_idr;
744 unit_opts->cu_qp_delta_enabled_flag = enc->common.opts.rc_mode != VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DISABLED_BIT_KHR;
745
746 unit_opts->nb_slices = 1;
747
748 unit_opts->slice_block_rows = (avctx->height + base_ctx->slice_block_height - 1) /
749 base_ctx->slice_block_height;
750 unit_opts->slice_block_cols = (avctx->width + base_ctx->slice_block_width - 1) /
751 base_ctx->slice_block_width;
752
753 /* cabac already set via an option */
754 /* fixed_qp_idr initialized in init_enc_options() */
755 /* hrd_buffer_size initialized in init_enc_options() */
756 /* initial_buffer_fullness initialized in init_enc_options() */
757
759 units, unit_opts);
760 if (err < 0)
761 return err;
762
764 !!(enc->caps.stdSyntaxFlags & VK_VIDEO_ENCODE_H265_STD_SAMPLE_ADAPTIVE_OFFSET_ENABLED_FLAG_SET_BIT_KHR);
766 !!(enc->caps.stdSyntaxFlags & VK_VIDEO_ENCODE_H265_STD_TRANSFORM_SKIP_ENABLED_FLAG_SET_BIT_KHR);
767
768 max_ctb_size = 16;
769
770 /* coding blocks from 8x8 to max CTB size. */
771 if (enc->caps.ctbSizes & VK_VIDEO_ENCODE_H265_CTB_SIZE_64_BIT_KHR)
772 max_ctb_size = 64;
773 else if (enc->caps.ctbSizes & VK_VIDEO_ENCODE_H265_CTB_SIZE_32_BIT_KHR)
774 max_ctb_size = 32;
775
776 min_tb_size = 0;
777 max_tb_size = 0;
778 if (enc->caps.transformBlockSizes & VK_VIDEO_ENCODE_H265_TRANSFORM_BLOCK_SIZE_4_BIT_KHR)
779 min_tb_size = 4;
780 else if (enc->caps.transformBlockSizes & VK_VIDEO_ENCODE_H265_TRANSFORM_BLOCK_SIZE_8_BIT_KHR)
781 min_tb_size = 8;
782 else if (enc->caps.transformBlockSizes & VK_VIDEO_ENCODE_H265_TRANSFORM_BLOCK_SIZE_16_BIT_KHR)
783 min_tb_size = 16;
784 else if (enc->caps.transformBlockSizes & VK_VIDEO_ENCODE_H265_TRANSFORM_BLOCK_SIZE_32_BIT_KHR)
785 min_tb_size = 32;
786
787 if (enc->caps.transformBlockSizes & VK_VIDEO_ENCODE_H265_TRANSFORM_BLOCK_SIZE_32_BIT_KHR)
788 max_tb_size = 32;
789 else if (enc->caps.transformBlockSizes & VK_VIDEO_ENCODE_H265_TRANSFORM_BLOCK_SIZE_16_BIT_KHR)
790 max_tb_size = 16;
791 else if (enc->caps.transformBlockSizes & VK_VIDEO_ENCODE_H265_TRANSFORM_BLOCK_SIZE_8_BIT_KHR)
792 max_tb_size = 8;
793 else if (enc->caps.transformBlockSizes & VK_VIDEO_ENCODE_H265_TRANSFORM_BLOCK_SIZE_4_BIT_KHR)
794 max_tb_size = 4;
795
799 units->raw_sps.log2_diff_max_min_luma_transform_block_size = av_log2(max_tb_size) - av_log2(min_tb_size);
800
801 max_transform_hierarchy = av_log2(max_ctb_size) - av_log2(min_tb_size);
802 units->raw_sps.max_transform_hierarchy_depth_intra = max_transform_hierarchy;
803 units->raw_sps.max_transform_hierarchy_depth_intra = max_transform_hierarchy;
804
808
810
811 if (base_ctx->gop_size & base_ctx->gop_size - 1 == 0)
813 else
815
816 return 0;
817}
818
819typedef struct VulkanH265Units {
820 StdVideoH265SequenceParameterSet sps;
821 StdVideoH265ShortTermRefPicSet str[STD_VIDEO_H265_SUBLAYERS_LIST_SIZE];
822 StdVideoH265LongTermRefPicsSps ltr;
823 StdVideoH265ProfileTierLevel ptl_sps;
824 StdVideoH265DecPicBufMgr dpbm_sps;
825
826 StdVideoH265HrdParameters vui_header_sps;
827 StdVideoH265SequenceParameterSetVui vui_sps;
828
829 StdVideoH265SubLayerHrdParameters slhdrnal[HEVC_MAX_SUB_LAYERS];
830 StdVideoH265SubLayerHrdParameters slhdrvcl[HEVC_MAX_SUB_LAYERS];
831
832 StdVideoH265PictureParameterSet pps;
833 StdVideoH265ScalingLists pps_scaling;
834
835 StdVideoH265VideoParameterSet vps;
836 StdVideoH265ProfileTierLevel ptl_vps;
837 StdVideoH265DecPicBufMgr dpbm_vps;
838 StdVideoH265HrdParameters vui_header_vps;
840
842 VulkanH265Units *vk_units)
843{
845
846 H265RawSPS *sps = &enc->units.raw_sps;
847 StdVideoH265SequenceParameterSet *vksps = &vk_units->sps;
848 StdVideoH265ShortTermRefPicSet *str = vk_units->str;
849 StdVideoH265LongTermRefPicsSps *ltr = &vk_units->ltr;
850 StdVideoH265ProfileTierLevel *ptl_sps = &vk_units->ptl_sps;
851 StdVideoH265DecPicBufMgr *dpbm_sps = &vk_units->dpbm_sps;
852
853 StdVideoH265HrdParameters *vui_header_sps = &vk_units->vui_header_sps;
854 StdVideoH265SequenceParameterSetVui *vui_sps = &vk_units->vui_sps;
855
856 StdVideoH265SubLayerHrdParameters *slhdrnal = vk_units->slhdrnal;
857 StdVideoH265SubLayerHrdParameters *slhdrvcl = vk_units->slhdrvcl;
858
859 H265RawPPS *pps = &enc->units.raw_pps;
860 StdVideoH265PictureParameterSet *vkpps = &vk_units->pps;
861
862 H265RawVPS *vps = &enc->units.raw_vps;
863 StdVideoH265VideoParameterSet *vkvps = &vk_units->vps;
864 StdVideoH265ProfileTierLevel *ptl_vps = &vk_units->ptl_vps;
865 StdVideoH265DecPicBufMgr *dpbm_vps = &vk_units->dpbm_vps;
866 StdVideoH265HrdParameters *vui_header_vps = &vk_units->vui_header_vps;
867
868 /* SPS */
869 for (int i = 0; i < HEVC_MAX_SUB_LAYERS; i++) {
870 memcpy(&slhdrnal[i], &sps->vui.hrd_parameters.nal_sub_layer_hrd_parameters[i], sizeof(*slhdrnal));
871 memcpy(&slhdrvcl[i], &sps->vui.hrd_parameters.vcl_sub_layer_hrd_parameters[i], sizeof(*slhdrvcl));
872 slhdrnal[i].cbr_flag = 0x0;
873 slhdrvcl[i].cbr_flag = 0x0;
874 for (int j = 0; j < HEVC_MAX_CPB_CNT; j++) {
875 slhdrnal[i].cbr_flag |= sps->vui.hrd_parameters.nal_sub_layer_hrd_parameters[i].cbr_flag[j] << i;
876 slhdrvcl[i].cbr_flag |= sps->vui.hrd_parameters.vcl_sub_layer_hrd_parameters[i].cbr_flag[j] << i;
877 }
878 }
879
880 *vui_header_sps = (StdVideoH265HrdParameters) {
881 .flags = (StdVideoH265HrdFlags) {
882 .nal_hrd_parameters_present_flag = sps->vui.hrd_parameters.nal_hrd_parameters_present_flag,
883 .vcl_hrd_parameters_present_flag = sps->vui.hrd_parameters.vcl_hrd_parameters_present_flag,
884 .sub_pic_hrd_params_present_flag = sps->vui.hrd_parameters.sub_pic_hrd_params_present_flag,
885 .sub_pic_cpb_params_in_pic_timing_sei_flag = sps->vui.hrd_parameters.sub_pic_cpb_params_in_pic_timing_sei_flag,
886 .fixed_pic_rate_general_flag = 0x0,
887 .fixed_pic_rate_within_cvs_flag = 0x0,
888 .low_delay_hrd_flag = 0x0,
889 },
890 .tick_divisor_minus2 = sps->vui.hrd_parameters.tick_divisor_minus2,
891 .du_cpb_removal_delay_increment_length_minus1 = sps->vui.hrd_parameters.du_cpb_removal_delay_increment_length_minus1,
892 .dpb_output_delay_du_length_minus1 = sps->vui.hrd_parameters.dpb_output_delay_du_length_minus1,
893 .bit_rate_scale = sps->vui.hrd_parameters.bit_rate_scale,
894 .cpb_size_scale = sps->vui.hrd_parameters.cpb_size_scale,
895 .cpb_size_du_scale = sps->vui.hrd_parameters.cpb_size_du_scale,
896 .initial_cpb_removal_delay_length_minus1 = sps->vui.hrd_parameters.initial_cpb_removal_delay_length_minus1,
897 .au_cpb_removal_delay_length_minus1 = sps->vui.hrd_parameters.au_cpb_removal_delay_length_minus1,
898 .dpb_output_delay_length_minus1 = sps->vui.hrd_parameters.dpb_output_delay_length_minus1,
899 /* Reserved - 3*16 bits */
900 .pSubLayerHrdParametersNal = slhdrnal,
901 .pSubLayerHrdParametersVcl = slhdrvcl,
902 };
903
904 for (int i = 0; i < HEVC_MAX_SUB_LAYERS; i++) {
905 vui_header_sps->flags.fixed_pic_rate_general_flag |= sps->vui.hrd_parameters.fixed_pic_rate_general_flag[i] << i;
906 vui_header_sps->flags.fixed_pic_rate_within_cvs_flag |= sps->vui.hrd_parameters.fixed_pic_rate_within_cvs_flag[i] << i;
907 vui_header_sps->flags.low_delay_hrd_flag |= sps->vui.hrd_parameters.low_delay_hrd_flag[i] << i;
908 }
909
910 for (int i = 0; i < STD_VIDEO_H265_SUBLAYERS_LIST_SIZE; i++) {
911 dpbm_sps->max_latency_increase_plus1[i] = sps->sps_max_latency_increase_plus1[i];
912 dpbm_sps->max_dec_pic_buffering_minus1[i] = sps->sps_max_dec_pic_buffering_minus1[i];
913 dpbm_sps->max_num_reorder_pics[i] = sps->sps_max_num_reorder_pics[i];
914 }
915
916 *ptl_sps = (StdVideoH265ProfileTierLevel) {
917 .flags = (StdVideoH265ProfileTierLevelFlags) {
918 .general_tier_flag = sps->profile_tier_level.general_tier_flag,
919 .general_progressive_source_flag = sps->profile_tier_level.general_progressive_source_flag,
920 .general_interlaced_source_flag = sps->profile_tier_level.general_interlaced_source_flag,
921 .general_non_packed_constraint_flag = sps->profile_tier_level.general_non_packed_constraint_flag,
922 .general_frame_only_constraint_flag = sps->profile_tier_level.general_frame_only_constraint_flag,
923 },
924 .general_profile_idc = ff_vk_h265_profile_to_vk(sps->profile_tier_level.general_profile_idc),
925 .general_level_idc = ff_vk_h265_level_to_vk(sps->profile_tier_level.general_level_idc),
926 };
927
928 for (int i = 0; i < STD_VIDEO_H265_MAX_SHORT_TERM_REF_PIC_SETS; i++) {
929 const H265RawSTRefPicSet *st_rps = &sps->st_ref_pic_set[i];
930
931 str[i] = (StdVideoH265ShortTermRefPicSet) {
932 .flags = (StdVideoH265ShortTermRefPicSetFlags) {
933 .inter_ref_pic_set_prediction_flag = st_rps->inter_ref_pic_set_prediction_flag,
934 .delta_rps_sign = st_rps->delta_rps_sign,
935 },
936 .delta_idx_minus1 = st_rps->delta_idx_minus1,
937 .use_delta_flag = 0x0,
938 .abs_delta_rps_minus1 = st_rps->abs_delta_rps_minus1,
939 .used_by_curr_pic_flag = 0x0,
940 .used_by_curr_pic_s0_flag = 0x0,
941 .used_by_curr_pic_s1_flag = 0x0,
942 /* Reserved */
943 /* Reserved */
944 /* Reserved */
945 .num_negative_pics = st_rps->num_negative_pics,
946 .num_positive_pics = st_rps->num_positive_pics,
947 };
948
949 for (int j = 0; j < HEVC_MAX_REFS; j++) {
950 str[i].use_delta_flag |= st_rps->use_delta_flag[j] << i;
951 str[i].used_by_curr_pic_flag |= st_rps->used_by_curr_pic_flag[j] << i;
952 str[i].used_by_curr_pic_s0_flag |= st_rps->used_by_curr_pic_s0_flag[j] << i;
953 str[i].used_by_curr_pic_s1_flag |= st_rps->used_by_curr_pic_s1_flag[j] << i;
954 str[i].delta_poc_s0_minus1[j] = st_rps->delta_poc_s0_minus1[j];
955 str[i].delta_poc_s1_minus1[j] = st_rps->delta_poc_s1_minus1[j];
956 }
957 }
958
959 ltr->used_by_curr_pic_lt_sps_flag = 0;
960 for (int i = 0; i < STD_VIDEO_H265_MAX_LONG_TERM_REF_PICS_SPS; i++) {
961 ltr->used_by_curr_pic_lt_sps_flag |= sps->lt_ref_pic_poc_lsb_sps[i] << i;
962 ltr->lt_ref_pic_poc_lsb_sps[i] = sps->lt_ref_pic_poc_lsb_sps[i];
963 }
964
965 *vksps = (StdVideoH265SequenceParameterSet) {
966 .flags = (StdVideoH265SpsFlags) {
967 .sps_temporal_id_nesting_flag = sps->sps_temporal_id_nesting_flag,
968 .separate_colour_plane_flag = sps->separate_colour_plane_flag,
969 .conformance_window_flag = sps->conformance_window_flag,
970 .sps_sub_layer_ordering_info_present_flag = sps->sps_sub_layer_ordering_info_present_flag,
971 .scaling_list_enabled_flag = sps->scaling_list_enabled_flag,
972 .sps_scaling_list_data_present_flag = sps->sps_scaling_list_data_present_flag,
973 .amp_enabled_flag = sps->amp_enabled_flag,
974 .sample_adaptive_offset_enabled_flag = sps->sample_adaptive_offset_enabled_flag,
975 .pcm_enabled_flag = sps->pcm_enabled_flag,
976 .pcm_loop_filter_disabled_flag = sps->pcm_loop_filter_disabled_flag,
977 .long_term_ref_pics_present_flag = sps->long_term_ref_pics_present_flag,
978 .sps_temporal_mvp_enabled_flag = sps->sps_temporal_mvp_enabled_flag,
979 .strong_intra_smoothing_enabled_flag = sps->strong_intra_smoothing_enabled_flag,
980 .vui_parameters_present_flag = sps->vui_parameters_present_flag,
981 .sps_extension_present_flag = sps->sps_extension_present_flag,
982 .sps_range_extension_flag = sps->sps_range_extension_flag,
983 .transform_skip_rotation_enabled_flag = sps->transform_skip_rotation_enabled_flag,
984 .transform_skip_context_enabled_flag = sps->transform_skip_context_enabled_flag,
985 .implicit_rdpcm_enabled_flag = sps->implicit_rdpcm_enabled_flag,
986 .explicit_rdpcm_enabled_flag = sps->explicit_rdpcm_enabled_flag,
987 .extended_precision_processing_flag = sps->extended_precision_processing_flag,
988 .intra_smoothing_disabled_flag = sps->intra_smoothing_disabled_flag,
989 .high_precision_offsets_enabled_flag = sps->high_precision_offsets_enabled_flag,
990 .persistent_rice_adaptation_enabled_flag = sps->persistent_rice_adaptation_enabled_flag,
991 .cabac_bypass_alignment_enabled_flag = sps->cabac_bypass_alignment_enabled_flag,
992 .sps_scc_extension_flag = sps->sps_scc_extension_flag,
993 .sps_curr_pic_ref_enabled_flag = sps->sps_curr_pic_ref_enabled_flag,
994 .palette_mode_enabled_flag = sps->palette_mode_enabled_flag,
995 .sps_palette_predictor_initializers_present_flag = sps->sps_palette_predictor_initializer_present_flag,
996 .intra_boundary_filtering_disabled_flag = sps->intra_boundary_filtering_disable_flag,
997 },
998 .chroma_format_idc = sps->chroma_format_idc,
999 .pic_width_in_luma_samples = sps->pic_width_in_luma_samples,
1000 .pic_height_in_luma_samples = sps->pic_height_in_luma_samples,
1001 .sps_video_parameter_set_id = sps->sps_video_parameter_set_id,
1002 .sps_max_sub_layers_minus1 = sps->sps_max_sub_layers_minus1,
1003 .sps_seq_parameter_set_id = sps->sps_seq_parameter_set_id,
1004 .bit_depth_luma_minus8 = sps->bit_depth_luma_minus8,
1005 .bit_depth_chroma_minus8 = sps->bit_depth_chroma_minus8,
1006 .log2_max_pic_order_cnt_lsb_minus4 = sps->log2_max_pic_order_cnt_lsb_minus4,
1007 .log2_min_luma_coding_block_size_minus3 = sps->log2_min_luma_coding_block_size_minus3,
1008 .log2_diff_max_min_luma_coding_block_size = sps->log2_diff_max_min_luma_coding_block_size,
1009 .log2_min_luma_transform_block_size_minus2 = sps->log2_min_luma_transform_block_size_minus2,
1010 .log2_diff_max_min_luma_transform_block_size = sps->log2_diff_max_min_luma_transform_block_size,
1011 .max_transform_hierarchy_depth_inter = sps->max_transform_hierarchy_depth_inter,
1012 .max_transform_hierarchy_depth_intra = sps->max_transform_hierarchy_depth_intra,
1013 .num_short_term_ref_pic_sets = sps->num_short_term_ref_pic_sets,
1014 .num_long_term_ref_pics_sps = sps->num_long_term_ref_pics_sps,
1015 .pcm_sample_bit_depth_luma_minus1 = sps->pcm_sample_bit_depth_luma_minus1,
1016 .pcm_sample_bit_depth_chroma_minus1 = sps->pcm_sample_bit_depth_chroma_minus1,
1017 .log2_min_pcm_luma_coding_block_size_minus3 = sps->log2_min_pcm_luma_coding_block_size_minus3,
1018 .log2_diff_max_min_pcm_luma_coding_block_size = sps->log2_diff_max_min_pcm_luma_coding_block_size,
1019 /* Reserved */
1020 /* Reserved */
1021 .palette_max_size = sps->palette_max_size,
1022 .delta_palette_max_predictor_size = sps->delta_palette_max_predictor_size,
1023 .motion_vector_resolution_control_idc = sps->motion_vector_resolution_control_idc,
1024 .sps_num_palette_predictor_initializers_minus1 = sps->sps_num_palette_predictor_initializer_minus1,
1025 .conf_win_left_offset = sps->conf_win_left_offset,
1026 .conf_win_right_offset = sps->conf_win_right_offset,
1027 .conf_win_top_offset = sps->conf_win_top_offset,
1028 .conf_win_bottom_offset = sps->conf_win_bottom_offset,
1029 .pProfileTierLevel = ptl_sps,
1030 .pDecPicBufMgr = dpbm_sps,
1031 .pScalingLists = NULL,
1032 .pShortTermRefPicSet = str,
1033 .pLongTermRefPicsSps = ltr,
1034 .pSequenceParameterSetVui = vui_sps,
1035 .pPredictorPaletteEntries = NULL,
1036 };
1037
1038 /* PPS */
1039 *vkpps = (StdVideoH265PictureParameterSet) {
1040 .flags = (StdVideoH265PpsFlags) {
1041 .dependent_slice_segments_enabled_flag = pps->dependent_slice_segments_enabled_flag,
1042 .output_flag_present_flag = pps->output_flag_present_flag,
1043 .sign_data_hiding_enabled_flag = pps->sign_data_hiding_enabled_flag,
1044 .cabac_init_present_flag = pps->cabac_init_present_flag,
1045 .constrained_intra_pred_flag = pps->constrained_intra_pred_flag,
1046 .transform_skip_enabled_flag = pps->transform_skip_enabled_flag,
1047 .cu_qp_delta_enabled_flag = pps->cu_qp_delta_enabled_flag,
1048 .pps_slice_chroma_qp_offsets_present_flag = pps->pps_slice_chroma_qp_offsets_present_flag,
1049 .weighted_pred_flag = pps->weighted_pred_flag,
1050 .weighted_bipred_flag = pps->weighted_bipred_flag,
1051 .transquant_bypass_enabled_flag = pps->transquant_bypass_enabled_flag,
1052 .tiles_enabled_flag = pps->tiles_enabled_flag,
1053 .entropy_coding_sync_enabled_flag = pps->entropy_coding_sync_enabled_flag,
1054 .uniform_spacing_flag = pps->uniform_spacing_flag,
1055 .loop_filter_across_tiles_enabled_flag = pps->loop_filter_across_tiles_enabled_flag,
1056 .pps_loop_filter_across_slices_enabled_flag = pps->pps_loop_filter_across_slices_enabled_flag,
1057 .deblocking_filter_control_present_flag = pps->deblocking_filter_control_present_flag,
1058 .deblocking_filter_override_enabled_flag = pps->deblocking_filter_override_enabled_flag,
1059 .pps_deblocking_filter_disabled_flag = pps->pps_deblocking_filter_disabled_flag,
1060 .pps_scaling_list_data_present_flag = pps->pps_scaling_list_data_present_flag,
1061 .lists_modification_present_flag = pps->lists_modification_present_flag,
1062 .slice_segment_header_extension_present_flag = pps->slice_segment_header_extension_present_flag,
1063 .pps_extension_present_flag = pps->pps_extension_present_flag,
1064 .cross_component_prediction_enabled_flag = pps->cross_component_prediction_enabled_flag,
1065 .chroma_qp_offset_list_enabled_flag = pps->chroma_qp_offset_list_enabled_flag,
1066 .pps_curr_pic_ref_enabled_flag = pps->pps_curr_pic_ref_enabled_flag,
1067 .residual_adaptive_colour_transform_enabled_flag = pps->residual_adaptive_colour_transform_enabled_flag,
1068 .pps_slice_act_qp_offsets_present_flag = pps->pps_slice_act_qp_offsets_present_flag,
1069 .pps_palette_predictor_initializers_present_flag = pps->pps_palette_predictor_initializer_present_flag,
1070 .monochrome_palette_flag = pps->monochrome_palette_flag,
1071 .pps_range_extension_flag = pps->pps_range_extension_flag,
1072 },
1073 .pps_pic_parameter_set_id = pps->pps_pic_parameter_set_id,
1074 .pps_seq_parameter_set_id = pps->pps_seq_parameter_set_id,
1075 .sps_video_parameter_set_id = sps->sps_video_parameter_set_id,
1076 .num_extra_slice_header_bits = pps->num_extra_slice_header_bits,
1077 .num_ref_idx_l0_default_active_minus1 = pps->num_ref_idx_l0_default_active_minus1,
1078 .num_ref_idx_l1_default_active_minus1 = pps->num_ref_idx_l1_default_active_minus1,
1079 .init_qp_minus26 = pps->init_qp_minus26,
1080 .diff_cu_qp_delta_depth = pps->diff_cu_qp_delta_depth,
1081 .pps_cb_qp_offset = pps->pps_cb_qp_offset,
1082 .pps_cr_qp_offset = pps->pps_cr_qp_offset,
1083 .pps_beta_offset_div2 = pps->pps_beta_offset_div2,
1084 .pps_tc_offset_div2 = pps->pps_tc_offset_div2,
1085 .log2_parallel_merge_level_minus2 = pps->log2_parallel_merge_level_minus2,
1086 .log2_max_transform_skip_block_size_minus2 = pps->log2_max_transform_skip_block_size_minus2,
1087 .diff_cu_chroma_qp_offset_depth = pps->diff_cu_chroma_qp_offset_depth,
1088 .chroma_qp_offset_list_len_minus1 = pps->chroma_qp_offset_list_len_minus1,
1089 .log2_sao_offset_scale_luma = pps->log2_sao_offset_scale_luma,
1090 .log2_sao_offset_scale_chroma = pps->log2_sao_offset_scale_chroma,
1091 .pps_act_y_qp_offset_plus5 = pps->pps_act_y_qp_offset_plus5,
1092 .pps_act_cb_qp_offset_plus5 = pps->pps_act_cb_qp_offset_plus5,
1093 .pps_act_cr_qp_offset_plus3 = pps->pps_act_cr_qp_offset_plus3,
1094 .pps_num_palette_predictor_initializers = pps->pps_num_palette_predictor_initializer,
1095 .luma_bit_depth_entry_minus8 = pps->luma_bit_depth_entry_minus8,
1096 .chroma_bit_depth_entry_minus8 = pps->chroma_bit_depth_entry_minus8,
1097 .num_tile_columns_minus1 = pps->num_tile_columns_minus1,
1098 .num_tile_rows_minus1 = pps->num_tile_rows_minus1,
1099 .pScalingLists = NULL,
1100 .pPredictorPaletteEntries = NULL,
1101 };
1102
1103 for (int i = 0; i < pps->num_tile_columns_minus1; i++)
1104 vkpps->column_width_minus1[i] = pps->column_width_minus1[i];
1105
1106 for (int i = 0; i < pps->num_tile_rows_minus1; i++)
1107 vkpps->row_height_minus1[i] = pps->row_height_minus1[i];
1108
1109 for (int i = 0; i <= pps->chroma_qp_offset_list_len_minus1; i++) {
1110 vkpps->cb_qp_offset_list[i] = pps->cb_qp_offset_list[i];
1111 vkpps->cr_qp_offset_list[i] = pps->cr_qp_offset_list[i];
1112 }
1113
1114 /* VPS */
1115 for (int i = 0; i < STD_VIDEO_H265_SUBLAYERS_LIST_SIZE; i++) {
1116 dpbm_vps->max_latency_increase_plus1[i] = vps->vps_max_latency_increase_plus1[i];
1117 dpbm_vps->max_dec_pic_buffering_minus1[i] = vps->vps_max_dec_pic_buffering_minus1[i];
1118 dpbm_vps->max_num_reorder_pics[i] = vps->vps_max_num_reorder_pics[i];
1119 }
1120
1121 *ptl_vps = (StdVideoH265ProfileTierLevel) {
1122 .flags = (StdVideoH265ProfileTierLevelFlags) {
1123 .general_tier_flag = vps->profile_tier_level.general_tier_flag,
1124 .general_progressive_source_flag = vps->profile_tier_level.general_progressive_source_flag,
1125 .general_interlaced_source_flag = vps->profile_tier_level.general_interlaced_source_flag,
1126 .general_non_packed_constraint_flag = vps->profile_tier_level.general_non_packed_constraint_flag,
1127 .general_frame_only_constraint_flag = vps->profile_tier_level.general_frame_only_constraint_flag,
1128 },
1129 .general_profile_idc = ff_vk_h265_profile_to_vk(vps->profile_tier_level.general_profile_idc),
1130 .general_level_idc = ff_vk_h265_level_to_vk(vps->profile_tier_level.general_level_idc),
1131 };
1132
1133 *vkvps = (StdVideoH265VideoParameterSet) {
1134 .flags = (StdVideoH265VpsFlags) {
1135 .vps_temporal_id_nesting_flag = vps->vps_temporal_id_nesting_flag,
1136 .vps_sub_layer_ordering_info_present_flag = vps->vps_sub_layer_ordering_info_present_flag,
1137 .vps_timing_info_present_flag = vps->vps_timing_info_present_flag,
1138 .vps_poc_proportional_to_timing_flag = vps->vps_poc_proportional_to_timing_flag,
1139 },
1140 .vps_video_parameter_set_id = vps->vps_video_parameter_set_id,
1141 .vps_max_sub_layers_minus1 = vps->vps_max_sub_layers_minus1,
1142 /* Reserved */
1143 /* Reserved */
1144 .vps_num_units_in_tick = vps->vps_num_units_in_tick,
1145 .vps_time_scale = vps->vps_time_scale,
1146 .vps_num_ticks_poc_diff_one_minus1 = vps->vps_num_ticks_poc_diff_one_minus1,
1147 /* Reserved */
1148 .pDecPicBufMgr = dpbm_vps,
1149 .pHrdParameters = vui_header_vps,
1150 .pProfileTierLevel = ptl_vps,
1151 };
1152
1153 return 0;
1154}
1155
1157{
1158 int err;
1159 VulkanEncodeH265Context *enc = avctx->priv_data;
1161 FFVulkanContext *s = &ctx->s;
1162 FFVulkanFunctions *vk = &ctx->s.vkfn;
1163
1164 VulkanH265Units vk_units = { 0 };
1165
1166 VkVideoEncodeH265SessionParametersAddInfoKHR h265_params_info;
1167 VkVideoEncodeH265SessionParametersCreateInfoKHR h265_params;
1168
1169 /* Convert it to Vulkan */
1170 err = base_unit_to_vk(avctx, &vk_units);
1171 if (err < 0) {
1172 av_log(avctx, AV_LOG_ERROR, "Unable to convert SPS/PPS units to Vulkan: %s\n",
1173 av_err2str(err));
1174 return err;
1175 }
1176
1177 /* Destroy the session params */
1178 if (ctx->session_params)
1179 vk->DestroyVideoSessionParametersKHR(s->hwctx->act_dev,
1180 ctx->session_params,
1181 s->hwctx->alloc);
1182
1183 h265_params_info = (VkVideoEncodeH265SessionParametersAddInfoKHR) {
1184 .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_PARAMETERS_ADD_INFO_KHR,
1185 .pStdSPSs = &vk_units.sps,
1186 .stdSPSCount = 1,
1187 .pStdPPSs = &vk_units.pps,
1188 .stdPPSCount = 1,
1189 .pStdVPSs = &vk_units.vps,
1190 .stdVPSCount = 1,
1191 };
1192 h265_params = (VkVideoEncodeH265SessionParametersCreateInfoKHR) {
1193 .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_PARAMETERS_CREATE_INFO_KHR,
1194 .maxStdSPSCount = 1,
1195 .maxStdPPSCount = 1,
1196 .maxStdVPSCount = 1,
1197 .pParametersAddInfo = &h265_params_info,
1198 };
1199
1200 return ff_vulkan_encode_create_session_params(avctx, ctx, &h265_params);
1201}
1202
1204 const uint8_t *data, size_t size,
1205 int sps_override, int pps_override)
1206{
1207 int err;
1208 VulkanEncodeH265Context *enc = avctx->priv_data;
1209
1211 CodedBitstreamFragment au = { 0 };
1212
1213 err = ff_cbs_init(&cbs, AV_CODEC_ID_HEVC, avctx);
1214 if (err < 0)
1215 return err;
1216
1217 err = ff_cbs_read(cbs, &au, NULL, data, size);
1218 if (err < 0) {
1219 av_log(avctx, AV_LOG_ERROR, "Unable to parse feedback units, bad drivers: %s\n",
1220 av_err2str(err));
1221 goto fail;
1222 }
1223
1224 if (sps_override) {
1225 for (int i = 0; i < au.nb_units; i++) {
1226 if (au.units[i].type == HEVC_NAL_SPS) {
1227 H265RawSPS *sps = au.units[i].content;
1228 enc->units.raw_sps.pic_width_in_luma_samples = sps->pic_width_in_luma_samples;
1229 enc->units.raw_sps.pic_height_in_luma_samples = sps->pic_height_in_luma_samples;
1230 enc->units.raw_sps.log2_diff_max_min_luma_coding_block_size = sps->log2_diff_max_min_luma_coding_block_size;
1231 enc->units.raw_sps.max_transform_hierarchy_depth_inter = sps->max_transform_hierarchy_depth_inter;
1232 enc->units.raw_sps.max_transform_hierarchy_depth_intra = sps->max_transform_hierarchy_depth_intra;
1233 }
1234 }
1235 }
1236
1237 /* If PPS has an override, just copy it entirely. */
1238 if (pps_override) {
1239 for (int i = 0; i < au.nb_units; i++) {
1240 if (au.units[i].type == HEVC_NAL_PPS) {
1241 H265RawPPS *pps = au.units[i].content;
1242 memcpy(&enc->units.raw_pps, pps, sizeof(*pps));
1243 enc->fixed_qp_idr = pps->init_qp_minus26 + 26;
1244 break;
1245 }
1246 }
1247 }
1248
1249 err = 0;
1250fail:
1251 ff_cbs_fragment_free(&au);
1252 ff_cbs_close(&cbs);
1253
1254 return err;
1255}
1256
1258{
1259 int err;
1260 VkResult ret;
1261 VulkanEncodeH265Context *enc = avctx->priv_data;
1263 FFVulkanContext *s = &ctx->s;
1264 FFVulkanFunctions *vk = &ctx->s.vkfn;
1265
1266 VkVideoEncodeH265SessionParametersGetInfoKHR h265_params_info;
1267 VkVideoEncodeSessionParametersGetInfoKHR params_info;
1268 VkVideoEncodeH265SessionParametersFeedbackInfoKHR h265_params_feedback;
1269 VkVideoEncodeSessionParametersFeedbackInfoKHR params_feedback;
1270
1271 void *data = NULL;
1272 size_t data_size = 0;
1273
1274 /* Generate SPS/PPS unit info */
1275 err = init_sequence_headers(avctx);
1276 if (err < 0) {
1277 av_log(avctx, AV_LOG_ERROR, "Unable to initialize SPS/PPS units: %s\n",
1278 av_err2str(err));
1279 return err;
1280 }
1281
1282 /* Create session parameters from them */
1283 err = create_session_params(avctx);
1284 if (err < 0)
1285 return err;
1286
1287 h265_params_info = (VkVideoEncodeH265SessionParametersGetInfoKHR) {
1288 .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_PARAMETERS_GET_INFO_KHR,
1289 .writeStdSPS = 1,
1290 .writeStdPPS = 1,
1291 .writeStdVPS = 1,
1292 .stdSPSId = enc->units.raw_sps.sps_seq_parameter_set_id,
1293 .stdPPSId = enc->units.raw_pps.pps_pic_parameter_set_id,
1294 .stdVPSId = enc->units.raw_vps.vps_video_parameter_set_id,
1295 };
1296 params_info = (VkVideoEncodeSessionParametersGetInfoKHR) {
1297 .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_SESSION_PARAMETERS_GET_INFO_KHR,
1298 .pNext = &h265_params_info,
1299 .videoSessionParameters = ctx->session_params,
1300 };
1301
1302 h265_params_feedback = (VkVideoEncodeH265SessionParametersFeedbackInfoKHR) {
1303 .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_PARAMETERS_FEEDBACK_INFO_KHR,
1304 };
1305 params_feedback = (VkVideoEncodeSessionParametersFeedbackInfoKHR) {
1306 .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_SESSION_PARAMETERS_FEEDBACK_INFO_KHR,
1307 .pNext = &h265_params_feedback,
1308 };
1309
1310 ret = vk->GetEncodedVideoSessionParametersKHR(s->hwctx->act_dev, &params_info,
1311 &params_feedback,
1312 &data_size, data);
1313 if (ret == VK_INCOMPLETE ||
1314 (ret == VK_SUCCESS) && (data_size > 0)) {
1315 data = av_mallocz(data_size);
1316 if (!data)
1317 return AVERROR(ENOMEM);
1318 } else {
1319 av_log(avctx, AV_LOG_ERROR, "Unable to get feedback for H.265 units = %zu\n", data_size);
1320 return AVERROR_EXTERNAL;
1321 }
1322
1323 ret = vk->GetEncodedVideoSessionParametersKHR(s->hwctx->act_dev, &params_info,
1324 &params_feedback,
1325 &data_size, data);
1326 if (ret != VK_SUCCESS) {
1327 av_log(avctx, AV_LOG_ERROR, "Error writing feedback units\n");
1328 err = AVERROR_EXTERNAL;
1329 goto end;
1330 }
1331
1332 av_log(avctx, AV_LOG_VERBOSE, "Feedback units written, overrides: %i (SPS: %i PPS: %i VPS: %i)\n",
1333 params_feedback.hasOverrides,
1334 h265_params_feedback.hasStdSPSOverrides,
1335 h265_params_feedback.hasStdPPSOverrides,
1336 h265_params_feedback.hasStdVPSOverrides);
1337
1338 params_feedback.hasOverrides = 1;
1339 h265_params_feedback.hasStdSPSOverrides = 1;
1340 h265_params_feedback.hasStdPPSOverrides = 1;
1341
1342 /* No need to sync any overrides */
1343 err = 0;
1344 if (!params_feedback.hasOverrides)
1345 goto end;
1346
1347 /* Parse back tne units and override */
1348 err = parse_feedback_units(avctx, data, data_size,
1349 h265_params_feedback.hasStdSPSOverrides,
1350 h265_params_feedback.hasStdPPSOverrides);
1351 if (err < 0)
1352 goto end;
1353
1354 /* Create final session parameters */
1355 err = create_session_params(avctx);
1356
1357end:
1358 av_free(data);
1359 return err;
1360}
1361
1364 void *nal_unit)
1365{
1366 H265RawNALUnitHeader *header = nal_unit;
1367
1368 int err = ff_cbs_insert_unit_content(au, -1,
1369 header->nal_unit_type, nal_unit, NULL);
1370 if (err < 0)
1371 av_log(avctx, AV_LOG_ERROR, "Failed to add NAL unit: "
1372 "type = %d.\n", header->nal_unit_type);
1373
1374 return err;
1375}
1376
1378 uint8_t *data, size_t *data_len,
1380{
1381 VulkanEncodeH265Context *enc = avctx->priv_data;
1382
1383 int err = ff_cbs_write_fragment_data(enc->cbs, au);
1384 if (err < 0) {
1385 av_log(avctx, AV_LOG_ERROR, "Failed to write packed header.\n");
1386 return err;
1387 }
1388
1389 if (*data_len < au->data_size) {
1390 av_log(avctx, AV_LOG_ERROR, "Access unit too large: %zu < %zu.\n",
1391 *data_len, au->data_size);
1392 return AVERROR(ENOSPC);
1393 }
1394
1395 memcpy(data, au->data, au->data_size);
1396 *data_len = au->data_size;
1397
1398 return 0;
1399}
1400
1402 FFHWBaseEncodePicture *base_pic,
1403 uint8_t *data, size_t *data_len)
1404{
1405 int err;
1406 VulkanEncodeH265Context *enc = avctx->priv_data;
1407 VulkanEncodeH265Picture *hp = base_pic ? base_pic->codec_priv : NULL;
1409
1410 if (hp && hp->units_needed & UNIT_AUD) {
1411 err = vulkan_encode_h265_add_nal(avctx, au, &enc->raw_aud);
1412 if (err < 0)
1413 goto fail;
1414 hp->units_needed &= ~UNIT_AUD;
1415 }
1416
1417 err = vulkan_encode_h265_add_nal(avctx, au, &enc->units.raw_vps);
1418 if (err < 0)
1419 goto fail;
1420
1421 err = vulkan_encode_h265_add_nal(avctx, au, &enc->units.raw_sps);
1422 if (err < 0)
1423 goto fail;
1424
1425 err = vulkan_encode_h265_add_nal(avctx, au, &enc->units.raw_pps);
1426 if (err < 0)
1427 goto fail;
1428
1429 err = write_access_unit(avctx, data, data_len, au);
1430fail:
1431 ff_cbs_fragment_reset(au);
1432 return err;
1433}
1434
1436 FFHWBaseEncodePicture *base_pic,
1437 uint8_t *data, size_t *data_len)
1438{
1439 int err;
1440 VulkanEncodeH265Context *enc = avctx->priv_data;
1441 VulkanEncodeH265Picture *hp = base_pic->codec_priv;
1443
1444 if (hp->units_needed & UNIT_AUD) {
1445 err = vulkan_encode_h265_add_nal(avctx, au, &enc->raw_aud);
1446 if (err < 0)
1447 goto fail;
1448 }
1449
1451 err = ff_cbs_sei_add_message(enc->cbs, au, 1,
1454 if (err < 0)
1455 goto fail;
1456 }
1457
1459 err = ff_cbs_sei_add_message(enc->cbs, au, 1,
1462 if (err < 0)
1463 goto fail;
1464 }
1465 if (hp->units_needed & UNIT_SEI_A53_CC) {
1466 err = ff_cbs_sei_add_message(enc->cbs, au, 1,
1468 &enc->sei_a53cc, NULL);
1469 if (err < 0)
1470 goto fail;
1471 }
1472
1473 if (hp->units_needed) {
1474 err = write_access_unit(avctx, data, data_len, au);
1475 if (err < 0)
1476 goto fail;
1477 } else {
1478 err = 0;
1479 *data_len = 0;
1480 }
1481
1482fail:
1483 ff_cbs_fragment_reset(au);
1484 return err;
1485}
1486
1487static int write_filler(AVCodecContext *avctx, uint32_t filler,
1488 uint8_t *data, size_t *data_len)
1489{
1490 int err;
1491 VulkanEncodeH265Context *enc = avctx->priv_data;
1493
1494 H265RawFiller raw_filler = {
1495 .nal_unit_header =
1496 {
1497 .nal_unit_type = HEVC_NAL_FD_NUT,
1498 .nuh_temporal_id_plus1 = 1,
1499 },
1500 .filler_size = filler,
1501 };
1502
1503 err = vulkan_encode_h265_add_nal(avctx, au, &raw_filler);
1504 if (err < 0)
1505 goto fail;
1506
1507 err = write_access_unit(avctx, data, data_len, au);
1508fail:
1509 ff_cbs_fragment_reset(au);
1510 return err;
1511}
1512
1526
1528{
1529 int err, ref_l0, ref_l1;
1530 VulkanEncodeH265Context *enc = avctx->priv_data;
1532 FFHWBaseEncodeContext *base_ctx = &ctx->base;
1533 int flags;
1534
1535 if (avctx->profile == AV_PROFILE_UNKNOWN)
1536 avctx->profile = enc->common.opts.profile;
1537
1538 enc->caps = (VkVideoEncodeH265CapabilitiesKHR) {
1539 .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_CAPABILITIES_KHR,
1540 };
1541
1542 enc->quality_props = (VkVideoEncodeH265QualityLevelPropertiesKHR) {
1543 .sType = VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_QUALITY_LEVEL_PROPERTIES_KHR,
1544 };
1545
1546 err = ff_vulkan_encode_init(avctx, &enc->common,
1548 &enc->caps, &enc->quality_props);
1549 if (err < 0)
1550 return err;
1551
1552 av_log(avctx, AV_LOG_VERBOSE, "H265 encoder capabilities:\n");
1553 av_log(avctx, AV_LOG_VERBOSE, " Standard capability flags:\n");
1554 av_log(avctx, AV_LOG_VERBOSE, " separate_color_plane: %i\n",
1555 !!(enc->caps.stdSyntaxFlags & VK_VIDEO_ENCODE_H265_STD_SEPARATE_COLOR_PLANE_FLAG_SET_BIT_KHR));
1556 av_log(avctx, AV_LOG_VERBOSE, " sample_adaptive_offset: %i\n",
1557 !!(enc->caps.stdSyntaxFlags & VK_VIDEO_ENCODE_H265_STD_SAMPLE_ADAPTIVE_OFFSET_ENABLED_FLAG_SET_BIT_KHR));
1558 av_log(avctx, AV_LOG_VERBOSE, " scaling_lists: %i\n",
1559 !!(enc->caps.stdSyntaxFlags & VK_VIDEO_ENCODE_H265_STD_SCALING_LIST_DATA_PRESENT_FLAG_SET_BIT_KHR));
1560 av_log(avctx, AV_LOG_VERBOSE, " pcm: %i\n",
1561 !!(enc->caps.stdSyntaxFlags & VK_VIDEO_ENCODE_H265_STD_PCM_ENABLED_FLAG_SET_BIT_KHR));
1562 av_log(avctx, AV_LOG_VERBOSE, " temporal_mvp: %i\n",
1563 !!(enc->caps.stdSyntaxFlags & VK_VIDEO_ENCODE_H265_STD_SPS_TEMPORAL_MVP_ENABLED_FLAG_SET_BIT_KHR));
1564 av_log(avctx, AV_LOG_VERBOSE, " init_qp: %i\n",
1565 !!(enc->caps.stdSyntaxFlags & VK_VIDEO_ENCODE_H265_STD_INIT_QP_MINUS26_BIT_KHR));
1566 av_log(avctx, AV_LOG_VERBOSE, " weighted:%s%s\n",
1567 enc->caps.stdSyntaxFlags & VK_VIDEO_ENCODE_H265_STD_WEIGHTED_PRED_FLAG_SET_BIT_KHR ?
1568 " pred" : "",
1569 enc->caps.stdSyntaxFlags & VK_VIDEO_ENCODE_H265_STD_WEIGHTED_BIPRED_FLAG_SET_BIT_KHR ?
1570 " bipred" : "");
1571 av_log(avctx, AV_LOG_VERBOSE, " parallel_merge_level: %i\n",
1572 !!(enc->caps.stdSyntaxFlags & VK_VIDEO_ENCODE_H265_STD_LOG2_PARALLEL_MERGE_LEVEL_MINUS2_BIT_KHR));
1573 av_log(avctx, AV_LOG_VERBOSE, " sign_data_hiding: %i\n",
1574 !!(enc->caps.stdSyntaxFlags & VK_VIDEO_ENCODE_H265_STD_SIGN_DATA_HIDING_ENABLED_FLAG_SET_BIT_KHR));
1575 av_log(avctx, AV_LOG_VERBOSE, " transform_skip:%s%s\n",
1576 enc->caps.stdSyntaxFlags & VK_VIDEO_ENCODE_H265_STD_TRANSFORM_SKIP_ENABLED_FLAG_SET_BIT_KHR ?
1577 " set" : "",
1578 enc->caps.stdSyntaxFlags & VK_VIDEO_ENCODE_H265_STD_TRANSFORM_SKIP_ENABLED_FLAG_UNSET_BIT_KHR ?
1579 " unset" : "");
1580 av_log(avctx, AV_LOG_VERBOSE, " slice_chroma_qp_offsets: %i\n",
1581 !!(enc->caps.stdSyntaxFlags & VK_VIDEO_ENCODE_H265_STD_PPS_SLICE_CHROMA_QP_OFFSETS_PRESENT_FLAG_SET_BIT_KHR));
1582 av_log(avctx, AV_LOG_VERBOSE, " transquant_bypass: %i\n",
1583 !!(enc->caps.stdSyntaxFlags & VK_VIDEO_ENCODE_H265_STD_TRANSQUANT_BYPASS_ENABLED_FLAG_SET_BIT_KHR));
1584 av_log(avctx, AV_LOG_VERBOSE, " constrained_intra_pred: %i\n",
1585 !!(enc->caps.stdSyntaxFlags & VK_VIDEO_ENCODE_H265_STD_CONSTRAINED_INTRA_PRED_FLAG_SET_BIT_KHR));
1586 av_log(avctx, AV_LOG_VERBOSE, " entrypy_coding_sync: %i\n",
1587 !!(enc->caps.stdSyntaxFlags & VK_VIDEO_ENCODE_H265_STD_ENTROPY_CODING_SYNC_ENABLED_FLAG_SET_BIT_KHR));
1588 av_log(avctx, AV_LOG_VERBOSE, " dependent_slice_segment:%s%s\n",
1589 enc->caps.stdSyntaxFlags & VK_VIDEO_ENCODE_H265_STD_DEPENDENT_SLICE_SEGMENTS_ENABLED_FLAG_SET_BIT_KHR ?
1590 " enabled" : "",
1591 enc->caps.stdSyntaxFlags & VK_VIDEO_ENCODE_H265_STD_DEPENDENT_SLICE_SEGMENT_FLAG_SET_BIT_KHR ?
1592 " set" : "");
1593 av_log(avctx, AV_LOG_VERBOSE, " slice_qp_delta: %i\n",
1594 !!(enc->caps.stdSyntaxFlags & VK_VIDEO_ENCODE_H265_STD_SLICE_QP_DELTA_BIT_KHR));
1595 av_log(avctx, AV_LOG_VERBOSE, " different_slice_qp_delta: %i\n",
1596 !!(enc->caps.stdSyntaxFlags & VK_VIDEO_ENCODE_H265_STD_DIFFERENT_SLICE_QP_DELTA_BIT_KHR));
1597
1598 av_log(avctx, AV_LOG_VERBOSE, " Capability flags:\n");
1599 av_log(avctx, AV_LOG_VERBOSE, " hdr_compliance: %i\n",
1600 !!(enc->caps.flags & VK_VIDEO_ENCODE_H265_CAPABILITY_HRD_COMPLIANCE_BIT_KHR));
1601 av_log(avctx, AV_LOG_VERBOSE, " pred_weight_table_generated: %i\n",
1602 !!(enc->caps.flags & VK_VIDEO_ENCODE_H265_CAPABILITY_PREDICTION_WEIGHT_TABLE_GENERATED_BIT_KHR));
1603 av_log(avctx, AV_LOG_VERBOSE, " row_unaligned_slice: %i\n",
1604 !!(enc->caps.flags & VK_VIDEO_ENCODE_H265_CAPABILITY_ROW_UNALIGNED_SLICE_SEGMENT_BIT_KHR));
1605 av_log(avctx, AV_LOG_VERBOSE, " different_slice_type: %i\n",
1606 !!(enc->caps.flags & VK_VIDEO_ENCODE_H265_CAPABILITY_DIFFERENT_SLICE_SEGMENT_TYPE_BIT_KHR));
1607 av_log(avctx, AV_LOG_VERBOSE, " b_frame_in_l0_list: %i\n",
1608 !!(enc->caps.flags & VK_VIDEO_ENCODE_H265_CAPABILITY_B_FRAME_IN_L0_LIST_BIT_KHR));
1609 av_log(avctx, AV_LOG_VERBOSE, " b_frame_in_l1_list: %i\n",
1610 !!(enc->caps.flags & VK_VIDEO_ENCODE_H265_CAPABILITY_B_FRAME_IN_L1_LIST_BIT_KHR));
1611 av_log(avctx, AV_LOG_VERBOSE, " per_pict_type_min_max_qp: %i\n",
1612 !!(enc->caps.flags & VK_VIDEO_ENCODE_H265_CAPABILITY_PER_PICTURE_TYPE_MIN_MAX_QP_BIT_KHR));
1613 av_log(avctx, AV_LOG_VERBOSE, " per_slice_constant_qp: %i\n",
1614 !!(enc->caps.flags & VK_VIDEO_ENCODE_H265_CAPABILITY_PER_SLICE_SEGMENT_CONSTANT_QP_BIT_KHR));
1615
1616 av_log(avctx, AV_LOG_VERBOSE, " Capabilities:\n");
1617 av_log(avctx, AV_LOG_VERBOSE, " maxLevelIdc: %i\n",
1618 enc->caps.maxLevelIdc);
1619 av_log(avctx, AV_LOG_VERBOSE, " maxSliceCount: %i\n",
1620 enc->caps.maxSliceSegmentCount);
1621 av_log(avctx, AV_LOG_VERBOSE, " maxTiles: %ix%i\n",
1622 enc->caps.maxTiles.width, enc->caps.maxTiles.height);
1623 av_log(avctx, AV_LOG_VERBOSE, " cbtSizes: 0x%x\n",
1624 enc->caps.ctbSizes);
1625 av_log(avctx, AV_LOG_VERBOSE, " transformBlockSizes: 0x%x\n",
1626 enc->caps.transformBlockSizes);
1627 av_log(avctx, AV_LOG_VERBOSE, " max(P/B)PictureL0ReferenceCount: %i P's; %i B's\n",
1628 enc->caps.maxPPictureL0ReferenceCount,
1629 enc->caps.maxBPictureL0ReferenceCount);
1630 av_log(avctx, AV_LOG_VERBOSE, " maxL1ReferenceCount: %i\n",
1631 enc->caps.maxL1ReferenceCount);
1632 av_log(avctx, AV_LOG_VERBOSE, " maxSubLayerCount: %i\n",
1633 enc->caps.maxSubLayerCount);
1634 av_log(avctx, AV_LOG_VERBOSE, " expectDyadicTemporalLayerPattern: %i\n",
1635 enc->caps.expectDyadicTemporalSubLayerPattern);
1636 av_log(avctx, AV_LOG_VERBOSE, " min/max Qp: [%i, %i]\n",
1637 enc->caps.minQp, enc->caps.maxQp);
1638 av_log(avctx, AV_LOG_VERBOSE, " prefersGopRemainingFrames: %i\n",
1639 enc->caps.prefersGopRemainingFrames);
1640 av_log(avctx, AV_LOG_VERBOSE, " requiresGopRemainingFrames: %i\n",
1641 enc->caps.requiresGopRemainingFrames);
1642
1643 err = init_enc_options(avctx);
1644 if (err < 0)
1645 return err;
1646
1647 flags = ctx->codec->flags;
1648 if (!enc->caps.maxPPictureL0ReferenceCount &&
1649 !enc->caps.maxBPictureL0ReferenceCount &&
1650 !enc->caps.maxL1ReferenceCount) {
1651 /* Intra-only */
1653 ref_l0 = ref_l1 = 0;
1654 } else if (!enc->caps.maxPPictureL0ReferenceCount) {
1655 /* No P-frames? How. */
1656 base_ctx->p_to_gpb = 1;
1657 ref_l0 = enc->caps.maxBPictureL0ReferenceCount;
1658 ref_l1 = enc->caps.maxL1ReferenceCount;
1659 } else if (!enc->caps.maxBPictureL0ReferenceCount &&
1660 !enc->caps.maxL1ReferenceCount) {
1661 /* No B-frames */
1663 ref_l0 = enc->caps.maxPPictureL0ReferenceCount;
1664 ref_l1 = 0;
1665 } else {
1666 /* P and B frames */
1667 ref_l0 = FFMIN(enc->caps.maxPPictureL0ReferenceCount,
1668 enc->caps.maxBPictureL0ReferenceCount);
1669 ref_l1 = enc->caps.maxL1ReferenceCount;
1670 }
1671
1672 err = ff_hw_base_init_gop_structure(base_ctx, avctx, ref_l0, ref_l1,
1673 flags, 0);
1674 if (err < 0)
1675 return err;
1676
1677 base_ctx->output_delay = base_ctx->b_per_p;
1678 base_ctx->decode_delay = base_ctx->max_b_depth;
1679
1680 /* Init CBS */
1681 err = ff_cbs_init(&enc->cbs, AV_CODEC_ID_HEVC, avctx);
1682 if (err < 0)
1683 return err;
1684
1685 /* Create units and session parameters */
1686 err = init_base_units(avctx);
1687 if (err < 0)
1688 return err;
1689
1690 /* Write out extradata */
1691 err = ff_vulkan_write_global_header(avctx, &enc->common);
1692 if (err < 0)
1693 return err;
1694
1695 return 0;
1696}
1697
1699{
1700 VulkanEncodeH265Context *enc = avctx->priv_data;
1701
1702 ff_cbs_fragment_free(&enc->current_access_unit);
1703 ff_cbs_close(&enc->cbs);
1704
1705 av_freep(&enc->sei_a53cc_data);
1706
1708 return 0;
1709}
1710
1711#define OFFSET(x) offsetof(VulkanEncodeH265Context, x)
1712#define FLAGS (AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM)
1716
1717 { "profile", "Set profile (profile_idc and constraint_set*_flag)",
1718 OFFSET(common.opts.profile), AV_OPT_TYPE_INT,
1719 { .i64 = AV_PROFILE_UNKNOWN }, AV_PROFILE_UNKNOWN, 0xffff, FLAGS, .unit = "profile" },
1720
1721#define PROFILE(name, value) name, NULL, 0, AV_OPT_TYPE_CONST, \
1722 { .i64 = value }, 0, 0, FLAGS, .unit = "profile"
1723 { PROFILE("main", AV_PROFILE_HEVC_MAIN) },
1724 { PROFILE("main10", AV_PROFILE_HEVC_MAIN_10) },
1725 { PROFILE("rext", AV_PROFILE_HEVC_REXT) },
1726#undef PROFILE
1727
1728 { "tier", "Set tier (general_tier_flag)", OFFSET(common.opts.tier), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, FLAGS, .unit = "tier" },
1729 { "main", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = 0 }, 0, 0, FLAGS, .unit = "tier" },
1730 { "high", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = 1 }, 0, 0, FLAGS, .unit = "tier" },
1731
1732 { "level", "Set level (general_level_idc)",
1733 OFFSET(common.opts.level), AV_OPT_TYPE_INT,
1734 { .i64 = AV_LEVEL_UNKNOWN }, AV_LEVEL_UNKNOWN, 0xff, FLAGS, .unit = "level" },
1735
1736#define LEVEL(name, value) name, NULL, 0, AV_OPT_TYPE_CONST, \
1737 { .i64 = value }, 0, 0, FLAGS, .unit = "level"
1738 { LEVEL("1", 30) },
1739 { LEVEL("2", 60) },
1740 { LEVEL("2.1", 63) },
1741 { LEVEL("3", 90) },
1742 { LEVEL("3.1", 93) },
1743 { LEVEL("4", 120) },
1744 { LEVEL("4.1", 123) },
1745 { LEVEL("5", 150) },
1746 { LEVEL("5.1", 153) },
1747 { LEVEL("5.2", 156) },
1748 { LEVEL("6", 180) },
1749 { LEVEL("6.1", 183) },
1750 { LEVEL("6.2", 186) },
1751#undef LEVEL
1752
1753 { "units", "Set units to include", OFFSET(unit_elems), AV_OPT_TYPE_FLAGS, { .i64 = UNIT_SEI_MASTERING_DISPLAY | UNIT_SEI_CONTENT_LIGHT_LEVEL | UNIT_SEI_A53_CC }, 0, INT_MAX, FLAGS, "units" },
1754 { "hdr", "Include HDR metadata for mastering display colour volume and content light level information", 0, AV_OPT_TYPE_CONST, { .i64 = UNIT_SEI_MASTERING_DISPLAY | UNIT_SEI_CONTENT_LIGHT_LEVEL }, INT_MIN, INT_MAX, FLAGS, "units" },
1755 { "a53_cc", "Include A/53 caption data", 0, AV_OPT_TYPE_CONST, { .i64 = UNIT_SEI_A53_CC }, INT_MIN, INT_MAX, FLAGS, "units" },
1756
1757 { NULL },
1758};
1759
1761 { "b", "0" },
1762 { "bf", "2" },
1763 { "g", "300" },
1764 { "i_qfactor", "1" },
1765 { "i_qoffset", "0" },
1766 { "b_qfactor", "6/5" },
1767 { "b_qoffset", "0" },
1768 { "qmin", "-1" },
1769 { "qmax", "-1" },
1770 { "refs", "0" },
1771 { NULL },
1772};
1773
1775 .class_name = "hevc_vulkan",
1776 .item_name = av_default_item_name,
1778 .version = LIBAVUTIL_VERSION_INT,
1779};
1780
1782 .p.name = "hevc_vulkan",
1783 CODEC_LONG_NAME("H.265/HEVC (Vulkan)"),
1784 .p.type = AVMEDIA_TYPE_VIDEO,
1785 .p.id = AV_CODEC_ID_HEVC,
1786 .priv_data_size = sizeof(VulkanEncodeH265Context),
1789 .close = &vulkan_encode_h265_close,
1790 .p.priv_class = &vulkan_encode_h265_class,
1791 .p.capabilities = AV_CODEC_CAP_DELAY |
1796 .caps_internal = FF_CODEC_CAP_INIT_CLEANUP,
1797 .defaults = vulkan_encode_h265_defaults,
1799 .hw_configs = ff_vulkan_encode_hw_configs,
1800 .p.wrapper_name = "vulkan",
1801};
const FFCodec ff_hevc_vulkan_encoder
int ff_alloc_a53_sei(const AVFrame *frame, size_t prefix_len, void **data, size_t *sei_size)
Check AVFrame for A53 side data and allocate and fill SEI message with A53 info.
Definition atsc_a53.c:26
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition avassert.h:42
#define flags(name, subs,...)
Definition cbs_h264.c:74
#define i(width, name, range_min, range_max)
Definition cbs_h264.c:63
static int FUNC sps(CodedBitstreamContext *ctx, RWContext *rw, H264RawSPS *current)
static int FUNC vps(CodedBitstreamContext *ctx, RWContext *rw, H265RawVPS *current)
int ff_cbs_sei_add_message(CodedBitstreamContext *ctx, CodedBitstreamFragment *au, int prefix, uint32_t payload_type, void *payload_data, void *payload_ref)
Add an SEI message to an access unit.
Definition cbs_sei.c:467
#define s(width, name)
Definition cbs_vp9.c:198
#define FLAGS
Definition cmdutils.c:598
#define AV_CODEC_ID_H265
Definition codec_id.h:224
#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
Definition common.h:100
#define NULL
Definition coverity.c:32
long long int64_t
Definition coverity.c:34
#define AV_PROFILE_UNKNOWN
Definition defs.h:65
#define AV_LEVEL_UNKNOWN
Definition defs.h:209
#define AV_PROFILE_HEVC_REXT
Definition defs.h:162
#define AV_PROFILE_HEVC_MAIN
Definition defs.h:159
#define AV_PROFILE_HEVC_MAIN_10
Definition defs.h:160
uint64_t pps
Definition dovi_rpuenc.c:36
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_CAP_HARDWARE
Codec is backed by a hardware implementation.
Definition codec.h:133
@ AV_CODEC_ID_HEVC
Definition codec_id.h:223
#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
@ AVMEDIA_TYPE_VIDEO
Definition avutil.h:200
#define LIBAVUTIL_VERSION_INT
Definition version.h:85
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
#define MAX_DPB_SIZE
@ FF_HW_FLAG_NON_IDR_KEY_PICTURES
@ FF_HW_FLAG_B_PICTURE_REFERENCES
@ FF_HW_FLAG_B_PICTURES
@ FF_HW_FLAG_INTRA_ONLY
@ FF_HW_PICTURE_TYPE_P
@ FF_HW_PICTURE_TYPE_I
@ FF_HW_PICTURE_TYPE_B
@ FF_HW_PICTURE_TYPE_IDR
#define MAX_REFERENCE_LIST_NUM
int ff_hw_base_encode_init_params_h265(FFHWBaseEncodeContext *base_ctx, AVCodecContext *avctx, FFHWBaseEncodeH265 *common, FFHWBaseEncodeH265Opts *opts)
int(* filler)(InterplayACMContext *s, unsigned ind, unsigned col)
#define av_log2
Definition intmath.h:84
@ HEVC_NAL_AUD
Definition hevc.h:64
@ HEVC_NAL_PPS
Definition hevc.h:63
@ HEVC_NAL_FD_NUT
Definition hevc.h:67
@ HEVC_NAL_SPS
Definition hevc.h:62
@ HEVC_MAX_CPB_CNT
Definition hevc.h:134
@ HEVC_MAX_REFS
Definition hevc.h:122
@ HEVC_MAX_SUB_LAYERS
Definition hevc.h:105
Libavcodec version macros.
#define av_cold
Definition attributes.h:117
common internal API header
const char * desc
Definition libsvtav1.c:83
#define FFSWAP(type, a, b)
Definition macros.h:52
#define FFMIN(a, b)
Definition macros.h:49
#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
#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
static const uint8_t header[24]
Definition sdr2.c:68
@ SEI_TYPE_USER_DATA_REGISTERED_ITU_T_T35
Definition sei.h:34
@ SEI_TYPE_CONTENT_LIGHT_LEVEL_INFO
Definition sei.h:103
@ SEI_TYPE_MASTERING_DISPLAY_COLOUR_VOLUME
Definition sei.h:96
#define FF_ARRAY_ELEMS(a)
Describe the class of an AVClass context structure.
Definition log.h:76
main external API structure.
Definition avcodec.h:443
int width
picture width / height.
Definition avcodec.h:604
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
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
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
int64_t rc_max_rate
maximum bitrate
Definition avcodec.h:1288
int qmax
maximum quantizer
Definition avcodec.h:1259
enum AVCodecID codec_id
Definition avcodec.h:453
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
Context structure for coded bitstream operations.
Definition cbs.h:226
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
struct FFHWBaseEncodePicture * dpb[MAX_DPB_SIZE]
struct FFHWBaseEncodePicture * prev
int nb_refs[MAX_REFERENCE_LIST_NUM]
struct FFHWBaseEncodePicture * refs[MAX_REFERENCE_LIST_NUM][MAX_PICTURE_REFERENCES]
VkVideoEncodeRateControlModeFlagBitsKHR rc_mode
FFHWBaseEncodeContext base
FFVkEncodeCommonOptions opts
VkVideoReferenceSlotInfoKHR dpb_slot
uint8_t num_ref_idx_l0_default_active_minus1
Definition cbs_h265.h:369
uint8_t pps_pic_parameter_set_id
Definition cbs_h265.h:360
uint8_t transform_skip_enabled_flag
Definition cbs_h265.h:375
uint8_t num_ref_idx_l1_default_active_minus1
Definition cbs_h265.h:370
int8_t init_qp_minus26
Definition cbs_h265.h:372
uint8_t sample_adaptive_offset_enabled_flag
Definition cbs_h265.h:298
uint8_t log2_max_pic_order_cnt_lsb_minus4
Definition cbs_h265.h:277
uint8_t log2_diff_max_min_luma_coding_block_size
Definition cbs_h265.h:285
uint8_t log2_min_luma_transform_block_size_minus2
Definition cbs_h265.h:286
uint8_t sps_seq_parameter_set_id
Definition cbs_h265.h:257
uint8_t sps_temporal_mvp_enabled_flag
Definition cbs_h265.h:315
uint8_t log2_diff_max_min_luma_transform_block_size
Definition cbs_h265.h:287
H265RawVUI vui
Definition cbs_h265.h:319
uint8_t max_transform_hierarchy_depth_inter
Definition cbs_h265.h:288
uint16_t pic_width_in_luma_samples
Definition cbs_h265.h:265
uint16_t pic_height_in_luma_samples
Definition cbs_h265.h:266
uint8_t log2_min_luma_coding_block_size_minus3
Definition cbs_h265.h:284
uint8_t max_transform_hierarchy_depth_intra
Definition cbs_h265.h:289
uint8_t delta_rps_sign
Definition cbs_h265.h:225
uint8_t used_by_curr_pic_flag[HEVC_MAX_REFS]
Definition cbs_h265.h:228
uint8_t num_positive_pics
Definition cbs_h265.h:232
uint16_t delta_poc_s0_minus1[HEVC_MAX_REFS]
Definition cbs_h265.h:233
uint8_t inter_ref_pic_set_prediction_flag
Definition cbs_h265.h:222
uint8_t num_negative_pics
Definition cbs_h265.h:231
uint8_t delta_idx_minus1
Definition cbs_h265.h:224
uint16_t abs_delta_rps_minus1
Definition cbs_h265.h:226
uint8_t used_by_curr_pic_s0_flag[HEVC_MAX_REFS]
Definition cbs_h265.h:234
uint16_t delta_poc_s1_minus1[HEVC_MAX_REFS]
Definition cbs_h265.h:235
uint8_t used_by_curr_pic_s1_flag[HEVC_MAX_REFS]
Definition cbs_h265.h:236
uint8_t use_delta_flag[HEVC_MAX_REFS]
Definition cbs_h265.h:229
uint8_t vps_video_parameter_set_id
Definition cbs_h265.h:187
uint8_t max_bytes_per_pic_denom
Definition cbs_h265.h:172
uint8_t max_bits_per_min_cu_denom
Definition cbs_h265.h:173
uint8_t bitstream_restriction_flag
Definition cbs_h265.h:167
uint16_t max_pic_average_light_level
Definition cbs_sei.h:89
uint16_t max_content_light_level
Definition cbs_sei.h:88
uint8_t itu_t_t35_country_code
Definition cbs_sei.h:34
SEIRawMasteringDisplayColourVolume sei_mastering_display
FFVulkanEncodeContext common
SEIRawUserDataRegistered sei_a53cc
VkVideoEncodeH265CapabilitiesKHR caps
VkVideoEncodeH265QualityLevelPropertiesKHR quality_props
FFHWBaseEncodeH265Opts unit_opts
SEIRawContentLightLevelInfo sei_content_light_level
CodedBitstreamContext * cbs
CodedBitstreamFragment current_access_unit
VkVideoEncodeH265ProfileInfoKHR profile
StdVideoEncodeH265ReferenceListsInfo ref_list_info
StdVideoEncodeH265WeightTable slice_wt
StdVideoEncodeH265ReferenceInfo h265dpb_info
VkVideoEncodeH265DpbSlotInfoKHR vkh265dpb_info
StdVideoEncodeH265PictureInfo h265pic_info
VkVideoEncodeH265RateControlInfoKHR vkrc_info
StdVideoEncodeH265LongTermRefPics l_rps
VkVideoEncodeH265NaluSliceSegmentInfoKHR vkslice
VkVideoEncodeH265PictureInfoKHR vkh265pic_info
VkVideoEncodeH265RateControlLayerInfoKHR vkrc_layer_info
StdVideoH265ShortTermRefPicSet s_rps
StdVideoEncodeH265SliceSegmentHeader slice_hdr
StdVideoH265LongTermRefPicsSps ltr
StdVideoH265DecPicBufMgr dpbm_vps
StdVideoH265HrdParameters vui_header_vps
StdVideoH265VideoParameterSet vps
StdVideoH265SubLayerHrdParameters slhdrvcl[HEVC_MAX_SUB_LAYERS]
StdVideoH265ShortTermRefPicSet str[STD_VIDEO_H265_SUBLAYERS_LIST_SIZE]
StdVideoH265ProfileTierLevel ptl_vps
StdVideoH265SequenceParameterSet sps
StdVideoH265SubLayerHrdParameters slhdrnal[HEVC_MAX_SUB_LAYERS]
StdVideoH265ProfileTierLevel ptl_sps
StdVideoH265ScalingLists pps_scaling
StdVideoH265DecPicBufMgr dpbm_sps
StdVideoH265PictureParameterSet pps
StdVideoH265HrdParameters vui_header_sps
StdVideoH265SequenceParameterSetVui vui_sps
#define lrint
Definition tablegen.h:53
#define av_free(p)
#define av_mallocz(s)
#define av_freep(p)
#define av_log(a,...)
static AVFormatContext * ctx
Definition movenc.c:49
int size
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.
av_cold int ff_vulkan_write_global_header(AVCodecContext *avctx, FFVulkanEncodeContext *ctx)
Write out the extradata in case its needed.
int ff_vulkan_encode_create_session_params(AVCodecContext *avctx, FFVulkanEncodeContext *ctx, void *codec_params_pnext)
Create session parameters.
#define VULKAN_ENCODE_COMMON_OPTIONS
static int init_profile(AVCodecContext *avctx, VkVideoProfileInfoKHR *profile, void *pnext)
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)
static const FFVulkanCodec enc_cb
@ UNIT_SEI_A53_CC
@ UNIT_AUD
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)
static int write_access_unit(AVCodecContext *avctx, uint8_t *data, size_t *data_len, CodedBitstreamFragment *au)
static const AVClass vulkan_encode_h265_class
static int create_session_params(AVCodecContext *avctx)
static const FFCodecDefault vulkan_encode_h265_defaults[]
static void setup_refs(AVCodecContext *avctx, FFHWBaseEncodePicture *pic, VkVideoEncodeInfoKHR *encode_info)
static int parse_feedback_units(AVCodecContext *avctx, const uint8_t *data, size_t size, int sps_override, int pps_override)
@ UNIT_SEI_MASTERING_DISPLAY
@ UNIT_SEI_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 const AVOption vulkan_encode_h265_options[]
static int vk_enc_h265_update_pic_info(AVCodecContext *avctx, FFHWBaseEncodePicture *pic)
static int init_pic_rc(AVCodecContext *avctx, FFHWBaseEncodePicture *pic, VkVideoEncodeRateControlInfoKHR *rc_info, VkVideoEncodeRateControlLayerInfoKHR *rc_layer)
static void setup_slices(AVCodecContext *avctx, FFHWBaseEncodePicture *pic)
static av_cold int vulkan_encode_h265_close(AVCodecContext *avctx)
const FFVulkanEncodeDescriptor ff_vk_enc_h265_desc
static int write_filler(AVCodecContext *avctx, uint32_t filler, uint8_t *data, size_t *data_len)
static int write_extra_headers(AVCodecContext *avctx, FFHWBaseEncodePicture *base_pic, uint8_t *data, size_t *data_len)
static av_cold int base_unit_to_vk(AVCodecContext *avctx, VulkanH265Units *vk_units)
static int init_pic_params(AVCodecContext *avctx, FFHWBaseEncodePicture *pic, VkVideoEncodeInfoKHR *encode_info)
#define PROFILE(name, value)
#define OFFSET(x)
static av_cold int init_sequence_headers(AVCodecContext *avctx)
static int vulkan_encode_h265_add_nal(AVCodecContext *avctx, CodedBitstreamFragment *au, void *nal_unit)
static int init_base_units(AVCodecContext *avctx)
static av_cold int vulkan_encode_h265_init(AVCodecContext *avctx)
static int write_sequence_headers(AVCodecContext *avctx, FFHWBaseEncodePicture *base_pic, uint8_t *data, size_t *data_len)
#define FF_VK_EXT_VIDEO_ENCODE_H265
StdVideoH265ProfileIdc ff_vk_h265_profile_to_vk(int profile)
StdVideoH265LevelIdc ff_vk_h265_level_to_vk(int level_idc)