Message ID | 1571908692-30876-1-git-send-email-leozhang@qiyi.com |
---|---|
State | Superseded |
Headers | show |
ping leozhang <leozhang@qiyi.com> 于2019年10月24日周四 下午5:18写道: > > Reviewed-by: Paul B Mahol <onemda@gmail.com> > Reviewed-by: Jun Zhao <mypopy@gmail.com> > Signed-off-by: leozhang <leozhang@qiyi.com> > --- > libavfilter/vf_bilateral.c | 57 ++++++++++++++++++++++++++++++++++------------ > 1 file changed, 43 insertions(+), 14 deletions(-) > > diff --git a/libavfilter/vf_bilateral.c b/libavfilter/vf_bilateral.c > index 3c9d800..4d7bf68 100644 > --- a/libavfilter/vf_bilateral.c > +++ b/libavfilter/vf_bilateral.c > @@ -29,6 +29,8 @@ > #include "internal.h" > #include "video.h" > > +#include <float.h> > + > typedef struct BilateralContext { > const AVClass *class; > > @@ -54,7 +56,7 @@ typedef struct BilateralContext { > } BilateralContext; > > #define OFFSET(x) offsetof(BilateralContext, x) > -#define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM > +#define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_RUNTIME_PARAM > > static const AVOption bilateral_options[] = { > { "sigmaS", "set spatial sigma", OFFSET(sigmaS), AV_OPT_TYPE_FLOAT, {.dbl=0.1}, 0.0, 10, FLAGS }, > @@ -91,19 +93,27 @@ static int query_formats(AVFilterContext *ctx) > return ff_set_common_formats(ctx, ff_make_format_list(pix_fmts)); > } > > -static int config_input(AVFilterLink *inlink) > +static int init_lut(BilateralContext *s) > { > - BilateralContext *s = inlink->dst->priv; > - const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(inlink->format); > float inv_sigma_range; > > - s->depth = desc->comp[0].depth; > inv_sigma_range = 1.0f / (s->sigmaR * ((1 << s->depth) - 1)); > > //compute a lookup table > for (int i = 0; i < (1 << s->depth); i++) > s->range_table[i] = expf(-i * inv_sigma_range); > > + return 0; > +} > + > +static int config_input(AVFilterLink *inlink) > +{ > + BilateralContext *s = inlink->dst->priv; > + const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(inlink->format); > + > + s->depth = desc->comp[0].depth; > + init_lut(s); > + > s->planewidth[1] = s->planewidth[2] = AV_CEIL_RSHIFT(inlink->w, desc->log2_chroma_w); > s->planewidth[0] = s->planewidth[3] = inlink->w; > s->planeheight[1] = s->planeheight[2] = AV_CEIL_RSHIFT(inlink->h, desc->log2_chroma_h); > @@ -325,6 +335,24 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in) > return ff_filter_frame(outlink, out); > } > > +static int process_command(AVFilterContext *ctx, const char *cmd, const char *args, > + char *res, int res_len, int flags) > +{ > + BilateralContext *s = ctx->priv; > + int ret; > + float old_sigmaR = s->sigmaR; > + > + if ((ret = ff_filter_process_command(ctx, cmd, args, res, res_len, flags)) < 0) { > + return ret; > + } > + > + if (fabs(old_sigmaR - s->sigmaR) > FLT_EPSILON && (ret = init_lut(s)) < 0) { > + s->sigmaR = old_sigmaR; > + } > + > + return ret; > +} > + > static av_cold void uninit(AVFilterContext *ctx) > { > BilateralContext *s = ctx->priv; > @@ -358,13 +386,14 @@ static const AVFilterPad bilateral_outputs[] = { > }; > > AVFilter ff_vf_bilateral = { > - .name = "bilateral", > - .description = NULL_IF_CONFIG_SMALL("Apply Bilateral filter."), > - .priv_size = sizeof(BilateralContext), > - .priv_class = &bilateral_class, > - .uninit = uninit, > - .query_formats = query_formats, > - .inputs = bilateral_inputs, > - .outputs = bilateral_outputs, > - .flags = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC, > + .name = "bilateral", > + .description = NULL_IF_CONFIG_SMALL("Apply Bilateral filter."), > + .priv_size = sizeof(BilateralContext), > + .priv_class = &bilateral_class, > + .uninit = uninit, > + .query_formats = query_formats, > + .inputs = bilateral_inputs, > + .outputs = bilateral_outputs, > + .flags = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC, > + .process_command = process_command, > }; > -- > 1.8.3.1 > > _______________________________________________ > ffmpeg-devel mailing list > ffmpeg-devel@ffmpeg.org > https://ffmpeg.org/mailman/listinfo/ffmpeg-devel > > To unsubscribe, visit link above, or email > ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
Good weekend. Is it ok or any more suggestions? Tao Zhang <nowerzt@gmail.com> 于2019年10月28日周一 下午2:53写道: > > ping > > leozhang <leozhang@qiyi.com> 于2019年10月24日周四 下午5:18写道: > > > > Reviewed-by: Paul B Mahol <onemda@gmail.com> > > Reviewed-by: Jun Zhao <mypopy@gmail.com> > > Signed-off-by: leozhang <leozhang@qiyi.com> > > --- > > libavfilter/vf_bilateral.c | 57 ++++++++++++++++++++++++++++++++++------------ > > 1 file changed, 43 insertions(+), 14 deletions(-) > > > > diff --git a/libavfilter/vf_bilateral.c b/libavfilter/vf_bilateral.c > > index 3c9d800..4d7bf68 100644 > > --- a/libavfilter/vf_bilateral.c > > +++ b/libavfilter/vf_bilateral.c > > @@ -29,6 +29,8 @@ > > #include "internal.h" > > #include "video.h" > > > > +#include <float.h> > > + > > typedef struct BilateralContext { > > const AVClass *class; > > > > @@ -54,7 +56,7 @@ typedef struct BilateralContext { > > } BilateralContext; > > > > #define OFFSET(x) offsetof(BilateralContext, x) > > -#define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM > > +#define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_RUNTIME_PARAM > > > > static const AVOption bilateral_options[] = { > > { "sigmaS", "set spatial sigma", OFFSET(sigmaS), AV_OPT_TYPE_FLOAT, {.dbl=0.1}, 0.0, 10, FLAGS }, > > @@ -91,19 +93,27 @@ static int query_formats(AVFilterContext *ctx) > > return ff_set_common_formats(ctx, ff_make_format_list(pix_fmts)); > > } > > > > -static int config_input(AVFilterLink *inlink) > > +static int init_lut(BilateralContext *s) > > { > > - BilateralContext *s = inlink->dst->priv; > > - const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(inlink->format); > > float inv_sigma_range; > > > > - s->depth = desc->comp[0].depth; > > inv_sigma_range = 1.0f / (s->sigmaR * ((1 << s->depth) - 1)); > > > > //compute a lookup table > > for (int i = 0; i < (1 << s->depth); i++) > > s->range_table[i] = expf(-i * inv_sigma_range); > > > > + return 0; > > +} > > + > > +static int config_input(AVFilterLink *inlink) > > +{ > > + BilateralContext *s = inlink->dst->priv; > > + const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(inlink->format); > > + > > + s->depth = desc->comp[0].depth; > > + init_lut(s); > > + > > s->planewidth[1] = s->planewidth[2] = AV_CEIL_RSHIFT(inlink->w, desc->log2_chroma_w); > > s->planewidth[0] = s->planewidth[3] = inlink->w; > > s->planeheight[1] = s->planeheight[2] = AV_CEIL_RSHIFT(inlink->h, desc->log2_chroma_h); > > @@ -325,6 +335,24 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in) > > return ff_filter_frame(outlink, out); > > } > > > > +static int process_command(AVFilterContext *ctx, const char *cmd, const char *args, > > + char *res, int res_len, int flags) > > +{ > > + BilateralContext *s = ctx->priv; > > + int ret; > > + float old_sigmaR = s->sigmaR; > > + > > + if ((ret = ff_filter_process_command(ctx, cmd, args, res, res_len, flags)) < 0) { > > + return ret; > > + } > > + > > + if (fabs(old_sigmaR - s->sigmaR) > FLT_EPSILON && (ret = init_lut(s)) < 0) { > > + s->sigmaR = old_sigmaR; > > + } > > + > > + return ret; > > +} > > + > > static av_cold void uninit(AVFilterContext *ctx) > > { > > BilateralContext *s = ctx->priv; > > @@ -358,13 +386,14 @@ static const AVFilterPad bilateral_outputs[] = { > > }; > > > > AVFilter ff_vf_bilateral = { > > - .name = "bilateral", > > - .description = NULL_IF_CONFIG_SMALL("Apply Bilateral filter."), > > - .priv_size = sizeof(BilateralContext), > > - .priv_class = &bilateral_class, > > - .uninit = uninit, > > - .query_formats = query_formats, > > - .inputs = bilateral_inputs, > > - .outputs = bilateral_outputs, > > - .flags = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC, > > + .name = "bilateral", > > + .description = NULL_IF_CONFIG_SMALL("Apply Bilateral filter."), > > + .priv_size = sizeof(BilateralContext), > > + .priv_class = &bilateral_class, > > + .uninit = uninit, > > + .query_formats = query_formats, > > + .inputs = bilateral_inputs, > > + .outputs = bilateral_outputs, > > + .flags = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC, > > + .process_command = process_command, > > }; > > -- > > 1.8.3.1 > > > > _______________________________________________ > > ffmpeg-devel mailing list > > ffmpeg-devel@ffmpeg.org > > https://ffmpeg.org/mailman/listinfo/ffmpeg-devel > > > > To unsubscribe, visit link above, or email > > ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
You mixed functional and non-functional changes in single patch. This is big no. On 11/2/19, Tao Zhang <nowerzt@gmail.com> wrote: > Good weekend. Is it ok or any more suggestions? > > Tao Zhang <nowerzt@gmail.com> 于2019年10月28日周一 下午2:53写道: >> >> ping >> >> leozhang <leozhang@qiyi.com> 于2019年10月24日周四 下午5:18写道: >> > >> > Reviewed-by: Paul B Mahol <onemda@gmail.com> >> > Reviewed-by: Jun Zhao <mypopy@gmail.com> >> > Signed-off-by: leozhang <leozhang@qiyi.com> >> > --- >> > libavfilter/vf_bilateral.c | 57 >> > ++++++++++++++++++++++++++++++++++------------ >> > 1 file changed, 43 insertions(+), 14 deletions(-) >> > >> > diff --git a/libavfilter/vf_bilateral.c b/libavfilter/vf_bilateral.c >> > index 3c9d800..4d7bf68 100644 >> > --- a/libavfilter/vf_bilateral.c >> > +++ b/libavfilter/vf_bilateral.c >> > @@ -29,6 +29,8 @@ >> > #include "internal.h" >> > #include "video.h" >> > >> > +#include <float.h> >> > + >> > typedef struct BilateralContext { >> > const AVClass *class; >> > >> > @@ -54,7 +56,7 @@ typedef struct BilateralContext { >> > } BilateralContext; >> > >> > #define OFFSET(x) offsetof(BilateralContext, x) >> > -#define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM >> > +#define FLAGS >> > AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_RUNTIME_PARAM >> > >> > static const AVOption bilateral_options[] = { >> > { "sigmaS", "set spatial sigma", OFFSET(sigmaS), >> > AV_OPT_TYPE_FLOAT, {.dbl=0.1}, 0.0, 10, FLAGS }, >> > @@ -91,19 +93,27 @@ static int query_formats(AVFilterContext *ctx) >> > return ff_set_common_formats(ctx, ff_make_format_list(pix_fmts)); >> > } >> > >> > -static int config_input(AVFilterLink *inlink) >> > +static int init_lut(BilateralContext *s) >> > { >> > - BilateralContext *s = inlink->dst->priv; >> > - const AVPixFmtDescriptor *desc = >> > av_pix_fmt_desc_get(inlink->format); >> > float inv_sigma_range; >> > >> > - s->depth = desc->comp[0].depth; >> > inv_sigma_range = 1.0f / (s->sigmaR * ((1 << s->depth) - 1)); >> > >> > //compute a lookup table >> > for (int i = 0; i < (1 << s->depth); i++) >> > s->range_table[i] = expf(-i * inv_sigma_range); >> > >> > + return 0; >> > +} >> > + >> > +static int config_input(AVFilterLink *inlink) >> > +{ >> > + BilateralContext *s = inlink->dst->priv; >> > + const AVPixFmtDescriptor *desc = >> > av_pix_fmt_desc_get(inlink->format); >> > + >> > + s->depth = desc->comp[0].depth; >> > + init_lut(s); >> > + >> > s->planewidth[1] = s->planewidth[2] = AV_CEIL_RSHIFT(inlink->w, >> > desc->log2_chroma_w); >> > s->planewidth[0] = s->planewidth[3] = inlink->w; >> > s->planeheight[1] = s->planeheight[2] = AV_CEIL_RSHIFT(inlink->h, >> > desc->log2_chroma_h); >> > @@ -325,6 +335,24 @@ static int filter_frame(AVFilterLink *inlink, >> > AVFrame *in) >> > return ff_filter_frame(outlink, out); >> > } >> > >> > +static int process_command(AVFilterContext *ctx, const char *cmd, const >> > char *args, >> > + char *res, int res_len, int flags) >> > +{ >> > + BilateralContext *s = ctx->priv; >> > + int ret; >> > + float old_sigmaR = s->sigmaR; >> > + >> > + if ((ret = ff_filter_process_command(ctx, cmd, args, res, res_len, >> > flags)) < 0) { >> > + return ret; >> > + } >> > + >> > + if (fabs(old_sigmaR - s->sigmaR) > FLT_EPSILON && (ret = >> > init_lut(s)) < 0) { >> > + s->sigmaR = old_sigmaR; >> > + } >> > + >> > + return ret; >> > +} >> > + >> > static av_cold void uninit(AVFilterContext *ctx) >> > { >> > BilateralContext *s = ctx->priv; >> > @@ -358,13 +386,14 @@ static const AVFilterPad bilateral_outputs[] = { >> > }; >> > >> > AVFilter ff_vf_bilateral = { >> > - .name = "bilateral", >> > - .description = NULL_IF_CONFIG_SMALL("Apply Bilateral filter."), >> > - .priv_size = sizeof(BilateralContext), >> > - .priv_class = &bilateral_class, >> > - .uninit = uninit, >> > - .query_formats = query_formats, >> > - .inputs = bilateral_inputs, >> > - .outputs = bilateral_outputs, >> > - .flags = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC, >> > + .name = "bilateral", >> > + .description = NULL_IF_CONFIG_SMALL("Apply Bilateral filter."), >> > + .priv_size = sizeof(BilateralContext), >> > + .priv_class = &bilateral_class, >> > + .uninit = uninit, >> > + .query_formats = query_formats, >> > + .inputs = bilateral_inputs, >> > + .outputs = bilateral_outputs, >> > + .flags = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC, >> > + .process_command = process_command, >> > }; >> > -- >> > 1.8.3.1 >> > >> > _______________________________________________ >> > ffmpeg-devel mailing list >> > ffmpeg-devel@ffmpeg.org >> > https://ffmpeg.org/mailman/listinfo/ffmpeg-devel >> > >> > To unsubscribe, visit link above, or email >> > ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe". > _______________________________________________ > ffmpeg-devel mailing list > ffmpeg-devel@ffmpeg.org > https://ffmpeg.org/mailman/listinfo/ffmpeg-devel > > To unsubscribe, visit link above, or email > ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
Paul B Mahol <onemda@gmail.com> 于2019年11月2日周六 下午6:34写道: > > You mixed functional and non-functional changes in single patch. Lesson learned. I'll submit a new patch. Thanks a lot. Today is a good day. > This is big no. > > On 11/2/19, Tao Zhang <nowerzt@gmail.com> wrote: > > Good weekend. Is it ok or any more suggestions? > > > > Tao Zhang <nowerzt@gmail.com> 于2019年10月28日周一 下午2:53写道: > >> > >> ping > >> > >> leozhang <leozhang@qiyi.com> 于2019年10月24日周四 下午5:18写道: > >> > > >> > Reviewed-by: Paul B Mahol <onemda@gmail.com> > >> > Reviewed-by: Jun Zhao <mypopy@gmail.com> > >> > Signed-off-by: leozhang <leozhang@qiyi.com> > >> > --- > >> > libavfilter/vf_bilateral.c | 57 > >> > ++++++++++++++++++++++++++++++++++------------ > >> > 1 file changed, 43 insertions(+), 14 deletions(-) > >> > > >> > diff --git a/libavfilter/vf_bilateral.c b/libavfilter/vf_bilateral.c > >> > index 3c9d800..4d7bf68 100644 > >> > --- a/libavfilter/vf_bilateral.c > >> > +++ b/libavfilter/vf_bilateral.c > >> > @@ -29,6 +29,8 @@ > >> > #include "internal.h" > >> > #include "video.h" > >> > > >> > +#include <float.h> > >> > + > >> > typedef struct BilateralContext { > >> > const AVClass *class; > >> > > >> > @@ -54,7 +56,7 @@ typedef struct BilateralContext { > >> > } BilateralContext; > >> > > >> > #define OFFSET(x) offsetof(BilateralContext, x) > >> > -#define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM > >> > +#define FLAGS > >> > AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_RUNTIME_PARAM > >> > > >> > static const AVOption bilateral_options[] = { > >> > { "sigmaS", "set spatial sigma", OFFSET(sigmaS), > >> > AV_OPT_TYPE_FLOAT, {.dbl=0.1}, 0.0, 10, FLAGS }, > >> > @@ -91,19 +93,27 @@ static int query_formats(AVFilterContext *ctx) > >> > return ff_set_common_formats(ctx, ff_make_format_list(pix_fmts)); > >> > } > >> > > >> > -static int config_input(AVFilterLink *inlink) > >> > +static int init_lut(BilateralContext *s) > >> > { > >> > - BilateralContext *s = inlink->dst->priv; > >> > - const AVPixFmtDescriptor *desc = > >> > av_pix_fmt_desc_get(inlink->format); > >> > float inv_sigma_range; > >> > > >> > - s->depth = desc->comp[0].depth; > >> > inv_sigma_range = 1.0f / (s->sigmaR * ((1 << s->depth) - 1)); > >> > > >> > //compute a lookup table > >> > for (int i = 0; i < (1 << s->depth); i++) > >> > s->range_table[i] = expf(-i * inv_sigma_range); > >> > > >> > + return 0; > >> > +} > >> > + > >> > +static int config_input(AVFilterLink *inlink) > >> > +{ > >> > + BilateralContext *s = inlink->dst->priv; > >> > + const AVPixFmtDescriptor *desc = > >> > av_pix_fmt_desc_get(inlink->format); > >> > + > >> > + s->depth = desc->comp[0].depth; > >> > + init_lut(s); > >> > + > >> > s->planewidth[1] = s->planewidth[2] = AV_CEIL_RSHIFT(inlink->w, > >> > desc->log2_chroma_w); > >> > s->planewidth[0] = s->planewidth[3] = inlink->w; > >> > s->planeheight[1] = s->planeheight[2] = AV_CEIL_RSHIFT(inlink->h, > >> > desc->log2_chroma_h); > >> > @@ -325,6 +335,24 @@ static int filter_frame(AVFilterLink *inlink, > >> > AVFrame *in) > >> > return ff_filter_frame(outlink, out); > >> > } > >> > > >> > +static int process_command(AVFilterContext *ctx, const char *cmd, const > >> > char *args, > >> > + char *res, int res_len, int flags) > >> > +{ > >> > + BilateralContext *s = ctx->priv; > >> > + int ret; > >> > + float old_sigmaR = s->sigmaR; > >> > + > >> > + if ((ret = ff_filter_process_command(ctx, cmd, args, res, res_len, > >> > flags)) < 0) { > >> > + return ret; > >> > + } > >> > + > >> > + if (fabs(old_sigmaR - s->sigmaR) > FLT_EPSILON && (ret = > >> > init_lut(s)) < 0) { > >> > + s->sigmaR = old_sigmaR; > >> > + } > >> > + > >> > + return ret; > >> > +} > >> > + > >> > static av_cold void uninit(AVFilterContext *ctx) > >> > { > >> > BilateralContext *s = ctx->priv; > >> > @@ -358,13 +386,14 @@ static const AVFilterPad bilateral_outputs[] = { > >> > }; > >> > > >> > AVFilter ff_vf_bilateral = { > >> > - .name = "bilateral", > >> > - .description = NULL_IF_CONFIG_SMALL("Apply Bilateral filter."), > >> > - .priv_size = sizeof(BilateralContext), > >> > - .priv_class = &bilateral_class, > >> > - .uninit = uninit, > >> > - .query_formats = query_formats, > >> > - .inputs = bilateral_inputs, > >> > - .outputs = bilateral_outputs, > >> > - .flags = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC, > >> > + .name = "bilateral", > >> > + .description = NULL_IF_CONFIG_SMALL("Apply Bilateral filter."), > >> > + .priv_size = sizeof(BilateralContext), > >> > + .priv_class = &bilateral_class, > >> > + .uninit = uninit, > >> > + .query_formats = query_formats, > >> > + .inputs = bilateral_inputs, > >> > + .outputs = bilateral_outputs, > >> > + .flags = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC, > >> > + .process_command = process_command, > >> > }; > >> > -- > >> > 1.8.3.1 > >> > > >> > _______________________________________________ > >> > ffmpeg-devel mailing list > >> > ffmpeg-devel@ffmpeg.org > >> > https://ffmpeg.org/mailman/listinfo/ffmpeg-devel > >> > > >> > To unsubscribe, visit link above, or email > >> > ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe". > > _______________________________________________ > > ffmpeg-devel mailing list > > ffmpeg-devel@ffmpeg.org > > https://ffmpeg.org/mailman/listinfo/ffmpeg-devel > > > > To unsubscribe, visit link above, or email > > ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe". > _______________________________________________ > ffmpeg-devel mailing list > ffmpeg-devel@ffmpeg.org > https://ffmpeg.org/mailman/listinfo/ffmpeg-devel > > To unsubscribe, visit link above, or email > ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
diff --git a/libavfilter/vf_bilateral.c b/libavfilter/vf_bilateral.c index 3c9d800..4d7bf68 100644 --- a/libavfilter/vf_bilateral.c +++ b/libavfilter/vf_bilateral.c @@ -29,6 +29,8 @@ #include "internal.h" #include "video.h" +#include <float.h> + typedef struct BilateralContext { const AVClass *class; @@ -54,7 +56,7 @@ typedef struct BilateralContext { } BilateralContext; #define OFFSET(x) offsetof(BilateralContext, x) -#define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM +#define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_RUNTIME_PARAM static const AVOption bilateral_options[] = { { "sigmaS", "set spatial sigma", OFFSET(sigmaS), AV_OPT_TYPE_FLOAT, {.dbl=0.1}, 0.0, 10, FLAGS }, @@ -91,19 +93,27 @@ static int query_formats(AVFilterContext *ctx) return ff_set_common_formats(ctx, ff_make_format_list(pix_fmts)); } -static int config_input(AVFilterLink *inlink) +static int init_lut(BilateralContext *s) { - BilateralContext *s = inlink->dst->priv; - const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(inlink->format); float inv_sigma_range; - s->depth = desc->comp[0].depth; inv_sigma_range = 1.0f / (s->sigmaR * ((1 << s->depth) - 1)); //compute a lookup table for (int i = 0; i < (1 << s->depth); i++) s->range_table[i] = expf(-i * inv_sigma_range); + return 0; +} + +static int config_input(AVFilterLink *inlink) +{ + BilateralContext *s = inlink->dst->priv; + const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(inlink->format); + + s->depth = desc->comp[0].depth; + init_lut(s); + s->planewidth[1] = s->planewidth[2] = AV_CEIL_RSHIFT(inlink->w, desc->log2_chroma_w); s->planewidth[0] = s->planewidth[3] = inlink->w; s->planeheight[1] = s->planeheight[2] = AV_CEIL_RSHIFT(inlink->h, desc->log2_chroma_h); @@ -325,6 +335,24 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in) return ff_filter_frame(outlink, out); } +static int process_command(AVFilterContext *ctx, const char *cmd, const char *args, + char *res, int res_len, int flags) +{ + BilateralContext *s = ctx->priv; + int ret; + float old_sigmaR = s->sigmaR; + + if ((ret = ff_filter_process_command(ctx, cmd, args, res, res_len, flags)) < 0) { + return ret; + } + + if (fabs(old_sigmaR - s->sigmaR) > FLT_EPSILON && (ret = init_lut(s)) < 0) { + s->sigmaR = old_sigmaR; + } + + return ret; +} + static av_cold void uninit(AVFilterContext *ctx) { BilateralContext *s = ctx->priv; @@ -358,13 +386,14 @@ static const AVFilterPad bilateral_outputs[] = { }; AVFilter ff_vf_bilateral = { - .name = "bilateral", - .description = NULL_IF_CONFIG_SMALL("Apply Bilateral filter."), - .priv_size = sizeof(BilateralContext), - .priv_class = &bilateral_class, - .uninit = uninit, - .query_formats = query_formats, - .inputs = bilateral_inputs, - .outputs = bilateral_outputs, - .flags = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC, + .name = "bilateral", + .description = NULL_IF_CONFIG_SMALL("Apply Bilateral filter."), + .priv_size = sizeof(BilateralContext), + .priv_class = &bilateral_class, + .uninit = uninit, + .query_formats = query_formats, + .inputs = bilateral_inputs, + .outputs = bilateral_outputs, + .flags = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC, + .process_command = process_command, };