[FFmpeg-devel] [PATCH] lavfi/hue: fix h/H commands in case h and H are not specified as initial parameters

Clément Bœsch ubitux at gmail.com
Mon Apr 22 01:16:55 CEST 2013


On Sun, Apr 21, 2013 at 05:33:33PM +0200, Stefano Sabatini wrote:
> In filter_frame(), check for the existence of the corresponding parsed
> expression rather than on the expression, which may or may not be set,
> and release the alternative parsed expression when one of H/h is set.
> ---
>  libavfilter/vf_hue.c |   31 ++++++++++++++++++++-----------
>  1 file changed, 20 insertions(+), 11 deletions(-)
> 
> diff --git a/libavfilter/vf_hue.c b/libavfilter/vf_hue.c
> index 9b2ecd4..b91e9c1 100644
> --- a/libavfilter/vf_hue.c
> +++ b/libavfilter/vf_hue.c
> @@ -255,7 +255,7 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *inpic)
>      hue->var_values[VAR_T]   = TS2T(inpic->pts, inlink->time_base);
>      hue->var_values[VAR_PTS] = TS2D(inpic->pts);
>  
> -    if (hue->saturation_expr) {
> +    if (hue->saturation_pexpr) {
>          hue->saturation = av_expr_eval(hue->saturation_pexpr, hue->var_values, NULL);
>  
>          if (hue->saturation < SAT_MIN_VAL || hue->saturation > SAT_MAX_VAL) {
> @@ -266,10 +266,10 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *inpic)
>          }
>      }
>  
> -    if (hue->hue_deg_expr) {
> +    if (hue->hue_deg_pexpr) {
>          hue->hue_deg = av_expr_eval(hue->hue_deg_pexpr, hue->var_values, NULL);
>          hue->hue = hue->hue_deg * M_PI / 180;
> -    } else if (hue->hue_expr) {
> +    } else if (hue->hue_pexpr) {
>          hue->hue = av_expr_eval(hue->hue_pexpr, hue->var_values, NULL);
>          hue->hue_deg = hue->hue * 180 / M_PI;
>      }
> @@ -307,16 +307,25 @@ static int process_command(AVFilterContext *ctx, const char *cmd, const char *ar
>                             char *res, int res_len, int flags)
>  {
>      HueContext *hue = ctx->priv;
> +    int ret =  AVERROR(ENOSYS);
>  
> -#define SET_CMD(expr, option) do {                                 \
> -    if (!strcmp(cmd, option))                                      \
> -        return set_expr(&hue->expr##_pexpr, args, cmd, ctx);       \
> -} while (0)
> -    SET_CMD(hue_deg,    "h");
> -    SET_CMD(hue,        "H");
> -    SET_CMD(saturation, "s");
> +    if (!strcmp(cmd, "h")) {
> +        ret = set_expr(&hue->hue_deg_pexpr, args, cmd, ctx);
> +        if (ret >= 0) {
> +            av_expr_free(hue->hue_pexpr);
> +            hue->hue_pexpr = NULL;
> +        }
> +    } else if (!strcmp(cmd, "H")) {
> +        ret = set_expr(&hue->hue_pexpr, args, cmd, ctx);
> +        if (ret >= 0) {
> +            av_expr_free(hue->hue_deg_pexpr);
> +            hue->hue_deg_pexpr = NULL;
> +        }
> +    } else if (!strcmp(cmd, "s")) {
> +        ret = set_expr(&hue->saturation_pexpr, args, cmd, ctx);
> +    }
>  
> -    return AVERROR(ENOSYS);
> +    return ret;
>  }
>  

LGTM

Note: you could also av_freep() the opposite expression strings in the h/H
command case to avoid inconsistent context states and the first diff
chunks of that patch.

-- 
Clément B.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 490 bytes
Desc: not available
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20130422/84b338ad/attachment.asc>


More information about the ffmpeg-devel mailing list