diff --git a/doc/filters.texi b/doc/filters.texi index 4c85d71be3..b7f7e7d8d7 100644 --- a/doc/filters.texi +++ b/doc/filters.texi @@ -4970,13 +4970,13 @@ A description of the accepted options follows. @table @option @item luma_msize_x, lx @item chroma_msize_x, cx -Set the luma/chroma matrix horizontal size. It can be an integer +Set the luma/chroma matrix horizontal size. It must be an odd integer between 3 and 63, default value is 5. @item luma_msize_y, ly @item chroma_msize_y, cy -Set the luma/chroma matrix vertical size. It can be an integer between -3 and 63, default value is 5. +Set the luma/chroma matrix vertical size. It must be an odd integer +between 3 and 63, default value is 5. @item luma_amount, la @item chroma_amount, ca diff --git a/libavfilter/version.h b/libavfilter/version.h index dbcf76e0bc..8747e0fab4 100644 --- a/libavfilter/version.h +++ b/libavfilter/version.h @@ -30,7 +30,7 @@ #define LIBAVFILTER_VERSION_MAJOR 3 #define LIBAVFILTER_VERSION_MINOR 38 -#define LIBAVFILTER_VERSION_MICRO 100 +#define LIBAVFILTER_VERSION_MICRO 101 #define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \ LIBAVFILTER_VERSION_MINOR, \ diff --git a/libavfilter/vf_unsharp.c b/libavfilter/vf_unsharp.c index 2170d651e7..53de99f0df 100644 --- a/libavfilter/vf_unsharp.c +++ b/libavfilter/vf_unsharp.c @@ -195,11 +195,18 @@ static int query_formats(AVFilterContext *ctx) return 0; } -static void init_filter_param(AVFilterContext *ctx, FilterParam *fp, const char *effect_type, int width) +static int init_filter_param(AVFilterContext *ctx, FilterParam *fp, const char *effect_type, int width) { int z; const char *effect; + if (!(fp->msize_x & fp->msize_y & 1)) { + av_log(ctx, AV_LOG_ERROR, + "Invalid even size for %s matrix size %dx%d\n", + effect_type, fp->msize_x, fp->msize_y); + return AVERROR(EINVAL); + } + effect = fp->amount == 0 ? "none" : fp->amount < 0 ? "blur" : "sharpen"; av_log(ctx, AV_LOG_VERBOSE, "effect:%s type:%s msize_x:%d msize_y:%d amount:%0.2f\n", @@ -207,18 +214,25 @@ static void init_filter_param(AVFilterContext *ctx, FilterParam *fp, const char for (z = 0; z < 2 * fp->steps_y; z++) fp->sc[z] = av_malloc(sizeof(*(fp->sc[z])) * (width + 2 * fp->steps_x)); + + return 0; } static int config_props(AVFilterLink *link) { UnsharpContext *unsharp = link->dst->priv; const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(link->format); + int ret; unsharp->hsub = desc->log2_chroma_w; unsharp->vsub = desc->log2_chroma_h; - init_filter_param(link->dst, &unsharp->luma, "luma", link->w); - init_filter_param(link->dst, &unsharp->chroma, "chroma", SHIFTUP(link->w, unsharp->hsub)); + ret = init_filter_param(link->dst, &unsharp->luma, "luma", link->w); + if (ret < 0) + return ret; + ret = init_filter_param(link->dst, &unsharp->chroma, "chroma", SHIFTUP(link->w, unsharp->hsub)); + if (ret < 0) + return ret; return 0; }