diff options
-rw-r--r-- | bswap.h | 43 | ||||
-rw-r--r-- | libmpdemux/ebml.c | 3 | ||||
-rw-r--r-- | libmpdemux/nuppelvideo.h | 7 |
3 files changed, 47 insertions, 6 deletions
@@ -117,6 +117,37 @@ static inline uint64_t ByteSwap64(uint64_t x) #endif /* !HAVE_BYTESWAP_H */ +static float inline bswap_flt(float x) { + union {uint32_t i; float f;} u; + u.f = x; + u.i = bswap_32(u.i); + return u.f; +} + +static double inline bswap_dbl(double x) { + union {uint64_t i; double d;} u; + u.d = x; + u.i = bswap_64(u.i); + return u.d; +} + +static long double inline bswap_ldbl(long double x) { + union {char d[10]; long double ld;} uin; + union {char d[10]; long double ld;} uout; + uin.ld = x; + uout.d[0] = uin.d[9]; + uout.d[1] = uin.d[8]; + uout.d[2] = uin.d[7]; + uout.d[3] = uin.d[6]; + uout.d[4] = uin.d[5]; + uout.d[5] = uin.d[4]; + uout.d[6] = uin.d[3]; + uout.d[7] = uin.d[2]; + uout.d[8] = uin.d[1]; + uout.d[9] = uin.d[0]; + return uout.ld; +} + // be2me ... BigEndian to MachineEndian // le2me ... LittleEndian to MachineEndian @@ -127,6 +158,12 @@ static inline uint64_t ByteSwap64(uint64_t x) #define le2me_16(x) bswap_16(x) #define le2me_32(x) bswap_32(x) #define le2me_64(x) bswap_64(x) +#define be2me_flt(x) (x) +#define be2me_dbl(x) (x) +#define be2me_ldbl(x) (x) +#define le2me_flt(x) bswap_flt(x) +#define le2me_dbl(x) bswap_dbl(x) +#define le2me_ldbl(x) bswap_ldbl(x) #else #define be2me_16(x) bswap_16(x) #define be2me_32(x) bswap_32(x) @@ -134,6 +171,12 @@ static inline uint64_t ByteSwap64(uint64_t x) #define le2me_16(x) (x) #define le2me_32(x) (x) #define le2me_64(x) (x) +#define be2me_flt(x) bswap_flt(x) +#define be2me_dbl(x) bswap_dbl(x) +#define be2me_ldbl(x) bswap_ldbl(x) +#define le2me_flt(x) (x) +#define le2me_dbl(x) (x) +#define le2me_ldbl(x) (x) #endif #endif /* __BSWAP_H__ */ diff --git a/libmpdemux/ebml.c b/libmpdemux/ebml.c index 952a3894a5..89da629288 100644 --- a/libmpdemux/ebml.c +++ b/libmpdemux/ebml.c @@ -12,6 +12,7 @@ #include "stream.h" #include "ebml.h" +#include "bswap.h" /* @@ -194,7 +195,7 @@ ebml_read_float (stream_t *s, uint64_t *length) union {uint8_t data[10]; long double ld;} u; if (stream_read (s, u.data, 10) != 10) return EBML_FLOAT_INVALID; - value = u.ld; + value = be2me_ldbl(u.ld); break; } diff --git a/libmpdemux/nuppelvideo.h b/libmpdemux/nuppelvideo.h index 44c63384d5..0f89b0c6f2 100644 --- a/libmpdemux/nuppelvideo.h +++ b/libmpdemux/nuppelvideo.h @@ -92,12 +92,13 @@ typedef struct audbuffertype unsigned char *buffer_offset; } audbuffertyp; -#ifdef WORDS_BIGENDIAN #define le2me_rtfileheader(h) { \ (h)->width = le2me_32((h)->width); \ (h)->height = le2me_32((h)->height); \ (h)->desiredwidth = le2me_32((h)->desiredwidth); \ (h)->desiredheight = le2me_32((h)->desiredheight); \ + (h)->aspect = le2me_dbl((h)->aspect); \ + (h)->fps = le2me_dbl((h)->fps); \ (h)->videoblocks = le2me_32((h)->videoblocks); \ (h)->audioblocks = le2me_32((h)->audioblocks); \ (h)->textsblocks = le2me_32((h)->textsblocks); \ @@ -107,8 +108,4 @@ typedef struct audbuffertype (h)->timecode = le2me_32((h)->timecode); \ (h)->packetlength = le2me_32((h)->packetlength); \ } -#else -#define le2me_rtfileheader(h) /**/ -#define le2me_rtframeheader(h) /**/ -#endif |