[FFmpeg-devel] [PATCH] Add support for the new key & value API in libaom.

Bohan Li bohanli at google.com
Thu Feb 4 23:02:20 EET 2021


This key & value API can greatly help with users who wants to try
libaom-av1 specific options that are not supported by ffmpeg options.

As was previously discussed in this thread:
https://lists.ffmpeg.org/pipermail/ffmpeg-devel/2020-October/271658.

The commit that added the API to libaom:
https://aomedia.googlesource.com/aom/+/c1d42fe6615c96fc929257

The libaom issue tracker:
https://bugs.chromium.org/p/aomedia/issues/detail?id=2875

Signed-off-by: Bohan Li <bohanli at google.com>
---
 doc/encoders.texi      | 11 +++++++++++
 libavcodec/libaomenc.c | 30 ++++++++++++++++++++++++++++++
 2 files changed, 41 insertions(+)

diff --git a/doc/encoders.texi b/doc/encoders.texi
index c2ba7d3e6f..9fab512892 100644
--- a/doc/encoders.texi
+++ b/doc/encoders.texi
@@ -1684,6 +1684,17 @@ Enable interintra compound. Default is true.
 @item enable-smooth-interintra (@emph{boolean}) (Requires libaom >= v2.0.0)
 Enable smooth interintra mode. Default is true.
 
+ at item libaom-params
+Set libaom options using a list of @var{key}=@var{value} pairs separated
+by ":". For a list of supported options, see @command{aomenc --help} under the
+section "AV1 Specific Options".
+
+For example to specify libaom encoding options with @option{-libaom-params}:
+
+ at example
+ffmpeg -i input -c:v libaom-av1 -b:v 500K -libaom-params tune=psnr:enable-tpl-model=1 output.mp4
+ at end example
+
 @end table
 
 @section libsvtav1
diff --git a/libavcodec/libaomenc.c b/libavcodec/libaomenc.c
index 342d0883e4..c7a87e01cd 100644
--- a/libavcodec/libaomenc.c
+++ b/libavcodec/libaomenc.c
@@ -124,6 +124,7 @@ typedef struct AOMEncoderContext {
     int enable_diff_wtd_comp;
     int enable_dist_wtd_comp;
     int enable_dual_filter;
+    AVDictionary *extra_params;
 } AOMContext;
 
 static const char *const ctlidstr[] = {
@@ -318,6 +319,25 @@ static av_cold int codecctl_int(AVCodecContext *avctx,
     return 0;
 }
 
+static av_cold int codec_set_option(AVCodecContext *avctx,
+                                    const char* key,
+                                    const char* value)
+{
+    AOMContext *ctx = avctx->priv_data;
+    int width = -30;
+    int res;
+
+    av_log(avctx, AV_LOG_DEBUG, "  %*s: %s\n", width, key, value);
+
+    res = aom_codec_set_option(&ctx->encoder, key, value);
+    if (res != AOM_CODEC_OK) {
+        log_encoder_error(avctx, key);
+        return AVERROR(EINVAL);
+    }
+
+    return 0;
+}
+
 static av_cold int aom_free(AVCodecContext *avctx)
 {
     AOMContext *ctx = avctx->priv_data;
@@ -874,6 +894,15 @@ static av_cold int aom_init(AVCodecContext *avctx,
         codecctl_int(avctx, AV1E_SET_ENABLE_INTRABC, ctx->enable_intrabc);
 #endif
 
+#if AOM_ENCODER_ABI_VERSION >= 23
+    {
+      AVDictionaryEntry *en = NULL;
+      while ((en = av_dict_get(ctx->extra_params, "", en, AV_DICT_IGNORE_SUFFIX))) {
+        codec_set_option(avctx, en->key, en->value);
+      }
+    }
+#endif
+
     // provide dummy value to initialize wrapper, values will be updated each _encode()
     aom_img_wrap(&ctx->rawimg, img_fmt, avctx->width, avctx->height, 1,
                  (unsigned char*)1);
@@ -1299,6 +1328,7 @@ static const AVOption options[] = {
     { "enable-masked-comp",           "Enable masked compound",                            OFFSET(enable_masked_comp),           AV_OPT_TYPE_BOOL, {.i64 = -1}, -1, 1, VE},
     { "enable-interintra-comp",       "Enable interintra compound",                        OFFSET(enable_interintra_comp),       AV_OPT_TYPE_BOOL, {.i64 = -1}, -1, 1, VE},
     { "enable-smooth-interintra",     "Enable smooth interintra mode",                     OFFSET(enable_smooth_interintra),     AV_OPT_TYPE_BOOL, {.i64 = -1}, -1, 1, VE},
+    { "libaom-params",                "Extra parameters for libaom",                       OFFSET(extra_params),                 AV_OPT_TYPE_DICT, { 0 },        0, 0, VE },
     { NULL },
 };
 
-- 
2.30.0.365.g02bc693789-goog



More information about the ffmpeg-devel mailing list