[FFmpeg-cvslog] libvpxenc: Report encoded VP9 level

Alex Converse git at videolan.org
Mon Nov 28 22:05:29 EET 2016


ffmpeg | branch: master | Alex Converse <alex.converse at gmail.com> | Fri Nov 18 13:56:32 2016 -0800| [8899057d914af32e08042b3e6f25da563485644b] | committer: Alex Converse

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.

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=8899057d914af32e08042b3e6f25da563485644b
---

 libavcodec/libvpxenc.c | 32 ++++++++++++++++++++++++++++++++
 1 file changed, 32 insertions(+)

diff --git a/libavcodec/libvpxenc.c b/libavcodec/libvpxenc.c
index 51f423a..1325199 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);



More information about the ffmpeg-cvslog mailing list