Add a mechanism to provide preset config strings

If the --subgop-config-str parameter provided is one of
the known preset tags, the in-built preset config string
is used instead.
Therefore, --subgop-config-str=enh will automatically now
invoke the subgop_config_str_enh preset config string.

Change-Id: I3969ce66c9004820655749bd2ffeac7b662b948e
diff --git a/av1/av1_cx_iface.c b/av1/av1_cx_iface.c
index 3b1fc81..07723b9 100644
--- a/av1/av1_cx_iface.c
+++ b/av1/av1_cx_iface.c
@@ -237,6 +237,17 @@
     "16:1:1V5/2V4/3V5/4V3/5V5/6V4/7V5/8V2/"
     "9V5/10V4/11V5/12V3/13V5/14V1/15V5/16V5";
 
+typedef struct {
+  const char *preset_tag;
+  const char *preset_str;
+} subgop_config_str_preset_map_type;
+
+const subgop_config_str_preset_map_type subgop_config_str_preset_map[] = {
+  { "def", subgop_config_str_def },  { "enh", subgop_config_str_enh },
+  { "asym", subgop_config_str_enh }, { "ts", subgop_config_str_ts },
+  { "ld", subgop_config_str_ld },
+};
+
 static struct av1_extracfg default_extra_cfg = {
   0,              // cpu_used
   1,              // enable_auto_alt_ref
@@ -1091,6 +1102,20 @@
   oxcf->subgop_config_str = extra_cfg->subgop_config_str;
   oxcf->subgop_config_path = extra_cfg->subgop_config_path;
 
+  // check if subgop_config_str is a preset tag
+  if (oxcf->subgop_config_str) {
+    int num_preset_configs = sizeof(subgop_config_str_preset_map) /
+                             sizeof(*subgop_config_str_preset_map);
+    int p;
+    for (p = 0; p < num_preset_configs; ++p) {
+      if (!strcmp(oxcf->subgop_config_str,
+                  subgop_config_str_preset_map[p].preset_tag)) {
+        oxcf->subgop_config_str = subgop_config_str_preset_map[p].preset_str;
+        break;
+      }
+    }
+  }
+
   // Set tune related configuration.
   tune_cfg->tuning = extra_cfg->tuning;
   tune_cfg->vmaf_model_path = extra_cfg->vmaf_model_path;