Add a key & value API to the libaom library.

BUG=aomedia:2875

Change-Id: I252e357a549d9cbd4b4ae3527bc4aa21cb50ea29
diff --git a/CMakeLists.txt b/CMakeLists.txt
index cb7d5e6..b502006 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -128,6 +128,8 @@
             "${AOM_ROOT}/aom/src/aom_integer.c")
 
 list(APPEND AOM_COMMON_APP_UTIL_SOURCES
+            "${AOM_ROOT}/av1/arg_defs.h"
+            "${AOM_ROOT}/av1/arg_defs.c"
             "${AOM_ROOT}/common/args_helper.c"
             "${AOM_ROOT}/common/args_helper.h"
             "${AOM_ROOT}/common/args.c"
diff --git a/aom/aom_codec.h b/aom/aom_codec.h
index 6e4208d..f58272e 100644
--- a/aom/aom_codec.h
+++ b/aom/aom_codec.h
@@ -149,7 +149,7 @@
  * types, removing or reassigning enums, adding/removing/rearranging
  * fields to structures
  */
-#define AOM_CODEC_ABI_VERSION (5 + AOM_IMAGE_ABI_VERSION) /**<\hideinitializer*/
+#define AOM_CODEC_ABI_VERSION (6 + AOM_IMAGE_ABI_VERSION) /**<\hideinitializer*/
 
 /*!\brief Algorithm return codes */
 typedef enum {
@@ -490,6 +490,26 @@
  */
 aom_codec_err_t aom_codec_control(aom_codec_ctx_t *ctx, int ctrl_id, ...);
 
+/*!\brief Key & Value API
+ *
+ * aom_codec_set_option() takes a context, a key (option name) and a value. If
+ * the context is non-null and an error occurs, ctx->err will be set to the same
+ * value as the return value.
+ *
+ * \param[in]     ctx              Pointer to this instance's context
+ * \param[in]     name             The name of the option (key)
+ * \param[in]     value            The value of the option
+ *
+ * \retval #AOM_CODEC_OK
+ *     The value of the option was set.
+ * \retval #AOM_CODEC_INVALID_PARAM
+ *     The data was not valid.
+ * \retval #AOM_CODEC_ERROR
+ *     The option was not successfully set.
+ */
+aom_codec_err_t aom_codec_set_option(aom_codec_ctx_t *ctx, const char *name,
+                                     const char *value);
+
 /*!\brief aom_codec_control wrapper macro (adds type-checking, less flexible)
  *
  * This macro allows for type safe conversions across the variadic parameter
diff --git a/aom/internal/aom_codec_internal.h b/aom/internal/aom_codec_internal.h
index efebd17..0ad33bd 100644
--- a/aom/internal/aom_codec_internal.h
+++ b/aom/internal/aom_codec_internal.h
@@ -47,6 +47,7 @@
 #define AOM_AOM_INTERNAL_AOM_CODEC_INTERNAL_H_
 #include "../aom_decoder.h"
 #include "../aom_encoder.h"
+#include "common/args_helper.h"
 #include <stdarg.h>
 
 #ifdef __cplusplus
@@ -153,6 +154,23 @@
 typedef aom_codec_err_t (*aom_codec_control_fn_t)(aom_codec_alg_priv_t *ctx,
                                                   va_list ap);
 
+/*!\brief codec option setter function pointer prototype
+ * This function is used to set a codec option using a key (option name) & value
+ * pair.
+ *
+ * \param[in]     ctx              Pointer to this instance's context
+ * \param[in]     name             A string of the option's name (key)
+ * \param[in]     value            A string of the value to be set to
+ *
+ * \retval #AOM_CODEC_OK
+ *     The option is successfully set to the value
+ * \retval #AOM_CODEC_INVALID_PARAM
+ *     The data was not valid.
+ */
+typedef aom_codec_err_t (*aom_codec_set_option_fn_t)(aom_codec_alg_priv_t *ctx,
+                                                     const char *name,
+                                                     const char *value);
+
 /*!\brief control function pointer mapping
  *
  * This structure stores the mapping between control identifiers and
@@ -292,6 +310,7 @@
     aom_codec_get_preview_frame_fn_t
         get_preview; /**< \copydoc ::aom_codec_get_preview_frame_fn_t */
   } enc;
+  aom_codec_set_option_fn_t set_option;
 };
 
 /*!\brief Instance private storage
@@ -351,7 +370,7 @@
 struct aom_internal_error_info {
   aom_codec_err_t error_code;
   int has_detail;
-  char detail[80];
+  char detail[ARG_ERR_MSG_MAX_LEN];
   int setjmp;  // Boolean: whether 'jmp' is valid.
   jmp_buf jmp;
 };
diff --git a/aom/src/aom_codec.c b/aom/src/aom_codec.c
index d418463..4778781 100644
--- a/aom/src/aom_codec.c
+++ b/aom/src/aom_codec.c
@@ -114,6 +114,20 @@
   return AOM_CODEC_ERROR;
 }
 
+aom_codec_err_t aom_codec_set_option(aom_codec_ctx_t *ctx, const char *name,
+                                     const char *value) {
+  if (!ctx) {
+    return AOM_CODEC_INVALID_PARAM;
+  }
+  if (!ctx->iface || !ctx->priv || !ctx->iface->set_option) {
+    ctx->err = AOM_CODEC_ERROR;
+    return AOM_CODEC_ERROR;
+  }
+  ctx->err =
+      ctx->iface->set_option((aom_codec_alg_priv_t *)ctx->priv, name, value);
+  return ctx->err;
+}
+
 void aom_internal_error(struct aom_internal_error_info *info,
                         aom_codec_err_t error, const char *fmt, ...) {
   va_list ap;
diff --git a/apps/aomenc.c b/apps/aomenc.c
index 19a4524..789cd60 100644
--- a/apps/aomenc.c
+++ b/apps/aomenc.c
@@ -123,824 +123,6 @@
   return 0;
 }
 
-static const arg_def_t help =
-    ARG_DEF(NULL, "help", 0, "Show usage options and exit");
-static const arg_def_t debugmode =
-    ARG_DEF("D", "debug", 0, "Debug mode (makes output deterministic)");
-static const arg_def_t outputfile =
-    ARG_DEF("o", "output", 1, "Output filename");
-static const arg_def_t use_yv12 =
-    ARG_DEF(NULL, "yv12", 0, "Input file is YV12 ");
-static const arg_def_t use_i420 =
-    ARG_DEF(NULL, "i420", 0, "Input file is I420 (default)");
-static const arg_def_t use_i422 =
-    ARG_DEF(NULL, "i422", 0, "Input file is I422");
-static const arg_def_t use_i444 =
-    ARG_DEF(NULL, "i444", 0, "Input file is I444");
-static const arg_def_t codecarg = ARG_DEF(NULL, "codec", 1, "Codec to use");
-static const arg_def_t passes =
-    ARG_DEF("p", "passes", 1, "Number of passes (1/2)");
-static const arg_def_t pass_arg =
-    ARG_DEF(NULL, "pass", 1, "Pass to execute (1/2)");
-static const arg_def_t fpf_name =
-    ARG_DEF(NULL, "fpf", 1, "First pass statistics file name");
-static const arg_def_t limit =
-    ARG_DEF(NULL, "limit", 1, "Stop encoding after n input frames");
-static const arg_def_t skip =
-    ARG_DEF(NULL, "skip", 1, "Skip the first n input frames");
-static const arg_def_t good_dl =
-    ARG_DEF(NULL, "good", 0, "Use Good Quality Deadline");
-static const arg_def_t rt_dl =
-    ARG_DEF(NULL, "rt", 0, "Use Realtime Quality Deadline");
-static const arg_def_t quietarg =
-    ARG_DEF("q", "quiet", 0, "Do not print encode progress");
-static const arg_def_t verbosearg =
-    ARG_DEF("v", "verbose", 0, "Show encoder parameters");
-static const arg_def_t psnrarg = ARG_DEF(
-    NULL, "psnr", -1,
-    "Show PSNR in status line"
-    "(0: Disable PSNR status line display, 1: PSNR calculated using input "
-    "bit-depth (default), 2: PSNR calculated using stream bit-depth), "
-    "takes default option when arguments are not specified");
-static const arg_def_t use_cfg = ARG_DEF("c", "cfg", 1, "Config file to use");
-
-static const struct arg_enum_list test_decode_enum[] = {
-  { "off", TEST_DECODE_OFF },
-  { "fatal", TEST_DECODE_FATAL },
-  { "warn", TEST_DECODE_WARN },
-  { NULL, 0 }
-};
-static const arg_def_t recontest = ARG_DEF_ENUM(
-    NULL, "test-decode", 1, "Test encode/decode mismatch", test_decode_enum);
-static const arg_def_t framerate =
-    ARG_DEF(NULL, "fps", 1, "Stream frame rate (rate/scale)");
-static const arg_def_t use_webm =
-    ARG_DEF(NULL, "webm", 0, "Output WebM (default when WebM IO is enabled)");
-static const arg_def_t use_ivf = ARG_DEF(NULL, "ivf", 0, "Output IVF");
-static const arg_def_t use_obu = ARG_DEF(NULL, "obu", 0, "Output OBU");
-static const arg_def_t q_hist_n =
-    ARG_DEF(NULL, "q-hist", 1, "Show quantizer histogram (n-buckets)");
-static const arg_def_t rate_hist_n =
-    ARG_DEF(NULL, "rate-hist", 1, "Show rate histogram (n-buckets)");
-static const arg_def_t disable_warnings =
-    ARG_DEF(NULL, "disable-warnings", 0,
-            "Disable warnings about potentially incorrect encode settings.");
-static const arg_def_t disable_warning_prompt =
-    ARG_DEF("y", "disable-warning-prompt", 0,
-            "Display warnings, but do not prompt user to continue.");
-static const struct arg_enum_list bitdepth_enum[] = {
-  { "8", AOM_BITS_8 }, { "10", AOM_BITS_10 }, { "12", AOM_BITS_12 }, { NULL, 0 }
-};
-
-static const arg_def_t bitdeptharg = ARG_DEF_ENUM(
-    "b", "bit-depth", 1,
-    "Bit depth for codec (8 for version <=1, 10 or 12 for version 2)",
-    bitdepth_enum);
-static const arg_def_t inbitdeptharg =
-    ARG_DEF(NULL, "input-bit-depth", 1, "Bit depth of input");
-
-static const arg_def_t input_chroma_subsampling_x = ARG_DEF(
-    NULL, "input-chroma-subsampling-x", 1, "chroma subsampling x value.");
-static const arg_def_t input_chroma_subsampling_y = ARG_DEF(
-    NULL, "input-chroma-subsampling-y", 1, "chroma subsampling y value.");
-
-static const arg_def_t *main_args[] = { &help,
-                                        &use_cfg,
-                                        &debugmode,
-                                        &outputfile,
-                                        &codecarg,
-                                        &passes,
-                                        &pass_arg,
-                                        &fpf_name,
-                                        &limit,
-                                        &skip,
-                                        &good_dl,
-                                        &rt_dl,
-                                        &quietarg,
-                                        &verbosearg,
-                                        &psnrarg,
-                                        &use_webm,
-                                        &use_ivf,
-                                        &use_obu,
-                                        &q_hist_n,
-                                        &rate_hist_n,
-                                        &disable_warnings,
-                                        &disable_warning_prompt,
-                                        &recontest,
-                                        NULL };
-
-static const arg_def_t usage =
-    ARG_DEF("u", "usage", 1, "Usage profile number to use");
-static const arg_def_t threads =
-    ARG_DEF("t", "threads", 1, "Max number of threads to use");
-static const arg_def_t profile =
-    ARG_DEF(NULL, "profile", 1, "Bitstream profile number to use");
-static const arg_def_t width = ARG_DEF("w", "width", 1, "Frame width");
-static const arg_def_t height = ARG_DEF("h", "height", 1, "Frame height");
-static const arg_def_t forced_max_frame_width = ARG_DEF(
-    NULL, "forced_max_frame_width", 1, "Maximum frame width value to force");
-static const arg_def_t forced_max_frame_height = ARG_DEF(
-    NULL, "forced_max_frame_height", 1, "Maximum frame height value to force");
-#if CONFIG_WEBM_IO
-static const struct arg_enum_list stereo_mode_enum[] = {
-  { "mono", STEREO_FORMAT_MONO },
-  { "left-right", STEREO_FORMAT_LEFT_RIGHT },
-  { "bottom-top", STEREO_FORMAT_BOTTOM_TOP },
-  { "top-bottom", STEREO_FORMAT_TOP_BOTTOM },
-  { "right-left", STEREO_FORMAT_RIGHT_LEFT },
-  { NULL, 0 }
-};
-static const arg_def_t stereo_mode = ARG_DEF_ENUM(
-    NULL, "stereo-mode", 1, "Stereo 3D video format", stereo_mode_enum);
-#endif
-static const arg_def_t timebase = ARG_DEF(
-    NULL, "timebase", 1, "Output timestamp precision (fractional seconds)");
-static const arg_def_t global_error_resilient =
-    ARG_DEF(NULL, "global-error-resilient", 1,
-            "Enable global error resiliency features");
-static const arg_def_t lag_in_frames =
-    ARG_DEF(NULL, "lag-in-frames", 1, "Max number of frames to lag");
-static const arg_def_t large_scale_tile = ARG_DEF(
-    NULL, "large-scale-tile", 1,
-    "Large scale tile coding (0: off (default), 1: on (ivf output only))");
-static const arg_def_t monochrome =
-    ARG_DEF(NULL, "monochrome", 0, "Monochrome video (no chroma planes)");
-static const arg_def_t full_still_picture_hdr = ARG_DEF(
-    NULL, "full-still-picture-hdr", 0, "Use full header for still picture");
-static const arg_def_t use_16bit_internal =
-    ARG_DEF(NULL, "use-16bit-internal", 0, "Force use of 16-bit pipeline");
-
-static const arg_def_t *global_args[] = { &use_yv12,
-                                          &use_i420,
-                                          &use_i422,
-                                          &use_i444,
-                                          &usage,
-                                          &threads,
-                                          &profile,
-                                          &width,
-                                          &height,
-                                          &forced_max_frame_width,
-                                          &forced_max_frame_height,
-#if CONFIG_WEBM_IO
-                                          &stereo_mode,
-#endif
-                                          &timebase,
-                                          &framerate,
-                                          &global_error_resilient,
-                                          &bitdeptharg,
-                                          &lag_in_frames,
-                                          &large_scale_tile,
-                                          &monochrome,
-                                          &full_still_picture_hdr,
-                                          &use_16bit_internal,
-                                          NULL };
-
-static const arg_def_t dropframe_thresh =
-    ARG_DEF(NULL, "drop-frame", 1, "Temporal resampling threshold (buf %)");
-static const arg_def_t resize_mode =
-    ARG_DEF(NULL, "resize-mode", 1, "Frame resize mode");
-static const arg_def_t resize_denominator =
-    ARG_DEF(NULL, "resize-denominator", 1, "Frame resize denominator");
-static const arg_def_t resize_kf_denominator = ARG_DEF(
-    NULL, "resize-kf-denominator", 1, "Frame resize keyframe denominator");
-static const arg_def_t superres_mode =
-    ARG_DEF(NULL, "superres-mode", 1, "Frame super-resolution mode");
-static const arg_def_t superres_denominator = ARG_DEF(
-    NULL, "superres-denominator", 1, "Frame super-resolution denominator");
-static const arg_def_t superres_kf_denominator =
-    ARG_DEF(NULL, "superres-kf-denominator", 1,
-            "Frame super-resolution keyframe denominator");
-static const arg_def_t superres_qthresh = ARG_DEF(
-    NULL, "superres-qthresh", 1, "Frame super-resolution qindex threshold");
-static const arg_def_t superres_kf_qthresh =
-    ARG_DEF(NULL, "superres-kf-qthresh", 1,
-            "Frame super-resolution keyframe qindex threshold");
-static const struct arg_enum_list end_usage_enum[] = { { "vbr", AOM_VBR },
-                                                       { "cbr", AOM_CBR },
-                                                       { "cq", AOM_CQ },
-                                                       { "q", AOM_Q },
-                                                       { NULL, 0 } };
-static const arg_def_t end_usage =
-    ARG_DEF_ENUM(NULL, "end-usage", 1, "Rate control mode", end_usage_enum);
-static const arg_def_t target_bitrate =
-    ARG_DEF(NULL, "target-bitrate", 1, "Bitrate (kbps)");
-static const arg_def_t min_quantizer =
-    ARG_DEF(NULL, "min-q", 1, "Minimum (best) quantizer");
-static const arg_def_t max_quantizer =
-    ARG_DEF(NULL, "max-q", 1, "Maximum (worst) quantizer");
-static const arg_def_t undershoot_pct =
-    ARG_DEF(NULL, "undershoot-pct", 1, "Datarate undershoot (min) target (%)");
-static const arg_def_t overshoot_pct =
-    ARG_DEF(NULL, "overshoot-pct", 1, "Datarate overshoot (max) target (%)");
-static const arg_def_t buf_sz =
-    ARG_DEF(NULL, "buf-sz", 1, "Client buffer size (ms)");
-static const arg_def_t buf_initial_sz =
-    ARG_DEF(NULL, "buf-initial-sz", 1, "Client initial buffer size (ms)");
-static const arg_def_t buf_optimal_sz =
-    ARG_DEF(NULL, "buf-optimal-sz", 1, "Client optimal buffer size (ms)");
-static const arg_def_t bias_pct =
-    ARG_DEF(NULL, "bias-pct", 1, "CBR/VBR bias (0=CBR, 100=VBR)");
-static const arg_def_t minsection_pct =
-    ARG_DEF(NULL, "minsection-pct", 1, "GOP min bitrate (% of target)");
-static const arg_def_t maxsection_pct =
-    ARG_DEF(NULL, "maxsection-pct", 1, "GOP max bitrate (% of target)");
-static const arg_def_t *rc_args[] = { &dropframe_thresh,
-                                      &resize_mode,
-                                      &resize_denominator,
-                                      &resize_kf_denominator,
-                                      &superres_mode,
-                                      &superres_denominator,
-                                      &superres_kf_denominator,
-                                      &superres_qthresh,
-                                      &superres_kf_qthresh,
-                                      &end_usage,
-                                      &target_bitrate,
-                                      &min_quantizer,
-                                      &max_quantizer,
-                                      &undershoot_pct,
-                                      &overshoot_pct,
-                                      &buf_sz,
-                                      &buf_initial_sz,
-                                      &buf_optimal_sz,
-                                      &bias_pct,
-                                      &minsection_pct,
-                                      &maxsection_pct,
-                                      NULL };
-
-static const arg_def_t fwd_kf_enabled =
-    ARG_DEF(NULL, "enable-fwd-kf", 1, "Enable forward reference keyframes");
-static const arg_def_t kf_min_dist =
-    ARG_DEF(NULL, "kf-min-dist", 1, "Minimum keyframe interval (frames)");
-static const arg_def_t kf_max_dist =
-    ARG_DEF(NULL, "kf-max-dist", 1, "Maximum keyframe interval (frames)");
-static const arg_def_t kf_disabled =
-    ARG_DEF(NULL, "disable-kf", 0, "Disable keyframe placement");
-static const arg_def_t *kf_args[] = { &fwd_kf_enabled, &kf_min_dist,
-                                      &kf_max_dist, &kf_disabled, NULL };
-static const arg_def_t sframe_dist =
-    ARG_DEF(NULL, "sframe-dist", 1, "S-Frame interval (frames)");
-static const arg_def_t sframe_mode =
-    ARG_DEF(NULL, "sframe-mode", 1, "S-Frame insertion mode (1..2)");
-static const arg_def_t save_as_annexb =
-    ARG_DEF(NULL, "annexb", 1, "Save as Annex-B");
-static const arg_def_t noise_sens =
-    ARG_DEF(NULL, "noise-sensitivity", 1, "Noise sensitivity (frames to blur)");
-static const arg_def_t sharpness =
-    ARG_DEF(NULL, "sharpness", 1, "Loop filter sharpness (0..7), default is 0");
-static const arg_def_t static_thresh =
-    ARG_DEF(NULL, "static-thresh", 1, "Motion detection threshold");
-static const arg_def_t auto_altref =
-    ARG_DEF(NULL, "auto-alt-ref", 1, "Enable automatic alt reference frames");
-static const arg_def_t arnr_maxframes =
-    ARG_DEF(NULL, "arnr-maxframes", 1, "AltRef max frames (0..15)");
-static const arg_def_t arnr_strength =
-    ARG_DEF(NULL, "arnr-strength", 1, "AltRef filter strength (0..6)");
-static const struct arg_enum_list tuning_enum[] = {
-  { "psnr", AOM_TUNE_PSNR },
-  { "ssim", AOM_TUNE_SSIM },
-  { "vmaf_with_preprocessing", AOM_TUNE_VMAF_WITH_PREPROCESSING },
-  { "vmaf_without_preprocessing", AOM_TUNE_VMAF_WITHOUT_PREPROCESSING },
-  { "vmaf", AOM_TUNE_VMAF_MAX_GAIN },
-  { "vmaf_neg", AOM_TUNE_VMAF_NEG_MAX_GAIN },
-  { NULL, 0 }
-};
-static const arg_def_t tune_metric =
-    ARG_DEF_ENUM(NULL, "tune", 1, "Distortion metric tuned with", tuning_enum);
-static const arg_def_t cq_level =
-    ARG_DEF(NULL, "cq-level", 1, "Constant/Constrained Quality level");
-static const arg_def_t max_intra_rate_pct =
-    ARG_DEF(NULL, "max-intra-rate", 1, "Max I-frame bitrate (pct)");
-
-#if CONFIG_AV1_ENCODER
-static const arg_def_t cpu_used_av1 =
-    ARG_DEF(NULL, "cpu-used", 1,
-            "Speed setting (0..6 in good mode, 6..9 in realtime mode)");
-static const arg_def_t rowmtarg =
-    ARG_DEF(NULL, "row-mt", 1,
-            "Enable row based multi-threading (0: off, 1: on (default))");
-static const arg_def_t tile_cols =
-    ARG_DEF(NULL, "tile-columns", 1, "Number of tile columns to use, log2");
-static const arg_def_t tile_rows =
-    ARG_DEF(NULL, "tile-rows", 1, "Number of tile rows to use, log2");
-static const arg_def_t enable_tpl_model =
-    ARG_DEF(NULL, "enable-tpl-model", 1,
-            "RDO based on frame temporal dependency "
-            "(0: off, 1: backward source based). "
-            "This is required for deltaq mode.");
-static const arg_def_t enable_keyframe_filtering =
-    ARG_DEF(NULL, "enable-keyframe-filtering", 1,
-            "Apply temporal filtering on key frame"
-            "(0: no filter, 1: filter without overlay (default), "
-            "2: filter with overlay - experimental, may break random access in "
-            "players.)");
-static const arg_def_t tile_width =
-    ARG_DEF(NULL, "tile-width", 1, "Tile widths (comma separated)");
-static const arg_def_t tile_height =
-    ARG_DEF(NULL, "tile-height", 1, "Tile heights (command separated)");
-static const arg_def_t lossless =
-    ARG_DEF(NULL, "lossless", 1, "Lossless mode (0: false (default), 1: true)");
-static const arg_def_t enable_cdef =
-    ARG_DEF(NULL, "enable-cdef", 1,
-            "Enable the constrained directional enhancement filter (0: false, "
-            "1: true (default))");
-static const arg_def_t enable_restoration = ARG_DEF(
-    NULL, "enable-restoration", 1,
-    "Enable the loop restoration filter (0: false (default in Realtime mode), "
-    "1: true (default in Non-realtime mode))");
-static const arg_def_t enable_rect_partitions =
-    ARG_DEF(NULL, "enable-rect-partitions", 1,
-            "Enable rectangular partitions "
-            "(0: false, 1: true (default))");
-static const arg_def_t enable_ab_partitions =
-    ARG_DEF(NULL, "enable-ab-partitions", 1,
-            "Enable ab partitions (0: false, 1: true (default))");
-static const arg_def_t enable_1to4_partitions =
-    ARG_DEF(NULL, "enable-1to4-partitions", 1,
-            "Enable 1:4 and 4:1 partitions "
-            "(0: false, 1: true (default))");
-static const arg_def_t min_partition_size =
-    ARG_DEF(NULL, "min-partition-size", 1,
-            "Set min partition size "
-            "(4:4x4, 8:8x8, 16:16x16, 32:32x32, 64:64x64, 128:128x128). "
-            "On frame with 4k+ resolutions or higher speed settings, the min "
-            "partition size will have a minimum of 8.");
-static const arg_def_t max_partition_size =
-    ARG_DEF(NULL, "max-partition-size", 1,
-            "Set max partition size "
-            "(4:4x4, 8:8x8, 16:16x16, 32:32x32, 64:64x64, 128:128x128)");
-static const arg_def_t enable_dual_filter =
-    ARG_DEF(NULL, "enable-dual-filter", 1,
-            "Enable dual filter "
-            "(0: false, 1: true (default))");
-static const arg_def_t enable_chroma_deltaq =
-    ARG_DEF(NULL, "enable-chroma-deltaq", 1,
-            "Enable chroma delta quant "
-            "(0: false (default), 1: true)");
-static const arg_def_t enable_intra_edge_filter =
-    ARG_DEF(NULL, "enable-intra-edge-filter", 1,
-            "Enable intra edge filtering "
-            "(0: false, 1: true (default))");
-static const arg_def_t enable_order_hint =
-    ARG_DEF(NULL, "enable-order-hint", 1,
-            "Enable order hint "
-            "(0: false, 1: true (default))");
-static const arg_def_t enable_tx64 =
-    ARG_DEF(NULL, "enable-tx64", 1,
-            "Enable 64-pt transform (0: false, 1: true (default))");
-static const arg_def_t enable_flip_idtx =
-    ARG_DEF(NULL, "enable-flip-idtx", 1,
-            "Enable extended transform type (0: false, 1: true (default)) "
-            "including FLIPADST_DCT, DCT_FLIPADST, FLIPADST_FLIPADST, "
-            "ADST_FLIPADST, FLIPADST_ADST, IDTX, V_DCT, H_DCT, V_ADST, "
-            "H_ADST, V_FLIPADST, H_FLIPADST");
-static const arg_def_t enable_rect_tx =
-    ARG_DEF(NULL, "enable-rect-tx", 1,
-            "Enable rectangular transform (0: false, 1: true (default))");
-static const arg_def_t enable_dist_wtd_comp =
-    ARG_DEF(NULL, "enable-dist-wtd-comp", 1,
-            "Enable distance-weighted compound "
-            "(0: false, 1: true (default))");
-static const arg_def_t enable_masked_comp =
-    ARG_DEF(NULL, "enable-masked-comp", 1,
-            "Enable masked (wedge/diff-wtd) compound "
-            "(0: false, 1: true (default))");
-static const arg_def_t enable_onesided_comp =
-    ARG_DEF(NULL, "enable-onesided-comp", 1,
-            "Enable one sided compound "
-            "(0: false, 1: true (default))");
-static const arg_def_t enable_interintra_comp =
-    ARG_DEF(NULL, "enable-interintra-comp", 1,
-            "Enable interintra compound "
-            "(0: false, 1: true (default))");
-static const arg_def_t enable_smooth_interintra =
-    ARG_DEF(NULL, "enable-smooth-interintra", 1,
-            "Enable smooth interintra mode "
-            "(0: false, 1: true (default))");
-static const arg_def_t enable_diff_wtd_comp =
-    ARG_DEF(NULL, "enable-diff-wtd-comp", 1,
-            "Enable difference-weighted compound "
-            "(0: false, 1: true (default))");
-static const arg_def_t enable_interinter_wedge =
-    ARG_DEF(NULL, "enable-interinter-wedge", 1,
-            "Enable interinter wedge compound "
-            "(0: false, 1: true (default))");
-static const arg_def_t enable_interintra_wedge =
-    ARG_DEF(NULL, "enable-interintra-wedge", 1,
-            "Enable interintra wedge compound "
-            "(0: false, 1: true (default))");
-static const arg_def_t enable_global_motion =
-    ARG_DEF(NULL, "enable-global-motion", 1,
-            "Enable global motion "
-            "(0: false, 1: true (default))");
-static const arg_def_t enable_warped_motion =
-    ARG_DEF(NULL, "enable-warped-motion", 1,
-            "Enable local warped motion "
-            "(0: false, 1: true (default))");
-static const arg_def_t enable_filter_intra =
-    ARG_DEF(NULL, "enable-filter-intra", 1,
-            "Enable filter intra prediction mode "
-            "(0: false, 1: true (default))");
-static const arg_def_t enable_smooth_intra =
-    ARG_DEF(NULL, "enable-smooth-intra", 1,
-            "Enable smooth intra prediction modes "
-            "(0: false, 1: true (default))");
-static const arg_def_t enable_paeth_intra =
-    ARG_DEF(NULL, "enable-paeth-intra", 1,
-            "Enable Paeth intra prediction mode (0: false, 1: true (default))");
-static const arg_def_t enable_cfl_intra =
-    ARG_DEF(NULL, "enable-cfl-intra", 1,
-            "Enable chroma from luma intra prediction mode "
-            "(0: false, 1: true (default))");
-static const arg_def_t force_video_mode =
-    ARG_DEF(NULL, "force-video-mode", 1,
-            "Force video mode (0: false, 1: true (default))");
-static const arg_def_t enable_obmc = ARG_DEF(
-    NULL, "enable-obmc", 1, "Enable OBMC (0: false, 1: true (default))");
-static const arg_def_t enable_overlay =
-    ARG_DEF(NULL, "enable-overlay", 1,
-            "Enable coding overlay frames (0: false, 1: true (default))");
-static const arg_def_t enable_palette =
-    ARG_DEF(NULL, "enable-palette", 1,
-            "Enable palette prediction mode (0: false, 1: true (default))");
-static const arg_def_t enable_intrabc =
-    ARG_DEF(NULL, "enable-intrabc", 1,
-            "Enable intra block copy prediction mode "
-            "(0: false, 1: true (default))");
-static const arg_def_t enable_angle_delta =
-    ARG_DEF(NULL, "enable-angle-delta", 1,
-            "Enable intra angle delta (0: false, 1: true (default))");
-static const arg_def_t disable_trellis_quant =
-    ARG_DEF(NULL, "disable-trellis-quant", 1,
-            "Disable trellis optimization of quantized coefficients (0: false "
-            "1: true  2: true for rd search 3: true for estimate yrd serch "
-            "(default))");
-static const arg_def_t enable_qm =
-    ARG_DEF(NULL, "enable-qm", 1,
-            "Enable quantisation matrices (0: false (default), 1: true)");
-static const arg_def_t qm_min = ARG_DEF(
-    NULL, "qm-min", 1, "Min quant matrix flatness (0..15), default is 8");
-static const arg_def_t qm_max = ARG_DEF(
-    NULL, "qm-max", 1, "Max quant matrix flatness (0..15), default is 15");
-static const arg_def_t reduced_tx_type_set = ARG_DEF(
-    NULL, "reduced-tx-type-set", 1, "Use reduced set of transform types");
-static const arg_def_t use_intra_dct_only =
-    ARG_DEF(NULL, "use-intra-dct-only", 1, "Use DCT only for INTRA modes");
-static const arg_def_t use_inter_dct_only =
-    ARG_DEF(NULL, "use-inter-dct-only", 1, "Use DCT only for INTER modes");
-static const arg_def_t use_intra_default_tx_only =
-    ARG_DEF(NULL, "use-intra-default-tx-only", 1,
-            "Use Default-transform only for INTRA modes");
-static const arg_def_t quant_b_adapt =
-    ARG_DEF(NULL, "quant-b-adapt", 1, "Use adaptive quantize_b");
-static const arg_def_t coeff_cost_upd_freq =
-    ARG_DEF(NULL, "coeff-cost-upd-freq", 1,
-            "Update freq for coeff costs"
-            "0: SB, 1: SB Row per Tile, 2: Tile, 3: Off");
-static const arg_def_t mode_cost_upd_freq =
-    ARG_DEF(NULL, "mode-cost-upd-freq", 1,
-            "Update freq for mode costs"
-            "0: SB, 1: SB Row per Tile, 2: Tile, 3: Off");
-static const arg_def_t mv_cost_upd_freq =
-    ARG_DEF(NULL, "mv-cost-upd-freq", 1,
-            "Update freq for mv costs"
-            "0: SB, 1: SB Row per Tile, 2: Tile, 3: Off");
-static const arg_def_t num_tg = ARG_DEF(
-    NULL, "num-tile-groups", 1, "Maximum number of tile groups, default is 1");
-static const arg_def_t mtu_size =
-    ARG_DEF(NULL, "mtu-size", 1,
-            "MTU size for a tile group, default is 0 (no MTU targeting), "
-            "overrides maximum number of tile groups");
-static const struct arg_enum_list timing_info_enum[] = {
-  { "unspecified", AOM_TIMING_UNSPECIFIED },
-  { "constant", AOM_TIMING_EQUAL },
-  { "model", AOM_TIMING_DEC_MODEL },
-  { NULL, 0 }
-};
-static const arg_def_t timing_info =
-    ARG_DEF_ENUM(NULL, "timing-info", 1,
-                 "Signal timing info in the bitstream (model unly works for no "
-                 "hidden frames, no super-res yet):",
-                 timing_info_enum);
-#if CONFIG_TUNE_VMAF
-static const arg_def_t vmaf_model_path =
-    ARG_DEF(NULL, "vmaf-model-path", 1, "Path to the VMAF model file");
-#endif
-static const arg_def_t film_grain_test =
-    ARG_DEF(NULL, "film-grain-test", 1,
-            "Film grain test vectors (0: none (default), 1: test-1  2: test-2, "
-            "... 16: test-16)");
-static const arg_def_t film_grain_table =
-    ARG_DEF(NULL, "film-grain-table", 1,
-            "Path to file containing film grain parameters");
-#if CONFIG_DENOISE
-static const arg_def_t denoise_noise_level =
-    ARG_DEF(NULL, "denoise-noise-level", 1,
-            "Amount of noise (from 0 = don't denoise, to 50)");
-static const arg_def_t denoise_block_size =
-    ARG_DEF(NULL, "denoise-block-size", 1, "Denoise block size (default = 32)");
-#endif
-static const arg_def_t enable_ref_frame_mvs =
-    ARG_DEF(NULL, "enable-ref-frame-mvs", 1,
-            "Enable temporal mv prediction (default is 1)");
-static const arg_def_t frame_parallel_decoding =
-    ARG_DEF(NULL, "frame-parallel", 1,
-            "Enable frame parallel decodability features "
-            "(0: false (default), 1: true)");
-static const arg_def_t error_resilient_mode =
-    ARG_DEF(NULL, "error-resilient", 1,
-            "Enable error resilient features "
-            "(0: false (default), 1: true)");
-static const arg_def_t aq_mode = ARG_DEF(
-    NULL, "aq-mode", 1,
-    "Adaptive quantization mode (0: off (default), 1: variance 2: complexity, "
-    "3: cyclic refresh)");
-static const arg_def_t deltaq_mode =
-    ARG_DEF(NULL, "deltaq-mode", 1,
-            "Delta qindex mode (0: off, 1: deltaq objective (default), "
-            "2: deltaq perceptual). "
-            "Currently this requires enable-tpl-model as a prerequisite.");
-static const arg_def_t deltalf_mode = ARG_DEF(
-    NULL, "delta-lf-mode", 1, "Enable delta-lf-mode (0: off (default), 1: on)");
-static const arg_def_t frame_periodic_boost =
-    ARG_DEF(NULL, "frame-boost", 1,
-            "Enable frame periodic boost (0: off (default), 1: on)");
-static const arg_def_t gf_cbr_boost_pct = ARG_DEF(
-    NULL, "gf-cbr-boost", 1, "Boost for Golden Frame in CBR mode (pct)");
-static const arg_def_t max_inter_rate_pct =
-    ARG_DEF(NULL, "max-inter-rate", 1, "Max P-frame bitrate (pct)");
-static const arg_def_t min_gf_interval = ARG_DEF(
-    NULL, "min-gf-interval", 1,
-    "min gf/arf frame interval (default 0, indicating in-built behavior)");
-static const arg_def_t max_gf_interval = ARG_DEF(
-    NULL, "max-gf-interval", 1,
-    "max gf/arf frame interval (default 0, indicating in-built behavior)");
-static const arg_def_t gf_min_pyr_height =
-    ARG_DEF(NULL, "gf-min-pyr-height", 1,
-            "Min height for GF group pyramid structure (0 (default) to 5)");
-static const arg_def_t gf_max_pyr_height =
-    ARG_DEF(NULL, "gf-max-pyr-height", 1,
-            "maximum height for GF group pyramid structure (0 to 5 (default))");
-static const arg_def_t max_reference_frames = ARG_DEF(
-    NULL, "max-reference-frames", 1,
-    "maximum number of reference frames allowed per frame (3 to 7 (default))");
-static const arg_def_t reduced_reference_set =
-    ARG_DEF(NULL, "reduced-reference-set", 1,
-            "Use reduced set of single and compound references (0: off "
-            "(default), 1: on)");
-static const arg_def_t target_seq_level_idx =
-    ARG_DEF(NULL, "target-seq-level-idx", 1,
-            "Target sequence level index. "
-            "Possible values are in the form of \"ABxy\"(pad leading zeros if "
-            "less than 4 digits). "
-            "AB: Operating point(OP) index; "
-            "xy: Target level index for the OP. "
-            "E.g. \"0\" means target level index 0 for the 0th OP; "
-            "\"1021\" means target level index 21 for the 10th OP.");
-static const arg_def_t set_min_cr =
-    ARG_DEF(NULL, "min-cr", 1,
-            "Set minimum compression ratio. Take integer values. Default is 0. "
-            "If non-zero, encoder will try to keep the compression ratio of "
-            "each frame to be higher than the given value divided by 100.");
-
-static const struct arg_enum_list color_primaries_enum[] = {
-  { "bt709", AOM_CICP_CP_BT_709 },
-  { "unspecified", AOM_CICP_CP_UNSPECIFIED },
-  { "bt601", AOM_CICP_CP_BT_601 },
-  { "bt470m", AOM_CICP_CP_BT_470_M },
-  { "bt470bg", AOM_CICP_CP_BT_470_B_G },
-  { "smpte240", AOM_CICP_CP_SMPTE_240 },
-  { "film", AOM_CICP_CP_GENERIC_FILM },
-  { "bt2020", AOM_CICP_CP_BT_2020 },
-  { "xyz", AOM_CICP_CP_XYZ },
-  { "smpte431", AOM_CICP_CP_SMPTE_431 },
-  { "smpte432", AOM_CICP_CP_SMPTE_432 },
-  { "ebu3213", AOM_CICP_CP_EBU_3213 },
-  { NULL, 0 }
-};
-
-static const arg_def_t input_color_primaries = ARG_DEF_ENUM(
-    NULL, "color-primaries", 1,
-    "Color primaries (CICP) of input content:", color_primaries_enum);
-
-static const struct arg_enum_list transfer_characteristics_enum[] = {
-  { "unspecified", AOM_CICP_CP_UNSPECIFIED },
-  { "bt709", AOM_CICP_TC_BT_709 },
-  { "bt470m", AOM_CICP_TC_BT_470_M },
-  { "bt470bg", AOM_CICP_TC_BT_470_B_G },
-  { "bt601", AOM_CICP_TC_BT_601 },
-  { "smpte240", AOM_CICP_TC_SMPTE_240 },
-  { "lin", AOM_CICP_TC_LINEAR },
-  { "log100", AOM_CICP_TC_LOG_100 },
-  { "log100sq10", AOM_CICP_TC_LOG_100_SQRT10 },
-  { "iec61966", AOM_CICP_TC_IEC_61966 },
-  { "bt1361", AOM_CICP_TC_BT_1361 },
-  { "srgb", AOM_CICP_TC_SRGB },
-  { "bt2020-10bit", AOM_CICP_TC_BT_2020_10_BIT },
-  { "bt2020-12bit", AOM_CICP_TC_BT_2020_12_BIT },
-  { "smpte2084", AOM_CICP_TC_SMPTE_2084 },
-  { "hlg", AOM_CICP_TC_HLG },
-  { "smpte428", AOM_CICP_TC_SMPTE_428 },
-  { NULL, 0 }
-};
-
-static const arg_def_t input_transfer_characteristics =
-    ARG_DEF_ENUM(NULL, "transfer-characteristics", 1,
-                 "Transfer characteristics (CICP) of input content:",
-                 transfer_characteristics_enum);
-
-static const struct arg_enum_list matrix_coefficients_enum[] = {
-  { "identity", AOM_CICP_MC_IDENTITY },
-  { "bt709", AOM_CICP_MC_BT_709 },
-  { "unspecified", AOM_CICP_MC_UNSPECIFIED },
-  { "fcc73", AOM_CICP_MC_FCC },
-  { "bt470bg", AOM_CICP_MC_BT_470_B_G },
-  { "bt601", AOM_CICP_MC_BT_601 },
-  { "smpte240", AOM_CICP_CP_SMPTE_240 },
-  { "ycgco", AOM_CICP_MC_SMPTE_YCGCO },
-  { "bt2020ncl", AOM_CICP_MC_BT_2020_NCL },
-  { "bt2020cl", AOM_CICP_MC_BT_2020_CL },
-  { "smpte2085", AOM_CICP_MC_SMPTE_2085 },
-  { "chromncl", AOM_CICP_MC_CHROMAT_NCL },
-  { "chromcl", AOM_CICP_MC_CHROMAT_CL },
-  { "ictcp", AOM_CICP_MC_ICTCP },
-  { NULL, 0 }
-};
-
-static const arg_def_t input_matrix_coefficients = ARG_DEF_ENUM(
-    NULL, "matrix-coefficients", 1,
-    "Matrix coefficients (CICP) of input content:", matrix_coefficients_enum);
-
-static const struct arg_enum_list chroma_sample_position_enum[] = {
-  { "unknown", AOM_CSP_UNKNOWN },
-  { "vertical", AOM_CSP_VERTICAL },
-  { "colocated", AOM_CSP_COLOCATED },
-  { NULL, 0 }
-};
-
-static const arg_def_t input_chroma_sample_position =
-    ARG_DEF_ENUM(NULL, "chroma-sample-position", 1,
-                 "The chroma sample position when chroma 4:2:0 is signaled:",
-                 chroma_sample_position_enum);
-
-static const struct arg_enum_list tune_content_enum[] = {
-  { "default", AOM_CONTENT_DEFAULT },
-  { "screen", AOM_CONTENT_SCREEN },
-  { NULL, 0 }
-};
-
-static const arg_def_t tune_content = ARG_DEF_ENUM(
-    NULL, "tune-content", 1, "Tune content type", tune_content_enum);
-
-static const arg_def_t cdf_update_mode =
-    ARG_DEF(NULL, "cdf-update-mode", 1,
-            "CDF update mode for entropy coding "
-            "(0: no CDF update; 1: update CDF on all frames(default); "
-            "2: selectively update CDF on some frames");
-
-static const struct arg_enum_list superblock_size_enum[] = {
-  { "dynamic", AOM_SUPERBLOCK_SIZE_DYNAMIC },
-  { "64", AOM_SUPERBLOCK_SIZE_64X64 },
-  { "128", AOM_SUPERBLOCK_SIZE_128X128 },
-  { NULL, 0 }
-};
-static const arg_def_t superblock_size = ARG_DEF_ENUM(
-    NULL, "sb-size", 1, "Superblock size to use", superblock_size_enum);
-
-static const arg_def_t set_tier_mask =
-    ARG_DEF(NULL, "set-tier-mask", 1,
-            "Set bit mask to specify which tier each of the 32 possible "
-            "operating points conforms to. "
-            "Bit value 0(defualt): Main Tier; 1: High Tier.");
-
-static const arg_def_t use_fixed_qp_offsets =
-    ARG_DEF(NULL, "use-fixed-qp-offsets", 1,
-            "Enable fixed QP offsets for frames at different levels of the "
-            "pyramid. Selected automatically from --cq-level if "
-            "--fixed-qp-offsets is not provided. If this option is not "
-            "specified (default), offsets are adaptively chosen by the "
-            "encoder.");
-
-static const arg_def_t fixed_qp_offsets =
-    ARG_DEF(NULL, "fixed-qp-offsets", 1,
-            "Set fixed QP offsets for frames at different levels of the "
-            "pyramid. Comma-separated list of 5 offsets for keyframe, ALTREF, "
-            "and 3 levels of internal alt-refs. If this option is not "
-            "specified (default), offsets are adaptively chosen by the "
-            "encoder.");
-
-static const arg_def_t vbr_corpus_complexity_lap = ARG_DEF(
-    NULL, "vbr-corpus-complexity-lap", 1,
-    "Set average corpus complexity per mb for single pass VBR using lap. "
-    "(0..10000), default is 0");
-
-static const arg_def_t *av1_args[] = { &cpu_used_av1,
-                                       &auto_altref,
-                                       &sharpness,
-                                       &static_thresh,
-                                       &rowmtarg,
-                                       &tile_cols,
-                                       &tile_rows,
-                                       &enable_tpl_model,
-                                       &enable_keyframe_filtering,
-                                       &arnr_maxframes,
-                                       &arnr_strength,
-                                       &tune_metric,
-                                       &cq_level,
-                                       &max_intra_rate_pct,
-                                       &max_inter_rate_pct,
-                                       &gf_cbr_boost_pct,
-                                       &lossless,
-                                       &enable_cdef,
-                                       &enable_restoration,
-                                       &enable_rect_partitions,
-                                       &enable_ab_partitions,
-                                       &enable_1to4_partitions,
-                                       &min_partition_size,
-                                       &max_partition_size,
-                                       &enable_dual_filter,
-                                       &enable_chroma_deltaq,
-                                       &enable_intra_edge_filter,
-                                       &enable_order_hint,
-                                       &enable_tx64,
-                                       &enable_flip_idtx,
-                                       &enable_rect_tx,
-                                       &enable_dist_wtd_comp,
-                                       &enable_masked_comp,
-                                       &enable_onesided_comp,
-                                       &enable_interintra_comp,
-                                       &enable_smooth_interintra,
-                                       &enable_diff_wtd_comp,
-                                       &enable_interinter_wedge,
-                                       &enable_interintra_wedge,
-                                       &enable_global_motion,
-                                       &enable_warped_motion,
-                                       &enable_filter_intra,
-                                       &enable_smooth_intra,
-                                       &enable_paeth_intra,
-                                       &enable_cfl_intra,
-                                       &force_video_mode,
-                                       &enable_obmc,
-                                       &enable_overlay,
-                                       &enable_palette,
-                                       &enable_intrabc,
-                                       &enable_angle_delta,
-                                       &disable_trellis_quant,
-                                       &enable_qm,
-                                       &qm_min,
-                                       &qm_max,
-                                       &reduced_tx_type_set,
-                                       &use_intra_dct_only,
-                                       &use_inter_dct_only,
-                                       &use_intra_default_tx_only,
-                                       &quant_b_adapt,
-                                       &coeff_cost_upd_freq,
-                                       &mode_cost_upd_freq,
-                                       &mv_cost_upd_freq,
-                                       &frame_parallel_decoding,
-                                       &error_resilient_mode,
-                                       &aq_mode,
-                                       &deltaq_mode,
-                                       &deltalf_mode,
-                                       &frame_periodic_boost,
-                                       &noise_sens,
-                                       &tune_content,
-                                       &cdf_update_mode,
-                                       &input_color_primaries,
-                                       &input_transfer_characteristics,
-                                       &input_matrix_coefficients,
-                                       &input_chroma_sample_position,
-                                       &min_gf_interval,
-                                       &max_gf_interval,
-                                       &gf_min_pyr_height,
-                                       &gf_max_pyr_height,
-                                       &superblock_size,
-                                       &num_tg,
-                                       &mtu_size,
-                                       &timing_info,
-                                       &film_grain_test,
-                                       &film_grain_table,
-#if CONFIG_DENOISE
-                                       &denoise_noise_level,
-                                       &denoise_block_size,
-#endif  // CONFIG_DENOISE
-                                       &max_reference_frames,
-                                       &reduced_reference_set,
-                                       &enable_ref_frame_mvs,
-                                       &target_seq_level_idx,
-                                       &set_tier_mask,
-                                       &set_min_cr,
-                                       &vbr_corpus_complexity_lap,
-                                       &bitdeptharg,
-                                       &inbitdeptharg,
-                                       &input_chroma_subsampling_x,
-                                       &input_chroma_subsampling_y,
-                                       &sframe_dist,
-                                       &sframe_mode,
-                                       &save_as_annexb,
-#if CONFIG_TUNE_VMAF
-                                       &vmaf_model_path,
-#endif
-                                       NULL };
 static const int av1_arg_ctrl_map[] = { AOME_SET_CPUUSED,
                                         AOME_SET_ENABLEAUTOALTREF,
                                         AOME_SET_SHARPNESS,
@@ -1042,7 +224,197 @@
                                         AV1E_SET_VMAF_MODEL_PATH,
 #endif
                                         0 };
-#endif  // CONFIG_AV1_ENCODER
+
+const arg_def_t *main_args[] = { &g_av1_codec_arg_defs.help,
+                                 &g_av1_codec_arg_defs.use_cfg,
+                                 &g_av1_codec_arg_defs.debugmode,
+                                 &g_av1_codec_arg_defs.outputfile,
+                                 &g_av1_codec_arg_defs.codecarg,
+                                 &g_av1_codec_arg_defs.passes,
+                                 &g_av1_codec_arg_defs.pass_arg,
+                                 &g_av1_codec_arg_defs.fpf_name,
+                                 &g_av1_codec_arg_defs.limit,
+                                 &g_av1_codec_arg_defs.skip,
+                                 &g_av1_codec_arg_defs.good_dl,
+                                 &g_av1_codec_arg_defs.rt_dl,
+                                 &g_av1_codec_arg_defs.quietarg,
+                                 &g_av1_codec_arg_defs.verbosearg,
+                                 &g_av1_codec_arg_defs.psnrarg,
+                                 &g_av1_codec_arg_defs.use_webm,
+                                 &g_av1_codec_arg_defs.use_ivf,
+                                 &g_av1_codec_arg_defs.use_obu,
+                                 &g_av1_codec_arg_defs.q_hist_n,
+                                 &g_av1_codec_arg_defs.rate_hist_n,
+                                 &g_av1_codec_arg_defs.disable_warnings,
+                                 &g_av1_codec_arg_defs.disable_warning_prompt,
+                                 &g_av1_codec_arg_defs.recontest,
+                                 NULL };
+
+const arg_def_t *global_args[] = {
+  &g_av1_codec_arg_defs.use_yv12,
+  &g_av1_codec_arg_defs.use_i420,
+  &g_av1_codec_arg_defs.use_i422,
+  &g_av1_codec_arg_defs.use_i444,
+  &g_av1_codec_arg_defs.usage,
+  &g_av1_codec_arg_defs.threads,
+  &g_av1_codec_arg_defs.profile,
+  &g_av1_codec_arg_defs.width,
+  &g_av1_codec_arg_defs.height,
+  &g_av1_codec_arg_defs.forced_max_frame_width,
+  &g_av1_codec_arg_defs.forced_max_frame_height,
+#if CONFIG_WEBM_IO
+  &g_av1_codec_arg_defs.stereo_mode,
+#endif
+  &g_av1_codec_arg_defs.timebase,
+  &g_av1_codec_arg_defs.framerate,
+  &g_av1_codec_arg_defs.global_error_resilient,
+  &g_av1_codec_arg_defs.bitdeptharg,
+  &g_av1_codec_arg_defs.lag_in_frames,
+  &g_av1_codec_arg_defs.large_scale_tile,
+  &g_av1_codec_arg_defs.monochrome,
+  &g_av1_codec_arg_defs.full_still_picture_hdr,
+  &g_av1_codec_arg_defs.use_16bit_internal,
+  NULL
+};
+
+const arg_def_t *rc_args[] = { &g_av1_codec_arg_defs.dropframe_thresh,
+                               &g_av1_codec_arg_defs.resize_mode,
+                               &g_av1_codec_arg_defs.resize_denominator,
+                               &g_av1_codec_arg_defs.resize_kf_denominator,
+                               &g_av1_codec_arg_defs.superres_mode,
+                               &g_av1_codec_arg_defs.superres_denominator,
+                               &g_av1_codec_arg_defs.superres_kf_denominator,
+                               &g_av1_codec_arg_defs.superres_qthresh,
+                               &g_av1_codec_arg_defs.superres_kf_qthresh,
+                               &g_av1_codec_arg_defs.end_usage,
+                               &g_av1_codec_arg_defs.target_bitrate,
+                               &g_av1_codec_arg_defs.min_quantizer,
+                               &g_av1_codec_arg_defs.max_quantizer,
+                               &g_av1_codec_arg_defs.undershoot_pct,
+                               &g_av1_codec_arg_defs.overshoot_pct,
+                               &g_av1_codec_arg_defs.buf_sz,
+                               &g_av1_codec_arg_defs.buf_initial_sz,
+                               &g_av1_codec_arg_defs.buf_optimal_sz,
+                               &g_av1_codec_arg_defs.bias_pct,
+                               &g_av1_codec_arg_defs.minsection_pct,
+                               &g_av1_codec_arg_defs.maxsection_pct,
+                               NULL };
+
+const arg_def_t *kf_args[] = { &g_av1_codec_arg_defs.fwd_kf_enabled,
+                               &g_av1_codec_arg_defs.kf_min_dist,
+                               &g_av1_codec_arg_defs.kf_max_dist,
+                               &g_av1_codec_arg_defs.kf_disabled, NULL };
+
+const arg_def_t *av1_args[] = {
+  &g_av1_codec_arg_defs.cpu_used_av1,
+  &g_av1_codec_arg_defs.auto_altref,
+  &g_av1_codec_arg_defs.sharpness,
+  &g_av1_codec_arg_defs.static_thresh,
+  &g_av1_codec_arg_defs.rowmtarg,
+  &g_av1_codec_arg_defs.tile_cols,
+  &g_av1_codec_arg_defs.tile_rows,
+  &g_av1_codec_arg_defs.enable_tpl_model,
+  &g_av1_codec_arg_defs.enable_keyframe_filtering,
+  &g_av1_codec_arg_defs.arnr_maxframes,
+  &g_av1_codec_arg_defs.arnr_strength,
+  &g_av1_codec_arg_defs.tune_metric,
+  &g_av1_codec_arg_defs.cq_level,
+  &g_av1_codec_arg_defs.max_intra_rate_pct,
+  &g_av1_codec_arg_defs.max_inter_rate_pct,
+  &g_av1_codec_arg_defs.gf_cbr_boost_pct,
+  &g_av1_codec_arg_defs.lossless,
+  &g_av1_codec_arg_defs.enable_cdef,
+  &g_av1_codec_arg_defs.enable_restoration,
+  &g_av1_codec_arg_defs.enable_rect_partitions,
+  &g_av1_codec_arg_defs.enable_ab_partitions,
+  &g_av1_codec_arg_defs.enable_1to4_partitions,
+  &g_av1_codec_arg_defs.min_partition_size,
+  &g_av1_codec_arg_defs.max_partition_size,
+  &g_av1_codec_arg_defs.enable_dual_filter,
+  &g_av1_codec_arg_defs.enable_chroma_deltaq,
+  &g_av1_codec_arg_defs.enable_intra_edge_filter,
+  &g_av1_codec_arg_defs.enable_order_hint,
+  &g_av1_codec_arg_defs.enable_tx64,
+  &g_av1_codec_arg_defs.enable_flip_idtx,
+  &g_av1_codec_arg_defs.enable_rect_tx,
+  &g_av1_codec_arg_defs.enable_dist_wtd_comp,
+  &g_av1_codec_arg_defs.enable_masked_comp,
+  &g_av1_codec_arg_defs.enable_onesided_comp,
+  &g_av1_codec_arg_defs.enable_interintra_comp,
+  &g_av1_codec_arg_defs.enable_smooth_interintra,
+  &g_av1_codec_arg_defs.enable_diff_wtd_comp,
+  &g_av1_codec_arg_defs.enable_interinter_wedge,
+  &g_av1_codec_arg_defs.enable_interintra_wedge,
+  &g_av1_codec_arg_defs.enable_global_motion,
+  &g_av1_codec_arg_defs.enable_warped_motion,
+  &g_av1_codec_arg_defs.enable_filter_intra,
+  &g_av1_codec_arg_defs.enable_smooth_intra,
+  &g_av1_codec_arg_defs.enable_paeth_intra,
+  &g_av1_codec_arg_defs.enable_cfl_intra,
+  &g_av1_codec_arg_defs.force_video_mode,
+  &g_av1_codec_arg_defs.enable_obmc,
+  &g_av1_codec_arg_defs.enable_overlay,
+  &g_av1_codec_arg_defs.enable_palette,
+  &g_av1_codec_arg_defs.enable_intrabc,
+  &g_av1_codec_arg_defs.enable_angle_delta,
+  &g_av1_codec_arg_defs.disable_trellis_quant,
+  &g_av1_codec_arg_defs.enable_qm,
+  &g_av1_codec_arg_defs.qm_min,
+  &g_av1_codec_arg_defs.qm_max,
+  &g_av1_codec_arg_defs.reduced_tx_type_set,
+  &g_av1_codec_arg_defs.use_intra_dct_only,
+  &g_av1_codec_arg_defs.use_inter_dct_only,
+  &g_av1_codec_arg_defs.use_intra_default_tx_only,
+  &g_av1_codec_arg_defs.quant_b_adapt,
+  &g_av1_codec_arg_defs.coeff_cost_upd_freq,
+  &g_av1_codec_arg_defs.mode_cost_upd_freq,
+  &g_av1_codec_arg_defs.mv_cost_upd_freq,
+  &g_av1_codec_arg_defs.frame_parallel_decoding,
+  &g_av1_codec_arg_defs.error_resilient_mode,
+  &g_av1_codec_arg_defs.aq_mode,
+  &g_av1_codec_arg_defs.deltaq_mode,
+  &g_av1_codec_arg_defs.deltalf_mode,
+  &g_av1_codec_arg_defs.frame_periodic_boost,
+  &g_av1_codec_arg_defs.noise_sens,
+  &g_av1_codec_arg_defs.tune_content,
+  &g_av1_codec_arg_defs.cdf_update_mode,
+  &g_av1_codec_arg_defs.input_color_primaries,
+  &g_av1_codec_arg_defs.input_transfer_characteristics,
+  &g_av1_codec_arg_defs.input_matrix_coefficients,
+  &g_av1_codec_arg_defs.input_chroma_sample_position,
+  &g_av1_codec_arg_defs.min_gf_interval,
+  &g_av1_codec_arg_defs.max_gf_interval,
+  &g_av1_codec_arg_defs.gf_min_pyr_height,
+  &g_av1_codec_arg_defs.gf_max_pyr_height,
+  &g_av1_codec_arg_defs.superblock_size,
+  &g_av1_codec_arg_defs.num_tg,
+  &g_av1_codec_arg_defs.mtu_size,
+  &g_av1_codec_arg_defs.timing_info,
+  &g_av1_codec_arg_defs.film_grain_test,
+  &g_av1_codec_arg_defs.film_grain_table,
+#if CONFIG_DENOISE
+  &g_av1_codec_arg_defs.denoise_noise_level,
+  &g_av1_codec_arg_defs.denoise_block_size,
+#endif  // CONFIG_DENOISE
+  &g_av1_codec_arg_defs.max_reference_frames,
+  &g_av1_codec_arg_defs.reduced_reference_set,
+  &g_av1_codec_arg_defs.enable_ref_frame_mvs,
+  &g_av1_codec_arg_defs.target_seq_level_idx,
+  &g_av1_codec_arg_defs.set_tier_mask,
+  &g_av1_codec_arg_defs.set_min_cr,
+  &g_av1_codec_arg_defs.vbr_corpus_complexity_lap,
+  &g_av1_codec_arg_defs.bitdeptharg,
+  &g_av1_codec_arg_defs.inbitdeptharg,
+  &g_av1_codec_arg_defs.input_chroma_subsampling_x,
+  &g_av1_codec_arg_defs.input_chroma_subsampling_y,
+  &g_av1_codec_arg_defs.sframe_dist,
+  &g_av1_codec_arg_defs.sframe_mode,
+  &g_av1_codec_arg_defs.save_as_annexb,
+#if CONFIG_TUNE_VMAF
+  &g_av1_codec_arg_defs.vmaf_model_path,
+#endif
+  NULL
+};
 
 static const arg_def_t *no_args[] = { NULL };
 
@@ -1186,77 +558,81 @@
   for (argi = argj = argv_local; (*argj = *argi); argi += arg.argv_step) {
     arg.argv_step = 1;
 
-    if (arg_match(&arg, &use_cfg, argi)) {
+    if (arg_match(&arg, &g_av1_codec_arg_defs.use_cfg, argi)) {
       if (!cfg_included) {
         parse_cfg(arg.val, &global->encoder_config);
         cfg_included = 1;
       }
-    } else if (arg_match(&arg, &help, argi)) {
+    } else if (arg_match(&arg, &g_av1_codec_arg_defs.help, argi)) {
       show_help(stdout, 0);
       exit(EXIT_SUCCESS);
-    } else if (arg_match(&arg, &codecarg, argi)) {
+    } else if (arg_match(&arg, &g_av1_codec_arg_defs.codecarg, argi)) {
       global->codec = get_aom_encoder_by_short_name(arg.val);
       if (!global->codec)
         die("Error: Unrecognized argument (%s) to --codec\n", arg.val);
-    } else if (arg_match(&arg, &passes, argi)) {
+    } else if (arg_match(&arg, &g_av1_codec_arg_defs.passes, argi)) {
       global->passes = arg_parse_uint(&arg);
 
       if (global->passes < 1 || global->passes > 2)
         die("Error: Invalid number of passes (%d)\n", global->passes);
-    } else if (arg_match(&arg, &pass_arg, argi)) {
+    } else if (arg_match(&arg, &g_av1_codec_arg_defs.pass_arg, argi)) {
       global->pass = arg_parse_uint(&arg);
 
       if (global->pass < 1 || global->pass > 2)
         die("Error: Invalid pass selected (%d)\n", global->pass);
-    } else if (arg_match(&arg, &input_chroma_sample_position, argi)) {
+    } else if (arg_match(&arg,
+                         &g_av1_codec_arg_defs.input_chroma_sample_position,
+                         argi)) {
       global->csp = arg_parse_enum(&arg);
       /* Flag is used by later code as well, preserve it. */
       argj++;
-    } else if (arg_match(&arg, &usage, argi))
+    } else if (arg_match(&arg, &g_av1_codec_arg_defs.usage, argi)) {
       global->usage = arg_parse_uint(&arg);
-    else if (arg_match(&arg, &good_dl, argi))
+    } else if (arg_match(&arg, &g_av1_codec_arg_defs.good_dl, argi)) {
       global->usage = AOM_USAGE_GOOD_QUALITY;  // Good quality usage
-    else if (arg_match(&arg, &rt_dl, argi))
+    } else if (arg_match(&arg, &g_av1_codec_arg_defs.rt_dl, argi)) {
       global->usage = AOM_USAGE_REALTIME;  // Real-time usage
-    else if (arg_match(&arg, &use_yv12, argi))
+    } else if (arg_match(&arg, &g_av1_codec_arg_defs.use_yv12, argi)) {
       global->color_type = YV12;
-    else if (arg_match(&arg, &use_i420, argi))
+    } else if (arg_match(&arg, &g_av1_codec_arg_defs.use_i420, argi)) {
       global->color_type = I420;
-    else if (arg_match(&arg, &use_i422, argi))
+    } else if (arg_match(&arg, &g_av1_codec_arg_defs.use_i422, argi)) {
       global->color_type = I422;
-    else if (arg_match(&arg, &use_i444, argi))
+    } else if (arg_match(&arg, &g_av1_codec_arg_defs.use_i444, argi)) {
       global->color_type = I444;
-    else if (arg_match(&arg, &quietarg, argi))
+    } else if (arg_match(&arg, &g_av1_codec_arg_defs.quietarg, argi)) {
       global->quiet = 1;
-    else if (arg_match(&arg, &verbosearg, argi))
+    } else if (arg_match(&arg, &g_av1_codec_arg_defs.verbosearg, argi)) {
       global->verbose = 1;
-    else if (arg_match(&arg, &limit, argi))
+    } else if (arg_match(&arg, &g_av1_codec_arg_defs.limit, argi)) {
       global->limit = arg_parse_uint(&arg);
-    else if (arg_match(&arg, &skip, argi))
+    } else if (arg_match(&arg, &g_av1_codec_arg_defs.skip, argi)) {
       global->skip_frames = arg_parse_uint(&arg);
-    else if (arg_match(&arg, &psnrarg, argi)) {
+    } else if (arg_match(&arg, &g_av1_codec_arg_defs.psnrarg, argi)) {
       if (arg.val)
         global->show_psnr = arg_parse_int(&arg);
       else
         global->show_psnr = 1;
-    } else if (arg_match(&arg, &recontest, argi)) {
+    } else if (arg_match(&arg, &g_av1_codec_arg_defs.recontest, argi)) {
       global->test_decode = arg_parse_enum_or_int(&arg);
-    } else if (arg_match(&arg, &framerate, argi)) {
+    } else if (arg_match(&arg, &g_av1_codec_arg_defs.framerate, argi)) {
       global->framerate = arg_parse_rational(&arg);
       validate_positive_rational(arg.name, &global->framerate);
       global->have_framerate = 1;
-    } else if (arg_match(&arg, &debugmode, argi))
+    } else if (arg_match(&arg, &g_av1_codec_arg_defs.debugmode, argi)) {
       global->debug = 1;
-    else if (arg_match(&arg, &q_hist_n, argi))
+    } else if (arg_match(&arg, &g_av1_codec_arg_defs.q_hist_n, argi)) {
       global->show_q_hist_buckets = arg_parse_uint(&arg);
-    else if (arg_match(&arg, &rate_hist_n, argi))
+    } else if (arg_match(&arg, &g_av1_codec_arg_defs.rate_hist_n, argi)) {
       global->show_rate_hist_buckets = arg_parse_uint(&arg);
-    else if (arg_match(&arg, &disable_warnings, argi))
+    } else if (arg_match(&arg, &g_av1_codec_arg_defs.disable_warnings, argi)) {
       global->disable_warnings = 1;
-    else if (arg_match(&arg, &disable_warning_prompt, argi))
+    } else if (arg_match(&arg, &g_av1_codec_arg_defs.disable_warning_prompt,
+                         argi)) {
       global->disable_warning_prompt = 1;
-    else
+    } else {
       argj++;
+    }
   }
 
   if (global->pass) {
@@ -1469,7 +845,7 @@
       continue;
     }
 
-    if (arg_match(&arg, &outputfile, argi)) {
+    if (arg_match(&arg, &g_av1_codec_arg_defs.outputfile, argi)) {
       config->out_fn = arg.val;
       if (!webm_forced) {
         const size_t out_fn_len = strlen(config->out_fn);
@@ -1483,143 +859,156 @@
           config->write_ivf = 0;
         }
       }
-    } else if (arg_match(&arg, &fpf_name, argi)) {
+    } else if (arg_match(&arg, &g_av1_codec_arg_defs.fpf_name, argi)) {
       config->stats_fn = arg.val;
-    } else if (arg_match(&arg, &use_webm, argi)) {
+    } else if (arg_match(&arg, &g_av1_codec_arg_defs.use_webm, argi)) {
 #if CONFIG_WEBM_IO
       config->write_webm = 1;
       webm_forced = 1;
 #else
       die("Error: --webm specified but webm is disabled.");
 #endif
-    } else if (arg_match(&arg, &use_ivf, argi)) {
+    } else if (arg_match(&arg, &g_av1_codec_arg_defs.use_ivf, argi)) {
       config->write_webm = 0;
       config->write_ivf = 1;
-    } else if (arg_match(&arg, &use_obu, argi)) {
+    } else if (arg_match(&arg, &g_av1_codec_arg_defs.use_obu, argi)) {
       config->write_webm = 0;
       config->write_ivf = 0;
-    } else if (arg_match(&arg, &threads, argi)) {
+    } else if (arg_match(&arg, &g_av1_codec_arg_defs.threads, argi)) {
       config->cfg.g_threads = arg_parse_uint(&arg);
-    } else if (arg_match(&arg, &profile, argi)) {
+    } else if (arg_match(&arg, &g_av1_codec_arg_defs.profile, argi)) {
       config->cfg.g_profile = arg_parse_uint(&arg);
-    } else if (arg_match(&arg, &width, argi)) {
+    } else if (arg_match(&arg, &g_av1_codec_arg_defs.width, argi)) {
       config->cfg.g_w = arg_parse_uint(&arg);
-    } else if (arg_match(&arg, &height, argi)) {
+    } else if (arg_match(&arg, &g_av1_codec_arg_defs.height, argi)) {
       config->cfg.g_h = arg_parse_uint(&arg);
-    } else if (arg_match(&arg, &forced_max_frame_width, argi)) {
+    } else if (arg_match(&arg, &g_av1_codec_arg_defs.forced_max_frame_width,
+                         argi)) {
       config->cfg.g_forced_max_frame_width = arg_parse_uint(&arg);
-    } else if (arg_match(&arg, &forced_max_frame_height, argi)) {
+    } else if (arg_match(&arg, &g_av1_codec_arg_defs.forced_max_frame_height,
+                         argi)) {
       config->cfg.g_forced_max_frame_height = arg_parse_uint(&arg);
-    } else if (arg_match(&arg, &bitdeptharg, argi)) {
+    } else if (arg_match(&arg, &g_av1_codec_arg_defs.bitdeptharg, argi)) {
       config->cfg.g_bit_depth = arg_parse_enum_or_int(&arg);
-    } else if (arg_match(&arg, &inbitdeptharg, argi)) {
+    } else if (arg_match(&arg, &g_av1_codec_arg_defs.inbitdeptharg, argi)) {
       config->cfg.g_input_bit_depth = arg_parse_uint(&arg);
-    } else if (arg_match(&arg, &input_chroma_subsampling_x, argi)) {
+    } else if (arg_match(&arg, &g_av1_codec_arg_defs.input_chroma_subsampling_x,
+                         argi)) {
       stream->chroma_subsampling_x = arg_parse_uint(&arg);
-    } else if (arg_match(&arg, &input_chroma_subsampling_y, argi)) {
+    } else if (arg_match(&arg, &g_av1_codec_arg_defs.input_chroma_subsampling_y,
+                         argi)) {
       stream->chroma_subsampling_y = arg_parse_uint(&arg);
 #if CONFIG_WEBM_IO
-    } else if (arg_match(&arg, &stereo_mode, argi)) {
+    } else if (arg_match(&arg, &g_av1_codec_arg_defs.stereo_mode, argi)) {
       config->stereo_fmt = arg_parse_enum_or_int(&arg);
 #endif
-    } else if (arg_match(&arg, &timebase, argi)) {
+    } else if (arg_match(&arg, &g_av1_codec_arg_defs.timebase, argi)) {
       config->cfg.g_timebase = arg_parse_rational(&arg);
       validate_positive_rational(arg.name, &config->cfg.g_timebase);
-    } else if (arg_match(&arg, &global_error_resilient, argi)) {
+    } else if (arg_match(&arg, &g_av1_codec_arg_defs.global_error_resilient,
+                         argi)) {
       config->cfg.g_error_resilient = arg_parse_uint(&arg);
-    } else if (arg_match(&arg, &lag_in_frames, argi)) {
+    } else if (arg_match(&arg, &g_av1_codec_arg_defs.lag_in_frames, argi)) {
       config->cfg.g_lag_in_frames = arg_parse_uint(&arg);
-    } else if (arg_match(&arg, &large_scale_tile, argi)) {
+    } else if (arg_match(&arg, &g_av1_codec_arg_defs.large_scale_tile, argi)) {
       config->cfg.large_scale_tile = arg_parse_uint(&arg);
       if (config->cfg.large_scale_tile) {
         global->codec = get_aom_encoder_by_short_name("av1");
       }
-    } else if (arg_match(&arg, &monochrome, argi)) {
+    } else if (arg_match(&arg, &g_av1_codec_arg_defs.monochrome, argi)) {
       config->cfg.monochrome = 1;
-    } else if (arg_match(&arg, &full_still_picture_hdr, argi)) {
+    } else if (arg_match(&arg, &g_av1_codec_arg_defs.full_still_picture_hdr,
+                         argi)) {
       config->cfg.full_still_picture_hdr = 1;
-    } else if (arg_match(&arg, &use_16bit_internal, argi)) {
+    } else if (arg_match(&arg, &g_av1_codec_arg_defs.use_16bit_internal,
+                         argi)) {
       config->use_16bit_internal = CONFIG_AV1_HIGHBITDEPTH;
       if (!config->use_16bit_internal) {
         warn("%s option ignored with CONFIG_AV1_HIGHBITDEPTH=0.\n", arg.name);
       }
-    } else if (arg_match(&arg, &dropframe_thresh, argi)) {
+    } else if (arg_match(&arg, &g_av1_codec_arg_defs.dropframe_thresh, argi)) {
       config->cfg.rc_dropframe_thresh = arg_parse_uint(&arg);
-    } else if (arg_match(&arg, &resize_mode, argi)) {
+    } else if (arg_match(&arg, &g_av1_codec_arg_defs.resize_mode, argi)) {
       config->cfg.rc_resize_mode = arg_parse_uint(&arg);
-    } else if (arg_match(&arg, &resize_denominator, argi)) {
+    } else if (arg_match(&arg, &g_av1_codec_arg_defs.resize_denominator,
+                         argi)) {
       config->cfg.rc_resize_denominator = arg_parse_uint(&arg);
-    } else if (arg_match(&arg, &resize_kf_denominator, argi)) {
+    } else if (arg_match(&arg, &g_av1_codec_arg_defs.resize_kf_denominator,
+                         argi)) {
       config->cfg.rc_resize_kf_denominator = arg_parse_uint(&arg);
-    } else if (arg_match(&arg, &superres_mode, argi)) {
+    } else if (arg_match(&arg, &g_av1_codec_arg_defs.superres_mode, argi)) {
       config->cfg.rc_superres_mode = arg_parse_uint(&arg);
-    } else if (arg_match(&arg, &superres_denominator, argi)) {
+    } else if (arg_match(&arg, &g_av1_codec_arg_defs.superres_denominator,
+                         argi)) {
       config->cfg.rc_superres_denominator = arg_parse_uint(&arg);
-    } else if (arg_match(&arg, &superres_kf_denominator, argi)) {
+    } else if (arg_match(&arg, &g_av1_codec_arg_defs.superres_kf_denominator,
+                         argi)) {
       config->cfg.rc_superres_kf_denominator = arg_parse_uint(&arg);
-    } else if (arg_match(&arg, &superres_qthresh, argi)) {
+    } else if (arg_match(&arg, &g_av1_codec_arg_defs.superres_qthresh, argi)) {
       config->cfg.rc_superres_qthresh = arg_parse_uint(&arg);
-    } else if (arg_match(&arg, &superres_kf_qthresh, argi)) {
+    } else if (arg_match(&arg, &g_av1_codec_arg_defs.superres_kf_qthresh,
+                         argi)) {
       config->cfg.rc_superres_kf_qthresh = arg_parse_uint(&arg);
-    } else if (arg_match(&arg, &end_usage, argi)) {
+    } else if (arg_match(&arg, &g_av1_codec_arg_defs.end_usage, argi)) {
       config->cfg.rc_end_usage = arg_parse_enum_or_int(&arg);
-    } else if (arg_match(&arg, &target_bitrate, argi)) {
+    } else if (arg_match(&arg, &g_av1_codec_arg_defs.target_bitrate, argi)) {
       config->cfg.rc_target_bitrate = arg_parse_uint(&arg);
-    } else if (arg_match(&arg, &min_quantizer, argi)) {
+    } else if (arg_match(&arg, &g_av1_codec_arg_defs.min_quantizer, argi)) {
       config->cfg.rc_min_quantizer = arg_parse_uint(&arg);
-    } else if (arg_match(&arg, &max_quantizer, argi)) {
+    } else if (arg_match(&arg, &g_av1_codec_arg_defs.max_quantizer, argi)) {
       config->cfg.rc_max_quantizer = arg_parse_uint(&arg);
-    } else if (arg_match(&arg, &undershoot_pct, argi)) {
+    } else if (arg_match(&arg, &g_av1_codec_arg_defs.undershoot_pct, argi)) {
       config->cfg.rc_undershoot_pct = arg_parse_uint(&arg);
-    } else if (arg_match(&arg, &overshoot_pct, argi)) {
+    } else if (arg_match(&arg, &g_av1_codec_arg_defs.overshoot_pct, argi)) {
       config->cfg.rc_overshoot_pct = arg_parse_uint(&arg);
-    } else if (arg_match(&arg, &buf_sz, argi)) {
+    } else if (arg_match(&arg, &g_av1_codec_arg_defs.buf_sz, argi)) {
       config->cfg.rc_buf_sz = arg_parse_uint(&arg);
-    } else if (arg_match(&arg, &buf_initial_sz, argi)) {
+    } else if (arg_match(&arg, &g_av1_codec_arg_defs.buf_initial_sz, argi)) {
       config->cfg.rc_buf_initial_sz = arg_parse_uint(&arg);
-    } else if (arg_match(&arg, &buf_optimal_sz, argi)) {
+    } else if (arg_match(&arg, &g_av1_codec_arg_defs.buf_optimal_sz, argi)) {
       config->cfg.rc_buf_optimal_sz = arg_parse_uint(&arg);
-    } else if (arg_match(&arg, &bias_pct, argi)) {
+    } else if (arg_match(&arg, &g_av1_codec_arg_defs.bias_pct, argi)) {
       config->cfg.rc_2pass_vbr_bias_pct = arg_parse_uint(&arg);
       if (global->passes < 2)
         warn("option %s ignored in one-pass mode.\n", arg.name);
-    } else if (arg_match(&arg, &minsection_pct, argi)) {
+    } else if (arg_match(&arg, &g_av1_codec_arg_defs.minsection_pct, argi)) {
       config->cfg.rc_2pass_vbr_minsection_pct = arg_parse_uint(&arg);
 
       if (global->passes < 2)
         warn("option %s ignored in one-pass mode.\n", arg.name);
-    } else if (arg_match(&arg, &maxsection_pct, argi)) {
+    } else if (arg_match(&arg, &g_av1_codec_arg_defs.maxsection_pct, argi)) {
       config->cfg.rc_2pass_vbr_maxsection_pct = arg_parse_uint(&arg);
 
       if (global->passes < 2)
         warn("option %s ignored in one-pass mode.\n", arg.name);
-    } else if (arg_match(&arg, &fwd_kf_enabled, argi)) {
+    } else if (arg_match(&arg, &g_av1_codec_arg_defs.fwd_kf_enabled, argi)) {
       config->cfg.fwd_kf_enabled = arg_parse_uint(&arg);
-    } else if (arg_match(&arg, &kf_min_dist, argi)) {
+    } else if (arg_match(&arg, &g_av1_codec_arg_defs.kf_min_dist, argi)) {
       config->cfg.kf_min_dist = arg_parse_uint(&arg);
-    } else if (arg_match(&arg, &kf_max_dist, argi)) {
+    } else if (arg_match(&arg, &g_av1_codec_arg_defs.kf_max_dist, argi)) {
       config->cfg.kf_max_dist = arg_parse_uint(&arg);
-    } else if (arg_match(&arg, &kf_disabled, argi)) {
+    } else if (arg_match(&arg, &g_av1_codec_arg_defs.kf_disabled, argi)) {
       config->cfg.kf_mode = AOM_KF_DISABLED;
-    } else if (arg_match(&arg, &sframe_dist, argi)) {
+    } else if (arg_match(&arg, &g_av1_codec_arg_defs.sframe_dist, argi)) {
       config->cfg.sframe_dist = arg_parse_uint(&arg);
-    } else if (arg_match(&arg, &sframe_mode, argi)) {
+    } else if (arg_match(&arg, &g_av1_codec_arg_defs.sframe_mode, argi)) {
       config->cfg.sframe_mode = arg_parse_uint(&arg);
-    } else if (arg_match(&arg, &save_as_annexb, argi)) {
+    } else if (arg_match(&arg, &g_av1_codec_arg_defs.save_as_annexb, argi)) {
       config->cfg.save_as_annexb = arg_parse_uint(&arg);
-    } else if (arg_match(&arg, &tile_width, argi)) {
+    } else if (arg_match(&arg, &g_av1_codec_arg_defs.tile_width, argi)) {
       config->cfg.tile_width_count =
           arg_parse_list(&arg, config->cfg.tile_widths, MAX_TILE_WIDTHS);
-    } else if (arg_match(&arg, &tile_height, argi)) {
+    } else if (arg_match(&arg, &g_av1_codec_arg_defs.tile_height, argi)) {
       config->cfg.tile_height_count =
           arg_parse_list(&arg, config->cfg.tile_heights, MAX_TILE_HEIGHTS);
 #if CONFIG_TUNE_VMAF
     } else if (arg_match(&arg, &vmaf_model_path, argi)) {
       config->vmaf_model_path = arg.val;
 #endif
-    } else if (arg_match(&arg, &use_fixed_qp_offsets, argi)) {
+    } else if (arg_match(&arg, &g_av1_codec_arg_defs.use_fixed_qp_offsets,
+                         argi)) {
       config->cfg.use_fixed_qp_offsets = arg_parse_uint(&arg);
-    } else if (arg_match(&arg, &fixed_qp_offsets, argi)) {
+    } else if (arg_match(&arg, &g_av1_codec_arg_defs.fixed_qp_offsets, argi)) {
       const int fixed_qp_offset_count = arg_parse_list(
           &arg, config->cfg.fixed_qp_offsets, FIXED_QP_OFFSET_COUNT);
       if (fixed_qp_offset_count < FIXED_QP_OFFSET_COUNT) {
@@ -1629,7 +1018,8 @@
       }
       config->cfg.use_fixed_qp_offsets = 1;
     } else if (global->usage == AOM_USAGE_REALTIME &&
-               arg_match(&arg, &enable_restoration, argi)) {
+               arg_match(&arg, &g_av1_codec_arg_defs.enable_restoration,
+                         argi)) {
       if (arg_parse_uint(&arg) == 1) {
         warn("non-zero %s option ignored in realtime mode.\n", arg.name);
       }
diff --git a/apps/aomenc.h b/apps/aomenc.h
index 8d4c25c..d717b24 100644
--- a/apps/aomenc.h
+++ b/apps/aomenc.h
@@ -13,17 +13,12 @@
 
 #include "aom/aom_codec.h"
 #include "aom/aom_encoder.h"
+#include "av1/arg_defs.h"
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
-enum TestDecodeFatality {
-  TEST_DECODE_OFF,
-  TEST_DECODE_FATAL,
-  TEST_DECODE_WARN,
-};
-
 typedef enum {
   I420,  // 4:2:0 8+ bit-depth
   I422,  // 4:2:2 8+ bit-depth
diff --git a/av1/arg_defs.c b/av1/arg_defs.c
new file mode 100644
index 0000000..b599c05
--- /dev/null
+++ b/av1/arg_defs.c
@@ -0,0 +1,598 @@
+/*
+ * Copyright (c) 2021, Alliance for Open Media. All rights reserved
+ *
+ * This source code is subject to the terms of the BSD 2 Clause License and
+ * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
+ * was not distributed with this source code in the LICENSE file, you can
+ * obtain it at www.aomedia.org/license/software. If the Alliance for Open
+ * Media Patent License 1.0 was not distributed with this source code in the
+ * PATENTS file, you can obtain it at www.aomedia.org/license/patent.
+ */
+
+#include "av1/arg_defs.h"
+
+static const struct arg_enum_list test_decode_enum[] = {
+  { "off", TEST_DECODE_OFF },
+  { "fatal", TEST_DECODE_FATAL },
+  { "warn", TEST_DECODE_WARN },
+  { NULL, 0 }
+};
+
+static const struct arg_enum_list bitdepth_enum[] = {
+  { "8", AOM_BITS_8 }, { "10", AOM_BITS_10 }, { "12", AOM_BITS_12 }, { NULL, 0 }
+};
+
+#if CONFIG_WEBM_IO
+static const struct arg_enum_list stereo_mode_enum[] = {
+  { "mono", STEREO_FORMAT_MONO },
+  { "left-right", STEREO_FORMAT_LEFT_RIGHT },
+  { "bottom-top", STEREO_FORMAT_BOTTOM_TOP },
+  { "top-bottom", STEREO_FORMAT_TOP_BOTTOM },
+  { "right-left", STEREO_FORMAT_RIGHT_LEFT },
+  { NULL, 0 }
+};
+#endif
+
+static const struct arg_enum_list end_usage_enum[] = { { "vbr", AOM_VBR },
+                                                       { "cbr", AOM_CBR },
+                                                       { "cq", AOM_CQ },
+                                                       { "q", AOM_Q },
+                                                       { NULL, 0 } };
+
+static const struct arg_enum_list tuning_enum[] = {
+  { "psnr", AOM_TUNE_PSNR },
+  { "ssim", AOM_TUNE_SSIM },
+  { "vmaf_with_preprocessing", AOM_TUNE_VMAF_WITH_PREPROCESSING },
+  { "vmaf_without_preprocessing", AOM_TUNE_VMAF_WITHOUT_PREPROCESSING },
+  { "vmaf", AOM_TUNE_VMAF_MAX_GAIN },
+  { "vmaf_neg", AOM_TUNE_VMAF_NEG_MAX_GAIN },
+  { NULL, 0 }
+};
+
+#if CONFIG_AV1_ENCODER
+static const struct arg_enum_list timing_info_enum[] = {
+  { "unspecified", AOM_TIMING_UNSPECIFIED },
+  { "constant", AOM_TIMING_EQUAL },
+  { "model", AOM_TIMING_DEC_MODEL },
+  { NULL, 0 }
+};
+
+static const struct arg_enum_list superblock_size_enum[] = {
+  { "dynamic", AOM_SUPERBLOCK_SIZE_DYNAMIC },
+  { "64", AOM_SUPERBLOCK_SIZE_64X64 },
+  { "128", AOM_SUPERBLOCK_SIZE_128X128 },
+  { NULL, 0 }
+};
+
+static const struct arg_enum_list matrix_coefficients_enum[] = {
+  { "identity", AOM_CICP_MC_IDENTITY },
+  { "bt709", AOM_CICP_MC_BT_709 },
+  { "unspecified", AOM_CICP_MC_UNSPECIFIED },
+  { "fcc73", AOM_CICP_MC_FCC },
+  { "bt470bg", AOM_CICP_MC_BT_470_B_G },
+  { "bt601", AOM_CICP_MC_BT_601 },
+  { "smpte240", AOM_CICP_CP_SMPTE_240 },
+  { "ycgco", AOM_CICP_MC_SMPTE_YCGCO },
+  { "bt2020ncl", AOM_CICP_MC_BT_2020_NCL },
+  { "bt2020cl", AOM_CICP_MC_BT_2020_CL },
+  { "smpte2085", AOM_CICP_MC_SMPTE_2085 },
+  { "chromncl", AOM_CICP_MC_CHROMAT_NCL },
+  { "chromcl", AOM_CICP_MC_CHROMAT_CL },
+  { "ictcp", AOM_CICP_MC_ICTCP },
+  { NULL, 0 }
+};
+
+static const struct arg_enum_list chroma_sample_position_enum[] = {
+  { "unknown", AOM_CSP_UNKNOWN },
+  { "vertical", AOM_CSP_VERTICAL },
+  { "colocated", AOM_CSP_COLOCATED },
+  { NULL, 0 }
+};
+
+static const struct arg_enum_list tune_content_enum[] = {
+  { "default", AOM_CONTENT_DEFAULT },
+  { "screen", AOM_CONTENT_SCREEN },
+  { NULL, 0 }
+};
+
+static const struct arg_enum_list transfer_characteristics_enum[] = {
+  { "unspecified", AOM_CICP_CP_UNSPECIFIED },
+  { "bt709", AOM_CICP_TC_BT_709 },
+  { "bt470m", AOM_CICP_TC_BT_470_M },
+  { "bt470bg", AOM_CICP_TC_BT_470_B_G },
+  { "bt601", AOM_CICP_TC_BT_601 },
+  { "smpte240", AOM_CICP_TC_SMPTE_240 },
+  { "lin", AOM_CICP_TC_LINEAR },
+  { "log100", AOM_CICP_TC_LOG_100 },
+  { "log100sq10", AOM_CICP_TC_LOG_100_SQRT10 },
+  { "iec61966", AOM_CICP_TC_IEC_61966 },
+  { "bt1361", AOM_CICP_TC_BT_1361 },
+  { "srgb", AOM_CICP_TC_SRGB },
+  { "bt2020-10bit", AOM_CICP_TC_BT_2020_10_BIT },
+  { "bt2020-12bit", AOM_CICP_TC_BT_2020_12_BIT },
+  { "smpte2084", AOM_CICP_TC_SMPTE_2084 },
+  { "hlg", AOM_CICP_TC_HLG },
+  { "smpte428", AOM_CICP_TC_SMPTE_428 },
+  { NULL, 0 }
+};
+
+static const struct arg_enum_list color_primaries_enum[] = {
+  { "bt709", AOM_CICP_CP_BT_709 },
+  { "unspecified", AOM_CICP_CP_UNSPECIFIED },
+  { "bt601", AOM_CICP_CP_BT_601 },
+  { "bt470m", AOM_CICP_CP_BT_470_M },
+  { "bt470bg", AOM_CICP_CP_BT_470_B_G },
+  { "smpte240", AOM_CICP_CP_SMPTE_240 },
+  { "film", AOM_CICP_CP_GENERIC_FILM },
+  { "bt2020", AOM_CICP_CP_BT_2020 },
+  { "xyz", AOM_CICP_CP_XYZ },
+  { "smpte431", AOM_CICP_CP_SMPTE_431 },
+  { "smpte432", AOM_CICP_CP_SMPTE_432 },
+  { "ebu3213", AOM_CICP_CP_EBU_3213 },
+  { NULL, 0 }
+};
+#endif  // CONFIG_AV1_ENCODER
+
+const av1_codec_arg_definitions_t g_av1_codec_arg_defs = {
+  .help = ARG_DEF(NULL, "help", 0, "Show usage options and exit"),
+  .debugmode =
+      ARG_DEF("D", "debug", 0, "Debug mode (makes output deterministic)"),
+  .outputfile = ARG_DEF("o", "output", 1, "Output filename"),
+  .use_yv12 = ARG_DEF(NULL, "yv12", 0, "Input file is YV12 "),
+  .use_i420 = ARG_DEF(NULL, "i420", 0, "Input file is I420 (default)"),
+  .use_i422 = ARG_DEF(NULL, "i422", 0, "Input file is I422"),
+  .use_i444 = ARG_DEF(NULL, "i444", 0, "Input file is I444"),
+  .codecarg = ARG_DEF(NULL, "codec", 1, "Codec to use"),
+  .passes = ARG_DEF("p", "passes", 1, "Number of passes (1/2)"),
+  .pass_arg = ARG_DEF(NULL, "pass", 1, "Pass to execute (1/2)"),
+  .fpf_name = ARG_DEF(NULL, "fpf", 1, "First pass statistics file name"),
+  .limit = ARG_DEF(NULL, "limit", 1, "Stop encoding after n input frames"),
+  .skip = ARG_DEF(NULL, "skip", 1, "Skip the first n input frames"),
+  .good_dl = ARG_DEF(NULL, "good", 0, "Use Good Quality Deadline"),
+  .rt_dl = ARG_DEF(NULL, "rt", 0, "Use Realtime Quality Deadline"),
+  .quietarg = ARG_DEF("q", "quiet", 0, "Do not print encode progress"),
+  .verbosearg = ARG_DEF("v", "verbose", 0, "Show encoder parameters"),
+  .psnrarg = ARG_DEF(
+      NULL, "psnr", -1,
+      "Show PSNR in status line"
+      "(0: Disable PSNR status line display, 1: PSNR calculated using input "
+      "bit-depth (default), 2: PSNR calculated using stream bit-depth), "
+      "takes default option when arguments are not specified"),
+  .use_cfg = ARG_DEF("c", "cfg", 1, "Config file to use"),
+  .recontest = ARG_DEF_ENUM(NULL, "test-decode", 1,
+                            "Test encode/decode mismatch", test_decode_enum),
+  .framerate = ARG_DEF(NULL, "fps", 1, "Stream frame rate (rate/scale)"),
+  .use_webm =
+      ARG_DEF(NULL, "webm", 0, "Output WebM (default when WebM IO is enabled)"),
+  .use_ivf = ARG_DEF(NULL, "ivf", 0, "Output IVF"),
+  .use_obu = ARG_DEF(NULL, "obu", 0, "Output OBU"),
+  .q_hist_n =
+      ARG_DEF(NULL, "q-hist", 1, "Show quantizer histogram (n-buckets)"),
+  .rate_hist_n =
+      ARG_DEF(NULL, "rate-hist", 1, "Show rate histogram (n-buckets)"),
+  .disable_warnings =
+      ARG_DEF(NULL, "disable-warnings", 0,
+              "Disable warnings about potentially incorrect encode settings."),
+  .disable_warning_prompt =
+      ARG_DEF("y", "disable-warning-prompt", 0,
+              "Display warnings, but do not prompt user to continue."),
+  .bitdeptharg = ARG_DEF_ENUM(
+      "b", "bit-depth", 1,
+      "Bit depth for codec (8 for version <=1, 10 or 12 for version 2)",
+      bitdepth_enum),
+  .inbitdeptharg = ARG_DEF(NULL, "input-bit-depth", 1, "Bit depth of input"),
+
+  .input_chroma_subsampling_x = ARG_DEF(NULL, "input-chroma-subsampling-x", 1,
+                                        "chroma subsampling x value."),
+  .input_chroma_subsampling_y = ARG_DEF(NULL, "input-chroma-subsampling-y", 1,
+                                        "chroma subsampling y value."),
+
+  .usage = ARG_DEF("u", "usage", 1, "Usage profile number to use"),
+  .threads = ARG_DEF("t", "threads", 1, "Max number of threads to use"),
+  .profile = ARG_DEF(NULL, "profile", 1, "Bitstream profile number to use"),
+  .width = ARG_DEF("w", "width", 1, "Frame width"),
+  .height = ARG_DEF("h", "height", 1, "Frame height"),
+  .forced_max_frame_width = ARG_DEF(NULL, "forced_max_frame_width", 1,
+                                    "Maximum frame width value to force"),
+  .forced_max_frame_height = ARG_DEF(NULL, "forced_max_frame_height", 1,
+                                     "Maximum frame height value to force"),
+#if CONFIG_WEBM_IO
+  .stereo_mode = ARG_DEF_ENUM(NULL, "stereo-mode", 1, "Stereo 3D video format",
+                              stereo_mode_enum),
+#endif
+  .timebase = ARG_DEF(NULL, "timebase", 1,
+                      "Output timestamp precision (fractional seconds)"),
+  .global_error_resilient = ARG_DEF(NULL, "global-error-resilient", 1,
+                                    "Enable global error resiliency features"),
+  .lag_in_frames =
+      ARG_DEF(NULL, "lag-in-frames", 1, "Max number of frames to lag"),
+  .large_scale_tile = ARG_DEF(
+      NULL, "large-scale-tile", 1,
+      "Large scale tile coding (0: off (default), 1: on (ivf output only))"),
+  .monochrome =
+      ARG_DEF(NULL, "monochrome", 0, "Monochrome video (no chroma planes)"),
+  .full_still_picture_hdr = ARG_DEF(NULL, "full-still-picture-hdr", 0,
+                                    "Use full header for still picture"),
+  .use_16bit_internal =
+      ARG_DEF(NULL, "use-16bit-internal", 0, "Force use of 16-bit pipeline"),
+  .dropframe_thresh =
+      ARG_DEF(NULL, "drop-frame", 1, "Temporal resampling threshold (buf %)"),
+  .resize_mode = ARG_DEF(NULL, "resize-mode", 1, "Frame resize mode"),
+  .resize_denominator =
+      ARG_DEF(NULL, "resize-denominator", 1, "Frame resize denominator"),
+  .resize_kf_denominator = ARG_DEF(NULL, "resize-kf-denominator", 1,
+                                   "Frame resize keyframe denominator"),
+  .superres_mode =
+      ARG_DEF(NULL, "superres-mode", 1, "Frame super-resolution mode"),
+  .superres_denominator = ARG_DEF(NULL, "superres-denominator", 1,
+                                  "Frame super-resolution denominator"),
+  .superres_kf_denominator =
+      ARG_DEF(NULL, "superres-kf-denominator", 1,
+              "Frame super-resolution keyframe denominator"),
+  .superres_qthresh = ARG_DEF(NULL, "superres-qthresh", 1,
+                              "Frame super-resolution qindex threshold"),
+  .superres_kf_qthresh =
+      ARG_DEF(NULL, "superres-kf-qthresh", 1,
+              "Frame super-resolution keyframe qindex threshold"),
+  .end_usage =
+      ARG_DEF_ENUM(NULL, "end-usage", 1, "Rate control mode", end_usage_enum),
+  .target_bitrate = ARG_DEF(NULL, "target-bitrate", 1, "Bitrate (kbps)"),
+  .min_quantizer = ARG_DEF(NULL, "min-q", 1, "Minimum (best) quantizer"),
+  .max_quantizer = ARG_DEF(NULL, "max-q", 1, "Maximum (worst) quantizer"),
+  .undershoot_pct = ARG_DEF(NULL, "undershoot-pct", 1,
+                            "Datarate undershoot (min) target (%)"),
+  .overshoot_pct =
+      ARG_DEF(NULL, "overshoot-pct", 1, "Datarate overshoot (max) target (%)"),
+  .buf_sz = ARG_DEF(NULL, "buf-sz", 1, "Client buffer size (ms)"),
+  .buf_initial_sz =
+      ARG_DEF(NULL, "buf-initial-sz", 1, "Client initial buffer size (ms)"),
+  .buf_optimal_sz =
+      ARG_DEF(NULL, "buf-optimal-sz", 1, "Client optimal buffer size (ms)"),
+  .bias_pct = ARG_DEF(NULL, "bias-pct", 1, "CBR/VBR bias (0=CBR, 100=VBR)"),
+  .minsection_pct =
+      ARG_DEF(NULL, "minsection-pct", 1, "GOP min bitrate (% of target)"),
+  .maxsection_pct =
+      ARG_DEF(NULL, "maxsection-pct", 1, "GOP max bitrate (% of target)"),
+  .fwd_kf_enabled =
+      ARG_DEF(NULL, "enable-fwd-kf", 1, "Enable forward reference keyframes"),
+  .kf_min_dist =
+      ARG_DEF(NULL, "kf-min-dist", 1, "Minimum keyframe interval (frames)"),
+  .kf_max_dist =
+      ARG_DEF(NULL, "kf-max-dist", 1, "Maximum keyframe interval (frames)"),
+  .kf_disabled = ARG_DEF(NULL, "disable-kf", 0, "Disable keyframe placement"),
+  .sframe_dist = ARG_DEF(NULL, "sframe-dist", 1, "S-Frame interval (frames)"),
+  .sframe_mode =
+      ARG_DEF(NULL, "sframe-mode", 1, "S-Frame insertion mode (1..2)"),
+  .save_as_annexb = ARG_DEF(NULL, "annexb", 1, "Save as Annex-B"),
+  .noise_sens = ARG_DEF(NULL, "noise-sensitivity", 1,
+                        "Noise sensitivity (frames to blur)"),
+  .sharpness = ARG_DEF(NULL, "sharpness", 1,
+                       "Loop filter sharpness (0..7), default is 0"),
+  .static_thresh =
+      ARG_DEF(NULL, "static-thresh", 1, "Motion detection threshold"),
+  .auto_altref =
+      ARG_DEF(NULL, "auto-alt-ref", 1, "Enable automatic alt reference frames"),
+  .arnr_maxframes =
+      ARG_DEF(NULL, "arnr-maxframes", 1, "AltRef max frames (0..15)"),
+  .arnr_strength =
+      ARG_DEF(NULL, "arnr-strength", 1, "AltRef filter strength (0..6)"),
+  .tune_metric = ARG_DEF_ENUM(NULL, "tune", 1, "Distortion metric tuned with",
+                              tuning_enum),
+  .cq_level =
+      ARG_DEF(NULL, "cq-level", 1, "Constant/Constrained Quality level"),
+  .max_intra_rate_pct =
+      ARG_DEF(NULL, "max-intra-rate", 1, "Max I-frame bitrate (pct)"),
+#if CONFIG_AV1_ENCODER
+  .cpu_used_av1 =
+      ARG_DEF(NULL, "cpu-used", 1,
+              "Speed setting (0..6 in good mode, 6..9 in realtime mode)"),
+  .rowmtarg =
+      ARG_DEF(NULL, "row-mt", 1,
+              "Enable row based multi-threading (0: off, 1: on (default))"),
+  .tile_cols =
+      ARG_DEF(NULL, "tile-columns", 1, "Number of tile columns to use, log2"),
+  .tile_rows =
+      ARG_DEF(NULL, "tile-rows", 1, "Number of tile rows to use, log2"),
+  .enable_tpl_model = ARG_DEF(NULL, "enable-tpl-model", 1,
+                              "RDO based on frame temporal dependency "
+                              "(0: off, 1: backward source based). "
+                              "This is required for deltaq mode."),
+  .enable_keyframe_filtering = ARG_DEF(
+      NULL, "enable-keyframe-filtering", 1,
+      "Apply temporal filtering on key frame"
+      "(0: no filter, 1: filter without overlay (default), "
+      "2: filter with overlay - experimental, may break random access in "
+      "players.)"),
+  .tile_width = ARG_DEF(NULL, "tile-width", 1, "Tile widths (comma separated)"),
+  .tile_height =
+      ARG_DEF(NULL, "tile-height", 1, "Tile heights (command separated)"),
+  .lossless = ARG_DEF(NULL, "lossless", 1,
+                      "Lossless mode (0: false (default), 1: true)"),
+  .enable_cdef = ARG_DEF(
+      NULL, "enable-cdef", 1,
+      "Enable the constrained directional enhancement filter (0: false, "
+      "1: true (default))"),
+  .enable_restoration = ARG_DEF(NULL, "enable-restoration", 1,
+                                "Enable the loop restoration filter (0: false "
+                                "(default in Realtime mode), "
+                                "1: true (default in Non-realtime mode))"),
+  .enable_rect_partitions = ARG_DEF(NULL, "enable-rect-partitions", 1,
+                                    "Enable rectangular partitions "
+                                    "(0: false, 1: true (default))"),
+  .enable_ab_partitions =
+      ARG_DEF(NULL, "enable-ab-partitions", 1,
+              "Enable ab partitions (0: false, 1: true (default))"),
+  .enable_1to4_partitions = ARG_DEF(NULL, "enable-1to4-partitions", 1,
+                                    "Enable 1:4 and 4:1 partitions "
+                                    "(0: false, 1: true (default))"),
+  .min_partition_size =
+      ARG_DEF(NULL, "min-partition-size", 1,
+              "Set min partition size "
+              "(4:4x4, 8:8x8, 16:16x16, 32:32x32, 64:64x64, 128:128x128). "
+              "On frame with 4k+ resolutions or higher speed settings, the min "
+              "partition size will have a minimum of 8."),
+  .max_partition_size =
+      ARG_DEF(NULL, "max-partition-size", 1,
+              "Set max partition size "
+              "(4:4x4, 8:8x8, 16:16x16, 32:32x32, 64:64x64, 128:128x128)"),
+  .enable_dual_filter = ARG_DEF(NULL, "enable-dual-filter", 1,
+                                "Enable dual filter "
+                                "(0: false, 1: true (default))"),
+  .enable_chroma_deltaq = ARG_DEF(NULL, "enable-chroma-deltaq", 1,
+                                  "Enable chroma delta quant "
+                                  "(0: false (default), 1: true)"),
+  .enable_intra_edge_filter = ARG_DEF(NULL, "enable-intra-edge-filter", 1,
+                                      "Enable intra edge filtering "
+                                      "(0: false, 1: true (default))"),
+  .enable_order_hint = ARG_DEF(NULL, "enable-order-hint", 1,
+                               "Enable order hint "
+                               "(0: false, 1: true (default))"),
+  .enable_tx64 =
+      ARG_DEF(NULL, "enable-tx64", 1,
+              "Enable 64-pt transform (0: false, 1: true (default))"),
+  .enable_flip_idtx =
+      ARG_DEF(NULL, "enable-flip-idtx", 1,
+              "Enable extended transform type (0: false, 1: true (default)) "
+              "including FLIPADST_DCT, DCT_FLIPADST, FLIPADST_FLIPADST, "
+              "ADST_FLIPADST, FLIPADST_ADST, IDTX, V_DCT, H_DCT, V_ADST, "
+              "H_ADST, V_FLIPADST, H_FLIPADST"),
+  .enable_rect_tx =
+      ARG_DEF(NULL, "enable-rect-tx", 1,
+              "Enable rectangular transform (0: false, 1: true (default))"),
+  .enable_dist_wtd_comp = ARG_DEF(NULL, "enable-dist-wtd-comp", 1,
+                                  "Enable distance-weighted compound "
+                                  "(0: false, 1: true (default))"),
+  .enable_masked_comp = ARG_DEF(NULL, "enable-masked-comp", 1,
+                                "Enable masked (wedge/diff-wtd) compound "
+                                "(0: false, 1: true (default))"),
+  .enable_onesided_comp = ARG_DEF(NULL, "enable-onesided-comp", 1,
+                                  "Enable one sided compound "
+                                  "(0: false, 1: true (default))"),
+  .enable_interintra_comp = ARG_DEF(NULL, "enable-interintra-comp", 1,
+                                    "Enable interintra compound "
+                                    "(0: false, 1: true (default))"),
+  .enable_smooth_interintra = ARG_DEF(NULL, "enable-smooth-interintra", 1,
+                                      "Enable smooth interintra mode "
+                                      "(0: false, 1: true (default))"),
+  .enable_diff_wtd_comp = ARG_DEF(NULL, "enable-diff-wtd-comp", 1,
+                                  "Enable difference-weighted compound "
+                                  "(0: false, 1: true (default))"),
+  .enable_interinter_wedge = ARG_DEF(NULL, "enable-interinter-wedge", 1,
+                                     "Enable interinter wedge compound "
+                                     "(0: false, 1: true (default))"),
+  .enable_interintra_wedge = ARG_DEF(NULL, "enable-interintra-wedge", 1,
+                                     "Enable interintra wedge compound "
+                                     "(0: false, 1: true (default))"),
+  .enable_global_motion = ARG_DEF(NULL, "enable-global-motion", 1,
+                                  "Enable global motion "
+                                  "(0: false, 1: true (default))"),
+  .enable_warped_motion = ARG_DEF(NULL, "enable-warped-motion", 1,
+                                  "Enable local warped motion "
+                                  "(0: false, 1: true (default))"),
+  .enable_filter_intra = ARG_DEF(NULL, "enable-filter-intra", 1,
+                                 "Enable filter intra prediction mode "
+                                 "(0: false, 1: true (default))"),
+  .enable_smooth_intra = ARG_DEF(NULL, "enable-smooth-intra", 1,
+                                 "Enable smooth intra prediction modes "
+                                 "(0: false, 1: true (default))"),
+  .enable_paeth_intra = ARG_DEF(
+      NULL, "enable-paeth-intra", 1,
+      "Enable Paeth intra prediction mode (0: false, 1: true (default))"),
+  .enable_cfl_intra = ARG_DEF(NULL, "enable-cfl-intra", 1,
+                              "Enable chroma from luma intra prediction mode "
+                              "(0: false, 1: true (default))"),
+  .force_video_mode = ARG_DEF(NULL, "force-video-mode", 1,
+                              "Force video mode (0: false, 1: true (default))"),
+  .enable_obmc = ARG_DEF(NULL, "enable-obmc", 1,
+                         "Enable OBMC (0: false, 1: true (default))"),
+  .enable_overlay =
+      ARG_DEF(NULL, "enable-overlay", 1,
+              "Enable coding overlay frames (0: false, 1: true (default))"),
+  .enable_palette =
+      ARG_DEF(NULL, "enable-palette", 1,
+              "Enable palette prediction mode (0: false, 1: true (default))"),
+  .enable_intrabc = ARG_DEF(NULL, "enable-intrabc", 1,
+                            "Enable intra block copy prediction mode "
+                            "(0: false, 1: true (default))"),
+  .enable_angle_delta =
+      ARG_DEF(NULL, "enable-angle-delta", 1,
+              "Enable intra angle delta (0: false, 1: true (default))"),
+  .disable_trellis_quant = ARG_DEF(
+      NULL, "disable-trellis-quant", 1,
+      "Disable trellis optimization of quantized coefficients (0: false "
+      "1: true  2: true for rd search 3: true for estimate yrd serch "
+      "(default))"),
+  .enable_qm =
+      ARG_DEF(NULL, "enable-qm", 1,
+              "Enable quantisation matrices (0: false (default), 1: true)"),
+  .qm_min = ARG_DEF(NULL, "qm-min", 1,
+                    "Min quant matrix flatness (0..15), default is 8"),
+  .qm_max = ARG_DEF(NULL, "qm-max", 1,
+                    "Max quant matrix flatness (0..15), default is 15"),
+  .reduced_tx_type_set = ARG_DEF(NULL, "reduced-tx-type-set", 1,
+                                 "Use reduced set of transform types"),
+  .use_intra_dct_only =
+      ARG_DEF(NULL, "use-intra-dct-only", 1, "Use DCT only for INTRA modes"),
+  .use_inter_dct_only =
+      ARG_DEF(NULL, "use-inter-dct-only", 1, "Use DCT only for INTER modes"),
+  .use_intra_default_tx_only =
+      ARG_DEF(NULL, "use-intra-default-tx-only", 1,
+              "Use Default-transform only for INTRA modes"),
+  .quant_b_adapt = ARG_DEF(NULL, "quant-b-adapt", 1, "Use adaptive quantize_b"),
+  .coeff_cost_upd_freq = ARG_DEF(NULL, "coeff-cost-upd-freq", 1,
+                                 "Update freq for coeff costs"
+                                 "0: SB, 1: SB Row per Tile, 2: Tile, 3: Off"),
+  .mode_cost_upd_freq = ARG_DEF(NULL, "mode-cost-upd-freq", 1,
+                                "Update freq for mode costs"
+                                "0: SB, 1: SB Row per Tile, 2: Tile, 3: Off"),
+  .mv_cost_upd_freq = ARG_DEF(NULL, "mv-cost-upd-freq", 1,
+                              "Update freq for mv costs"
+                              "0: SB, 1: SB Row per Tile, 2: Tile, 3: Off"),
+  .num_tg = ARG_DEF(NULL, "num-tile-groups", 1,
+                    "Maximum number of tile groups, default is 1"),
+  .mtu_size =
+      ARG_DEF(NULL, "mtu-size", 1,
+              "MTU size for a tile group, default is 0 (no MTU targeting), "
+              "overrides maximum number of tile groups"),
+  .timing_info = ARG_DEF_ENUM(
+      NULL, "timing-info", 1,
+      "Signal timing info in the bitstream (model unly works for no "
+      "hidden frames, no super-res yet):",
+      timing_info_enum),
+#if CONFIG_TUNE_VMAF
+  .vmaf_model_path =
+      ARG_DEF(NULL, "vmaf-model-path", 1, "Path to the VMAF model file"),
+#endif
+  .film_grain_test = ARG_DEF(
+      NULL, "film-grain-test", 1,
+      "Film grain test vectors (0: none (default), 1: test-1  2: test-2, "
+      "... 16: test-16)"),
+  .film_grain_table = ARG_DEF(NULL, "film-grain-table", 1,
+                              "Path to file containing film grain parameters"),
+#if CONFIG_DENOISE
+  .denoise_noise_level =
+      ARG_DEF(NULL, "denoise-noise-level", 1,
+              "Amount of noise (from 0 = don't denoise, to 50)"),
+  .denoise_block_size = ARG_DEF(NULL, "denoise-block-size", 1,
+                                "Denoise block size (default = 32)"),
+#endif
+  .enable_ref_frame_mvs =
+      ARG_DEF(NULL, "enable-ref-frame-mvs", 1,
+              "Enable temporal mv prediction (default is 1)"),
+  .frame_parallel_decoding =
+      ARG_DEF(NULL, "frame-parallel", 1,
+              "Enable frame parallel decodability features "
+              "(0: false (default), 1: true)"),
+  .error_resilient_mode = ARG_DEF(NULL, "error-resilient", 1,
+                                  "Enable error resilient features "
+                                  "(0: false (default), 1: true)"),
+  .aq_mode = ARG_DEF(NULL, "aq-mode", 1,
+                     "Adaptive quantization mode (0: off (default), 1: "
+                     "variance 2: complexity, "
+                     "3: cyclic refresh)"),
+  .deltaq_mode =
+      ARG_DEF(NULL, "deltaq-mode", 1,
+              "Delta qindex mode (0: off, 1: deltaq objective (default), "
+              "2: deltaq perceptual). "
+              "Currently this requires enable-tpl-model as a prerequisite."),
+  .deltalf_mode = ARG_DEF(NULL, "delta-lf-mode", 1,
+                          "Enable delta-lf-mode (0: off (default), 1: on)"),
+  .frame_periodic_boost =
+      ARG_DEF(NULL, "frame-boost", 1,
+              "Enable frame periodic boost (0: off (default), 1: on)"),
+  .gf_cbr_boost_pct = ARG_DEF(NULL, "gf-cbr-boost", 1,
+                              "Boost for Golden Frame in CBR mode (pct)"),
+  .max_inter_rate_pct =
+      ARG_DEF(NULL, "max-inter-rate", 1, "Max P-frame bitrate (pct)"),
+  .min_gf_interval = ARG_DEF(
+      NULL, "min-gf-interval", 1,
+      "min gf/arf frame interval (default 0, indicating in-built behavior)"),
+  .max_gf_interval = ARG_DEF(
+      NULL, "max-gf-interval", 1,
+      "max gf/arf frame interval (default 0, indicating in-built behavior)"),
+  .gf_min_pyr_height =
+      ARG_DEF(NULL, "gf-min-pyr-height", 1,
+              "Min height for GF group pyramid structure (0 (default) to 5)"),
+  .gf_max_pyr_height = ARG_DEF(
+      NULL, "gf-max-pyr-height", 1,
+      "maximum height for GF group pyramid structure (0 to 5 (default))"),
+  .max_reference_frames = ARG_DEF(NULL, "max-reference-frames", 1,
+                                  "maximum number of reference frames allowed "
+                                  "per frame (3 to 7 (default))"),
+  .reduced_reference_set =
+      ARG_DEF(NULL, "reduced-reference-set", 1,
+              "Use reduced set of single and compound references (0: off "
+              "(default), 1: on)"),
+  .target_seq_level_idx = ARG_DEF(
+      NULL, "target-seq-level-idx", 1,
+      "Target sequence level index. "
+      "Possible values are in the form of \"ABxy\"(pad leading zeros if "
+      "less than 4 digits). "
+      "AB: Operating point(OP) index, "
+      "xy: Target level index for the OP. "
+      "E.g. \"0\" means target level index 0 for the 0th OP, "
+      "\"1021\" means target level index 21 for the 10th OP."),
+  .set_min_cr = ARG_DEF(
+      NULL, "min-cr", 1,
+      "Set minimum compression ratio. Take integer values. Default is 0. "
+      "If non-zero, encoder will try to keep the compression ratio of "
+      "each frame to be higher than the given value divided by 100."),
+
+  .input_color_primaries = ARG_DEF_ENUM(
+      NULL, "color-primaries", 1,
+      "Color primaries (CICP) of input content:", color_primaries_enum),
+
+  .input_transfer_characteristics =
+      ARG_DEF_ENUM(NULL, "transfer-characteristics", 1,
+                   "Transfer characteristics (CICP) of input content:",
+                   transfer_characteristics_enum),
+
+  .input_matrix_coefficients = ARG_DEF_ENUM(
+      NULL, "matrix-coefficients", 1,
+      "Matrix coefficients (CICP) of input content:", matrix_coefficients_enum),
+
+  .input_chroma_sample_position =
+      ARG_DEF_ENUM(NULL, "chroma-sample-position", 1,
+                   "The chroma sample position when chroma 4:2:0 is signaled:",
+                   chroma_sample_position_enum),
+
+  .tune_content = ARG_DEF_ENUM(NULL, "tune-content", 1, "Tune content type",
+                               tune_content_enum),
+
+  .cdf_update_mode =
+      ARG_DEF(NULL, "cdf-update-mode", 1,
+              "CDF update mode for entropy coding "
+              "(0: no CDF update, 1: update CDF on all frames(default), "
+              "2: selectively update CDF on some frames"),
+
+  .superblock_size = ARG_DEF_ENUM(NULL, "sb-size", 1, "Superblock size to use",
+                                  superblock_size_enum),
+
+  .set_tier_mask =
+      ARG_DEF(NULL, "set-tier-mask", 1,
+              "Set bit mask to specify which tier each of the 32 possible "
+              "operating points conforms to. "
+              "Bit value 0(defualt): Main Tier, 1: High Tier."),
+
+  .use_fixed_qp_offsets =
+      ARG_DEF(NULL, "use-fixed-qp-offsets", 1,
+              "Enable fixed QP offsets for frames at different levels of the "
+              "pyramid. Selected automatically from --cq-level if "
+              "--fixed-qp-offsets is not provided. If this option is not "
+              "specified (default), offsets are adaptively chosen by the "
+              "encoder."),
+
+  .fixed_qp_offsets = ARG_DEF(
+      NULL, "fixed-qp-offsets", 1,
+      "Set fixed QP offsets for frames at different levels of the "
+      "pyramid. Comma-separated list of 5 offsets for keyframe, ALTREF, "
+      "and 3 levels of internal alt-refs. If this option is not "
+      "specified (default), offsets are adaptively chosen by the "
+      "encoder."),
+
+  .vbr_corpus_complexity_lap = ARG_DEF(
+      NULL, "vbr-corpus-complexity-lap", 1,
+      "Set average corpus complexity per mb for single pass VBR using lap. "
+      "(0..10000), default is 0")
+#endif  // CONFIG_AV1_ENCODER
+};
diff --git a/av1/arg_defs.h b/av1/arg_defs.h
new file mode 100644
index 0000000..ac0d636
--- /dev/null
+++ b/av1/arg_defs.h
@@ -0,0 +1,222 @@
+/*
+ * Copyright (c) 2021, Alliance for Open Media. All rights reserved
+ *
+ * This source code is subject to the terms of the BSD 2 Clause License and
+ * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
+ * was not distributed with this source code in the LICENSE file, you can
+ * obtain it at www.aomedia.org/license/software. If the Alliance for Open
+ * Media Patent License 1.0 was not distributed with this source code in the
+ * PATENTS file, you can obtain it at www.aomedia.org/license/patent.
+ */
+#ifndef AOM_AV1_ARG_DEFS_H_
+#define AOM_AV1_ARG_DEFS_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "config/aom_config.h"
+#include "common/args_helper.h"
+#if CONFIG_WEBM_IO
+#include "common/webmenc.h"
+#endif
+#include "aom/aomcx.h"
+
+enum TestDecodeFatality {
+  TEST_DECODE_OFF,
+  TEST_DECODE_FATAL,
+  TEST_DECODE_WARN,
+};
+
+typedef struct av1_codec_arg_definitions {
+  arg_def_t help;
+  arg_def_t debugmode;
+  arg_def_t outputfile;
+  arg_def_t use_yv12;
+  arg_def_t use_i420;
+  arg_def_t use_i422;
+  arg_def_t use_i444;
+  arg_def_t codecarg;
+  arg_def_t passes;
+  arg_def_t pass_arg;
+  arg_def_t fpf_name;
+  arg_def_t limit;
+  arg_def_t skip;
+  arg_def_t good_dl;
+  arg_def_t rt_dl;
+  arg_def_t quietarg;
+  arg_def_t verbosearg;
+  arg_def_t psnrarg;
+  arg_def_t use_cfg;
+  arg_def_t recontest;
+  arg_def_t framerate;
+  arg_def_t use_webm;
+  arg_def_t use_ivf;
+  arg_def_t use_obu;
+  arg_def_t q_hist_n;
+  arg_def_t rate_hist_n;
+  arg_def_t disable_warnings;
+  arg_def_t disable_warning_prompt;
+  arg_def_t bitdeptharg;
+  arg_def_t inbitdeptharg;
+  arg_def_t input_chroma_subsampling_x;
+  arg_def_t input_chroma_subsampling_y;
+  arg_def_t usage;
+  arg_def_t threads;
+  arg_def_t profile;
+  arg_def_t width;
+  arg_def_t height;
+  arg_def_t forced_max_frame_width;
+  arg_def_t forced_max_frame_height;
+#if CONFIG_WEBM_IO
+  arg_def_t stereo_mode;
+#endif
+  arg_def_t timebase;
+  arg_def_t global_error_resilient;
+  arg_def_t lag_in_frames;
+  arg_def_t large_scale_tile;
+  arg_def_t monochrome;
+  arg_def_t full_still_picture_hdr;
+  arg_def_t use_16bit_internal;
+  arg_def_t dropframe_thresh;
+  arg_def_t resize_mode;
+  arg_def_t resize_denominator;
+  arg_def_t resize_kf_denominator;
+  arg_def_t superres_mode;
+  arg_def_t superres_denominator;
+  arg_def_t superres_kf_denominator;
+  arg_def_t superres_qthresh;
+  arg_def_t superres_kf_qthresh;
+  arg_def_t end_usage;
+  arg_def_t target_bitrate;
+  arg_def_t min_quantizer;
+  arg_def_t max_quantizer;
+  arg_def_t undershoot_pct;
+  arg_def_t overshoot_pct;
+  arg_def_t buf_sz;
+  arg_def_t buf_initial_sz;
+  arg_def_t buf_optimal_sz;
+  arg_def_t bias_pct;
+  arg_def_t minsection_pct;
+  arg_def_t maxsection_pct;
+  arg_def_t fwd_kf_enabled;
+  arg_def_t kf_min_dist;
+  arg_def_t kf_max_dist;
+  arg_def_t kf_disabled;
+  arg_def_t sframe_dist;
+  arg_def_t sframe_mode;
+  arg_def_t save_as_annexb;
+  arg_def_t noise_sens;
+  arg_def_t sharpness;
+  arg_def_t static_thresh;
+  arg_def_t auto_altref;
+  arg_def_t arnr_maxframes;
+  arg_def_t arnr_strength;
+  arg_def_t tune_metric;
+  arg_def_t cq_level;
+  arg_def_t max_intra_rate_pct;
+#if CONFIG_AV1_ENCODER
+  arg_def_t cpu_used_av1;
+  arg_def_t rowmtarg;
+  arg_def_t tile_cols;
+  arg_def_t tile_rows;
+  arg_def_t enable_tpl_model;
+  arg_def_t enable_keyframe_filtering;
+  arg_def_t tile_width;
+  arg_def_t tile_height;
+  arg_def_t lossless;
+  arg_def_t enable_cdef;
+  arg_def_t enable_restoration;
+  arg_def_t enable_rect_partitions;
+  arg_def_t enable_ab_partitions;
+  arg_def_t enable_1to4_partitions;
+  arg_def_t min_partition_size;
+  arg_def_t max_partition_size;
+  arg_def_t enable_dual_filter;
+  arg_def_t enable_chroma_deltaq;
+  arg_def_t enable_intra_edge_filter;
+  arg_def_t enable_order_hint;
+  arg_def_t enable_tx64;
+  arg_def_t enable_flip_idtx;
+  arg_def_t enable_rect_tx;
+  arg_def_t enable_dist_wtd_comp;
+  arg_def_t enable_masked_comp;
+  arg_def_t enable_onesided_comp;
+  arg_def_t enable_interintra_comp;
+  arg_def_t enable_smooth_interintra;
+  arg_def_t enable_diff_wtd_comp;
+  arg_def_t enable_interinter_wedge;
+  arg_def_t enable_interintra_wedge;
+  arg_def_t enable_global_motion;
+  arg_def_t enable_warped_motion;
+  arg_def_t enable_filter_intra;
+  arg_def_t enable_smooth_intra;
+  arg_def_t enable_paeth_intra;
+  arg_def_t enable_cfl_intra;
+  arg_def_t force_video_mode;
+  arg_def_t enable_obmc;
+  arg_def_t enable_overlay;
+  arg_def_t enable_palette;
+  arg_def_t enable_intrabc;
+  arg_def_t enable_angle_delta;
+  arg_def_t disable_trellis_quant;
+  arg_def_t enable_qm;
+  arg_def_t qm_min;
+  arg_def_t qm_max;
+  arg_def_t reduced_tx_type_set;
+  arg_def_t use_intra_dct_only;
+  arg_def_t use_inter_dct_only;
+  arg_def_t use_intra_default_tx_only;
+  arg_def_t quant_b_adapt;
+  arg_def_t coeff_cost_upd_freq;
+  arg_def_t mode_cost_upd_freq;
+  arg_def_t mv_cost_upd_freq;
+  arg_def_t num_tg;
+  arg_def_t mtu_size;
+  arg_def_t timing_info;
+#if CONFIG_TUNE_VMAF
+  arg_def_t vmaf_model_path;
+#endif
+  arg_def_t film_grain_test;
+  arg_def_t film_grain_table;
+#if CONFIG_DENOISE
+  arg_def_t denoise_noise_level;
+  arg_def_t denoise_block_size;
+#endif
+  arg_def_t enable_ref_frame_mvs;
+  arg_def_t frame_parallel_decoding;
+  arg_def_t error_resilient_mode;
+  arg_def_t aq_mode;
+  arg_def_t deltaq_mode;
+  arg_def_t deltalf_mode;
+  arg_def_t frame_periodic_boost;
+  arg_def_t gf_cbr_boost_pct;
+  arg_def_t max_inter_rate_pct;
+  arg_def_t min_gf_interval;
+  arg_def_t max_gf_interval;
+  arg_def_t gf_min_pyr_height;
+  arg_def_t gf_max_pyr_height;
+  arg_def_t max_reference_frames;
+  arg_def_t reduced_reference_set;
+  arg_def_t target_seq_level_idx;
+  arg_def_t set_min_cr;
+  arg_def_t input_color_primaries;
+  arg_def_t input_transfer_characteristics;
+  arg_def_t input_matrix_coefficients;
+  arg_def_t input_chroma_sample_position;
+  arg_def_t tune_content;
+  arg_def_t cdf_update_mode;
+  arg_def_t superblock_size;
+  arg_def_t set_tier_mask;
+  arg_def_t use_fixed_qp_offsets;
+  arg_def_t fixed_qp_offsets;
+  arg_def_t vbr_corpus_complexity_lap;
+#endif  // CONFIG_AV1_ENCODER
+} av1_codec_arg_definitions_t;
+
+extern const av1_codec_arg_definitions_t g_av1_codec_arg_defs;
+
+#ifdef __cplusplus
+}
+#endif
+#endif  // AOM_AV1_ARG_DEFS_H_
diff --git a/av1/av1.cmake b/av1/av1.cmake
index 0fafad3..718254b 100644
--- a/av1/av1.cmake
+++ b/av1/av1.cmake
@@ -14,6 +14,10 @@
 set(AOM_AV1_AV1_CMAKE_ 1)
 
 list(APPEND AOM_AV1_COMMON_SOURCES
+            "${AOM_ROOT}/common/args_helper.h"
+            "${AOM_ROOT}/common/args_helper.c"
+            "${AOM_ROOT}/av1/arg_defs.h"
+            "${AOM_ROOT}/av1/arg_defs.c"
             "${AOM_ROOT}/av1/av1_iface_common.h"
             "${AOM_ROOT}/av1/common/alloccommon.c"
             "${AOM_ROOT}/av1/common/alloccommon.h"
diff --git a/av1/av1_cx_iface.c b/av1/av1_cx_iface.c
index 02afee5..3ea3b8f 100644
--- a/av1/av1_cx_iface.c
+++ b/av1/av1_cx_iface.c
@@ -11,6 +11,7 @@
 #include <stdlib.h>
 #include <string.h>
 
+#include "aom_mem/aom_mem.h"
 #include "config/aom_config.h"
 #include "config/aom_version.h"
 
@@ -26,6 +27,9 @@
 #include "av1/encoder/encoder.h"
 #include "av1/encoder/ethread.h"
 #include "av1/encoder/firstpass.h"
+#include "av1/arg_defs.h"
+
+#include "common/args_helper.h"
 
 #define MAG_SIZE (4)
 
@@ -2766,6 +2770,360 @@
   return update_extra_cfg(ctx, &extra_cfg);
 }
 
+static aom_codec_err_t encoder_set_option(aom_codec_alg_priv_t *ctx,
+                                          const char *name, const char *value) {
+  if (ctx == NULL || name == NULL || value == NULL)
+    return AOM_CODEC_INVALID_PARAM;
+  struct av1_extracfg extra_cfg = ctx->extra_cfg;
+  // Used to mock the argv with just one string "--{name}={value}"
+  char *argv[2] = { NULL, "" };
+  size_t len = strlen(name) + strlen(value) + 4;
+  char *err_string = ctx->cpi->common.error.detail;
+
+#if __STDC_VERSION__ >= 201112L
+  static_assert(sizeof(ctx->cpi->common.error.detail) >= ARG_ERR_MSG_MAX_LEN,
+                "The size of the err_msg buffer for arg_match_helper must be "
+                "at least ARG_ERR_MSG_MAX_LEN");
+#else
+  assert(sizeof(ctx->cpi->common.error.detail) >= ARG_ERR_MSG_MAX_LEN);
+#endif
+
+  argv[0] = aom_malloc(len * sizeof(argv[1][0]));
+  snprintf(argv[0], len, "--%s=%s", name, value);
+  struct arg arg;
+
+  int match = 1;
+  if (arg_match_helper(&arg, &g_av1_codec_arg_defs.enable_keyframe_filtering,
+                       argv, err_string)) {
+    extra_cfg.enable_keyframe_filtering =
+        arg_parse_uint_helper(&arg, err_string);
+  } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.min_gf_interval, argv,
+                              err_string)) {
+    extra_cfg.min_gf_interval = arg_parse_uint_helper(&arg, err_string);
+  } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.max_gf_interval, argv,
+                              err_string)) {
+    extra_cfg.max_gf_interval = arg_parse_uint_helper(&arg, err_string);
+  } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.gf_min_pyr_height,
+                              argv, err_string)) {
+    extra_cfg.gf_min_pyr_height = arg_parse_uint_helper(&arg, err_string);
+  } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.gf_max_pyr_height,
+                              argv, err_string)) {
+    extra_cfg.gf_max_pyr_height = arg_parse_uint_helper(&arg, err_string);
+  } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.cpu_used_av1, argv,
+                              err_string)) {
+    extra_cfg.cpu_used = arg_parse_uint_helper(&arg, err_string);
+  } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.auto_altref, argv,
+                              err_string)) {
+    extra_cfg.enable_auto_alt_ref = arg_parse_uint_helper(&arg, err_string);
+  } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.noise_sens, argv,
+                              err_string)) {
+    extra_cfg.noise_sensitivity = arg_parse_uint_helper(&arg, err_string);
+  } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.sharpness, argv,
+                              err_string)) {
+    extra_cfg.sharpness = arg_parse_uint_helper(&arg, err_string);
+  } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.static_thresh, argv,
+                              err_string)) {
+    extra_cfg.static_thresh = arg_parse_uint_helper(&arg, err_string);
+  } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.rowmtarg, argv,
+                              err_string)) {
+    extra_cfg.row_mt = arg_parse_uint_helper(&arg, err_string);
+  } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.tile_cols, argv,
+                              err_string)) {
+    extra_cfg.tile_columns = arg_parse_uint_helper(&arg, err_string);
+  } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.tile_rows, argv,
+                              err_string)) {
+    extra_cfg.tile_rows = arg_parse_uint_helper(&arg, err_string);
+  } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.enable_tpl_model,
+                              argv, err_string)) {
+    extra_cfg.enable_tpl_model = arg_parse_uint_helper(&arg, err_string);
+  } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.arnr_maxframes, argv,
+                              err_string)) {
+    extra_cfg.arnr_max_frames = arg_parse_uint_helper(&arg, err_string);
+  } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.arnr_strength, argv,
+                              err_string)) {
+    extra_cfg.arnr_strength = arg_parse_uint_helper(&arg, err_string);
+  } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.tune_metric, argv,
+                              err_string)) {
+    extra_cfg.tuning = arg_parse_enum_helper(&arg, err_string);
+  }
+#if CONFIG_TUNE_VMAF
+  else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.vmaf_model_path, argv,
+                            err_string)) {
+    extra_cfg.vmaf_model_path = value;
+  }
+#endif
+  else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.cq_level, argv,
+                            err_string)) {
+    extra_cfg.cq_level = arg_parse_uint_helper(&arg, err_string);
+  } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.max_intra_rate_pct,
+                              argv, err_string)) {
+    extra_cfg.rc_max_intra_bitrate_pct =
+        arg_parse_uint_helper(&arg, err_string);
+  } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.max_inter_rate_pct,
+                              argv, err_string)) {
+    extra_cfg.rc_max_inter_bitrate_pct =
+        arg_parse_uint_helper(&arg, err_string);
+  } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.gf_cbr_boost_pct,
+                              argv, err_string)) {
+    extra_cfg.gf_cbr_boost_pct = arg_parse_uint_helper(&arg, err_string);
+  } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.lossless, argv,
+                              err_string)) {
+    extra_cfg.lossless = arg_parse_uint_helper(&arg, err_string);
+  } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.enable_cdef, argv,
+                              err_string)) {
+    extra_cfg.enable_cdef = arg_parse_uint_helper(&arg, err_string);
+  } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.enable_restoration,
+                              argv, err_string)) {
+    extra_cfg.enable_restoration = arg_parse_uint_helper(&arg, err_string);
+  } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.force_video_mode,
+                              argv, err_string)) {
+    extra_cfg.force_video_mode = arg_parse_uint_helper(&arg, err_string);
+  } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.enable_obmc, argv,
+                              err_string)) {
+    extra_cfg.enable_obmc = arg_parse_uint_helper(&arg, err_string);
+  } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.disable_trellis_quant,
+                              argv, err_string)) {
+    extra_cfg.disable_trellis_quant = arg_parse_uint_helper(&arg, err_string);
+  } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.enable_qm, argv,
+                              err_string)) {
+    extra_cfg.enable_qm = arg_parse_uint_helper(&arg, err_string);
+  } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.qm_max, argv,
+                              err_string)) {
+    extra_cfg.qm_max = arg_parse_uint_helper(&arg, err_string);
+  } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.qm_min, argv,
+                              err_string)) {
+    extra_cfg.qm_min = arg_parse_uint_helper(&arg, err_string);
+  } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.num_tg, argv,
+                              err_string)) {
+    extra_cfg.num_tg = arg_parse_uint_helper(&arg, err_string);
+  } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.mtu_size, argv,
+                              err_string)) {
+    extra_cfg.mtu_size = arg_parse_uint_helper(&arg, err_string);
+  } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.timing_info, argv,
+                              err_string)) {
+    extra_cfg.timing_info_type = arg_parse_enum_helper(&arg, err_string);
+  } else if (arg_match_helper(&arg,
+                              &g_av1_codec_arg_defs.frame_parallel_decoding,
+                              argv, err_string)) {
+    extra_cfg.frame_parallel_decoding_mode =
+        arg_parse_uint_helper(&arg, err_string);
+  } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.enable_dual_filter,
+                              argv, err_string)) {
+    extra_cfg.enable_dual_filter = arg_parse_uint_helper(&arg, err_string);
+  } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.enable_chroma_deltaq,
+                              argv, err_string)) {
+    extra_cfg.enable_chroma_deltaq = arg_parse_uint_helper(&arg, err_string);
+  } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.aq_mode, argv,
+                              err_string)) {
+    extra_cfg.aq_mode = arg_parse_uint_helper(&arg, err_string);
+  } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.deltaq_mode, argv,
+                              err_string)) {
+    extra_cfg.deltaq_mode = arg_parse_uint_helper(&arg, err_string);
+  } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.deltalf_mode, argv,
+                              err_string)) {
+    extra_cfg.deltalf_mode = arg_parse_uint_helper(&arg, err_string);
+  } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.frame_periodic_boost,
+                              argv, err_string)) {
+    extra_cfg.frame_periodic_boost = arg_parse_uint_helper(&arg, err_string);
+  } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.tune_content, argv,
+                              err_string)) {
+    extra_cfg.content = arg_parse_enum_helper(&arg, err_string);
+  } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.input_color_primaries,
+                              argv, err_string)) {
+    extra_cfg.color_primaries = arg_parse_enum_helper(&arg, err_string);
+  } else if (arg_match_helper(
+                 &arg, &g_av1_codec_arg_defs.input_transfer_characteristics,
+                 argv, err_string)) {
+    extra_cfg.transfer_characteristics =
+        arg_parse_enum_helper(&arg, err_string);
+  } else if (arg_match_helper(&arg,
+                              &g_av1_codec_arg_defs.input_matrix_coefficients,
+                              argv, err_string)) {
+    extra_cfg.matrix_coefficients = arg_parse_enum_helper(&arg, err_string);
+  } else if (arg_match_helper(
+                 &arg, &g_av1_codec_arg_defs.input_chroma_sample_position, argv,
+                 err_string)) {
+    extra_cfg.chroma_sample_position = arg_parse_enum_helper(&arg, err_string);
+  } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.superblock_size, argv,
+                              err_string)) {
+    extra_cfg.superblock_size = arg_parse_enum_helper(&arg, err_string);
+  } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.error_resilient_mode,
+                              argv, err_string)) {
+    extra_cfg.error_resilient_mode = arg_parse_int_helper(&arg, err_string);
+  } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.sframe_mode, argv,
+                              err_string)) {
+    extra_cfg.s_frame_mode = arg_parse_int_helper(&arg, err_string);
+  } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.film_grain_test, argv,
+                              err_string)) {
+    extra_cfg.film_grain_test_vector = arg_parse_int_helper(&arg, err_string);
+  } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.film_grain_table,
+                              argv, err_string)) {
+    extra_cfg.film_grain_table_filename = value;
+  } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.cdf_update_mode, argv,
+                              err_string)) {
+    extra_cfg.cdf_update_mode = arg_parse_int_helper(&arg, err_string);
+  } else if (arg_match_helper(&arg,
+                              &g_av1_codec_arg_defs.enable_rect_partitions,
+                              argv, err_string)) {
+    extra_cfg.enable_rect_partitions = arg_parse_int_helper(&arg, err_string);
+  } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.enable_ab_partitions,
+                              argv, err_string)) {
+    extra_cfg.enable_ab_partitions = arg_parse_int_helper(&arg, err_string);
+  } else if (arg_match_helper(&arg,
+                              &g_av1_codec_arg_defs.enable_1to4_partitions,
+                              argv, err_string)) {
+    extra_cfg.enable_1to4_partitions = arg_parse_int_helper(&arg, err_string);
+  } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.min_partition_size,
+                              argv, err_string)) {
+    extra_cfg.min_partition_size = arg_parse_int_helper(&arg, err_string);
+  } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.max_partition_size,
+                              argv, err_string)) {
+    extra_cfg.max_partition_size = arg_parse_int_helper(&arg, err_string);
+  } else if (arg_match_helper(&arg,
+                              &g_av1_codec_arg_defs.enable_intra_edge_filter,
+                              argv, err_string)) {
+    extra_cfg.enable_intra_edge_filter =
+        arg_parse_uint_helper(&arg, err_string);
+  } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.enable_order_hint,
+                              argv, err_string)) {
+    extra_cfg.enable_order_hint = arg_parse_int_helper(&arg, err_string);
+  } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.enable_tx64, argv,
+                              err_string)) {
+    extra_cfg.enable_tx64 = arg_parse_int_helper(&arg, err_string);
+  } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.enable_flip_idtx,
+                              argv, err_string)) {
+    extra_cfg.enable_flip_idtx = arg_parse_int_helper(&arg, err_string);
+  } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.enable_rect_tx, argv,
+                              err_string)) {
+    extra_cfg.enable_rect_tx = arg_parse_int_helper(&arg, err_string);
+  } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.enable_dist_wtd_comp,
+                              argv, err_string)) {
+    extra_cfg.enable_dist_wtd_comp = arg_parse_int_helper(&arg, err_string);
+  } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.max_reference_frames,
+                              argv, err_string)) {
+    extra_cfg.max_reference_frames = arg_parse_int_helper(&arg, err_string);
+  } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.reduced_reference_set,
+                              argv, err_string)) {
+    extra_cfg.enable_reduced_reference_set =
+        arg_parse_int_helper(&arg, err_string);
+  } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.enable_ref_frame_mvs,
+                              argv, err_string)) {
+    extra_cfg.enable_ref_frame_mvs = arg_parse_int_helper(&arg, err_string);
+  } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.enable_masked_comp,
+                              argv, err_string)) {
+    extra_cfg.enable_masked_comp = arg_parse_int_helper(&arg, err_string);
+  } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.enable_onesided_comp,
+                              argv, err_string)) {
+    extra_cfg.enable_onesided_comp = arg_parse_int_helper(&arg, err_string);
+  } else if (arg_match_helper(&arg,
+                              &g_av1_codec_arg_defs.enable_interintra_comp,
+                              argv, err_string)) {
+    extra_cfg.enable_interintra_comp = arg_parse_int_helper(&arg, err_string);
+  } else if (arg_match_helper(&arg,
+                              &g_av1_codec_arg_defs.enable_smooth_interintra,
+                              argv, err_string)) {
+    extra_cfg.enable_smooth_interintra = arg_parse_int_helper(&arg, err_string);
+  } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.enable_diff_wtd_comp,
+                              argv, err_string)) {
+    extra_cfg.enable_diff_wtd_comp = arg_parse_int_helper(&arg, err_string);
+  } else if (arg_match_helper(&arg,
+                              &g_av1_codec_arg_defs.enable_interinter_wedge,
+                              argv, err_string)) {
+    extra_cfg.enable_interinter_wedge = arg_parse_int_helper(&arg, err_string);
+  } else if (arg_match_helper(&arg,
+                              &g_av1_codec_arg_defs.enable_interintra_wedge,
+                              argv, err_string)) {
+    extra_cfg.enable_interintra_wedge = arg_parse_int_helper(&arg, err_string);
+  } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.enable_global_motion,
+                              argv, err_string)) {
+    extra_cfg.enable_global_motion = arg_parse_int_helper(&arg, err_string);
+  } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.enable_warped_motion,
+                              argv, err_string)) {
+    extra_cfg.enable_warped_motion = arg_parse_int_helper(&arg, err_string);
+  } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.enable_filter_intra,
+                              argv, err_string)) {
+    extra_cfg.enable_filter_intra = arg_parse_int_helper(&arg, err_string);
+  } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.enable_smooth_intra,
+                              argv, err_string)) {
+    extra_cfg.enable_smooth_intra = arg_parse_int_helper(&arg, err_string);
+  } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.enable_paeth_intra,
+                              argv, err_string)) {
+    extra_cfg.enable_paeth_intra = arg_parse_int_helper(&arg, err_string);
+  } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.enable_cfl_intra,
+                              argv, err_string)) {
+    extra_cfg.enable_cfl_intra = arg_parse_int_helper(&arg, err_string);
+  } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.superres_mode, argv,
+                              err_string)) {
+    extra_cfg.enable_superres = arg_parse_int_helper(&arg, err_string);
+  } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.enable_overlay, argv,
+                              err_string)) {
+    extra_cfg.enable_overlay = arg_parse_int_helper(&arg, err_string);
+  } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.enable_palette, argv,
+                              err_string)) {
+    extra_cfg.enable_palette = arg_parse_int_helper(&arg, err_string);
+  } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.enable_intrabc, argv,
+                              err_string)) {
+    extra_cfg.enable_intrabc = arg_parse_int_helper(&arg, err_string);
+  } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.enable_angle_delta,
+                              argv, err_string)) {
+    extra_cfg.enable_angle_delta = arg_parse_int_helper(&arg, err_string);
+  } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.reduced_tx_type_set,
+                              argv, err_string)) {
+    extra_cfg.reduced_tx_type_set = arg_parse_int_helper(&arg, err_string);
+  } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.use_intra_dct_only,
+                              argv, err_string)) {
+    extra_cfg.use_intra_dct_only = arg_parse_int_helper(&arg, err_string);
+  } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.use_inter_dct_only,
+                              argv, err_string)) {
+    extra_cfg.use_inter_dct_only = arg_parse_int_helper(&arg, err_string);
+  } else if (arg_match_helper(&arg,
+                              &g_av1_codec_arg_defs.use_intra_default_tx_only,
+                              argv, err_string)) {
+    extra_cfg.use_intra_default_tx_only =
+        arg_parse_int_helper(&arg, err_string);
+  } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.quant_b_adapt, argv,
+                              err_string)) {
+    extra_cfg.quant_b_adapt = arg_parse_int_helper(&arg, err_string);
+  } else if (arg_match_helper(&arg,
+                              &g_av1_codec_arg_defs.vbr_corpus_complexity_lap,
+                              argv, err_string)) {
+    extra_cfg.vbr_corpus_complexity_lap =
+        arg_parse_uint_helper(&arg, err_string);
+  } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.set_tier_mask, argv,
+                              err_string)) {
+    extra_cfg.tier_mask = arg_parse_uint_helper(&arg, err_string);
+  } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.set_min_cr, argv,
+                              err_string)) {
+    extra_cfg.min_cr = arg_parse_uint_helper(&arg, err_string);
+  } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.coeff_cost_upd_freq,
+                              argv, err_string)) {
+    extra_cfg.coeff_cost_upd_freq = arg_parse_uint_helper(&arg, err_string);
+  } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.mode_cost_upd_freq,
+                              argv, err_string)) {
+    extra_cfg.mode_cost_upd_freq = arg_parse_uint_helper(&arg, err_string);
+  } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.mv_cost_upd_freq,
+                              argv, err_string)) {
+    extra_cfg.mv_cost_upd_freq = arg_parse_uint_helper(&arg, err_string);
+  } else {
+    match = 0;
+    snprintf(err_string, ARG_ERR_MSG_MAX_LEN, "Cannot find aom option %s",
+             name);
+  }
+  aom_free(argv[0]);
+
+  if (strlen(err_string) != 0) {
+    ctx->base.err_detail = err_string;
+    return AOM_CODEC_INVALID_PARAM;
+  }
+
+  ctx->base.err_detail = NULL;
+
+  if (!match) {
+    return AOM_CODEC_INVALID_PARAM;
+  }
+  return update_extra_cfg(ctx, &extra_cfg);
+}
+
 static aom_codec_err_t ctrl_get_seq_level_idx(aom_codec_alg_priv_t *ctx,
                                               va_list args) {
   int *const arg = va_arg(args, int *);
@@ -3087,7 +3445,8 @@
       encoder_set_config,          // aom_codec_enc_config_set_fn_t
       encoder_get_global_headers,  // aom_codec_get_global_headers_fn_t
       encoder_get_preview          // aom_codec_get_preview_frame_fn_t
-  }
+  },
+  encoder_set_option  // aom_codec_set_option_fn_t
 };
 
 aom_codec_iface_t *aom_codec_av1_cx(void) { return &aom_codec_av1_cx_algo; }
diff --git a/av1/av1_dx_iface.c b/av1/av1_dx_iface.c
index 21050cd..1ee8a57 100644
--- a/av1/av1_dx_iface.c
+++ b/av1/av1_dx_iface.c
@@ -1598,7 +1598,8 @@
       NULL,  // aom_codec_enc_config_set_fn_t
       NULL,  // aom_codec_get_global_headers_fn_t
       NULL   // aom_codec_get_preview_frame_fn_t
-  }
+  },
+  NULL  // aom_codec_set_option_fn_t
 };
 
 aom_codec_iface_t *aom_codec_av1_dx(void) { return &aom_codec_av1_dx_algo; }