80 #define OFFSET(x) offsetof(LutContext, x)
81 #define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM
103 for (i = 0; i < 4; i++) {
110 #define YUV_FORMATS \
111 AV_PIX_FMT_YUV444P, AV_PIX_FMT_YUV422P, AV_PIX_FMT_YUV420P, \
112 AV_PIX_FMT_YUV411P, AV_PIX_FMT_YUV410P, AV_PIX_FMT_YUV440P, \
113 AV_PIX_FMT_YUVA420P, AV_PIX_FMT_YUVA422P, AV_PIX_FMT_YUVA444P, \
114 AV_PIX_FMT_YUVJ444P, AV_PIX_FMT_YUVJ422P, AV_PIX_FMT_YUVJ420P, \
117 #define RGB_FORMATS \
118 AV_PIX_FMT_ARGB, AV_PIX_FMT_RGBA, \
119 AV_PIX_FMT_ABGR, AV_PIX_FMT_BGRA, \
120 AV_PIX_FMT_RGB24, AV_PIX_FMT_BGR24
147 return av_clip(val, minval, maxval);
161 return pow((val-minval)/(maxval-minval), gamma) * (maxval-minval)+minval;
173 double level = (val - minval) / (maxval - minval);
174 level = level < 0.018 ? 4.5 * level
175 : 1.099 * pow(level, 1.0 / gamma) - 0.099;
176 return level * (maxval - minval) + minval;
179 static double (*
const funcs1[])(
void *, double) = {
218 min[
Y] = min[
U] = min[
V] = 16;
220 max[
U] = max[
V] = 240;
221 min[
A] = 0; max[
A] = 255;
224 min[0] = min[1] = min[2] = min[3] = 0;
225 max[0] = max[1] = max[2] = max[3] = 255;
248 "Error when parsing the expression '%s' for the component %d and color %d.\n",
257 for (val = 0; val < 256; val++) {
262 min[color], max[color]);
267 "Error when evaluating the expression '%s' for the value %d for the component %d.\n",
271 s->
lut[
comp][
val] = av_clip((
int)res, min[color], max[color]);
285 uint8_t *inrow, *outrow, *inrow0, *outrow0;
286 int i, j, plane, direct = 0;
302 inrow0 = in ->
data[0];
303 outrow0 = out->
data[0];
305 for (i = 0; i < in->
height; i ++) {
310 for (j = 0; j < w; j++) {
312 case 4: outrow[3] =
tab[3][inrow[3]];
313 case 3: outrow[2] =
tab[2][inrow[2]];
314 case 2: outrow[1] =
tab[1][inrow[1]];
315 default: outrow[0] =
tab[0][inrow[0]];
325 for (plane = 0; plane < 4 && in->
data[plane] && in->
linesize[plane]; plane++) {
326 int vsub = plane == 1 || plane == 2 ? s->
vsub : 0;
327 int hsub = plane == 1 || plane == 2 ? s->
hsub : 0;
331 inrow = in ->
data[plane];
332 outrow = out->
data[plane];
334 for (i = 0; i < h; i++) {
336 for (j = 0; j < w; j++)
337 outrow[j] = tab[inrow[j]];
365 #define DEFINE_LUT_FILTER(name_, description_) \
366 AVFilter ff_vf_##name_ = { \
368 .description = NULL_IF_CONFIG_SMALL(description_), \
369 .priv_size = sizeof(LutContext), \
370 .priv_class = &name_ ## _class, \
371 .init = name_##_init, \
373 .query_formats = query_formats, \
375 .outputs = outputs, \
376 .flags = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC, \
379 #if CONFIG_LUT_FILTER
381 #define lut_options options
389 DEFINE_LUT_FILTER(lut,
"Compute and apply a lookup table to the RGB/YUV input video.");
392 #if CONFIG_LUTYUV_FILTER
394 #define lutyuv_options options
406 DEFINE_LUT_FILTER(lutyuv,
"Compute and apply a lookup table to the YUV input video.");
409 #if CONFIG_LUTRGB_FILTER
411 #define lutrgb_options options
423 DEFINE_LUT_FILTER(lutrgb,
"Compute and apply a lookup table to the RGB input video.");
426 #if CONFIG_NEGATE_FILTER
428 static const AVOption negate_options[] = {
442 for (i = 0; i < 4; i++) {