[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