summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2013-12-03 22:24:49 +0100
committerwm4 <wm4@nowhere>2013-12-04 00:07:39 +0100
commit7d04327e7158d42ff62bc8b607d2832bb0b73d08 (patch)
tree986995e68c398bc02f8884684a15d710e0689534
parent5064ef87c3efbcd6bb04d835f6950172a457a473 (diff)
downloadmpv-7d04327e7158d42ff62bc8b607d2832bb0b73d08.tar.bz2
mpv-7d04327e7158d42ff62bc8b607d2832bb0b73d08.tar.xz
vf_gradfun: reroute to vf_lavfi
Also update the manpage. We changed defaults and added a suboption quite some time ago, and we forgot to update the manpage at all.
-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}
};