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 | expand |
Context | Check | Description |
---|---|---|
andriy/default | pending | |
andriy/make | success | Make finished |
andriy/make_fate | success | Make fate finished |
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 }, > }; >
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 --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, \