diff mbox

[FFmpeg-devel] fate: add vf_overlay test for main source with alpha channel

Message ID 20170720154251.GA3800234@phare.normalesup.org
State New
Headers show

Commit Message

Nicolas George July 20, 2017, 3:42 p.m. UTC
Le duodi 2 thermidor, an CCXXV, Nicolas George a écrit :
>		 the attached patch.

Sorry.

Regards,

Comments

Clément Bœsch July 21, 2017, 8:46 a.m. UTC | #1
On Thu, Jul 20, 2017 at 05:42:51PM +0200, Nicolas George wrote:
[...]
> diff --git a/libavfilter/vsrc_testsrc.c b/libavfilter/vsrc_testsrc.c
> index c4a5ae3742..f94c3ed9dd 100644
> --- a/libavfilter/vsrc_testsrc.c
> +++ b/libavfilter/vsrc_testsrc.c
> @@ -66,6 +66,9 @@ typedef struct TestSourceContext {
>      /* only used by testsrc */
>      int nb_decimals;
>  
> +    /* only used by testsrc2 */
> +    int alpha;
> +
>      /* only used by color */
>      FFDrawContext draw;
>      FFDrawColor color;
> @@ -685,6 +688,7 @@ AVFilter ff_vsrc_testsrc = {
>  
>  static const AVOption testsrc2_options[] = {
>      COMMON_OPTIONS
> +    { "alpha", "set global alpha (opacity)", OFFSET(alpha), AV_OPT_TYPE_INT, {.i64 = 255}, 0, 255, FLAGS },
>      { NULL }
>  };
>  
> @@ -735,6 +739,7 @@ static void test2_fill_picture(AVFilterContext *ctx, AVFrame *frame)
>  {
>      TestSourceContext *s = ctx->priv;
>      FFDrawColor color;
> +    unsigned alpha = s->alpha << 24;

small note here: i think x<<24 is undefined for x=0xff if x is signed
diff mbox

Patch

From e50bd258ac22d5758348eafa7203f264dd98f580 Mon Sep 17 00:00:00 2001
From: Nicolas George <george@nsup.org>
Date: Thu, 20 Jul 2017 17:35:44 +0200
Subject: [PATCH] lavfi/testsrc2: fix completely transparent alpha.

Signed-off-by: Nicolas George <george@nsup.org>
---
 libavfilter/vsrc_testsrc.c | 12 +++++++++---
 1 file changed, 9 insertions(+), 3 deletions(-)

diff --git a/libavfilter/vsrc_testsrc.c b/libavfilter/vsrc_testsrc.c
index c4a5ae3742..f94c3ed9dd 100644
--- a/libavfilter/vsrc_testsrc.c
+++ b/libavfilter/vsrc_testsrc.c
@@ -66,6 +66,9 @@  typedef struct TestSourceContext {
     /* only used by testsrc */
     int nb_decimals;
 
+    /* only used by testsrc2 */
+    int alpha;
+
     /* only used by color */
     FFDrawContext draw;
     FFDrawColor color;
@@ -685,6 +688,7 @@  AVFilter ff_vsrc_testsrc = {
 
 static const AVOption testsrc2_options[] = {
     COMMON_OPTIONS
+    { "alpha", "set global alpha (opacity)", OFFSET(alpha), AV_OPT_TYPE_INT, {.i64 = 255}, 0, 255, FLAGS },
     { NULL }
 };
 
@@ -735,6 +739,7 @@  static void test2_fill_picture(AVFilterContext *ctx, AVFrame *frame)
 {
     TestSourceContext *s = ctx->priv;
     FFDrawColor color;
+    unsigned alpha = s->alpha << 24;
 
     /* colored background */
     {
@@ -746,7 +751,8 @@  static void test2_fill_picture(AVFilterContext *ctx, AVFrame *frame)
             x2 = ff_draw_round_to_sub(&s->draw, 0, 0, x2);
             set_color(s, &color, ((i & 1) ? 0xFF0000 : 0) |
                                  ((i & 2) ? 0x00FF00 : 0) |
-                                 ((i & 4) ? 0x0000FF : 0));
+                                 ((i & 4) ? 0x0000FF : 0) |
+                                 alpha);
             ff_fill_rectangle(&s->draw, &color, frame->data, frame->linesize,
                               x, 0, x2 - x, frame->height);
             x = x2;
@@ -763,7 +769,7 @@  static void test2_fill_picture(AVFilterContext *ctx, AVFrame *frame)
         g0 = av_rescale_q(s->pts, s->time_base, av_make_q(1, 128));
         for (x = 0; x < s->w; x += dx) {
             g = (av_rescale(x, 6 * 256, s->w) + g0) % (6 * 256);
-            set_color(s, &color, color_gradient(g));
+            set_color(s, &color, color_gradient(g) | alpha);
             y = y0 + av_rescale(x, s->h / 2, s->w);
             y %= 2 * (s->h - 16);
             if (y > s->h - 16)
@@ -785,7 +791,7 @@  static void test2_fill_picture(AVFilterContext *ctx, AVFrame *frame)
         int c, i;
 
         for (c = 0; c < 3; c++) {
-            set_color(s, &color, 0xBBBBBB ^ (0xFF << (c << 3)));
+            set_color(s, &color, (0xBBBBBB ^ (0xFF << (c << 3))) | alpha);
             pos = av_rescale_q(s->pts, s->time_base, av_make_q(64 >> (c << 1), cycle)) % cycle;
             xh = pos < 1 * l ? pos :
                  pos < 2 * l ? l :
-- 
2.13.2