diff mbox series

[FFmpeg-devel,1/5] avcodec/libaomenc.c: Add super-resolution options to libaom wrapper

Message ID 20200626005516.678811-1-wangcao@google.com
State Superseded
Headers show
Series [FFmpeg-devel,1/5] avcodec/libaomenc.c: Add super-resolution options to libaom wrapper
Related show

Checks

Context Check Description
andriy/default pending
andriy/make success Make finished
andriy/make_fate success Make fate finished

Commit Message

Wang Cao June 26, 2020, 12:55 a.m. UTC
From: Wang Cao <doubleecao@gmail.com>

Signed-off-by: Wang Cao <wangcao@google.com>
---
 doc/encoders.texi      | 39 +++++++++++++++++++++++++++++++++++++++
 libavcodec/libaomenc.c | 38 ++++++++++++++++++++++++++++++++++++++
 libavcodec/version.h   |  2 +-
 3 files changed, 78 insertions(+), 1 deletion(-)

Comments

James Zern June 29, 2020, 6:05 p.m. UTC | #1
On Thu, Jun 25, 2020 at 5:55 PM Wang Cao <doubleecao@gmail.com> wrote:
>
> From: Wang Cao <doubleecao@gmail.com>
>
> Signed-off-by: Wang Cao <wangcao@google.com>
> ---
>  doc/encoders.texi      | 39 +++++++++++++++++++++++++++++++++++++++
>  libavcodec/libaomenc.c | 38 ++++++++++++++++++++++++++++++++++++++
>  libavcodec/version.h   |  2 +-
>  3 files changed, 78 insertions(+), 1 deletion(-)
>
> [...]
> @@ -688,6 +713,8 @@ static av_cold int aom_init(AVCodecContext *avctx,
>      // codec control failures are currently treated only as warnings
>      av_log(avctx, AV_LOG_DEBUG, "aom_codec_control\n");
>      codecctl_int(avctx, AOME_SET_CPUUSED, ctx->cpu_used);
> +    if (ctx->enable_superres >= 0)

I think you can just check whether superres_mode has been set to avoid
this additional option.

> +        codecctl_int(avctx, AV1E_SET_ENABLE_SUPERRES, ctx->enable_superres);
>      if (ctx->auto_alt_ref >= 0)
>          codecctl_int(avctx, AOME_SET_ENABLEAUTOALTREF, ctx->auto_alt_ref);
>      if (ctx->arnr_max_frames >= 0)
> @@ -1107,6 +1134,17 @@ static const AVOption options[] = {
>      { "tune",            "The metric that the encoder tunes for. Automatically chosen by the encoder by default", OFFSET(tune), AV_OPT_TYPE_INT, {.i64 = -1}, -1, AOM_TUNE_SSIM, VE, "tune"},
>      { "psnr",            NULL,         0, AV_OPT_TYPE_CONST, {.i64 = AOM_TUNE_PSNR}, 0, 0, VE, "tune"},
>      { "ssim",            NULL,         0, AV_OPT_TYPE_CONST, {.i64 = AOM_TUNE_SSIM}, 0, 0, VE, "tune"},
> +    { "enable-superres", "Enable super-resolution mode", OFFSET(enable_superres), AV_OPT_TYPE_BOOL, {.i64 = -1}, -1, 1, VE},
> +    { "superres-mode",   "Select super-resultion mode", OFFSET(superres_mode), AV_OPT_TYPE_INT, {.i64 = -1}, -1, AOM_SUPERRES_AUTO, VE, "superres_mode"},

resolution

> +    { "none",            "No frame superres allowed",                                      0, AV_OPT_TYPE_CONST, {.i64 = AOM_SUPERRES_NONE},    0, 0, VE, "superres_mode"},
> +    { "fixed",           "All frames are coded at the specified scale and super-resolved", 0, AV_OPT_TYPE_CONST, {.i64 = AOM_SUPERRES_FIXED},   0, 0, VE, "superres_mode"},
> +    { "random",          "All frames are coded at a random scale and super-resolved.",     0, AV_OPT_TYPE_CONST, {.i64 = AOM_SUPERRES_RANDOM},  0, 0, VE, "superres_mode"},
> +    { "qthresh",         "Superres scale for a frame is determined based on q_index",      0, AV_OPT_TYPE_CONST, {.i64 = AOM_SUPERRES_QTHRESH}, 0, 0, VE, "superres_mode"},
> +    { "auto",            "Automatically select superres for appropriate frames",           0, AV_OPT_TYPE_CONST, {.i64 = AOM_SUPERRES_AUTO},    0, 0, VE, "superres_mode"},
> +    { "superres-denominator",    "The denominator for superres to use, range [8, 16]",                               OFFSET(superres_denominator),    AV_OPT_TYPE_INT, {.i64 = 8}, 8, 16, VE},
> +    { "superres-qthresh",        "The q level threshold after which superres is used, range [1, 63]",                OFFSET(superres_qthresh),        AV_OPT_TYPE_INT, {.i64 = 0}, 0, 63, VE},
> +    { "superres-kf-denominator", "The denominator for superres to use on key frames, range [8, 16]",                 OFFSET(superres_kf_denominator), AV_OPT_TYPE_INT, {.i64 = 8}, 8, 16, VE},
> +    { "superres-kf-qthresh",     "The q level threshold after which superres is used for key frames, range [1, 63]", OFFSET(superres_kf_qthresh),     AV_OPT_TYPE_INT, {.i64 = 0}, 0, 63, VE},
>      { NULL },
>  };
>
James Zern June 29, 2020, 6:12 p.m. UTC | #2
On Mon, Jun 29, 2020 at 11:05 AM James Zern <jzern@google.com> wrote:
>
> On Thu, Jun 25, 2020 at 5:55 PM Wang Cao <doubleecao@gmail.com> wrote:
> >
> > From: Wang Cao <doubleecao@gmail.com>
> >
> > Signed-off-by: Wang Cao <wangcao@google.com>
> > ---
> >  doc/encoders.texi      | 39 +++++++++++++++++++++++++++++++++++++++
> >  libavcodec/libaomenc.c | 38 ++++++++++++++++++++++++++++++++++++++
> >  libavcodec/version.h   |  2 +-
> >  3 files changed, 78 insertions(+), 1 deletion(-)
> >
> > [...]
> > @@ -688,6 +713,8 @@ static av_cold int aom_init(AVCodecContext *avctx,
> >      // codec control failures are currently treated only as warnings
> >      av_log(avctx, AV_LOG_DEBUG, "aom_codec_control\n");
> >      codecctl_int(avctx, AOME_SET_CPUUSED, ctx->cpu_used);
> > +    if (ctx->enable_superres >= 0)
>
> I think you can just check whether superres_mode has been set to avoid
> this additional option.
>
> > +        codecctl_int(avctx, AV1E_SET_ENABLE_SUPERRES, ctx->enable_superres);
> >      if (ctx->auto_alt_ref >= 0)
> >          codecctl_int(avctx, AOME_SET_ENABLEAUTOALTREF, ctx->auto_alt_ref);
> >      if (ctx->arnr_max_frames >= 0)
> > @@ -1107,6 +1134,17 @@ static const AVOption options[] = {
> >      { "tune",            "The metric that the encoder tunes for. Automatically chosen by the encoder by default", OFFSET(tune), AV_OPT_TYPE_INT, {.i64 = -1}, -1, AOM_TUNE_SSIM, VE, "tune"},
> >      { "psnr",            NULL,         0, AV_OPT_TYPE_CONST, {.i64 = AOM_TUNE_PSNR}, 0, 0, VE, "tune"},
> >      { "ssim",            NULL,         0, AV_OPT_TYPE_CONST, {.i64 = AOM_TUNE_SSIM}, 0, 0, VE, "tune"},
> > +    { "enable-superres", "Enable super-resolution mode", OFFSET(enable_superres), AV_OPT_TYPE_BOOL, {.i64 = -1}, -1, 1, VE},
> > +    { "superres-mode",   "Select super-resultion mode", OFFSET(superres_mode), AV_OPT_TYPE_INT, {.i64 = -1}, -1, AOM_SUPERRES_AUTO, VE, "superres_mode"},
>
> resolution
>
> > +    { "none",            "No frame superres allowed",                                      0, AV_OPT_TYPE_CONST, {.i64 = AOM_SUPERRES_NONE},    0, 0, VE, "superres_mode"},

The AOM_SUPERRES_* enum values are a recent addition, for
compatibility you can use integer constants. If there was an abi bump
after they were added you can check that and keep the enum values for
current versions of the library.

> > +    { "fixed",           "All frames are coded at the specified scale and super-resolved", 0, AV_OPT_TYPE_CONST, {.i64 = AOM_SUPERRES_FIXED},   0, 0, VE, "superres_mode"},
> > +    { "random",          "All frames are coded at a random scale and super-resolved.",     0, AV_OPT_TYPE_CONST, {.i64 = AOM_SUPERRES_RANDOM},  0, 0, VE, "superres_mode"},
> > +    { "qthresh",         "Superres scale for a frame is determined based on q_index",      0, AV_OPT_TYPE_CONST, {.i64 = AOM_SUPERRES_QTHRESH}, 0, 0, VE, "superres_mode"},
> > +    { "auto",            "Automatically select superres for appropriate frames",           0, AV_OPT_TYPE_CONST, {.i64 = AOM_SUPERRES_AUTO},    0, 0, VE, "superres_mode"},
> > +    { "superres-denominator",    "The denominator for superres to use, range [8, 16]",                               OFFSET(superres_denominator),    AV_OPT_TYPE_INT, {.i64 = 8}, 8, 16, VE},
> > +    { "superres-qthresh",        "The q level threshold after which superres is used, range [1, 63]",                OFFSET(superres_qthresh),        AV_OPT_TYPE_INT, {.i64 = 0}, 0, 63, VE},
> > +    { "superres-kf-denominator", "The denominator for superres to use on key frames, range [8, 16]",                 OFFSET(superres_kf_denominator), AV_OPT_TYPE_INT, {.i64 = 8}, 8, 16, VE},
> > +    { "superres-kf-qthresh",     "The q level threshold after which superres is used for key frames, range [1, 63]", OFFSET(superres_kf_qthresh),     AV_OPT_TYPE_INT, {.i64 = 0}, 0, 63, VE},
> >      { NULL },
> >  };
> >
diff mbox series

Patch

diff --git a/doc/encoders.texi b/doc/encoders.texi
index 17a0f4c821..045535accb 100644
--- a/doc/encoders.texi
+++ b/doc/encoders.texi
@@ -1599,6 +1599,45 @@  Enable the use of global motion for block prediction. Default is true.
 Enable block copy mode for intra block prediction. This mode is
 useful for screen content. Default is true.
 
+@item enable-superres (@emph{boolean})
+Enable super-resolution during the encoding process.
+
+@item superres-mode (@emph{mode})
+Select super-resolution mode.
+
+@table @option
+@item none (@emph{0})
+No frame superres allowed.
+
+@item fixed (@emph{1})
+All frames are coded at the specified scale and super-resolved.
+
+@item random (@emph{2})
+All frames are coded at a random scale and super-resolved.
+
+@item qthresh (@emph{3})
+Superres scale for a frame is determined based on q_index.
+
+@item auto (@emph{4})
+Automatically select superres for appropriate frames.
+@end table
+
+@item superres_denominator
+The denominator for superres to use when @option{superres-mode} is @option{fixed}.
+Valid value ranges from 8 to 16.
+
+@item superres_kf_denominator
+The denominator for superres to use on key frames when
+@option{superres-mode} is @option{fixed}. Valid value ranges from 8 to 16.
+
+@item superres_qthresh
+The q level threshold after which superres is used when @option{superres-mode}
+is @option{qthresh}. Valid value ranges from 1 to 63.
+
+@item superres_kf_qthresh
+The q level threshold after which superres is used for key frames when
+@option{superres-mode} is @option{qthresh}. Valid value ranges from 1 to 63.
+
 @end table
 
 @section libkvazaar
diff --git a/libavcodec/libaomenc.c b/libavcodec/libaomenc.c
index 1c78da719a..17e130d8ec 100644
--- a/libavcodec/libaomenc.c
+++ b/libavcodec/libaomenc.c
@@ -96,6 +96,12 @@  typedef struct AOMEncoderContext {
     int enable_restoration;
     int usage;
     int tune;
+    int enable_superres;
+    int superres_mode;
+    int superres_denominator;
+    int superres_qthresh;
+    int superres_kf_denominator;
+    int superres_kf_qthresh;
 } AOMContext;
 
 static const char *const ctlidstr[] = {
@@ -135,6 +141,7 @@  static const char *const ctlidstr[] = {
 #endif
     [AV1E_SET_ENABLE_CDEF]      = "AV1E_SET_ENABLE_CDEF",
     [AOME_SET_TUNING]           = "AOME_SET_TUNING",
+    [AV1E_SET_ENABLE_SUPERRES]  = "AV1E_SET_ENABLE_SUPERRES",
 };
 
 static av_cold void log_encoder_error(AVCodecContext *avctx, const char *desc)
@@ -204,6 +211,13 @@  static av_cold void dump_enc_cfg(AVCodecContext *avctx,
            width, "tile_width_count:",  cfg->tile_width_count,
            width, "tile_height_count:", cfg->tile_height_count);
     av_log(avctx, level, "\n");
+    av_log(avctx, level, "super resolution settings\n"
+                         "  %*s%u\n  %*s%u\n  %*s%u\n  %*s%u\n  %*s%u\n  ",
+           width, "rc_superres_mode:",           cfg->rc_superres_mode,
+           width, "rc_superres_denominator:",    cfg->rc_superres_denominator,
+           width, "rc_superres_qthresh:",        cfg->rc_superres_qthresh,
+           width, "rc_superres_kf_denominator:", cfg->rc_superres_kf_denominator,
+           width, "rc_superres_kf_qthresh:",     cfg->rc_superres_kf_qthresh);
 }
 
 static void coded_frame_add(void *list, struct FrameListData *cx_frame)
@@ -546,6 +560,17 @@  static av_cold int aom_init(AVCodecContext *avctx,
             return AVERROR(EINVAL);
         }
 
+    if (ctx->superres_mode >= 0)
+        enccfg.rc_superres_mode = ctx->superres_mode;
+    if (ctx->superres_qthresh > 0)
+        enccfg.rc_superres_qthresh = ctx->superres_qthresh;
+    if (ctx->superres_kf_qthresh > 0)
+        enccfg.rc_superres_kf_qthresh = ctx->superres_kf_qthresh;
+    if (ctx->superres_denominator >= 8)
+        enccfg.rc_superres_denominator = ctx->superres_denominator;
+    if (ctx->superres_kf_denominator >= 8)
+        enccfg.rc_superres_kf_denominator = ctx->superres_kf_denominator;
+
     dump_enc_cfg(avctx, &enccfg);
 
     enccfg.g_w            = avctx->width;
@@ -688,6 +713,8 @@  static av_cold int aom_init(AVCodecContext *avctx,
     // codec control failures are currently treated only as warnings
     av_log(avctx, AV_LOG_DEBUG, "aom_codec_control\n");
     codecctl_int(avctx, AOME_SET_CPUUSED, ctx->cpu_used);
+    if (ctx->enable_superres >= 0)
+        codecctl_int(avctx, AV1E_SET_ENABLE_SUPERRES, ctx->enable_superres);
     if (ctx->auto_alt_ref >= 0)
         codecctl_int(avctx, AOME_SET_ENABLEAUTOALTREF, ctx->auto_alt_ref);
     if (ctx->arnr_max_frames >= 0)
@@ -1107,6 +1134,17 @@  static const AVOption options[] = {
     { "tune",            "The metric that the encoder tunes for. Automatically chosen by the encoder by default", OFFSET(tune), AV_OPT_TYPE_INT, {.i64 = -1}, -1, AOM_TUNE_SSIM, VE, "tune"},
     { "psnr",            NULL,         0, AV_OPT_TYPE_CONST, {.i64 = AOM_TUNE_PSNR}, 0, 0, VE, "tune"},
     { "ssim",            NULL,         0, AV_OPT_TYPE_CONST, {.i64 = AOM_TUNE_SSIM}, 0, 0, VE, "tune"},
+    { "enable-superres", "Enable super-resolution mode", OFFSET(enable_superres), AV_OPT_TYPE_BOOL, {.i64 = -1}, -1, 1, VE},
+    { "superres-mode",   "Select super-resultion mode", OFFSET(superres_mode), AV_OPT_TYPE_INT, {.i64 = -1}, -1, AOM_SUPERRES_AUTO, VE, "superres_mode"},
+    { "none",            "No frame superres allowed",                                      0, AV_OPT_TYPE_CONST, {.i64 = AOM_SUPERRES_NONE},    0, 0, VE, "superres_mode"},
+    { "fixed",           "All frames are coded at the specified scale and super-resolved", 0, AV_OPT_TYPE_CONST, {.i64 = AOM_SUPERRES_FIXED},   0, 0, VE, "superres_mode"},
+    { "random",          "All frames are coded at a random scale and super-resolved.",     0, AV_OPT_TYPE_CONST, {.i64 = AOM_SUPERRES_RANDOM},  0, 0, VE, "superres_mode"},
+    { "qthresh",         "Superres scale for a frame is determined based on q_index",      0, AV_OPT_TYPE_CONST, {.i64 = AOM_SUPERRES_QTHRESH}, 0, 0, VE, "superres_mode"},
+    { "auto",            "Automatically select superres for appropriate frames",           0, AV_OPT_TYPE_CONST, {.i64 = AOM_SUPERRES_AUTO},    0, 0, VE, "superres_mode"},
+    { "superres-denominator",    "The denominator for superres to use, range [8, 16]",                               OFFSET(superres_denominator),    AV_OPT_TYPE_INT, {.i64 = 8}, 8, 16, VE},
+    { "superres-qthresh",        "The q level threshold after which superres is used, range [1, 63]",                OFFSET(superres_qthresh),        AV_OPT_TYPE_INT, {.i64 = 0}, 0, 63, VE},
+    { "superres-kf-denominator", "The denominator for superres to use on key frames, range [8, 16]",                 OFFSET(superres_kf_denominator), AV_OPT_TYPE_INT, {.i64 = 8}, 8, 16, VE},
+    { "superres-kf-qthresh",     "The q level threshold after which superres is used for key frames, range [1, 63]", OFFSET(superres_kf_qthresh),     AV_OPT_TYPE_INT, {.i64 = 0}, 0, 63, VE},
     { NULL },
 };
 
diff --git a/libavcodec/version.h b/libavcodec/version.h
index 03593026b3..05f59901ff 100644
--- a/libavcodec/version.h
+++ b/libavcodec/version.h
@@ -29,7 +29,7 @@ 
 
 #define LIBAVCODEC_VERSION_MAJOR  58
 #define LIBAVCODEC_VERSION_MINOR  93
-#define LIBAVCODEC_VERSION_MICRO 100
+#define LIBAVCODEC_VERSION_MICRO 101
 
 #define LIBAVCODEC_VERSION_INT  AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
                                                LIBAVCODEC_VERSION_MINOR, \