summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--DOCS/man/en/vf.rst12
-rw-r--r--video/filter/vf_gradfun.c23
2 files changed, 29 insertions, 6 deletions
diff --git a/DOCS/man/en/vf.rst b/DOCS/man/en/vf.rst
index 3823bcf4c4..e202a21575 100644
--- a/DOCS/man/en/vf.rst
+++ b/DOCS/man/en/vf.rst
@@ -830,24 +830,24 @@ Available filters are:
Deprecated. Use libavfilter's ``stereo3d`` filter through ``--vf=lavfi``
instead.
-``gradfun[=strength[:radius]]``
+``gradfun[=strength[:radius|:size=<size>]]``
Fix the banding artifacts that are sometimes introduced into nearly flat
regions by truncation to 8bit color depth. Interpolates the gradients that
should go where the bands are, and dithers them.
``<strength>``
Maximum amount by which the filter will change any one pixel. Also the
- threshold for detecting nearly flat regions (default: 1.2).
+ threshold for detecting nearly flat regions (default: 1.5).
``<radius>``
Neighborhood to fit the gradient to. Larger radius makes for smoother
gradients, but also prevents the filter from modifying pixels near
- detailed regions (default: 16).
+ detailed regions (default: disabled).
- .. note::
+ ``<size>``
+ size of the filter in percent of the image diagonal size. This is
+ used to calculate the final radius size (default: 1).
- Deprecated. Use libavfilter's ``gradfun`` filter through ``--vf=lavfi``
- instead.
``dlopen=dll[:a0[:a1[:a2[:a3]]]]``
Loads an external library to filter the image. The library interface
diff --git a/video/filter/vf_gradfun.c b/video/filter/vf_gradfun.c
index f7b39fa999..28916e7871 100644
--- a/video/filter/vf_gradfun.c
+++ b/video/filter/vf_gradfun.c
@@ -45,6 +45,8 @@
#include "mpvcore/m_option.h"
+#include "vf_lavfi.h"
+
struct vf_priv_s {
float cfg_thresh;
int cfg_radius;
@@ -56,6 +58,7 @@ struct vf_priv_s {
int width, int thresh, const uint16_t *dithers);
void (*blur_line)(uint16_t *dc, uint16_t *buf, uint16_t *buf1,
uint8_t *src, int sstride, int width);
+ struct vf_lw_opts *lw_opts;
} const vf_priv_dflt = {
.cfg_thresh = 1.5,
.cfg_radius = -1,
@@ -353,6 +356,18 @@ static void uninit(struct vf_instance *vf)
av_free(vf->priv->buf);
}
+static void lavfi_recreate(struct vf_instance *vf)
+{
+ struct vf_priv_s *p = vf_lw_old_priv(vf);
+ int w = vf->fmt_in.params.w;
+ int h = vf->fmt_in.params.h;
+ p->radius = p->cfg_radius;
+ if (p->cfg_size > -1)
+ p->radius = (p->cfg_size / 100.0f) * sqrtf(w * w + h * h);
+ p->radius = av_clip((p->radius+1)&~1, 4, 32);
+ vf_lw_update_graph(vf, "gradfun", "%f:%d", p->cfg_thresh, p->radius);
+}
+
static int vf_open(vf_instance_t *vf, char *args)
{
vf->filter=filter;
@@ -372,6 +387,13 @@ static int vf_open(vf_instance_t *vf, char *args)
if (!have_radius && !have_size)
vf->priv->cfg_size = 1.0;
+ if (vf_lw_set_graph(vf, vf->priv->lw_opts, "gradfun", "%f:4",
+ vf->priv->cfg_thresh) >= 0)
+ {
+ vf_lw_set_recreate_cb(vf, lavfi_recreate);
+ return 1;
+ }
+
vf->priv->thresh = (1<<15)/av_clipf(vf->priv->cfg_thresh,0.51,255);
vf->priv->blur_line = blur_line_c;
@@ -397,6 +419,7 @@ static const m_option_t vf_opts_fields[] = {
OPT_FLOATRANGE("strength", cfg_thresh, 0, 0.51, 255),
OPT_INTRANGE("radius", cfg_radius, 0, 4, 32),
OPT_FLOATRANGE("size", cfg_size, 0, 0.1, 5.0),
+ OPT_SUBSTRUCT("", lw_opts, vf_lw_conf, 0),
{0}
};