diff --git a/libavcodec/libvpxenc.c b/libavcodec/libvpxenc.c index 51f423a2a5..13251996c5 100644 --- a/libavcodec/libvpxenc.c +++ b/libavcodec/libvpxenc.c @@ -137,6 +137,7 @@ static const char *const ctlidstr[] = { #endif #if VPX_ENCODER_ABI_VERSION >= 12 [VP9E_SET_TARGET_LEVEL] = "VP9E_SET_TARGET_LEVEL", + [VP9E_GET_LEVEL] = "VP9E_GET_LEVEL", #endif #endif }; @@ -264,10 +265,41 @@ static av_cold int codecctl_int(AVCodecContext *avctx, return res == VPX_CODEC_OK ? 0 : AVERROR(EINVAL); } +#if VPX_ENCODER_ABI_VERSION >= 12 +static av_cold int codecctl_intp(AVCodecContext *avctx, + enum vp8e_enc_control_id id, int *val) +{ + VPxContext *ctx = avctx->priv_data; + char buf[80]; + int width = -30; + int res; + + snprintf(buf, sizeof(buf), "%s:", ctlidstr[id]); + av_log(avctx, AV_LOG_DEBUG, " %*s%d\n", width, buf, *val); + + res = vpx_codec_control(&ctx->encoder, id, val); + if (res != VPX_CODEC_OK) { + snprintf(buf, sizeof(buf), "Failed to set %s codec control", + ctlidstr[id]); + log_encoder_error(avctx, buf); + } + + return res == VPX_CODEC_OK ? 0 : AVERROR(EINVAL); +} +#endif + static av_cold int vpx_free(AVCodecContext *avctx) { VPxContext *ctx = avctx->priv_data; +#if VPX_ENCODER_ABI_VERSION >= 12 + if (ctx->level >= 0 && !(avctx->flags & AV_CODEC_FLAG_PASS1)) { + int level_out = 0; + if (!codecctl_intp(avctx, VP9E_GET_LEVEL, &level_out)) + av_log(avctx, AV_LOG_INFO, "Encoded level %.1f\n", level_out * 0.1); + } +#endif + vpx_codec_destroy(&ctx->encoder); if (ctx->is_alpha) vpx_codec_destroy(&ctx->encoder_alpha);