]> granicus.if.org Git - strace/commitdiff
v4l2: v4l2_fourcc is endianness-agnostic
authorEugene Syromyatnikov <evgsyr@gmail.com>
Thu, 1 Mar 2018 23:45:16 +0000 (00:45 +0100)
committerDmitry V. Levin <ldv@altlinux.org>
Fri, 2 Mar 2018 16:02:20 +0000 (16:02 +0000)
v4l2_fourcc(a, b, c, d) is defined as (a | (b << 8) | (c << 16) | (d << 24)
regardless of endianness (no mnemonic on big-endian architectures),
so we don't need special handling for WORDS_BIGENDIAN both in decoder
and in the test.

* v4l2.c (print_pixelformat): Change initialisation to a simple
assignment of character array.
* tests/ioctl_v4l2.c [WORDS_BIGENDIAN]: Remove.
* NEWS: Mention this fix.

Co-Authored-by: Dmitry V. Levin <ldv@altlinux.org>
Fixes: v4.10~371 "Implement Video4Linux video-input ioctls decoder"
NEWS
tests/ioctl_v4l2.c
v4l2.c

diff --git a/NEWS b/NEWS
index c0874912b55ec717b4e2381a55a23ff3422c637c..cd2f1928b0f10ea7cae7d882c8150b119241242a 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -18,6 +18,7 @@ Noteworthy changes in release ?.?? (????-??-??)
 
 * Bug fixes
   * Fixed build on m68k.
+  * Fixed v4l2 pixelformat decoding on big-endian architectures.
 
 Noteworthy changes in release 4.21 (2018-02-13)
 ===============================================
index 47a538e4cb9deec9d10ba5b043ed52e90851913f..4d5745e4035e861c3dc33f2d76bd4acda1c4cb56 100644 (file)
 #include <linux/types.h>
 #include <linux/videodev2.h>
 
-#if WORDS_BIGENDIAN
-# define cc0(arg) ((unsigned int) (unsigned char) ((unsigned int) (arg) >> 24))
-# define cc1(arg) ((unsigned int) (unsigned char) ((unsigned int) (arg) >> 16))
-# define cc2(arg) ((unsigned int) (unsigned char) ((unsigned int) (arg) >> 8))
-# define cc3(arg) ((unsigned int) (unsigned char) (arg))
-# define fourcc(a0, a1, a2, a3) \
-       ((unsigned int)(a3) | \
-        ((unsigned int)(a2) << 8) | \
-        ((unsigned int)(a1) << 16) | \
-        ((unsigned int)(a0) << 24))
-#else
-# define cc0(arg) ((unsigned int) (unsigned char) (arg))
-# define cc1(arg) ((unsigned int) (unsigned char) ((unsigned int) (arg) >> 8))
-# define cc2(arg) ((unsigned int) (unsigned char) ((unsigned int) (arg) >> 16))
-# define cc3(arg) ((unsigned int) (unsigned char) ((unsigned int) (arg) >> 24))
-# define fourcc(a0, a1, a2, a3) \
+#define cc0(arg) ((unsigned int) (unsigned char) (arg))
+#define cc1(arg) ((unsigned int) (unsigned char) ((unsigned int) (arg) >> 8))
+#define cc2(arg) ((unsigned int) (unsigned char) ((unsigned int) (arg) >> 16))
+#define cc3(arg) ((unsigned int) (unsigned char) ((unsigned int) (arg) >> 24))
+#define fourcc(a0, a1, a2, a3) \
        ((unsigned int)(a0) | \
         ((unsigned int)(a1) << 8) | \
         ((unsigned int)(a2) << 16) | \
         ((unsigned int)(a3) << 24))
-#endif
 
 static const unsigned int magic = 0xdeadbeef;
 
diff --git a/v4l2.c b/v4l2.c
index d8d5e7746b5218f6ccd1eed366a18e0314a1bf07..6a89bf416e32df25d6306998722963437856d907 100644 (file)
--- a/v4l2.c
+++ b/v4l2.c
@@ -84,26 +84,17 @@ typedef struct v4l2_standard struct_v4l2_standard;
 static void
 print_pixelformat(uint32_t fourcc)
 {
-       const union {
-               uint32_t pixelformat;
-               unsigned char cc[sizeof(uint32_t)];
-       } u = {
-#if WORDS_BIGENDIAN
-               .cc = {
-                       (unsigned char) (fourcc >> 24),
-                       (unsigned char) (fourcc >> 16),
-                       (unsigned char) (fourcc >> 8),
-                       (unsigned char) fourcc
-               }
-#else
-               .pixelformat = fourcc
-#endif
+       unsigned char a[] = {
+               (unsigned char) fourcc,
+               (unsigned char) (fourcc >> 8),
+               (unsigned char) (fourcc >> 16),
+               (unsigned char) (fourcc >> 24),
        };
        unsigned int i;
 
        tprints("v4l2_fourcc(");
-       for (i = 0; i < sizeof(u.cc); ++i) {
-               unsigned char c = u.cc[i];
+       for (i = 0; i < ARRAY_SIZE(a); ++i) {
+               unsigned char c = a[i];
 
                if (i)
                        tprints(", ");