[FFmpeg-devel] [PATCH] vf_hue: add named options support

Stefano Sabatini stefasab at gmail.com
Tue Aug 14 12:57:31 CEST 2012


On date Tuesday 2012-08-14 11:13:22 +0200, Jérémy Tran encoded:
> Old syntax has been kept for compatibility reasons.
> ---
>  doc/filters.texi     | 17 ++++++++----
>  libavfilter/vf_hue.c | 73 ++++++++++++++++++++++++++++++++++++++++------------
>  2 files changed, 68 insertions(+), 22 deletions(-)
> 
> diff --git a/doc/filters.texi b/doc/filters.texi
> index 763085c..44e8344 100644
> --- a/doc/filters.texi
> +++ b/doc/filters.texi
> @@ -2191,12 +2191,19 @@ a float number which specifies chroma temporal strength, defaults to
>  
>  Modify the hue and/or the saturation of the input.
>  
> -This filter accepts the optional parameters: @var{hue}:@var{saturation}.
> +This filter accepts the optional parameters:
>  
> - at var{hue} must be a float number that specifies the hue angle as a
> -number of degrees, and defaults to 0.0.
> - at var{saturation} must be a float number that specifies the saturation
> -in the [-10,10] range, and defaults to 1.0.
> + at table @option
> + at item h
> +a float number that specifies the hue angle as a
> +number of degrees, and defaults to 0.0
> + at item H
> +a float number that specifies the hue angle as a
> +number of radians, and defaults to 0.0
> + at item s
> +a float number that specifies the saturation
> +in the [-10,10] range, and defaults to 1.0
> + at end table

Uhm docs should mention that the filter supports both syntaxes, and
possibly provide examples with both of them.

>  @section idet
>  
> diff --git a/libavfilter/vf_hue.c b/libavfilter/vf_hue.c
> index 16fa4f4..e2a404f 100644
> --- a/libavfilter/vf_hue.c
> +++ b/libavfilter/vf_hue.c
> @@ -25,7 +25,10 @@
>   * Ported from MPlayer libmpcodecs/vf_hue.c.
>   */
>  
> +#include <float.h>
> +#include "libavutil/eval.h"
>  #include "libavutil/imgutils.h"
> +#include "libavutil/opt.h"
>  #include "libavutil/pixdesc.h"
>  
>  #include "avfilter.h"
> @@ -34,7 +37,9 @@
>  #include "video.h"
>  
>  typedef struct {
> +    const    AVClass *class;
>      float    hue;

> +    float    hrad; /* hue expr in radian */

expressed?

>      float    saturation;
>      int      hsub;
>      int      vsub;
> @@ -42,37 +47,69 @@ typedef struct {
>      int32_t hue_cos;
>  } HueContext;
>  
> +#define OFFSET(x) offsetof(HueContext, x)
> +static const AVOption hue_options[] = {
> +    { "h", NULL, OFFSET(hue), AV_OPT_TYPE_FLOAT, { 0 }, -FLT_MAX, FLT_MAX, AV_OPT_FLAG_VIDEO_PARAM },
> +    { "H", NULL, OFFSET(hrad), AV_OPT_TYPE_FLOAT, { 0 }, -FLT_MAX, FLT_MAX, AV_OPT_FLAG_VIDEO_PARAM },
> +    { "s", NULL, OFFSET(saturation), AV_OPT_TYPE_FLOAT, { 1 }, -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;
>      char c1 = 0, c2 = 0;
> -
> -    if (args) {
> -        n = sscanf(args, "%f%c%f%c", &h, &c1, &s, &c2);
> -        if (n != 0 && n != 1 && (n != 3 || c1 != ':')) {
> -            av_log(ctx, AV_LOG_ERROR,
> -                   "Invalid syntax for argument '%s': "
> -                   "must be in the form 'hue[:saturation]'\n", args);
> -            return AVERROR(EINVAL);
> +    char *equal;
> +
> +    hue->class = &hue_class;
> +
> +    /* named options syntax */
> +    if (equal = strchr(args, '=')) {
> +        av_opt_set_defaults(hue);
> +        av_set_options_string(hue, args, "=", ":");
> +    /* compatibility syntax */

> +    } else {
> +        if (args) {
> +            n = sscanf(args, "%f%c%f%c", &h, &c1, &s, &c2);
> +            if (n != 0 && n != 1 && (n != 3 || c1 != ':')) {
> +                av_log(ctx, AV_LOG_ERROR,
> +                       "Invalid syntax for argument '%s': "
> +                       "must be in the form 'hue[:saturation]'\n", args);
> +                return AVERROR(EINVAL);
> +            }
> +            if (s < -10 || s > 10) {
> +                av_log(ctx, AV_LOG_ERROR,
> +                       "Invalid value for saturation %0.1f: "
> +                       "must be included between range -10 and +10\n", s);
> +                return AVERROR(EINVAL);
> +            }

Please don't reindent old code, it should simplify the patch (reindent
can be applied as a separate cosmetics commit).

>          }
> +        hue->hue = h;
> +        hue->saturation = s;
>      }
>  
> -    if (s < -10 || s > 10) {
> -        av_log(ctx, AV_LOG_ERROR,
> -               "Invalid value for saturation %0.1f: "
> -               "must be included between range -10 and +10\n", s);
> -        return AVERROR(EINVAL);

> +    /* radian has priority on degree */
> +    if (hue->hrad) {
> +        hue->hue = hue->hrad;
> +    } else {
> +        /* Convert angle from degree to radian */
> +        hue->hue *= M_PI / 180;

For avoiding confusion I'd rather rename hue -> hue_deg

   if (!hue->hue)
       hue->hue = hue->hue_deg * M_PI / 180;

while hue is expressed by default in radians.

[...]

Looks good otherwise.
-- 
FFmpeg = Fanciful & Fantastic Merciless Perfectionist Exploitable Generator


More information about the ffmpeg-devel mailing list