| @@ -66,36 +66,13 @@ typedef struct FilterParam { · 65 unmodified lines |
| 66 | | 66 | |
| 67 | typedef struct { | 67 | typedef struct { |
| 68 | const AVClass *class; | 68 | const AVClass *class; |
| | 69 | int lmsize_x, lmsize_y, cmsize_x, cmsize_y; |
| | 70 | float lamount, camount; |
| 69 | FilterParam luma; ///< luma parameters (width, height, amount) | 71 | FilterParam luma; ///< luma parameters (width, height, amount) |
| 70 | FilterParam chroma; ///< chroma parameters (width, height, amount) | 72 | FilterParam chroma; ///< chroma parameters (width, height, amount) |
| 71 | int hsub, vsub; | 73 | int hsub, vsub; |
| 72 | int luma_msize_x, luma_msize_y, chroma_msize_x, chroma_msize_y; | | |
| 73 | double luma_amount, chroma_amount; | | |
| 74 | } UnsharpContext; | 74 | } UnsharpContext; |
| 75 | | 75 | |
| 76 | #define OFFSET(x) offsetof(UnsharpContext, x) | | |
| 77 | #define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM | | |
| 78 | | | |
| 79 | static const AVOption unsharp_options[] = { | | |
| 80 | { "luma_msize_x", "set luma matrix x size", OFFSET(luma_msize_x), AV_OPT_TYPE_INT, {.i64=5}, 3, 63, .flags=FLAGS }, | | |
| 81 | { "lx", "set luma matrix x size", OFFSET(luma_msize_x), AV_OPT_TYPE_INT, {.i64=5}, 3, 63, .flags=FLAGS }, | | |
| 82 | { "luma_msize_y", "set luma matrix y size", OFFSET(luma_msize_y), AV_OPT_TYPE_INT, {.i64=5}, 3, 63, .flags=FLAGS }, | | |
| 83 | { "ly", "set luma matrix y size", OFFSET(luma_msize_y), AV_OPT_TYPE_INT, {.i64=5}, 3, 63, .flags=FLAGS }, | | |
| 84 | { "luma_amount", "set luma effect amount", OFFSET(luma_amount), AV_OPT_TYPE_DOUBLE, {.dbl=1.0}, -DBL_MAX, DBL_MAX, .flags=FLAGS }, | | |
| 85 | { "la", "set luma effect amount", OFFSET(luma_amount), AV_OPT_TYPE_DOUBLE, {.dbl=1.0}, -DBL_MAX, DBL_MAX, .flags=FLAGS }, | | |
| 86 | | | |
| 87 | { "chroma_msize_x", "set chroma matrix x size", OFFSET(chroma_msize_x), AV_OPT_TYPE_INT, {.i64=5}, 3, 63, .flags=FLAGS }, | | |
| 88 | { "cx", "set chroma matrix x size", OFFSET(chroma_msize_x), AV_OPT_TYPE_INT, {.i64=5}, 3, 63, .flags=FLAGS }, | | |
| 89 | { "chroma_msize_y", "set chroma matrix y size", OFFSET(chroma_msize_y), AV_OPT_TYPE_INT, {.i64=5}, 3, 63, .flags=FLAGS }, | | |
| 90 | { "cy" , "set chroma matrix y size", OFFSET(chroma_msize_y), AV_OPT_TYPE_INT, {.i64=5}, 3, 63, .flags=FLAGS }, | | |
| 91 | { "chroma_amount", "set chroma effect strenght", OFFSET(chroma_amount), AV_OPT_TYPE_DOUBLE, {.dbl=0.0}, -DBL_MAX, DBL_MAX, .flags=FLAGS }, | | |
| 92 | { "ca", "set chroma effect strenght", OFFSET(chroma_amount), AV_OPT_TYPE_DOUBLE, {.dbl=0.0}, -DBL_MAX, DBL_MAX, .flags=FLAGS }, | | |
| 93 | | | |
| 94 | { NULL } | | |
| 95 | }; | | |
| 96 | | | |
| 97 | AVFILTER_DEFINE_CLASS(unsharp); | | |
| 98 | | | |
| 99 | static void apply_unsharp( uint8_t *dst, int dst_stride, | 76 | static void apply_unsharp( uint8_t *dst, int dst_stride, |
| 100 | const uint8_t *src, int src_stride, | 77 | const uint8_t *src, int src_stride, |
| 101 | int width, int height, FilterParam *fp) | 78 | int width, int height, FilterParam *fp) |
| @@ -154,7 +131,7 @@ static void apply_unsharp( uint8_t *dst, int dst_stride, · 52 unmodified lines |
| 154 | } | 131 | } |
| 155 | } | 132 | } |
| 156 | | 133 | |
| 157 | static void set_filter_param(FilterParam *fp, int msize_x, int msize_y, double amount) | 134 | static void set_filter_param(FilterParam *fp, int msize_x, int msize_y, float amount) |
| 158 | { | 135 | { |
| 159 | fp->msize_x = msize_x; | 136 | fp->msize_x = msize_x; |
| 160 | fp->msize_y = msize_y; | 137 | fp->msize_y = msize_y; |
| @@ -170,8 +147,9 @@ static av_cold int init(AVFilterContext *ctx, const char *args) · 9 unmodified lines |
| 170 | { | 147 | { |
| 171 | UnsharpContext *unsharp = ctx->priv; | 148 | UnsharpContext *unsharp = ctx->priv; |
| 172 | | 149 | |
| 173 | set_filter_param(&unsharp->luma, unsharp->luma_msize_x, unsharp->luma_msize_y, unsharp->luma_amount); | 150 | |
| 174 | set_filter_param(&unsharp->chroma, unsharp->chroma_msize_x, unsharp->chroma_msize_y, unsharp->chroma_amount); | 151 | set_filter_param(&unsharp->luma, unsharp->lmsize_x, unsharp->lmsize_y, unsharp->lamount); |
| | 152 | set_filter_param(&unsharp->chroma, unsharp->cmsize_x, unsharp->cmsize_y, unsharp->camount); |
| 175 | | 153 | |
| 176 | return 0; | 154 | return 0; |
| 177 | } | 155 | } |
| @@ -269,6 +247,28 @@ static int filter_frame(AVFilterLink *link, AVFrame *in) · 91 unmodified lines |
| 269 | return ff_filter_frame(outlink, out); | 247 | return ff_filter_frame(outlink, out); |
| 270 | } | 248 | } |
| 271 | | 249 | |
| | 250 | #define OFFSET(x) offsetof(UnsharpContext, x) |
| | 251 | #define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM |
| | 252 | #define MIN_SIZE 3 |
| | 253 | #define MAX_SIZE 63 |
| | 254 | static const AVOption unsharp_options[] = { |
| | 255 | { "luma_msize_x", "luma matrix horizontal size", OFFSET(lmsize_x), AV_OPT_TYPE_INT, { .i64 = 5 }, MIN_SIZE, MAX_SIZE, FLAGS }, |
| | 256 | { "lx", "luma matrix horizontal size", OFFSET(lmsize_x), AV_OPT_TYPE_INT, { .i64 = 5 }, MIN_SIZE, MAX_SIZE, FLAGS }, |
| | 257 | { "luma_msize_y", "luma matrix vertical size", OFFSET(lmsize_y), AV_OPT_TYPE_INT, { .i64 = 5 }, MIN_SIZE, MAX_SIZE, FLAGS }, |
| | 258 | { "ly", "luma matrix vertical size", OFFSET(lmsize_y), AV_OPT_TYPE_INT, { .i64 = 5 }, MIN_SIZE, MAX_SIZE, FLAGS }, |
| | 259 | { "luma_amount", "luma effect strength", OFFSET(lamount), AV_OPT_TYPE_FLOAT, { .dbl = 1 }, -2, 5, FLAGS }, |
| | 260 | { "la", "luma effect strength", OFFSET(lamount), AV_OPT_TYPE_FLOAT, { .dbl = 1 }, -2, 5, FLAGS }, |
| | 261 | { "chroma_msize_x", "chroma matrix horizontal size", OFFSET(cmsize_x), AV_OPT_TYPE_INT, { .i64 = 5 }, MIN_SIZE, MAX_SIZE, FLAGS }, |
| | 262 | { "cx", "chroma matrix horizontal size", OFFSET(cmsize_x), AV_OPT_TYPE_INT, { .i64 = 5 }, MIN_SIZE, MAX_SIZE, FLAGS }, |
| | 263 | { "chroma_msize_y", "chroma matrix vertical size", OFFSET(cmsize_y), AV_OPT_TYPE_INT, { .i64 = 5 }, MIN_SIZE, MAX_SIZE, FLAGS }, |
| | 264 | { "cy", "chroma matrix vertical size", OFFSET(cmsize_y), AV_OPT_TYPE_INT, { .i64 = 5 }, MIN_SIZE, MAX_SIZE, FLAGS }, |
| | 265 | { "chroma_amount", "chroma effect strength", OFFSET(camount), AV_OPT_TYPE_FLOAT, { .dbl = 0 }, -2, 5, FLAGS }, |
| | 266 | { "ca", "chroma effect strength", OFFSET(camount), AV_OPT_TYPE_FLOAT, { .dbl = 0 }, -2, 5, FLAGS }, |
| | 267 | { NULL }, |
| | 268 | }; |
| | 269 | |
| | 270 | AVFILTER_DEFINE_CLASS(unsharp); |
| | 271 | |
| 272 | static const AVFilterPad avfilter_vf_unsharp_inputs[] = { | 272 | static const AVFilterPad avfilter_vf_unsharp_inputs[] = { |
| 273 | { | 273 | { |
| 274 | .name = "default", | 274 | .name = "default", |
| @@ -287,17 +287,12 @@ static const AVFilterPad avfilter_vf_unsharp_outputs[] = { · 12 unmodified lines |
| 287 | { NULL } | 287 | { NULL } |
| 288 | }; | 288 | }; |
| 289 | | 289 | |
| 290 | static const char *const shorthand[] = { | | |
| 291 | "luma_msize_x", "luma_msize_y", "luma_amount", | | |
| 292 | "chroma_msize_x", "chroma_msize_y", "chroma_amount", | | |
| 293 | NULL | | |
| 294 | }; | | |
| 295 | | | |
| 296 | AVFilter avfilter_vf_unsharp = { | 290 | AVFilter avfilter_vf_unsharp = { |
| 297 | .name = "unsharp", | 291 | .name = "unsharp", |
| 298 | .description = NULL_IF_CONFIG_SMALL("Sharpen or blur the input video."), | 292 | .description = NULL_IF_CONFIG_SMALL("Sharpen or blur the input video."), |
| 299 | | 293 | |
| 300 | .priv_size = sizeof(UnsharpContext), | 294 | .priv_size = sizeof(UnsharpContext), |
| | 295 | .priv_class = &unsharp_class, |
| 301 | | 296 | |
| 302 | .init = init, | 297 | .init = init, |
| 303 | .uninit = uninit, | 298 | .uninit = uninit, |
| @@ -306,7 +301,4 @@ AVFilter avfilter_vf_unsharp = { · 2 unmodified lines |
| 306 | .inputs = avfilter_vf_unsharp_inputs, | 301 | .inputs = avfilter_vf_unsharp_inputs, |
| 307 | | 302 | |
| 308 | .outputs = avfilter_vf_unsharp_outputs, | 303 | .outputs = avfilter_vf_unsharp_outputs, |
| 309 | | | |
| 310 | .priv_class = &unsharp_class, | | |
| 311 | .shorthand = shorthand, | | |
| 312 | }; | 304 | }; |