From: Eugene Syromyatnikov Date: Thu, 1 Mar 2018 23:45:16 +0000 (+0100) Subject: v4l2: v4l2_fourcc is endianness-agnostic X-Git-Tag: v4.22~131 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b82706f412ba897c3b265caadefbb2cabe852d75;p=strace v4l2: v4l2_fourcc is endianness-agnostic 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 Fixes: v4.10~371 "Implement Video4Linux video-input ioctls decoder" --- diff --git a/NEWS b/NEWS index c0874912..cd2f1928 100644 --- 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) =============================================== diff --git a/tests/ioctl_v4l2.c b/tests/ioctl_v4l2.c index 47a538e4..4d5745e4 100644 --- a/tests/ioctl_v4l2.c +++ b/tests/ioctl_v4l2.c @@ -33,27 +33,15 @@ #include #include -#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 d8d5e774..6a89bf41 100644 --- 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(", ");