libvpxenc: Report encoded VP9 level

Report the actual level of the encoded output if a level is
targeted or the level is passively tracked with a target of 0.
This commit is contained in:
Alex Converse 2016-11-18 13:56:32 -08:00
parent afb84857bf
commit 8899057d91

View File

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