v4l2-ctl: the alpha flags are mutually exclusive.
authorHans Verkuil <hans.verkuil@cisco.com>
Tue, 8 Jul 2014 07:41:23 +0000 (09:41 +0200)
committerHans Verkuil <hans.verkuil@cisco.com>
Tue, 8 Jul 2014 07:41:23 +0000 (09:41 +0200)
The alpha flags for a framebuffer are mutually exclusive. Implement
this in v4l2-ctl-overlay.cpp.

Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
utils/v4l2-ctl/v4l2-ctl-overlay.cpp

index 9e705e4..1b9a5ad 100644 (file)
@@ -366,6 +366,11 @@ void overlay_cmd(int ch, char *optarg)
        case OptSetFBuf:
                subs = optarg;
                while (*subs != '\0') {
+                       const unsigned chroma_flags = V4L2_FBUF_FLAG_CHROMAKEY |
+                                                     V4L2_FBUF_FLAG_SRC_CHROMAKEY;
+                       const unsigned alpha_flags = V4L2_FBUF_FLAG_GLOBAL_ALPHA |
+                                                    V4L2_FBUF_FLAG_LOCAL_ALPHA |
+                                                    V4L2_FBUF_FLAG_LOCAL_INV_ALPHA;
                        static const char *const subopts[] = {
                                "chromakey",
                                "src_chromakey",
@@ -378,28 +383,29 @@ void overlay_cmd(int ch, char *optarg)
 
                        switch (parse_subopt(&subs, subopts, &value)) {
                        case 0:
+                               fbuf.flags &= ~chroma_flags;
                                fbuf.flags |= strtol(value, 0L, 0) ? V4L2_FBUF_FLAG_CHROMAKEY : 0;
-                               set_fbuf |= V4L2_FBUF_FLAG_CHROMAKEY;
-                               fbuf.flags &= ~V4L2_FBUF_FLAG_SRC_CHROMAKEY;
-                               set_fbuf &= ~V4L2_FBUF_FLAG_SRC_CHROMAKEY;
+                               set_fbuf |= chroma_flags;
                                break;
                        case 1:
+                               fbuf.flags &= ~chroma_flags;
                                fbuf.flags |= strtol(value, 0L, 0) ? V4L2_FBUF_FLAG_SRC_CHROMAKEY : 0;
-                               set_fbuf |= V4L2_FBUF_FLAG_SRC_CHROMAKEY;
-                               fbuf.flags &= ~V4L2_FBUF_FLAG_CHROMAKEY;
-                               set_fbuf &= ~V4L2_FBUF_FLAG_CHROMAKEY;
+                               set_fbuf |= chroma_flags;
                                break;
                        case 2:
+                               fbuf.flags &= ~alpha_flags;
                                fbuf.flags |= strtol(value, 0L, 0) ? V4L2_FBUF_FLAG_GLOBAL_ALPHA : 0;
-                               set_fbuf |= V4L2_FBUF_FLAG_GLOBAL_ALPHA;
+                               set_fbuf |= alpha_flags;
                                break;
                        case 3:
+                               fbuf.flags &= ~alpha_flags;
                                fbuf.flags |= strtol(value, 0L, 0) ? V4L2_FBUF_FLAG_LOCAL_ALPHA : 0;
-                               set_fbuf |= V4L2_FBUF_FLAG_LOCAL_ALPHA;
+                               set_fbuf |= alpha_flags;
                                break;
                        case 4:
+                               fbuf.flags &= ~alpha_flags;
                                fbuf.flags |= strtol(value, 0L, 0) ? V4L2_FBUF_FLAG_LOCAL_INV_ALPHA : 0;
-                               set_fbuf |= V4L2_FBUF_FLAG_LOCAL_INV_ALPHA;
+                               set_fbuf |= alpha_flags;
                                break;
                        case 5:
                                fb_device = value;