summaryrefslogtreecommitdiff
path: root/libavfilter/vf_hue.c
diff options
context:
space:
mode:
authorStefano Sabatini <stefasab@gmail.com>2012-09-23 00:26:30 +0200
committerStefano Sabatini <stefasab@gmail.com>2012-09-23 00:46:33 +0200
commit7fe1ecefe17b0146d49cd0003f80266a481d1faa (patch)
tree1a66e9e1eb53df84e409801ec27f63dfb5b093ff /libavfilter/vf_hue.c
parenteb949544caab31116743fbc63ba643916d84cedf (diff)
lavfi/hue: simplify/fix setting logic in set_options()
Parse expression only when a new value is explicitly specified. In particular, avoid double free in case an old expression value is cached, it is set in the context, it is freed as the old value, and finally the pointer stored in the context is freed again when the filter is released.
Diffstat (limited to 'libavfilter/vf_hue.c')
-rw-r--r--libavfilter/vf_hue.c27
1 files changed, 9 insertions, 18 deletions
diff --git a/libavfilter/vf_hue.c b/libavfilter/vf_hue.c
index e02a216b90..3048a596ca 100644
--- a/libavfilter/vf_hue.c
+++ b/libavfilter/vf_hue.c
@@ -107,8 +107,8 @@ static inline void compute_sin_and_cos(HueContext *hue)
hue->hue_cos = rint(cos(hue->hue) * (1 << 16) * hue->saturation);
}
-#define PARSE_EXPRESSION(attr, name) \
- do { \
+#define SET_EXPRESSION(attr, name) do { \
+ if (hue->attr##_expr) { \
if ((ret = av_expr_parse(&hue->attr##_pexpr, hue->attr##_expr, var_names, \
NULL, NULL, NULL, NULL, 0, ctx)) < 0) { \
av_log(ctx, AV_LOG_ERROR, \
@@ -122,7 +122,10 @@ static inline void compute_sin_and_cos(HueContext *hue)
av_expr_free(old_##attr##_pexpr); \
old_##attr##_pexpr = NULL; \
} \
- } while (0)
+ } else { \
+ hue->attr##_expr = old_##attr##_expr; \
+ } \
+} while (0)
static inline int set_options(AVFilterContext *ctx, const char *args)
{
@@ -159,21 +162,9 @@ static inline int set_options(AVFilterContext *ctx, const char *args)
return AVERROR(EINVAL);
}
- /*
- * if both 'H' and 'h' options have not been specified, restore the
- * old values
- */
- if (!hue->hue_expr && !hue->hue_deg_expr) {
- hue->hue_expr = old_hue_expr;
- hue->hue_deg_expr = old_hue_deg_expr;
- }
-
- if (hue->hue_deg_expr)
- PARSE_EXPRESSION(hue_deg, h);
- if (hue->hue_expr)
- PARSE_EXPRESSION(hue, H);
- if (hue->saturation_expr)
- PARSE_EXPRESSION(saturation, s);
+ SET_EXPRESSION(hue_deg, h);
+ SET_EXPRESSION(hue, H);
+ SET_EXPRESSION(saturation, s);
hue->flat_syntax = 0;