68 char *comp_expr_str[4];
86 #define OFFSET(x) offsetof(LutContext, x)
89 {
"c0",
"set component #0 expression",
OFFSET(comp_expr_str[0]),
AV_OPT_TYPE_STRING, {.str=
"val"}, CHAR_MIN, CHAR_MAX},
90 {
"c1",
"set component #1 expression",
OFFSET(comp_expr_str[1]),
AV_OPT_TYPE_STRING, {.str=
"val"}, CHAR_MIN, CHAR_MAX},
91 {
"c2",
"set component #2 expression",
OFFSET(comp_expr_str[2]),
AV_OPT_TYPE_STRING, {.str=
"val"}, CHAR_MIN, CHAR_MAX},
92 {
"c3",
"set component #3 expression",
OFFSET(comp_expr_str[3]),
AV_OPT_TYPE_STRING, {.str=
"val"}, CHAR_MIN, CHAR_MAX},
139 for (i = 0; i < 4; i++) {
146 #define YUV_FORMATS \
147 AV_PIX_FMT_YUV444P, AV_PIX_FMT_YUV422P, AV_PIX_FMT_YUV420P, \
148 AV_PIX_FMT_YUV411P, AV_PIX_FMT_YUV410P, AV_PIX_FMT_YUV440P, \
149 AV_PIX_FMT_YUVA420P, \
150 AV_PIX_FMT_YUVJ444P, AV_PIX_FMT_YUVJ422P, AV_PIX_FMT_YUVJ420P, \
153 #define RGB_FORMATS \
154 AV_PIX_FMT_ARGB, AV_PIX_FMT_RGBA, \
155 AV_PIX_FMT_ABGR, AV_PIX_FMT_BGRA, \
156 AV_PIX_FMT_RGB24, AV_PIX_FMT_BGR24
176 static double clip(
void *opaque,
double val)
182 return av_clip(val, minval, maxval);
196 return pow((val-minval)/(maxval-minval), gamma) * (maxval-minval)+minval;
199 static double (*
const funcs1[])(
void *, double) = {
233 min[
Y] = min[
U] = min[
V] = 16;
235 max[
U] = max[
V] = 240;
236 min[
A] = 0; max[
A] = 255;
239 min[0] = min[1] = min[2] = min[3] = 0;
240 max[0] = max[1] = max[2] = max[3] = 255;
267 "Error when parsing the expression '%s' for the component %d.\n",
276 for (val = 0; val < 256; val++) {
281 min[comp], max[comp]);
286 "Error when evaluating the expression '%s' for the value %d for the component #%d.\n",
290 lut->
lut[
comp][val] = av_clip((
int)res, min[comp], max[comp]);
304 uint8_t *inrow, *outrow, *inrow0, *outrow0;
316 inrow0 = in ->
data[0];
317 outrow0 = out->
data[0];
319 for (i = 0; i < in->
video->
h; i ++) {
322 for (j = 0; j < inlink->
w; j++) {
323 for (k = 0; k < lut->
step; k++)
333 for (plane = 0; plane < 4 && in->
data[plane]; plane++) {
334 int vsub = plane == 1 || plane == 2 ? lut->
vsub : 0;
335 int hsub = plane == 1 || plane == 2 ? lut->
hsub : 0;
337 inrow = in ->
data[plane];
338 outrow = out->
data[plane];
340 for (i = 0; i < in->
video->
h >> vsub; i ++) {
341 for (j = 0; j < inlink->
w>>hsub; j++)
342 outrow[j] = lut->
lut[plane][inrow[j]];
366 #define DEFINE_LUT_FILTER(name_, description_, init_) \
367 AVFilter avfilter_vf_##name_ = { \
369 .description = NULL_IF_CONFIG_SMALL(description_), \
370 .priv_size = sizeof(LutContext), \
374 .query_formats = query_formats, \
377 .outputs = outputs, \
380 #if CONFIG_LUT_FILTER
383 #if CONFIG_LUTYUV_FILTER
386 #if CONFIG_LUTRGB_FILTER
390 #if CONFIG_NEGATE_FILTER
402 snprintf(lut_params,
sizeof(lut_params),
"c0=negval:c1=negval:c2=negval:a=%s",
405 return init(ctx, lut_params);