[Ffmpeg-devel] [PATCH] move BE/LE macros to libavutil

Reimar Döffinger Reimar.Doeffinger
Sun Dec 3 15:49:23 CET 2006


Hello,
On Sun, Nov 19, 2006 at 05:38:50PM +0100, Michael Niedermayer wrote:
> On Sun, Nov 19, 2006 at 12:44:24PM +0100, Reimar D?ffinger wrote:
> > do you think this is okay, as in the attached patch? I already know a
> > few place in MPlayer that could avoid code duplication with that.
> > Though I also wonder if they should have a FF prefix (though they seem
> > to be constructed to allow them to be overridden by defines in system
> > headers?).
> > Any comments?
> 
> yes, there are read/write 16/32/64 little/big/native endian cases
> we have BE_* LE_* ST* LD* unaligned* and probably more
> IMHO we should first clean these up inside lavc before exporting them

Would maybe attached patch be acceptable? It does not really clean them
up, but neither does it export them. At least it collects them all in
one place.

Greetings,
Reimar D?ffinger
-------------- next part --------------
Index: libavutil/intreadwrite.h
===================================================================
--- libavutil/intreadwrite.h	(revision 0)
+++ libavutil/intreadwrite.h	(revision 0)
@@ -0,0 +1,42 @@
+#ifndef INTREADWRITE_H
+#define INTREADWRITE_H
+
+#ifdef __GNUC__
+
+struct unaligned_64 { uint64_t l; } __attribute__((packed));
+struct unaligned_32 { uint32_t l; } __attribute__((packed));
+struct unaligned_16 { uint16_t l; } __attribute__((packed));
+
+#define LD16(a) (((const struct unaligned_16 *) (a))->l)
+#define LD32(a) (((const struct unaligned_32 *) (a))->l)
+#define LD64(a) (((const struct unaligned_64 *) (a))->l)
+
+#define ST16(a, b) (((struct unaligned_16 *) (a))->l) = (b)
+#define ST32(a, b) (((struct unaligned_32 *) (a))->l) = (b)
+
+#else /* __GNUC__ */
+
+#define LD16(a) (*((uint16_t*)(a)))
+#define LD32(a) (*((uint32_t*)(a)))
+#define LD64(a) (*((uint64_t*)(a)))
+
+#define ST16(a, b) *((uint16_t*)(a)) = (b)
+#define ST32(a, b) *((uint32_t*)(a)) = (b)
+
+#endif /* !__GNUC__ */
+
+/* endian macros */
+#if !defined(BE_16) || !defined(BE_32) || !defined(LE_16) || !defined(LE_32)
+#define BE_16(x)  ((((uint8_t*)(x))[0] << 8) | ((uint8_t*)(x))[1])
+#define BE_32(x)  ((((uint8_t*)(x))[0] << 24) | \
+                   (((uint8_t*)(x))[1] << 16) | \
+                   (((uint8_t*)(x))[2] << 8) | \
+                    ((uint8_t*)(x))[3])
+#define LE_16(x)  ((((uint8_t*)(x))[1] << 8) | ((uint8_t*)(x))[0])
+#define LE_32(x)  ((((uint8_t*)(x))[3] << 24) | \
+                   (((uint8_t*)(x))[2] << 16) | \
+                   (((uint8_t*)(x))[1] << 8) | \
+                    ((uint8_t*)(x))[0])
+#endif
+
+#endif /* INTREADWRITE_H */
Index: libavutil/internal.h
===================================================================
--- libavutil/internal.h	(revision 7217)
+++ libavutil/internal.h	(working copy)
@@ -34,6 +34,7 @@
 #    define ENODATA  61
 #endif
 
+#include "intreadwrite.h"
 #include "bswap.h"
 
 #include <stddef.h>
Index: libavcodec/dsputil.h
===================================================================
--- libavcodec/dsputil.h	(revision 7217)
+++ libavcodec/dsputil.h	(working copy)
@@ -590,30 +590,6 @@
 
 #endif
 
-#ifdef __GNUC__
-
-struct unaligned_64 { uint64_t l; } __attribute__((packed));
-struct unaligned_32 { uint32_t l; } __attribute__((packed));
-struct unaligned_16 { uint16_t l; } __attribute__((packed));
-
-#define LD16(a) (((const struct unaligned_16 *) (a))->l)
-#define LD32(a) (((const struct unaligned_32 *) (a))->l)
-#define LD64(a) (((const struct unaligned_64 *) (a))->l)
-
-#define ST16(a, b) (((struct unaligned_16 *) (a))->l) = (b)
-#define ST32(a, b) (((struct unaligned_32 *) (a))->l) = (b)
-
-#else /* __GNUC__ */
-
-#define LD16(a) (*((uint16_t*)(a)))
-#define LD32(a) (*((uint32_t*)(a)))
-#define LD64(a) (*((uint64_t*)(a)))
-
-#define ST16(a, b) *((uint16_t*)(a)) = (b)
-#define ST32(a, b) *((uint32_t*)(a)) = (b)
-
-#endif /* !__GNUC__ */
-
 /* PSNR */
 void get_psnr(uint8_t *orig_image[3], uint8_t *coded_image[3],
               int orig_linesize[3], int coded_linesize,
Index: libavcodec/avcodec.h
===================================================================
--- libavcodec/avcodec.h	(revision 7217)
+++ libavcodec/avcodec.h	(working copy)
@@ -2684,20 +2684,6 @@
 int img_pad(AVPicture *dst, const AVPicture *src, int height, int width, int pix_fmt,
             int padtop, int padbottom, int padleft, int padright, int *color);
 
-/* endian macros */
-#if !defined(BE_16) || !defined(BE_32) || !defined(LE_16) || !defined(LE_32)
-#define BE_16(x)  ((((uint8_t*)(x))[0] << 8) | ((uint8_t*)(x))[1])
-#define BE_32(x)  ((((uint8_t*)(x))[0] << 24) | \
-                   (((uint8_t*)(x))[1] << 16) | \
-                   (((uint8_t*)(x))[2] << 8) | \
-                    ((uint8_t*)(x))[3])
-#define LE_16(x)  ((((uint8_t*)(x))[1] << 8) | ((uint8_t*)(x))[0])
-#define LE_32(x)  ((((uint8_t*)(x))[3] << 24) | \
-                   (((uint8_t*)(x))[2] << 16) | \
-                   (((uint8_t*)(x))[1] << 8) | \
-                    ((uint8_t*)(x))[0])
-#endif
-
 extern unsigned int av_xiphlacing(unsigned char *s, unsigned int v);
 
 #ifdef __cplusplus



More information about the ffmpeg-devel mailing list