[FFmpeg-devel] [PATCH 1/2] libvpxenc: split vp8/vp9 options array

Timothy Gu timothygu99 at gmail.com
Sat Nov 2 20:16:49 CET 2013


On Nov 2, 2013 12:09 PM, "James Zern" <jzern at google.com> wrote:
>
> the current options are left for both to provide command line
compatibility
> ---
>  libavcodec/libvpxenc.c | 95
+++++++++++++++++++++++++++++++-------------------
>  1 file changed, 59 insertions(+), 36 deletions(-)
>
> diff --git a/libavcodec/libvpxenc.c b/libavcodec/libvpxenc.c
> index 8ebf052..69eef1b 100644
> --- a/libavcodec/libvpxenc.c
> +++ b/libavcodec/libvpxenc.c
> @@ -718,43 +718,66 @@ static int vp8_encode(AVCodecContext *avctx,
AVPacket *pkt,
>
>  #define OFFSET(x) offsetof(VP8Context, x)
>  #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
> -static const AVOption options[] = {
> -    { "cpu-used",        "Quality/Speed ratio modifier",
OFFSET(cpu_used),        AV_OPT_TYPE_INT, {.i64 = INT_MIN}, INT_MIN,
INT_MAX, VE},
> -    { "auto-alt-ref",    "Enable use of alternate reference "
> -                         "frames (2-pass only)",
OFFSET(auto_alt_ref),    AV_OPT_TYPE_INT, {.i64 = -1},      -1,      1,
  VE},
> -    { "lag-in-frames",   "Number of frames to look ahead for "
> -                         "alternate reference frame selection",
 OFFSET(lag_in_frames),   AV_OPT_TYPE_INT, {.i64 = -1},      -1,
 INT_MAX, VE},
> -    { "arnr-maxframes",  "altref noise reduction max frame count",
OFFSET(arnr_max_frames), AV_OPT_TYPE_INT, {.i64 = -1},      -1,
 INT_MAX, VE},
> -    { "arnr-strength",   "altref noise reduction filter strength",
OFFSET(arnr_strength),   AV_OPT_TYPE_INT, {.i64 = -1},      -1,
 INT_MAX, VE},
> -    { "arnr-type",       "altref noise reduction filter type",
OFFSET(arnr_type),       AV_OPT_TYPE_INT, {.i64 = -1},      -1,
 INT_MAX, VE, "arnr_type"},
> -    { "backward",        NULL, 0, AV_OPT_TYPE_CONST, {.i64 = 1}, 0, 0,
VE, "arnr_type" },
> -    { "forward",         NULL, 0, AV_OPT_TYPE_CONST, {.i64 = 2}, 0, 0,
VE, "arnr_type" },
> -    { "centered",        NULL, 0, AV_OPT_TYPE_CONST, {.i64 = 3}, 0, 0,
VE, "arnr_type" },
> -    { "deadline",        "Time to spend encoding, in microseconds.",
OFFSET(deadline),      AV_OPT_TYPE_INT, {.i64 = VPX_DL_GOOD_QUALITY},
INT_MIN, INT_MAX, VE, "quality"},
> -    { "best",            NULL, 0, AV_OPT_TYPE_CONST, {.i64 =
VPX_DL_BEST_QUALITY}, 0, 0, VE, "quality"},
> -    { "good",            NULL, 0, AV_OPT_TYPE_CONST, {.i64 =
VPX_DL_GOOD_QUALITY}, 0, 0, VE, "quality"},
> -    { "realtime",        NULL, 0, AV_OPT_TYPE_CONST, {.i64 =
VPX_DL_REALTIME},     0, 0, VE, "quality"},
> -    { "error-resilient", "Error resilience configuration",
OFFSET(error_resilient), AV_OPT_TYPE_FLAGS, {.i64 = 0}, INT_MIN, INT_MAX,
VE, "er"},
> -    { "max-intra-rate",  "Maximum I-frame bitrate (pct) 0=unlimited",
 OFFSET(max_intra_rate),  AV_OPT_TYPE_INT,  {.i64 = -1}, -1,      INT_MAX,
VE},
> -#ifdef VPX_ERROR_RESILIENT_DEFAULT
> -    { "default",         "Improve resiliency against losses of whole
frames", 0, AV_OPT_TYPE_CONST, {.i64 = VPX_ERROR_RESILIENT_DEFAULT}, 0, 0,
VE, "er"},
> -    { "partitions",      "The frame partitions are independently
decodable "
> -                         "by the bool decoder, meaning that partitions
can be decoded even "
> -                         "though earlier partitions have been lost. Note
that intra predicition"
> -                         " is still done over the partition boundary.",
      0, AV_OPT_TYPE_CONST, {.i64 = VPX_ERROR_RESILIENT_PARTITIONS}, 0, 0,
VE, "er"},
> +
> +#ifndef VPX_ERROR_RESILIENT_DEFAULT
> +#define VPX_ERROR_RESILIENT_DEFAULT 1
> +#define VPX_ERROR_RESILIENT_PARTITIONS 2
>  #endif
> -{"speed", "", offsetof(VP8Context, cpu_used), AV_OPT_TYPE_INT, {.i64 =
3}, -16, 16, VE},
> -{"quality", "", offsetof(VP8Context, deadline), AV_OPT_TYPE_INT, {.i64 =
VPX_DL_GOOD_QUALITY}, INT_MIN, INT_MAX, VE, "quality"},
> -{"vp8flags", "", offsetof(VP8Context, flags), FF_OPT_TYPE_FLAGS, {.i64 =
0}, 0, UINT_MAX, VE, "flags"},
> -{"error_resilient", "enable error resilience", 0, FF_OPT_TYPE_CONST,
{.dbl = VP8F_ERROR_RESILIENT}, INT_MIN, INT_MAX, VE, "flags"},
> -{"altref", "enable use of alternate reference frames (VP8/2-pass only)",
0, FF_OPT_TYPE_CONST, {.dbl = VP8F_AUTO_ALT_REF}, INT_MIN, INT_MAX, VE,
"flags"},
> -{"arnr_max_frames", "altref noise reduction max frame count",
offsetof(VP8Context, arnr_max_frames), AV_OPT_TYPE_INT, {.i64 = 0}, 0, 15,
VE},
> -{"arnr_strength", "altref noise reduction filter strength",
offsetof(VP8Context, arnr_strength), AV_OPT_TYPE_INT, {.i64 = 3}, 0, 6, VE},
> -{"arnr_type", "altref noise reduction filter type", offsetof(VP8Context,
arnr_type), AV_OPT_TYPE_INT, {.i64 = 3}, 1, 3, VE},
> -{"rc_lookahead", "Number of frames to look ahead for alternate reference
frame selection", offsetof(VP8Context, lag_in_frames), AV_OPT_TYPE_INT,
{.i64 = 25}, 0, 25, VE},
> -    { "crf",              "Select the quality for constant quality
mode", offsetof(VP8Context, crf), AV_OPT_TYPE_INT, {.i64 = 0}, 0, 63, VE },
> +
> +#define COMMON_OPTIONS \
> +    { "cpu-used",        "Quality/Speed ratio modifier",
OFFSET(cpu_used),        AV_OPT_TYPE_INT, {.i64 = INT_MIN}, INT_MIN,
INT_MAX, VE}, \
> +    { "auto-alt-ref",    "Enable use of alternate reference " \
> +                         "frames (2-pass only)",
OFFSET(auto_alt_ref),    AV_OPT_TYPE_INT, {.i64 = -1},      -1,      1,
  VE}, \
> +    { "lag-in-frames",   "Number of frames to look ahead for " \
> +                         "alternate reference frame selection",
 OFFSET(lag_in_frames),   AV_OPT_TYPE_INT, {.i64 = -1},      -1,
 INT_MAX, VE}, \
> +    { "arnr-maxframes",  "altref noise reduction max frame count",
OFFSET(arnr_max_frames), AV_OPT_TYPE_INT, {.i64 = -1},      -1,
 INT_MAX, VE}, \
> +    { "arnr-strength",   "altref noise reduction filter strength",
OFFSET(arnr_strength),   AV_OPT_TYPE_INT, {.i64 = -1},      -1,
 INT_MAX, VE}, \
> +    { "arnr-type",       "altref noise reduction filter type",
OFFSET(arnr_type),       AV_OPT_TYPE_INT, {.i64 = -1},      -1,
 INT_MAX, VE, "arnr_type"}, \
> +    { "backward",        NULL, 0, AV_OPT_TYPE_CONST, {.i64 = 1}, 0, 0,
VE, "arnr_type" }, \
> +    { "forward",         NULL, 0, AV_OPT_TYPE_CONST, {.i64 = 2}, 0, 0,
VE, "arnr_type" }, \
> +    { "centered",        NULL, 0, AV_OPT_TYPE_CONST, {.i64 = 3}, 0, 0,
VE, "arnr_type" }, \
> +    { "deadline",        "Time to spend encoding, in microseconds.",
OFFSET(deadline),      AV_OPT_TYPE_INT, {.i64 = VPX_DL_GOOD_QUALITY},
INT_MIN, INT_MAX, VE, "quality"}, \
> +    { "best",            NULL, 0, AV_OPT_TYPE_CONST, {.i64 =
VPX_DL_BEST_QUALITY}, 0, 0, VE, "quality"}, \
> +    { "good",            NULL, 0, AV_OPT_TYPE_CONST, {.i64 =
VPX_DL_GOOD_QUALITY}, 0, 0, VE, "quality"}, \
> +    { "realtime",        NULL, 0, AV_OPT_TYPE_CONST, {.i64 =
VPX_DL_REALTIME},     0, 0, VE, "quality"}, \
> +    { "error-resilient", "Error resilience configuration",
OFFSET(error_resilient), AV_OPT_TYPE_FLAGS, {.i64 = 0}, INT_MIN, INT_MAX,
VE, "er"}, \
> +    { "max-intra-rate",  "Maximum I-frame bitrate (pct) 0=unlimited",
 OFFSET(max_intra_rate),  AV_OPT_TYPE_INT,  {.i64 = -1}, -1,      INT_MAX,
VE}, \
> +    { "default",         "Improve resiliency against losses of whole
frames", 0, AV_OPT_TYPE_CONST, {.i64 = VPX_ERROR_RESILIENT_DEFAULT}, 0, 0,
VE, "er"}, \
> +    { "partitions",      "The frame partitions are independently
decodable " \
> +                         "by the bool decoder, meaning that partitions
can be decoded even " \
> +                         "though earlier partitions have been lost. Note
that intra predicition" \
> +                         " is still done over the partition boundary.",
      0, AV_OPT_TYPE_CONST, {.i64 = VPX_ERROR_RESILIENT_PARTITIONS}, 0, 0,
VE, "er"}, \
> +    { "crf",              "Select the quality for constant quality
mode", offsetof(VP8Context, crf), AV_OPT_TYPE_INT, {.i64 = 0}, 0, 63, VE },
\
> +
> +#define LEGACY_OPTIONS \

What's the difference between common options and legacy options, Forkness?

> +    {"speed", "", offsetof(VP8Context, cpu_used), AV_OPT_TYPE_INT, {.i64
= 3}, -16, 16, VE}, \
> +    {"quality", "", offsetof(VP8Context, deadline), AV_OPT_TYPE_INT,
{.i64 = VPX_DL_GOOD_QUALITY}, INT_MIN, INT_MAX, VE, "quality"}, \
> +    {"vp8flags", "", offsetof(VP8Context, flags), FF_OPT_TYPE_FLAGS,
{.i64 = 0}, 0, UINT_MAX, VE, "flags"}, \
> +    {"error_resilient", "enable error resilience", 0, FF_OPT_TYPE_CONST,
{.dbl = VP8F_ERROR_RESILIENT}, INT_MIN, INT_MAX, VE, "flags"}, \
> +    {"altref", "enable use of alternate reference frames (VP8/2-pass
only)", 0, FF_OPT_TYPE_CONST, {.dbl = VP8F_AUTO_ALT_REF}, INT_MIN, INT_MAX,
VE, "flags"}, \
> +    {"arnr_max_frames", "altref noise reduction max frame count",
offsetof(VP8Context, arnr_max_frames), AV_OPT_TYPE_INT, {.i64 = 0}, 0, 15,
VE}, \
> +    {"arnr_strength", "altref noise reduction filter strength",
offsetof(VP8Context, arnr_strength), AV_OPT_TYPE_INT, {.i64 = 3}, 0, 6,
VE}, \
> +    {"arnr_type", "altref noise reduction filter type",
offsetof(VP8Context, arnr_type), AV_OPT_TYPE_INT, {.i64 = 3}, 1, 3, VE}, \
> +    {"rc_lookahead", "Number of frames to look ahead for alternate
reference frame selection", offsetof(VP8Context, lag_in_frames),
AV_OPT_TYPE_INT, {.i64 = 25}, 0, 25, VE}, \
> +
> +#if CONFIG_LIBVPX_VP8_ENCODER
> +static const AVOption vp8_options[] = {
> +    COMMON_OPTIONS
> +    LEGACY_OPTIONS
>      { NULL }
>  };
> +#endif
> +
> +#if CONFIG_LIBVPX_VP9_ENCODER
> +static const AVOption vp9_options[] = {
> +    COMMON_OPTIONS
> +    LEGACY_OPTIONS
> +    { NULL }
> +};
> +#endif
> +
> +#undef COMMON_OPTIONS
> +#undef LEGACY_OPTIONS
>
>  static const AVCodecDefault defaults[] = {
>      { "qmin",             "-1" },
> @@ -773,7 +796,7 @@ static av_cold int vp8_init(AVCodecContext *avctx)
>  static const AVClass class_vp8 = {
>      .class_name = "libvpx-vp8 encoder",
>      .item_name  = av_default_item_name,
> -    .option     = options,
> +    .option     = vp8_options,
>      .version    = LIBAVUTIL_VERSION_INT,
>  };
>
> @@ -802,7 +825,7 @@ static av_cold int vp9_init(AVCodecContext *avctx)
>  static const AVClass class_vp9 = {
>      .class_name = "libvpx-vp9 encoder",
>      .item_name  = av_default_item_name,
> -    .option     = options,
> +    .option     = vp9_options,
>      .version    = LIBAVUTIL_VERSION_INT,
>  };
>
> --
> 1.8.4.1
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel


More information about the ffmpeg-devel mailing list