From 191b77eb01addf008440531f8cab193b3c2c5a15 Mon Sep 17 00:00:00 2001 From: Jérémy Tran Date: Thu, 16 Aug 2012 09:15:58 +0200 Subject: lavfi/hue: add named options support Old syntax has been kept for compatibility reasons. Signed-off-by: Stefano Sabatini --- libavfilter/version.h | 2 +- libavfilter/vf_hue.c | 63 +++++++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 57 insertions(+), 8 deletions(-) (limited to 'libavfilter') diff --git a/libavfilter/version.h b/libavfilter/version.h index 85a839fe9e..b2ef3112d5 100644 --- a/libavfilter/version.h +++ b/libavfilter/version.h @@ -30,7 +30,7 @@ #define LIBAVFILTER_VERSION_MAJOR 3 #define LIBAVFILTER_VERSION_MINOR 9 -#define LIBAVFILTER_VERSION_MICRO 101 +#define LIBAVFILTER_VERSION_MICRO 102 #define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \ LIBAVFILTER_VERSION_MINOR, \ diff --git a/libavfilter/vf_hue.c b/libavfilter/vf_hue.c index 16fa4f4a7f..0bc4d92c34 100644 --- a/libavfilter/vf_hue.c +++ b/libavfilter/vf_hue.c @@ -25,7 +25,9 @@ * Ported from MPlayer libmpcodecs/vf_hue.c. */ +#include #include "libavutil/imgutils.h" +#include "libavutil/opt.h" #include "libavutil/pixdesc.h" #include "avfilter.h" @@ -33,8 +35,13 @@ #include "internal.h" #include "video.h" +#define HUE_DEFAULT_VAL 0 +#define SAT_DEFAULT_VAL 1 + typedef struct { - float hue; + const AVClass *class; + float hue_deg; /* hue expressed in degrees */ + float hue; /* hue expressed in radians */ float saturation; int hsub; int vsub; @@ -42,13 +49,44 @@ typedef struct { int32_t hue_cos; } HueContext; +#define OFFSET(x) offsetof(HueContext, x) +static const AVOption hue_options[] = { + { "h", "set the hue angle degrees", OFFSET(hue_deg), AV_OPT_TYPE_FLOAT, + { -FLT_MAX }, -FLT_MAX, FLT_MAX, AV_OPT_FLAG_VIDEO_PARAM }, + { "H", "set the hue angle radians", OFFSET(hue), AV_OPT_TYPE_FLOAT, + { -FLT_MAX }, -FLT_MAX, FLT_MAX, AV_OPT_FLAG_VIDEO_PARAM }, + { "s", "set the saturation value", OFFSET(saturation), AV_OPT_TYPE_FLOAT, + { SAT_DEFAULT_VAL }, -10, 10, AV_OPT_FLAG_VIDEO_PARAM }, + { NULL } +}; + +AVFILTER_DEFINE_CLASS(hue); + static av_cold int init(AVFilterContext *ctx, const char *args) { HueContext *hue = ctx->priv; - float h = 0, s = 1; - int n; + float h = HUE_DEFAULT_VAL, s = SAT_DEFAULT_VAL; + int n, ret; char c1 = 0, c2 = 0; + char *equal; + + hue->class = &hue_class; + /* named options syntax */ + if (equal = strchr(args, '=')) { + av_opt_set_defaults(hue); + if ((ret = av_set_options_string(hue, args, "=", ":")) < 0) + return ret; + if (hue->hue != -FLT_MAX && hue->hue_deg != -FLT_MAX) { + av_log(ctx, AV_LOG_ERROR, + "H and h options are incompatible and cannot be specified " + "at the same time\n"); + return AVERROR(EINVAL); + } + if (hue->hue == -FLT_MAX) + hue->hue = HUE_DEFAULT_VAL; + /* compatibility syntax */ + } else { if (args) { n = sscanf(args, "%f%c%f%c", &h, &c1, &s, &c2); if (n != 0 && n != 1 && (n != 3 || c1 != ':')) { @@ -57,7 +95,6 @@ static av_cold int init(AVFilterContext *ctx, const char *args) "must be in the form 'hue[:saturation]'\n", args); return AVERROR(EINVAL); } - } if (s < -10 || s > 10) { av_log(ctx, AV_LOG_ERROR, @@ -65,14 +102,25 @@ static av_cold int init(AVFilterContext *ctx, const char *args) "must be included between range -10 and +10\n", s); return AVERROR(EINVAL); } - - /* Convert angle from degree to radian */ - hue->hue = h * M_PI / 180; + } + hue->hue_deg = h; hue->saturation = s; + } + + if (hue->hue_deg != -FLT_MAX) + /* Convert angle from degrees to radians */ + hue->hue = hue->hue_deg * M_PI / 180; return 0; } +static av_cold void uninit(AVFilterContext *ctx) +{ + HueContext *hue = ctx->priv; + + av_opt_free(hue); +} + static int query_formats(AVFilterContext *ctx) { static const enum PixelFormat pix_fmts[] = { @@ -180,6 +228,7 @@ AVFilter avfilter_vf_hue = { .priv_size = sizeof(HueContext), .init = init, + .uninit = uninit, .query_formats = query_formats, .inputs = (const AVFilterPad[]) { -- cgit v1.2.3