Browse code

avfilter/vf_drawbox: add alpha pixel formats support

Signed-off-by: Paul B Mahol <onemda@gmail.com>

Paul B Mahol authored on 2016/02/15 19:38:22
Showing 1 changed files
... ...
@@ -79,6 +79,7 @@ typedef struct DrawBoxContext {
79 79
     char *x_expr, *y_expr; ///< expression for x and y
80 80
     char *w_expr, *h_expr; ///< expression for width and height
81 81
     char *t_expr;          ///< expression for thickness
82
+    int have_alpha;
82 83
 } DrawBoxContext;
83 84
 
84 85
 static const int NUM_EXPR_EVALS = 5;
... ...
@@ -110,6 +111,7 @@ static int query_formats(AVFilterContext *ctx)
110 110
         AV_PIX_FMT_YUV411P,  AV_PIX_FMT_YUV410P,
111 111
         AV_PIX_FMT_YUVJ444P, AV_PIX_FMT_YUVJ422P, AV_PIX_FMT_YUVJ420P,
112 112
         AV_PIX_FMT_YUV440P,  AV_PIX_FMT_YUVJ440P,
113
+        AV_PIX_FMT_YUVA420P, AV_PIX_FMT_YUVA422P, AV_PIX_FMT_YUVA444P,
113 114
         AV_PIX_FMT_NONE
114 115
     };
115 116
     AVFilterFormats *fmts_list = ff_make_format_list(pix_fmts);
... ...
@@ -130,6 +132,7 @@ static int config_input(AVFilterLink *inlink)
130 130
 
131 131
     s->hsub = desc->log2_chroma_w;
132 132
     s->vsub = desc->log2_chroma_h;
133
+    s->have_alpha = desc->flags & AV_PIX_FMT_FLAG_ALPHA;
133 134
 
134 135
     var_values[VAR_IN_H] = var_values[VAR_IH] = inlink->h;
135 136
     var_values[VAR_IN_W] = var_values[VAR_IW] = inlink->w;
... ...
@@ -210,6 +213,33 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *frame)
210 210
     int plane, x, y, xb = s->x, yb = s->y;
211 211
     unsigned char *row[4];
212 212
 
213
+    if (s->have_alpha) {
214
+        for (y = FFMAX(yb, 0); y < frame->height && y < (yb + s->h); y++) {
215
+            row[0] = frame->data[0] + y * frame->linesize[0];
216
+            row[3] = frame->data[3] + y * frame->linesize[3];
217
+
218
+            for (plane = 1; plane < 3; plane++)
219
+                row[plane] = frame->data[plane] +
220
+                     frame->linesize[plane] * (y >> s->vsub);
221
+
222
+            if (s->invert_color) {
223
+                for (x = FFMAX(xb, 0); x < xb + s->w && x < frame->width; x++)
224
+                    if ((y - yb < s->thickness) || (yb + s->h - 1 - y < s->thickness) ||
225
+                        (x - xb < s->thickness) || (xb + s->w - 1 - x < s->thickness))
226
+                        row[0][x] = 0xff - row[0][x];
227
+            } else {
228
+                for (x = FFMAX(xb, 0); x < xb + s->w && x < frame->width; x++) {
229
+                    if ((y - yb < s->thickness) || (yb + s->h - 1 - y < s->thickness) ||
230
+                        (x - xb < s->thickness) || (xb + s->w - 1 - x < s->thickness)) {
231
+                        row[0][x           ] = s->yuv_color[Y];
232
+                        row[1][x >> s->hsub] = s->yuv_color[U];
233
+                        row[2][x >> s->hsub] = s->yuv_color[V];
234
+                        row[3][x           ] = s->yuv_color[A];
235
+                    }
236
+                }
237
+            }
238
+        }
239
+    } else {
213 240
     for (y = FFMAX(yb, 0); y < frame->height && y < (yb + s->h); y++) {
214 241
         row[0] = frame->data[0] + y * frame->linesize[0];
215 242
 
... ...
@@ -235,6 +265,7 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *frame)
235 235
             }
236 236
         }
237 237
     }
238
+    }
238 239
 
239 240
     return ff_filter_frame(inlink->dst->outputs[0], frame);
240 241
 }
... ...
@@ -323,6 +354,31 @@ static int drawgrid_filter_frame(AVFilterLink *inlink, AVFrame *frame)
323 323
     int plane, x, y;
324 324
     uint8_t *row[4];
325 325
 
326
+    if (drawgrid->have_alpha) {
327
+        for (y = 0; y < frame->height; y++) {
328
+            row[0] = frame->data[0] + y * frame->linesize[0];
329
+            row[3] = frame->data[3] + y * frame->linesize[3];
330
+
331
+            for (plane = 1; plane < 3; plane++)
332
+                row[plane] = frame->data[plane] +
333
+                     frame->linesize[plane] * (y >> drawgrid->vsub);
334
+
335
+            if (drawgrid->invert_color) {
336
+                for (x = 0; x < frame->width; x++)
337
+                    if (pixel_belongs_to_grid(drawgrid, x, y))
338
+                        row[0][x] = 0xff - row[0][x];
339
+            } else {
340
+                for (x = 0; x < frame->width; x++) {
341
+                    if (pixel_belongs_to_grid(drawgrid, x, y)) {
342
+                        row[0][x                  ] = drawgrid->yuv_color[Y];
343
+                        row[1][x >> drawgrid->hsub] = drawgrid->yuv_color[U];
344
+                        row[2][x >> drawgrid->hsub] = drawgrid->yuv_color[V];
345
+                        row[3][x                  ] = drawgrid->yuv_color[A];
346
+                    }
347
+                }
348
+            }
349
+        }
350
+    } else {
326 351
     for (y = 0; y < frame->height; y++) {
327 352
         row[0] = frame->data[0] + y * frame->linesize[0];
328 353
 
... ...
@@ -346,6 +402,7 @@ static int drawgrid_filter_frame(AVFilterLink *inlink, AVFrame *frame)
346 346
             }
347 347
         }
348 348
     }
349
+    }
349 350
 
350 351
     return ff_filter_frame(inlink->dst->outputs[0], frame);
351 352
 }