| @@ -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); | |||
| } | |||