...
|
...
|
@@ -60,7 +60,6 @@ typedef struct {
|
60
|
60
|
int hsub, vsub;
|
61
|
61
|
double var_values[VAR_VARS_NB];
|
62
|
62
|
int is_rgb, is_yuv;
|
63
|
|
- int rgba_map[4];
|
64
|
63
|
int step;
|
65
|
64
|
int negate_alpha; /* only used by negate */
|
66
|
65
|
} LutContext;
|
...
|
...
|
@@ -199,6 +198,7 @@ static int config_props(AVFilterLink *inlink)
|
199
|
199
|
AVFilterContext *ctx = inlink->dst;
|
200
|
200
|
LutContext *lut = ctx->priv;
|
201
|
201
|
const AVPixFmtDescriptor *desc = &av_pix_fmt_descriptors[inlink->format];
|
|
202
|
+ int rgba_map[4]; /* component index -> RGBA color index map */
|
202
|
203
|
int min[4], max[4];
|
203
|
204
|
int val, comp, ret;
|
204
|
205
|
|
...
|
...
|
@@ -232,54 +232,50 @@ static int config_props(AVFilterLink *inlink)
|
232
|
232
|
|
233
|
233
|
if (lut->is_rgb) {
|
234
|
234
|
switch (inlink->format) {
|
235
|
|
- case PIX_FMT_ARGB: lut->rgba_map[A] = 0; lut->rgba_map[R] = 1; lut->rgba_map[G] = 2; lut->rgba_map[B] = 3; break;
|
236
|
|
- case PIX_FMT_ABGR: lut->rgba_map[A] = 0; lut->rgba_map[B] = 1; lut->rgba_map[G] = 2; lut->rgba_map[R] = 3; break;
|
|
235
|
+ case PIX_FMT_ARGB: rgba_map[0] = A; rgba_map[1] = R; rgba_map[2] = G; rgba_map[3] = B; break;
|
|
236
|
+ case PIX_FMT_ABGR: rgba_map[0] = A; rgba_map[1] = B; rgba_map[2] = G; rgba_map[3] = R; break;
|
237
|
237
|
case PIX_FMT_RGBA:
|
238
|
|
- case PIX_FMT_RGB24: lut->rgba_map[R] = 0; lut->rgba_map[G] = 1; lut->rgba_map[B] = 2; lut->rgba_map[A] = 3; break;
|
|
238
|
+ case PIX_FMT_RGB24: rgba_map[0] = R; rgba_map[1] = G; rgba_map[2] = B; rgba_map[3] = A; break;
|
239
|
239
|
case PIX_FMT_BGRA:
|
240
|
|
- case PIX_FMT_BGR24: lut->rgba_map[B] = 0; lut->rgba_map[G] = 1; lut->rgba_map[R] = 2; lut->rgba_map[A] = 3; break;
|
|
240
|
+ case PIX_FMT_BGR24: rgba_map[0] = B; rgba_map[1] = G; rgba_map[2] = R; rgba_map[3] = A; break;
|
241
|
241
|
}
|
242
|
242
|
lut->step = av_get_bits_per_pixel(desc) >> 3;
|
243
|
243
|
}
|
244
|
244
|
|
245
|
245
|
for (comp = 0; comp < desc->nb_components; comp++) {
|
246
|
246
|
double res;
|
247
|
|
- int tcomp;
|
248
|
|
- if (lut->is_rgb) {
|
249
|
|
- for (tcomp = 0; lut->rgba_map[tcomp] != comp; tcomp++)
|
250
|
|
- ;
|
251
|
|
- } else
|
252
|
|
- tcomp = comp;
|
|
247
|
+ int color = lut->is_rgb ? rgba_map[comp] : comp;
|
|
248
|
+
|
253
|
249
|
/* create the parsed expression */
|
254
|
|
- ret = av_expr_parse(&lut->comp_expr[comp], lut->comp_expr_str[comp],
|
|
250
|
+ ret = av_expr_parse(&lut->comp_expr[color], lut->comp_expr_str[color],
|
255
|
251
|
var_names, funcs1_names, funcs1, NULL, NULL, 0, ctx);
|
256
|
252
|
if (ret < 0) {
|
257
|
253
|
av_log(ctx, AV_LOG_ERROR,
|
258
|
|
- "Error when parsing the expression '%s' for the component %d.\n",
|
259
|
|
- lut->comp_expr_str[comp], comp);
|
|
254
|
+ "Error when parsing the expression '%s' for the component %d and color %d.\n",
|
|
255
|
+ lut->comp_expr_str[comp], comp, color);
|
260
|
256
|
return AVERROR(EINVAL);
|
261
|
257
|
}
|
262
|
258
|
|
263
|
259
|
/* compute the lut */
|
264
|
|
- lut->var_values[VAR_MAXVAL] = max[comp];
|
265
|
|
- lut->var_values[VAR_MINVAL] = min[comp];
|
|
260
|
+ lut->var_values[VAR_MAXVAL] = max[color];
|
|
261
|
+ lut->var_values[VAR_MINVAL] = min[color];
|
266
|
262
|
|
267
|
263
|
for (val = 0; val < 256; val++) {
|
268
|
264
|
lut->var_values[VAR_VAL] = val;
|
269
|
|
- lut->var_values[VAR_CLIPVAL] = av_clip(val, min[comp], max[comp]);
|
|
265
|
+ lut->var_values[VAR_CLIPVAL] = av_clip(val, min[color], max[color]);
|
270
|
266
|
lut->var_values[VAR_NEGVAL] =
|
271
|
|
- av_clip(min[comp] + max[comp] - lut->var_values[VAR_VAL],
|
272
|
|
- min[comp], max[comp]);
|
|
267
|
+ av_clip(min[color] + max[color] - lut->var_values[VAR_VAL],
|
|
268
|
+ min[color], max[color]);
|
273
|
269
|
|
274
|
|
- res = av_expr_eval(lut->comp_expr[comp], lut->var_values, lut);
|
|
270
|
+ res = av_expr_eval(lut->comp_expr[color], lut->var_values, lut);
|
275
|
271
|
if (isnan(res)) {
|
276
|
272
|
av_log(ctx, AV_LOG_ERROR,
|
277
|
|
- "Error when evaluating the expression '%s' for the value %d for the component #%d.\n",
|
278
|
|
- lut->comp_expr_str[comp], val, comp);
|
|
273
|
+ "Error when evaluating the expression '%s' for the value %d for the component %d.\n",
|
|
274
|
+ lut->comp_expr_str[color], val, comp);
|
279
|
275
|
return AVERROR(EINVAL);
|
280
|
276
|
}
|
281
|
|
- lut->lut[tcomp][val] = av_clip((int)res, min[comp], max[comp]);
|
282
|
|
- av_log(ctx, AV_LOG_DEBUG, "val[%d][%d] = %d\n", comp, val, lut->lut[tcomp][val]);
|
|
277
|
+ lut->lut[comp][val] = av_clip((int)res, min[color], max[color]);
|
|
278
|
+ av_log(ctx, AV_LOG_DEBUG, "val[%d][%d] = %d\n", comp, val, lut->lut[comp][val]);
|
283
|
279
|
}
|
284
|
280
|
}
|
285
|
281
|
|