X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fvaapi_encode_vp9.c;h=4f3b55ed2d4dcc55c0c34583a2f843a8eb07d383;hb=c281d84b2020aebfa4120c0a2bf645ac8824aff6;hp=97142dcc49a7ca607b485b49c9e7164a4ecf5042;hpb=0c126431f9b290f5651ec62f45627632d94c51ea;p=ffmpeg diff --git a/libavcodec/vaapi_encode_vp9.c b/libavcodec/vaapi_encode_vp9.c index 97142dcc49a..4f3b55ed2d4 100644 --- a/libavcodec/vaapi_encode_vp9.c +++ b/libavcodec/vaapi_encode_vp9.c @@ -178,23 +178,31 @@ static int vaapi_encode_vp9_init_picture_params(AVCodecContext *avctx, static av_cold int vaapi_encode_vp9_configure(AVCodecContext *avctx) { + VAAPIEncodeContext *ctx = avctx->priv_data; VAAPIEncodeVP9Context *priv = avctx->priv_data; - priv->q_idx_p = av_clip(avctx->global_quality, 0, VP9_MAX_QUANT); - if (avctx->i_quant_factor > 0.0) - priv->q_idx_idr = av_clip((avctx->global_quality * - avctx->i_quant_factor + - avctx->i_quant_offset) + 0.5, - 0, VP9_MAX_QUANT); - else - priv->q_idx_idr = priv->q_idx_p; - if (avctx->b_quant_factor > 0.0) - priv->q_idx_b = av_clip((avctx->global_quality * - avctx->b_quant_factor + - avctx->b_quant_offset) + 0.5, - 0, VP9_MAX_QUANT); - else - priv->q_idx_b = priv->q_idx_p; + if (ctx->rc_mode->quality) { + priv->q_idx_p = av_clip(ctx->rc_quality, 0, VP9_MAX_QUANT); + if (avctx->i_quant_factor > 0.0) + priv->q_idx_idr = + av_clip((avctx->i_quant_factor * priv->q_idx_p + + avctx->i_quant_offset) + 0.5, + 0, VP9_MAX_QUANT); + else + priv->q_idx_idr = priv->q_idx_p; + if (avctx->b_quant_factor > 0.0) + priv->q_idx_b = + av_clip((avctx->b_quant_factor * priv->q_idx_p + + avctx->b_quant_offset) + 0.5, + 0, VP9_MAX_QUANT); + else + priv->q_idx_b = priv->q_idx_p; + } else { + // Arbitrary value. + priv->q_idx_idr = priv->q_idx_p = priv->q_idx_b = 100; + } + + ctx->roi_quant_range = VP9_MAX_QUANT; return 0; } @@ -211,6 +219,8 @@ static const VAAPIEncodeType vaapi_encode_type_vp9 = { .flags = FLAG_B_PICTURES | FLAG_B_PICTURE_REFERENCES, + .default_quality = 100, + .picture_priv_data_size = sizeof(VAAPIEncodeVP9Picture), .configure = &vaapi_encode_vp9_configure, @@ -244,6 +254,8 @@ static av_cold int vaapi_encode_vp9_init(AVCodecContext *avctx) #define FLAGS (AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM) static const AVOption vaapi_encode_vp9_options[] = { VAAPI_ENCODE_COMMON_OPTIONS, + VAAPI_ENCODE_RC_OPTIONS, + { "loop_filter_level", "Loop filter level", OFFSET(loop_filter_level), AV_OPT_TYPE_INT, { .i64 = 16 }, 0, 63, FLAGS }, { "loop_filter_sharpness", "Loop filter sharpness", @@ -255,7 +267,6 @@ static const AVCodecDefault vaapi_encode_vp9_defaults[] = { { "b", "0" }, { "bf", "0" }, { "g", "250" }, - { "global_quality", "100" }, { "qmin", "-1" }, { "qmax", "-1" }, { NULL }, @@ -275,15 +286,16 @@ AVCodec ff_vp9_vaapi_encoder = { .id = AV_CODEC_ID_VP9, .priv_data_size = sizeof(VAAPIEncodeVP9Context), .init = &vaapi_encode_vp9_init, - .send_frame = &ff_vaapi_encode_send_frame, .receive_packet = &ff_vaapi_encode_receive_packet, .close = &ff_vaapi_encode_close, .priv_class = &vaapi_encode_vp9_class, .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_HARDWARE, + .caps_internal = FF_CODEC_CAP_INIT_CLEANUP, .defaults = vaapi_encode_vp9_defaults, .pix_fmts = (const enum AVPixelFormat[]) { AV_PIX_FMT_VAAPI, AV_PIX_FMT_NONE, }, + .hw_configs = ff_vaapi_encode_hw_configs, .wrapper_name = "vaapi", };