1
mirror of https://git.videolan.org/git/ffmpeg.git synced 2024-09-28 07:53:47 +02:00

vaapi_encode_h265: Enable multiple-slice support

This commit is contained in:
Mark Thompson 2018-09-23 22:52:59 +01:00
parent a769e72c75
commit a7eda762dc

View File

@ -54,9 +54,6 @@ typedef struct VAAPIEncodeH265Context {
int sei;
// Derived settings.
unsigned int ctu_width;
unsigned int ctu_height;
int fixed_qp_idr;
int fixed_qp_p;
int fixed_qp_b;
@ -349,7 +346,8 @@ static int vaapi_encode_h265_init_sequence_params(AVCodecContext *avctx)
level = ff_h265_guess_level(ptl, avctx->bit_rate,
ctx->surface_width, ctx->surface_height,
1, 1, 1, (ctx->b_per_p > 0) + 1);
ctx->nb_slices, 1, 1,
(ctx->b_per_p > 0) + 1);
if (level) {
av_log(avctx, AV_LOG_VERBOSE, "Using level %s.\n", level->name);
ptl->general_level_idc = level->level_idc;
@ -850,8 +848,6 @@ static int vaapi_encode_h265_init_picture_params(AVCodecContext *avctx,
av_assert0(0 && "invalid picture type");
}
pic->nb_slices = 1;
return 0;
}
@ -876,9 +872,8 @@ static int vaapi_encode_h265_init_slice_params(AVCodecContext *avctx,
sh->slice_pic_parameter_set_id = pps->pps_pic_parameter_set_id;
// Currently we only support one slice per frame.
sh->first_slice_segment_in_pic_flag = 1;
sh->slice_segment_address = 0;
sh->first_slice_segment_in_pic_flag = slice->index == 0;
sh->slice_segment_address = slice->block_start;
sh->slice_type = priv->slice_type;
@ -968,7 +963,7 @@ static int vaapi_encode_h265_init_slice_params(AVCodecContext *avctx,
*vslice = (VAEncSliceParameterBufferHEVC) {
.slice_segment_address = sh->slice_segment_address,
.num_ctu_in_slice = priv->ctu_width * priv->ctu_height,
.num_ctu_in_slice = slice->block_size,
.slice_type = sh->slice_type,
.slice_pic_parameter_set_id = sh->slice_pic_parameter_set_id,
@ -989,7 +984,7 @@ static int vaapi_encode_h265_init_slice_params(AVCodecContext *avctx,
.slice_tc_offset_div2 = sh->slice_tc_offset_div2,
.slice_fields.bits = {
.last_slice_of_pic_flag = 1,
.last_slice_of_pic_flag = slice->index == pic->nb_slices - 1,
.dependent_slice_segment_flag = sh->dependent_slice_segment_flag,
.colour_plane_id = sh->colour_plane_id,
.slice_temporal_mvp_enabled_flag =
@ -1041,13 +1036,6 @@ static av_cold int vaapi_encode_h265_configure(AVCodecContext *avctx)
if (err < 0)
return err;
priv->ctu_width = FFALIGN(ctx->surface_width, 32) / 32;
priv->ctu_height = FFALIGN(ctx->surface_height, 32) / 32;
av_log(avctx, AV_LOG_VERBOSE, "Input %ux%u -> Surface %ux%u -> CTU %ux%u.\n",
avctx->width, avctx->height, ctx->surface_width,
ctx->surface_height, priv->ctu_width, priv->ctu_height);
if (ctx->va_rc_mode == VA_RC_CQP) {
priv->fixed_qp_p = priv->qp;
if (avctx->i_quant_factor > 0.0)
@ -1092,6 +1080,8 @@ static const VAAPIEncodeProfile vaapi_encode_h265_profiles[] = {
static const VAAPIEncodeType vaapi_encode_type_h265 = {
.profiles = vaapi_encode_h265_profiles,
.flags = FLAG_SLICE_CONTROL,
.configure = &vaapi_encode_h265_configure,
.sequence_params_size = sizeof(VAEncSequenceParameterBufferHEVC),
@ -1138,6 +1128,9 @@ static av_cold int vaapi_encode_h265_init(AVCodecContext *avctx)
ctx->surface_width = FFALIGN(avctx->width, 16);
ctx->surface_height = FFALIGN(avctx->height, 16);
// CTU size is currently hard-coded to 32.
ctx->slice_block_width = ctx->slice_block_height = 32;
return ff_vaapi_encode_init(avctx);
}