blob: 36140571cd650ec077413b027fbf0404745cc383
1 | /* |
2 | * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at> |
3 | * |
4 | * This file is part of FFmpeg. |
5 | * |
6 | * FFmpeg is free software; you can redistribute it and/or |
7 | * modify it under the terms of the GNU Lesser General Public |
8 | * License as published by the Free Software Foundation; either |
9 | * version 2.1 of the License, or (at your option) any later version. |
10 | * |
11 | * FFmpeg is distributed in the hope that it will be useful, |
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
14 | * Lesser General Public License for more details. |
15 | * |
16 | * You should have received a copy of the GNU Lesser General Public |
17 | * License along with FFmpeg; if not, write to the Free Software |
18 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
19 | */ |
20 | |
21 | /** |
22 | * @file libavutil/bswap.h |
23 | * byte swapping routines |
24 | */ |
25 | |
26 | #ifndef AVUTIL_BSWAP_H |
27 | #define AVUTIL_BSWAP_H |
28 | |
29 | #ifdef __MW__ |
30 | #define inline __inline |
31 | #include <core/types.h> |
32 | #else |
33 | #include <stdint.h> |
34 | #endif |
35 | #include "common.h" |
36 | #include <stdint.h> |
37 | |
38 | #ifndef bswap_16 |
39 | static av_always_inline av_const uint16_t bswap_16(uint16_t x) |
40 | { |
41 | x = (x >> 8) | (x << 8); |
42 | return x; |
43 | } |
44 | #endif |
45 | |
46 | #ifndef bswap_32 |
47 | static av_always_inline av_const uint32_t bswap_32(uint32_t x) |
48 | { |
49 | x = ((x << 8) & 0xFF00FF00) | ((x >> 8) & 0x00FF00FF); |
50 | x = (x >> 16) | (x << 16); |
51 | return x; |
52 | } |
53 | #endif |
54 | |
55 | #ifndef bswap_64 |
56 | static inline uint64_t av_const bswap_64(uint64_t x) |
57 | { |
58 | #if 0 |
59 | x = ((x << 8) & 0xFF00FF00FF00FF00ULL) | ((x >> 8) & 0x00FF00FF00FF00FFULL); |
60 | x = ((x << 16) & 0xFFFF0000FFFF0000ULL) | ((x >> 16) & 0x0000FFFF0000FFFFULL); |
61 | return (x >> 32) | (x << 32); |
62 | #else |
63 | union { |
64 | uint64_t ll; |
65 | uint32_t l[2]; |
66 | } w, r; |
67 | w.ll = x; |
68 | r.l[0] = bswap_32(w.l[1]); |
69 | r.l[1] = bswap_32(w.l[0]); |
70 | return r.ll; |
71 | #endif |
72 | } |
73 | #endif |
74 | |
75 | // be2me ... big-endian to machine-endian |
76 | // le2me ... little-endian to machine-endian |
77 | |
78 | #if HAVE_BIGENDIAN |
79 | #define be2me_16(x) (x) |
80 | #define be2me_32(x) (x) |
81 | #define be2me_64(x) (x) |
82 | #define le2me_16(x) bswap_16(x) |
83 | #define le2me_32(x) bswap_32(x) |
84 | #define le2me_64(x) bswap_64(x) |
85 | #else |
86 | #define be2me_16(x) bswap_16(x) |
87 | #define be2me_32(x) bswap_32(x) |
88 | #define be2me_64(x) bswap_64(x) |
89 | #define le2me_16(x) (x) |
90 | #define le2me_32(x) (x) |
91 | #define le2me_64(x) (x) |
92 | #endif |
93 | |
94 | #endif /* AVUTIL_BSWAP_H */ |
95 |