Signed-off-by: Paul B Mahol <onemda@gmail.com>
Paul B Mahol authored on 2016/02/15 19:38:22... | ... |
@@ -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 |
} |