Commit 8fe0c527 authored by Stefano Sabatini's avatar Stefano Sabatini Committed by Anton Khirnov

lavfi: add LUT (LookUp Table) generic filters

Signed-off-by: 's avatarAnton Khirnov <anton@khirnov.net>
parent 85afbb1d
......@@ -50,6 +50,7 @@ easier to use. The changes are:
- Apple ProRes decoder
- CELT in Ogg demuxing
- VC-1 interlaced decoding
- lut, lutrgb, and lutyuv filters
version 0.7:
......
......@@ -701,6 +701,118 @@ a float number which specifies chroma temporal strength, defaults to
@var{luma_tmp}*@var{chroma_spatial}/@var{luma_spatial}
@end table
@section lut, lutrgb, lutyuv
Compute a look-up table for binding each pixel component input value
to an output value, and apply it to input video.
@var{lutyuv} applies a lookup table to a YUV input video, @var{lutrgb}
to an RGB input video.
These filters accept in input a ":"-separated list of options, which
specify the expressions used for computing the lookup table for the
corresponding pixel component values.
The @var{lut} filter requires either YUV or RGB pixel formats in
input, and accepts the options:
@table @option
@var{c0} (first pixel component)
@var{c1} (second pixel component)
@var{c2} (third pixel component)
@var{c3} (fourth pixel component, corresponds to the alpha component)
@end table
The exact component associated to each option depends on the format in
input.
The @var{lutrgb} filter requires RGB pixel formats in input, and
accepts the options:
@table @option
@var{r} (red component)
@var{g} (green component)
@var{b} (blue component)
@var{a} (alpha component)
@end table
The @var{lutyuv} filter requires YUV pixel formats in input, and
accepts the options:
@table @option
@var{y} (Y/luminance component)
@var{u} (U/Cb component)
@var{v} (V/Cr component)
@var{a} (alpha component)
@end table
The expressions can contain the following constants and functions:
@table @option
@item E, PI, PHI
the corresponding mathematical approximated values for e
(euler number), pi (greek PI), PHI (golden ratio)
@item w, h
the input width and heigth
@item val
input value for the pixel component
@item clipval
the input value clipped in the @var{minval}-@var{maxval} range
@item maxval
maximum value for the pixel component
@item minval
minimum value for the pixel component
@item negval
the negated value for the pixel component value clipped in the
@var{minval}-@var{maxval} range , it corresponds to the expression
"maxval-clipval+minval"
@item clip(val)
the computed value in @var{val} clipped in the
@var{minval}-@var{maxval} range
@item gammaval(gamma)
the computed gamma correction value of the pixel component value
clipped in the @var{minval}-@var{maxval} range, corresponds to the
expression
"pow((clipval-minval)/(maxval-minval)\,@var{gamma})*(maxval-minval)+minval"
@end table
All expressions default to "val".
Some examples follow:
@example
# negate input video
lutrgb="r=maxval+minval-val:g=maxval+minval-val:b=maxval+minval-val"
lutyuv="y=maxval+minval-val:u=maxval+minval-val:v=maxval+minval-val"
# the above is the same as
lutrgb="r=negval:g=negval:b=negval"
lutyuv="y=negval:u=negval:v=negval"
# negate luminance
lutyuv=negval
# remove chroma components, turns the video into a graytone image
lutyuv="u=128:v=128"
# apply a luma burning effect
lutyuv="y=2*val"
# remove green and blue components
lutrgb="g=0:b=0"
# set a constant alpha channel value on input
format=rgba,lutrgb=a="maxval-minval/2"
# correct luminance gamma by a 0.5 factor
lutyuv=y=gammaval(0.5)
@end example
@section noformat
Force libavfilter not to use any of the specified pixel formats for the
......
......@@ -33,6 +33,9 @@ OBJS-$(CONFIG_FREI0R_FILTER) += vf_frei0r.o
OBJS-$(CONFIG_GRADFUN_FILTER) += vf_gradfun.o
OBJS-$(CONFIG_HFLIP_FILTER) += vf_hflip.o
OBJS-$(CONFIG_HQDN3D_FILTER) += vf_hqdn3d.o
OBJS-$(CONFIG_LUT_FILTER) += vf_lut.o
OBJS-$(CONFIG_LUTRGB_FILTER) += vf_lut.o
OBJS-$(CONFIG_LUTYUV_FILTER) += vf_lut.o
OBJS-$(CONFIG_NOFORMAT_FILTER) += vf_format.o
OBJS-$(CONFIG_NULL_FILTER) += vf_null.o
OBJS-$(CONFIG_OCV_FILTER) += vf_libopencv.o
......
......@@ -54,6 +54,9 @@ void avfilter_register_all(void)
REGISTER_FILTER (GRADFUN, gradfun, vf);
REGISTER_FILTER (HFLIP, hflip, vf);
REGISTER_FILTER (HQDN3D, hqdn3d, vf);
REGISTER_FILTER (LUT, lut, vf);
REGISTER_FILTER (LUTRGB, lutrgb, vf);
REGISTER_FILTER (LUTYUV, lutyuv, vf);
REGISTER_FILTER (NOFORMAT, noformat, vf);
REGISTER_FILTER (NULL, null, vf);
REGISTER_FILTER (OCV, ocv, vf);
......
......@@ -29,8 +29,8 @@
#include "libavutil/rational.h"
#define LIBAVFILTER_VERSION_MAJOR 2
#define LIBAVFILTER_VERSION_MINOR 7
#define LIBAVFILTER_VERSION_MICRO 2
#define LIBAVFILTER_VERSION_MINOR 8
#define LIBAVFILTER_VERSION_MICRO 0
#define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \
LIBAVFILTER_VERSION_MINOR, \
......
......@@ -21,6 +21,7 @@
#include "libavutil/pixdesc.h"
#include "avfilter.h"
#include "internal.h"
/**
* Add all refs from a to ret and destroy a.
......@@ -70,6 +71,17 @@ AVFilterFormats *avfilter_merge_formats(AVFilterFormats *a, AVFilterFormats *b)
return ret;
}
int ff_fmt_is_in(int fmt, const int *fmts)
{
const int *p;
for (p = fmts; *p != PIX_FMT_NONE; p++) {
if (fmt == *p)
return 1;
}
return 0;
}
AVFilterFormats *avfilter_make_format_list(const int *fmts)
{
AVFilterFormats *formats;
......
......@@ -52,4 +52,7 @@ int ff_avfilter_graph_config_formats(AVFilterGraph *graphctx, AVClass *log_ctx);
/** default handler for freeing audio/video buffer when there are no references left */
void ff_avfilter_default_free_buffer(AVFilterBuffer *buf);
/** Tell is a format is contained in the provided list terminated by -1. */
int ff_fmt_is_in(int fmt, const int *fmts);
#endif /* AVFILTER_INTERNAL_H */
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment