Browse code

lavfi/lut: fix component -> rgba mapping

Stefano Sabatini authored on 2012/05/31 17:11:09
Showing 1 changed files
... ...
@@ -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