1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2025-03-23 04:24:35 +02:00

lavfi/lut: fix component -> rgba mapping

This commit is contained in:
Stefano Sabatini 2012-05-31 10:11:09 +02:00
parent 8b0e173529
commit f3fea5bab1

View File

@ -60,7 +60,6 @@ typedef struct {
int hsub, vsub; int hsub, vsub;
double var_values[VAR_VARS_NB]; double var_values[VAR_VARS_NB];
int is_rgb, is_yuv; int is_rgb, is_yuv;
int rgba_map[4];
int step; int step;
int negate_alpha; /* only used by negate */ int negate_alpha; /* only used by negate */
} LutContext; } LutContext;
@ -199,6 +198,7 @@ static int config_props(AVFilterLink *inlink)
AVFilterContext *ctx = inlink->dst; AVFilterContext *ctx = inlink->dst;
LutContext *lut = ctx->priv; LutContext *lut = ctx->priv;
const AVPixFmtDescriptor *desc = &av_pix_fmt_descriptors[inlink->format]; const AVPixFmtDescriptor *desc = &av_pix_fmt_descriptors[inlink->format];
int rgba_map[4]; /* component index -> RGBA color index map */
int min[4], max[4]; int min[4], max[4];
int val, comp, ret; int val, comp, ret;
@ -232,54 +232,50 @@ static int config_props(AVFilterLink *inlink)
if (lut->is_rgb) { if (lut->is_rgb) {
switch (inlink->format) { switch (inlink->format) {
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; case PIX_FMT_ARGB: rgba_map[0] = A; rgba_map[1] = R; rgba_map[2] = G; rgba_map[3] = B; break;
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; case PIX_FMT_ABGR: rgba_map[0] = A; rgba_map[1] = B; rgba_map[2] = G; rgba_map[3] = R; break;
case PIX_FMT_RGBA: case PIX_FMT_RGBA:
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; case PIX_FMT_RGB24: rgba_map[0] = R; rgba_map[1] = G; rgba_map[2] = B; rgba_map[3] = A; break;
case PIX_FMT_BGRA: case PIX_FMT_BGRA:
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; case PIX_FMT_BGR24: rgba_map[0] = B; rgba_map[1] = G; rgba_map[2] = R; rgba_map[3] = A; break;
} }
lut->step = av_get_bits_per_pixel(desc) >> 3; lut->step = av_get_bits_per_pixel(desc) >> 3;
} }
for (comp = 0; comp < desc->nb_components; comp++) { for (comp = 0; comp < desc->nb_components; comp++) {
double res; double res;
int tcomp; int color = lut->is_rgb ? rgba_map[comp] : comp;
if (lut->is_rgb) {
for (tcomp = 0; lut->rgba_map[tcomp] != comp; tcomp++)
;
} else
tcomp = comp;
/* create the parsed expression */ /* create the parsed expression */
ret = av_expr_parse(&lut->comp_expr[comp], lut->comp_expr_str[comp], ret = av_expr_parse(&lut->comp_expr[color], lut->comp_expr_str[color],
var_names, funcs1_names, funcs1, NULL, NULL, 0, ctx); var_names, funcs1_names, funcs1, NULL, NULL, 0, ctx);
if (ret < 0) { if (ret < 0) {
av_log(ctx, AV_LOG_ERROR, av_log(ctx, AV_LOG_ERROR,
"Error when parsing the expression '%s' for the component %d.\n", "Error when parsing the expression '%s' for the component %d and color %d.\n",
lut->comp_expr_str[comp], comp); lut->comp_expr_str[comp], comp, color);
return AVERROR(EINVAL); return AVERROR(EINVAL);
} }
/* compute the lut */ /* compute the lut */
lut->var_values[VAR_MAXVAL] = max[comp]; lut->var_values[VAR_MAXVAL] = max[color];
lut->var_values[VAR_MINVAL] = min[comp]; lut->var_values[VAR_MINVAL] = min[color];
for (val = 0; val < 256; val++) { for (val = 0; val < 256; val++) {
lut->var_values[VAR_VAL] = val; lut->var_values[VAR_VAL] = val;
lut->var_values[VAR_CLIPVAL] = av_clip(val, min[comp], max[comp]); lut->var_values[VAR_CLIPVAL] = av_clip(val, min[color], max[color]);
lut->var_values[VAR_NEGVAL] = lut->var_values[VAR_NEGVAL] =
av_clip(min[comp] + max[comp] - lut->var_values[VAR_VAL], av_clip(min[color] + max[color] - lut->var_values[VAR_VAL],
min[comp], max[comp]); min[color], max[color]);
res = av_expr_eval(lut->comp_expr[comp], lut->var_values, lut); res = av_expr_eval(lut->comp_expr[color], lut->var_values, lut);
if (isnan(res)) { if (isnan(res)) {
av_log(ctx, AV_LOG_ERROR, av_log(ctx, AV_LOG_ERROR,
"Error when evaluating the expression '%s' for the value %d for the component #%d.\n", "Error when evaluating the expression '%s' for the value %d for the component %d.\n",
lut->comp_expr_str[comp], val, comp); lut->comp_expr_str[color], val, comp);
return AVERROR(EINVAL); return AVERROR(EINVAL);
} }
lut->lut[tcomp][val] = av_clip((int)res, min[comp], max[comp]); lut->lut[comp][val] = av_clip((int)res, min[color], max[color]);
av_log(ctx, AV_LOG_DEBUG, "val[%d][%d] = %d\n", comp, val, lut->lut[tcomp][val]); av_log(ctx, AV_LOG_DEBUG, "val[%d][%d] = %d\n", comp, val, lut->lut[comp][val]);
} }
} }