62 char *comp_expr_str[4];
79 #define OFFSET(x) offsetof(LutContext, x)
80 #define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM
102 for (i = 0; i < 4; i++) {
109 #define YUV_FORMATS \
110 AV_PIX_FMT_YUV444P, AV_PIX_FMT_YUV422P, AV_PIX_FMT_YUV420P, \
111 AV_PIX_FMT_YUV411P, AV_PIX_FMT_YUV410P, AV_PIX_FMT_YUV440P, \
112 AV_PIX_FMT_YUVA420P, \
113 AV_PIX_FMT_YUVJ444P, AV_PIX_FMT_YUVJ422P, AV_PIX_FMT_YUVJ420P, \
116 #define RGB_FORMATS \
117 AV_PIX_FMT_ARGB, AV_PIX_FMT_RGBA, \
118 AV_PIX_FMT_ABGR, AV_PIX_FMT_BGRA, \
119 AV_PIX_FMT_RGB24, AV_PIX_FMT_BGR24
139 static double clip(
void *opaque,
double val)
145 return av_clip(val, minval, maxval);
159 return pow((val-minval)/(maxval-minval), gamma) * (maxval-minval)+minval;
162 static double (*
const funcs1[])(
void *, double) = {
197 min[
Y] = min[
U] = min[
V] = 16;
199 max[
U] = max[
V] = 240;
200 min[
A] = 0; max[
A] = 255;
203 min[0] = min[1] = min[2] = min[3] = 0;
204 max[0] = max[1] = max[2] = max[3] = 255;
225 "Error when parsing the expression '%s' for the component %d and color %d.\n",
234 for (val = 0; val < 256; val++) {
239 min[color], max[color]);
244 "Error when evaluating the expression '%s' for the value %d for the component %d.\n",
248 lut->
lut[
comp][val] = av_clip((
int)res, min[color], max[color]);
262 uint8_t *inrow, *outrow, *inrow0, *outrow0;
274 inrow0 = in ->
data[0];
275 outrow0 = out->
data[0];
277 for (i = 0; i < in->
video->
h; i ++) {
282 for (j = 0; j < w; j++) {
283 outrow[0] =
tab[0][inrow[0]];
285 outrow[1] =
tab[1][inrow[1]];
287 outrow[2] =
tab[2][inrow[2]];
289 outrow[3] =
tab[3][inrow[3]];
301 for (plane = 0; plane < 4 && in->
data[plane]; plane++) {
302 int vsub = plane == 1 || plane == 2 ? lut->
vsub : 0;
303 int hsub = plane == 1 || plane == 2 ? lut->
hsub : 0;
305 inrow = in ->
data[plane];
306 outrow = out->
data[plane];
308 for (i = 0; i < (in->
video->
h + (1<<vsub) - 1)>>vsub; i ++) {
310 int w = (inlink->
w + (1<<hsub) - 1)>>hsub;
311 for (j = 0; j < w; j++)
312 outrow[j] = tab[inrow[j]];
336 #define DEFINE_LUT_FILTER(name_, description_) \
337 AVFilter avfilter_vf_##name_ = { \
339 .description = NULL_IF_CONFIG_SMALL(description_), \
340 .priv_size = sizeof(LutContext), \
342 .init = name_##_init, \
344 .query_formats = query_formats, \
347 .outputs = outputs, \
348 .priv_class = &name_##_class, \
351 #if CONFIG_LUT_FILTER
353 #define lut_options options
361 lut->
class = &lut_class;
370 DEFINE_LUT_FILTER(lut,
"Compute and apply a lookup table to the RGB/YUV input video.");
373 #if CONFIG_LUTYUV_FILTER
375 #define lutyuv_options options
383 lut->
class = &lutyuv_class;
393 DEFINE_LUT_FILTER(lutyuv,
"Compute and apply a lookup table to the YUV input video.");
396 #if CONFIG_LUTRGB_FILTER
398 #define lutrgb_options options
406 lut->
class = &lutrgb_class;
416 DEFINE_LUT_FILTER(lutrgb,
"Compute and apply a lookup table to the RGB input video.");
419 #if CONFIG_NEGATE_FILTER
421 #define negate_options options
434 snprintf(lut_params,
sizeof(lut_params),
"c0=negval:c1=negval:c2=negval:a=%s",
437 lut->
class = &negate_class;