Add a control to force video mode

This commit adds a control to force video mode in the encoder. When
the encoder is forced in video mode, a single input frame is coded
as video, otherwise encoder codes a single input frame as still
picture using reduced header.

Currently by default, force video mode is on in the library and
aomenc, i.e. if there is only one input frame, encoder will use
video mode to encode the single frame. To force video mode off
and enable encoding of a single video frame using reduced still
picture header, one can pass
  --force-video-mode=0 to aomenc.

Note: even with --force-video-mode=0, input sequence with at least
2 video frames, encoder is operating as if force-video-mode is on.
The only combination producing still picture coded with reduced
header is "--force-video-mode=0 --limit=1"

BUG=aomedia:2425

Change-Id: I5eb2f437ed52cc675ab9549aecc28a8e78b0c325
diff --git a/aom/aomcx.h b/aom/aomcx.h
index c400c50..8e42bd6 100644
--- a/aom/aomcx.h
+++ b/aom/aomcx.h
@@ -572,6 +572,16 @@
    */
   AV1E_SET_ENABLE_RESTORATION,
 
+  /*!\brief Codec control function to force video mode
+   *
+   *                          0 = do not force video mode
+   *                          1 = force video mode even for a single frame
+   *
+   *  By default, the encoder does not force video and allows still picture.
+   *
+   */
+  AV1E_SET_FORCE_VIDEO_MODE,
+
   /*!\brief Codec control function to predict with OBMC mode.
    *
    *                          0 = do not allow OBMC mode
@@ -1331,6 +1341,9 @@
 AOM_CTRL_USE_TYPE(AV1E_SET_ENABLE_RESTORATION, unsigned int)
 #define AOM_CTRL_AV1E_SET_ENABLE_RESTORATION
 
+AOM_CTRL_USE_TYPE(AV1E_SET_FORCE_VIDEO_MODE, unsigned int)
+#define AOM_CTRL_AV1E_SET_FORCE_VIDEO_MODE
+
 AOM_CTRL_USE_TYPE(AV1E_SET_ENABLE_OBMC, unsigned int)
 #define AOM_CTRL_AV1E_SET_ENABLE_OBMC
 
diff --git a/apps/aomenc.c b/apps/aomenc.c
index bad4f53..5e4522d 100644
--- a/apps/aomenc.c
+++ b/apps/aomenc.c
@@ -540,6 +540,9 @@
     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_palette =
@@ -832,6 +835,7 @@
                                        &enable_smooth_intra,
                                        &enable_paeth_intra,
                                        &enable_cfl_intra,
+                                       &force_video_mode,
                                        &enable_obmc,
                                        &enable_palette,
                                        &enable_intrabc,
@@ -934,6 +938,7 @@
                                         AV1E_SET_ENABLE_SMOOTH_INTRA,
                                         AV1E_SET_ENABLE_PAETH_INTRA,
                                         AV1E_SET_ENABLE_CFL_INTRA,
+                                        AV1E_SET_FORCE_VIDEO_MODE,
                                         AV1E_SET_ENABLE_OBMC,
                                         AV1E_SET_ENABLE_PALETTE,
                                         AV1E_SET_ENABLE_INTRABC,
diff --git a/av1/av1_cx_iface.c b/av1/av1_cx_iface.c
index 59a6d46..942650d 100644
--- a/av1/av1_cx_iface.c
+++ b/av1/av1_cx_iface.c
@@ -53,6 +53,7 @@
   unsigned int lossless;
   unsigned int enable_cdef;
   unsigned int enable_restoration;
+  unsigned int force_video_mode;
   unsigned int enable_obmc;
   unsigned int disable_trellis_quant;
   unsigned int enable_qm;
@@ -172,6 +173,7 @@
   0,                       // lossless
   !CONFIG_SHARP_SETTINGS,  // enable_cdef
   1,                       // enable_restoration
+  1,                       // force_video_mode
   1,                       // enable_obmc
   3,                       // disable_trellis_quant
   0,                       // enable_qm
@@ -649,6 +651,7 @@
   oxcf->enable_cdef = extra_cfg->enable_cdef;
   oxcf->enable_restoration =
       (cfg->g_usage == AOM_USAGE_REALTIME) ? 0 : extra_cfg->enable_restoration;
+  oxcf->force_video_mode = extra_cfg->force_video_mode;
   oxcf->enable_obmc = extra_cfg->enable_obmc;
   oxcf->enable_palette = extra_cfg->enable_palette;
   oxcf->enable_intrabc = extra_cfg->enable_intrabc;
@@ -1106,6 +1109,13 @@
   return update_extra_cfg(ctx, &extra_cfg);
 }
 
+static aom_codec_err_t ctrl_set_force_video_mode(aom_codec_alg_priv_t *ctx,
+                                                 va_list args) {
+  struct av1_extracfg extra_cfg = ctx->extra_cfg;
+  extra_cfg.force_video_mode = CAST(AV1E_SET_FORCE_VIDEO_MODE, args);
+  return update_extra_cfg(ctx, &extra_cfg);
+}
+
 static aom_codec_err_t ctrl_set_enable_obmc(aom_codec_alg_priv_t *ctx,
                                             va_list args) {
   struct av1_extracfg extra_cfg = ctx->extra_cfg;
@@ -2314,6 +2324,7 @@
   { AV1E_SET_LOSSLESS, ctrl_set_lossless },
   { AV1E_SET_ENABLE_CDEF, ctrl_set_enable_cdef },
   { AV1E_SET_ENABLE_RESTORATION, ctrl_set_enable_restoration },
+  { AV1E_SET_FORCE_VIDEO_MODE, ctrl_set_force_video_mode },
   { AV1E_SET_ENABLE_OBMC, ctrl_set_enable_obmc },
   { AV1E_SET_DISABLE_TRELLIS_QUANT, ctrl_set_disable_trellis_quant },
   { AV1E_SET_ENABLE_QM, ctrl_set_enable_qm },
diff --git a/av1/encoder/encoder.c b/av1/encoder/encoder.c
index ab30db7..67802f2 100644
--- a/av1/encoder/encoder.c
+++ b/av1/encoder/encoder.c
@@ -1043,7 +1043,7 @@
 
 static void init_seq_coding_tools(SequenceHeader *seq, AV1_COMMON *cm,
                                   const AV1EncoderConfig *oxcf, int use_svc) {
-  seq->still_picture = (oxcf->limit == 1);
+  seq->still_picture = (oxcf->force_video_mode == 0) && (oxcf->limit == 1);
   seq->reduced_still_picture_hdr = seq->still_picture;
   seq->reduced_still_picture_hdr &= !oxcf->full_still_picture_hdr;
   seq->force_screen_content_tools = (oxcf->mode == REALTIME) ? 0 : 2;
diff --git a/av1/encoder/encoder.h b/av1/encoder/encoder.h
index ecc1b8d..da5e001 100644
--- a/av1/encoder/encoder.h
+++ b/av1/encoder/encoder.h
@@ -278,6 +278,7 @@
   int deltalf_mode;
   int enable_cdef;
   int enable_restoration;
+  int force_video_mode;
   int enable_obmc;
   int disable_trellis_quant;
   int using_qm;