39 int jobnr,
int nb_jobs);
42 static inline float lerpf(
float v0,
float v1,
float f)
44 return v0 + (v1 -
v0) * f;
53 const float scale = 1.f / 255.f;
59 const float gintensity = intensity * s->
balance[0];
60 const float bintensity = intensity * s->
balance[1];
61 const float rintensity = intensity * s->
balance[2];
62 const float sgintensity = alternate *
FFSIGN(gintensity);
63 const float sbintensity = alternate *
FFSIGN(bintensity);
64 const float srintensity = alternate *
FFSIGN(rintensity);
65 const int slice_start = (height * jobnr) / nb_jobs;
66 const int slice_end = (height * (jobnr + 1)) / nb_jobs;
67 const int glinesize = frame->
linesize[0];
68 const int blinesize = frame->
linesize[1];
69 const int rlinesize = frame->
linesize[2];
70 uint8_t *gptr = frame->
data[0] + slice_start * glinesize;
71 uint8_t *bptr = frame->
data[1] + slice_start * blinesize;
72 uint8_t *rptr = frame->
data[2] + slice_start * rlinesize;
74 for (
int y = slice_start; y <
slice_end; y++) {
75 for (
int x = 0; x <
width; x++) {
76 float g = gptr[x] * scale;
77 float b = bptr[x] * scale;
78 float r = rptr[x] * scale;
79 float max_color =
FFMAX3(r, g, b);
80 float min_color =
FFMIN3(r, g, b);
81 float color_saturation = max_color - min_color;
82 float luma = g * gc + r * rc + b * bc;
83 const float cg = 1.f + gintensity * (1.f - sgintensity * color_saturation);
84 const float cb = 1.f + bintensity * (1.f - sbintensity * color_saturation);
85 const float cr = 1.f + rintensity * (1.f - srintensity * color_saturation);
87 g =
lerpf(luma, g, cg);
88 b =
lerpf(luma, b, cb);
89 r =
lerpf(luma, r, cr);
91 gptr[x] = av_clip_uint8(g * 255.
f);
92 bptr[x] = av_clip_uint8(b * 255.f);
93 rptr[x] = av_clip_uint8(r * 255.f);
110 const float scale = 1.f /
max;
111 const float gc = s->
lcoeffs[0];
112 const float bc = s->
lcoeffs[1];
113 const float rc = s->
lcoeffs[2];
118 const float gintensity = intensity * s->
balance[0];
119 const float bintensity = intensity * s->
balance[1];
120 const float rintensity = intensity * s->
balance[2];
121 const float sgintensity = alternate *
FFSIGN(gintensity);
122 const float sbintensity = alternate *
FFSIGN(bintensity);
123 const float srintensity = alternate *
FFSIGN(rintensity);
124 const int slice_start = (height * jobnr) / nb_jobs;
125 const int slice_end = (height * (jobnr + 1)) / nb_jobs;
126 const int glinesize = frame->
linesize[0] / 2;
127 const int blinesize = frame->
linesize[1] / 2;
128 const int rlinesize = frame->
linesize[2] / 2;
129 uint16_t *gptr = (uint16_t *)frame->
data[0] + slice_start * glinesize;
130 uint16_t *bptr = (uint16_t *)frame->
data[1] + slice_start * blinesize;
131 uint16_t *rptr = (uint16_t *)frame->
data[2] + slice_start * rlinesize;
134 for (
int x = 0; x <
width; x++) {
135 float g = gptr[x] * scale;
136 float b = bptr[x] * scale;
137 float r = rptr[x] * scale;
138 float max_color =
FFMAX3(r, g, b);
139 float min_color =
FFMIN3(r, g, b);
140 float color_saturation = max_color - min_color;
141 float luma = g * gc + r * rc + b * bc;
142 const float cg = 1.f + gintensity * (1.f - sgintensity * color_saturation);
143 const float cb = 1.f + bintensity * (1.f - sbintensity * color_saturation);
144 const float cr = 1.f + rintensity * (1.f - srintensity * color_saturation);
146 g =
lerpf(luma, g, cg);
147 b =
lerpf(luma, b, cb);
148 r =
lerpf(luma, r, cr);
226 #define OFFSET(x) offsetof(VibranceContext, x) 227 #define VF AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_RUNTIME_PARAM 247 .priv_class = &vibrance_class,
249 .
inputs = vibrance_inputs,
AVFILTER_DEFINE_CLASS(vibrance)
static av_cold int query_formats(AVFilterContext *avctx)
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
This structure describes decoded (raw) audio or video data.
#define AV_PIX_FMT_GBRAP10
Main libavfilter public API header.
#define AV_PIX_FMT_GBRP10
#define AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC
Some filters support a generic "enable" expression option that can be used to enable or disable a fil...
const char * name
Pad name.
int(* do_slice)(AVFilterContext *s, void *arg, int jobnr, int nb_jobs)
static double cb(void *priv, double x, double y)
int ff_filter_frame(AVFilterLink *link, AVFrame *frame)
Send a frame of data to the next filter.
AVComponentDescriptor comp[4]
Parameters that describe how pixels are packed.
static int vibrance_slice8(AVFilterContext *avctx, void *arg, int jobnr, int nb_jobs)
A filter pad used for either input or output.
A link between two filters.
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
int ff_filter_process_command(AVFilterContext *ctx, const char *cmd, const char *arg, char *res, int res_len, int flags)
Generic processing of user supplied commands that are set in the same way as the filter options...
void * priv
private data for use by the filter
#define AVFILTER_FLAG_SLICE_THREADS
The filter supports multithreading by splitting frames into multiple parts and processing them concur...
#define AV_PIX_FMT_GBRAP12
static const AVOption vibrance_options[]
#define AV_PIX_FMT_GBRAP16
#define AV_PIX_FMT_GBRP16
int ff_filter_get_nb_threads(AVFilterContext *ctx)
Get number of threads for current filter instance.
static const AVFilterPad vibrance_inputs[]
static const AVFilterPad inputs[]
#define AV_PIX_FMT_GBRP14
static const AVFilterPad outputs[]
int format
agreed upon media format
int linesize[AV_NUM_DATA_POINTERS]
For video, size in bytes of each picture line.
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
static int filter_frame(AVFilterLink *link, AVFrame *frame)
Describe the class of an AVClass context structure.
const char * name
Filter name.
static const AVFilterPad vibrance_outputs[]
static av_cold int config_input(AVFilterLink *inlink)
AVFilterLink ** outputs
array of pointers to output links
static float lerpf(float v0, float v1, float f)
#define AV_PIX_FMT_GBRP12
#define flags(name, subs,...)
AVFilterInternal * internal
An opaque struct for libavfilter internal use.
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
planar GBRA 4:4:4:4 32bpp
static int vibrance_slice16(AVFilterContext *avctx, void *arg, int jobnr, int nb_jobs)
avfilter_execute_func * execute
static int slice_end(AVCodecContext *avctx, AVFrame *pict)
Handle slice ends.
AVFilterContext * dst
dest filter
static int process_command(AVFilterContext *ctx, const char *cmd, const char *args, char *res, int res_len, int flags)
static double cr(void *priv, double x, double y)
int depth
Number of bits in the component.
AVPixelFormat
Pixel format.
static av_always_inline av_const unsigned av_clip_uintp2_c(int a, int p)
Clip a signed integer to an unsigned power of two range.