lavfi/unsharp: add check on matrix x/y size values oddity

pull/8/merge
Stefano Sabatini 12 years ago
parent b8bb661dab
commit ef4c71e8f8
  1. 6
      doc/filters.texi
  2. 2
      libavfilter/version.h
  3. 20
      libavfilter/vf_unsharp.c

@ -4970,13 +4970,13 @@ A description of the accepted options follows.
@table @option @table @option
@item luma_msize_x, lx @item luma_msize_x, lx
@item chroma_msize_x, cx @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. between 3 and 63, default value is 5.
@item luma_msize_y, ly @item luma_msize_y, ly
@item chroma_msize_y, cy @item chroma_msize_y, cy
Set the luma/chroma matrix vertical size. It can be an integer between Set the luma/chroma matrix vertical size. It must be an odd integer
3 and 63, default value is 5. between 3 and 63, default value is 5.
@item luma_amount, la @item luma_amount, la
@item chroma_amount, ca @item chroma_amount, ca

@ -30,7 +30,7 @@
#define LIBAVFILTER_VERSION_MAJOR 3 #define LIBAVFILTER_VERSION_MAJOR 3
#define LIBAVFILTER_VERSION_MINOR 38 #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, \ #define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \
LIBAVFILTER_VERSION_MINOR, \ LIBAVFILTER_VERSION_MINOR, \

@ -195,11 +195,18 @@ static int query_formats(AVFilterContext *ctx)
return 0; 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; int z;
const char *effect; 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"; 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", 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++) for (z = 0; z < 2 * fp->steps_y; z++)
fp->sc[z] = av_malloc(sizeof(*(fp->sc[z])) * (width + 2 * fp->steps_x)); fp->sc[z] = av_malloc(sizeof(*(fp->sc[z])) * (width + 2 * fp->steps_x));
return 0;
} }
static int config_props(AVFilterLink *link) static int config_props(AVFilterLink *link)
{ {
UnsharpContext *unsharp = link->dst->priv; UnsharpContext *unsharp = link->dst->priv;
const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(link->format); const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(link->format);
int ret;
unsharp->hsub = desc->log2_chroma_w; unsharp->hsub = desc->log2_chroma_w;
unsharp->vsub = desc->log2_chroma_h; unsharp->vsub = desc->log2_chroma_h;
init_filter_param(link->dst, &unsharp->luma, "luma", link->w); ret = init_filter_param(link->dst, &unsharp->luma, "luma", link->w);
init_filter_param(link->dst, &unsharp->chroma, "chroma", SHIFTUP(link->w, unsharp->hsub)); 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; return 0;
} }

Loading…
Cancel
Save