ffmpeg / libavutil / intreadwrite.h @ b76e3424
History | View | Annotate | Download (7.42 KB)
1 | f5a90186 | Diego Biurrun | /*
|
---|---|---|---|
2 | * This file is part of FFmpeg.
|
||
3 | *
|
||
4 | * FFmpeg is free software; you can redistribute it and/or
|
||
5 | * modify it under the terms of the GNU Lesser General Public
|
||
6 | * License as published by the Free Software Foundation; either
|
||
7 | * version 2.1 of the License, or (at your option) any later version.
|
||
8 | *
|
||
9 | * FFmpeg is distributed in the hope that it will be useful,
|
||
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||
12 | * Lesser General Public License for more details.
|
||
13 | *
|
||
14 | * You should have received a copy of the GNU Lesser General Public
|
||
15 | * License along with FFmpeg; if not, write to the Free Software
|
||
16 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||
17 | */
|
||
18 | |||
19 | 5b21bdab | Diego Biurrun | #ifndef FFMPEG_INTREADWRITE_H
|
20 | #define FFMPEG_INTREADWRITE_H
|
||
21 | cf1e119b | Reimar Döffinger | |
22 | 99545457 | Måns Rullgård | #include <stdint.h> |
23 | a087028a | Diego Biurrun | #include "config.h" |
24 | c08be350 | Reimar Döffinger | #include "bswap.h" |
25 | 99545457 | Måns Rullgård | |
26 | cf1e119b | Reimar Döffinger | #ifdef __GNUC__
|
27 | |||
28 | struct unaligned_64 { uint64_t l; } __attribute__((packed));
|
||
29 | struct unaligned_32 { uint32_t l; } __attribute__((packed));
|
||
30 | struct unaligned_16 { uint16_t l; } __attribute__((packed));
|
||
31 | |||
32 | 905694d9 | Roman Shaposhnik | #define AV_RN16(a) (((const struct unaligned_16 *) (a))->l) |
33 | #define AV_RN32(a) (((const struct unaligned_32 *) (a))->l) |
||
34 | #define AV_RN64(a) (((const struct unaligned_64 *) (a))->l) |
||
35 | cf1e119b | Reimar Döffinger | |
36 | 905694d9 | Roman Shaposhnik | #define AV_WN16(a, b) (((struct unaligned_16 *) (a))->l) = (b) |
37 | #define AV_WN32(a, b) (((struct unaligned_32 *) (a))->l) = (b) |
||
38 | #define AV_WN64(a, b) (((struct unaligned_64 *) (a))->l) = (b) |
||
39 | cf1e119b | Reimar Döffinger | |
40 | b7b38fb2 | Måns Rullgård | #elif defined(__DECC)
|
41 | |||
42 | #define AV_RN16(a) (*((const __unaligned uint16_t*)(a))) |
||
43 | #define AV_RN32(a) (*((const __unaligned uint32_t*)(a))) |
||
44 | #define AV_RN64(a) (*((const __unaligned uint64_t*)(a))) |
||
45 | |||
46 | #define AV_WN16(a, b) *((__unaligned uint16_t*)(a)) = (b)
|
||
47 | #define AV_WN32(a, b) *((__unaligned uint32_t*)(a)) = (b)
|
||
48 | #define AV_WN64(a, b) *((__unaligned uint64_t*)(a)) = (b)
|
||
49 | |||
50 | #else
|
||
51 | cf1e119b | Reimar Döffinger | |
52 | ff794171 | Michael Niedermayer | #define AV_RN16(a) (*((const uint16_t*)(a))) |
53 | #define AV_RN32(a) (*((const uint32_t*)(a))) |
||
54 | #define AV_RN64(a) (*((const uint64_t*)(a))) |
||
55 | cf1e119b | Reimar Döffinger | |
56 | 905694d9 | Roman Shaposhnik | #define AV_WN16(a, b) *((uint16_t*)(a)) = (b)
|
57 | #define AV_WN32(a, b) *((uint32_t*)(a)) = (b)
|
||
58 | #define AV_WN64(a, b) *((uint64_t*)(a)) = (b)
|
||
59 | cf1e119b | Reimar Döffinger | |
60 | #endif /* !__GNUC__ */ |
||
61 | |||
62 | /* endian macros */
|
||
63 | ff794171 | Michael Niedermayer | #define AV_RB8(x) (((const uint8_t*)(x))[0]) |
64 | 803ca89c | Jindřich Makovička | #define AV_WB8(p, d) do { ((uint8_t*)(p))[0] = (d); } while(0) |
65 | a3550abd | Alex Beregszaszi | |
66 | 85b1a722 | Diego Biurrun | #define AV_RL8(x) AV_RB8(x)
|
67 | #define AV_WL8(p, d) AV_WB8(p, d)
|
||
68 | |||
69 | 7b829d2a | Ramiro Polla | #ifdef HAVE_FAST_UNALIGNED
|
70 | # ifdef WORDS_BIGENDIAN
|
||
71 | 905694d9 | Roman Shaposhnik | # define AV_RB16(x) AV_RN16(x)
|
72 | # define AV_WB16(p, d) AV_WN16(p, d)
|
||
73 | 7b829d2a | Ramiro Polla | |
74 | 905694d9 | Roman Shaposhnik | # define AV_RL16(x) bswap_16(AV_RN16(x))
|
75 | # define AV_WL16(p, d) AV_WN16(p, bswap_16(d))
|
||
76 | fbbea48e | Måns Rullgård | |
77 | # define AV_RB32(x) AV_RN32(x)
|
||
78 | # define AV_WB32(p, d) AV_WN32(p, d)
|
||
79 | |||
80 | # define AV_RL32(x) bswap_32(AV_RN32(x))
|
||
81 | # define AV_WL32(p, d) AV_WN32(p, bswap_32(d))
|
||
82 | |||
83 | # define AV_RB64(x) AV_RN64(x)
|
||
84 | # define AV_WB64(p, d) AV_WN64(p, d)
|
||
85 | |||
86 | # define AV_RL64(x) bswap_64(AV_RN64(x))
|
||
87 | # define AV_WL64(p, d) AV_WN64(p, bswap_64(d))
|
||
88 | 7b829d2a | Ramiro Polla | # else /* WORDS_BIGENDIAN */ |
89 | 905694d9 | Roman Shaposhnik | # define AV_RB16(x) bswap_16(AV_RN16(x))
|
90 | # define AV_WB16(p, d) AV_WN16(p, bswap_16(d))
|
||
91 | 7b829d2a | Ramiro Polla | |
92 | 905694d9 | Roman Shaposhnik | # define AV_RL16(x) AV_RN16(x)
|
93 | # define AV_WL16(p, d) AV_WN16(p, d)
|
||
94 | fbbea48e | Måns Rullgård | |
95 | # define AV_RB32(x) bswap_32(AV_RN32(x))
|
||
96 | # define AV_WB32(p, d) AV_WN32(p, bswap_32(d))
|
||
97 | |||
98 | # define AV_RL32(x) AV_RN32(x)
|
||
99 | # define AV_WL32(p, d) AV_WN32(p, d)
|
||
100 | |||
101 | # define AV_RB64(x) bswap_64(AV_RN64(x))
|
||
102 | # define AV_WB64(p, d) AV_WN64(p, bswap_64(d))
|
||
103 | |||
104 | # define AV_RL64(x) AV_RN64(x)
|
||
105 | # define AV_WL64(p, d) AV_WN64(p, d)
|
||
106 | 7b829d2a | Ramiro Polla | # endif
|
107 | #else /* HAVE_FAST_UNALIGNED */ |
||
108 | ff794171 | Michael Niedermayer | #define AV_RB16(x) ((((const uint8_t*)(x))[0] << 8) | ((const uint8_t*)(x))[1]) |
109 | 803ca89c | Jindřich Makovička | #define AV_WB16(p, d) do { \ |
110 | 7d4495da | Michael Niedermayer | ((uint8_t*)(p))[1] = (d); \
|
111 | 803ca89c | Jindřich Makovička | ((uint8_t*)(p))[0] = (d)>>8; } while(0) |
112 | a3550abd | Alex Beregszaszi | |
113 | ff794171 | Michael Niedermayer | #define AV_RL16(x) ((((const uint8_t*)(x))[1] << 8) | \ |
114 | ((const uint8_t*)(x))[0]) |
||
115 | 803ca89c | Jindřich Makovička | #define AV_WL16(p, d) do { \ |
116 | 85b1a722 | Diego Biurrun | ((uint8_t*)(p))[0] = (d); \
|
117 | 803ca89c | Jindřich Makovička | ((uint8_t*)(p))[1] = (d)>>8; } while(0) |
118 | 7b829d2a | Ramiro Polla | |
119 | ff794171 | Michael Niedermayer | #define AV_RB32(x) ((((const uint8_t*)(x))[0] << 24) | \ |
120 | (((const uint8_t*)(x))[1] << 16) | \ |
||
121 | (((const uint8_t*)(x))[2] << 8) | \ |
||
122 | ((const uint8_t*)(x))[3]) |
||
123 | 803ca89c | Jindřich Makovička | #define AV_WB32(p, d) do { \ |
124 | 7d4495da | Michael Niedermayer | ((uint8_t*)(p))[3] = (d); \
|
125 | ((uint8_t*)(p))[2] = (d)>>8; \ |
||
126 | ((uint8_t*)(p))[1] = (d)>>16; \ |
||
127 | 803ca89c | Jindřich Makovička | ((uint8_t*)(p))[0] = (d)>>24; } while(0) |
128 | a3550abd | Alex Beregszaszi | |
129 | ff794171 | Michael Niedermayer | #define AV_RL32(x) ((((const uint8_t*)(x))[3] << 24) | \ |
130 | (((const uint8_t*)(x))[2] << 16) | \ |
||
131 | (((const uint8_t*)(x))[1] << 8) | \ |
||
132 | ((const uint8_t*)(x))[0]) |
||
133 | 803ca89c | Jindřich Makovička | #define AV_WL32(p, d) do { \ |
134 | 7d4495da | Michael Niedermayer | ((uint8_t*)(p))[0] = (d); \
|
135 | ((uint8_t*)(p))[1] = (d)>>8; \ |
||
136 | ((uint8_t*)(p))[2] = (d)>>16; \ |
||
137 | 803ca89c | Jindřich Makovička | ((uint8_t*)(p))[3] = (d)>>24; } while(0) |
138 | 9e010b41 | Ivo van Poorten | |
139 | ff794171 | Michael Niedermayer | #define AV_RB64(x) (((uint64_t)((const uint8_t*)(x))[0] << 56) | \ |
140 | ((uint64_t)((const uint8_t*)(x))[1] << 48) | \ |
||
141 | ((uint64_t)((const uint8_t*)(x))[2] << 40) | \ |
||
142 | ((uint64_t)((const uint8_t*)(x))[3] << 32) | \ |
||
143 | ((uint64_t)((const uint8_t*)(x))[4] << 24) | \ |
||
144 | ((uint64_t)((const uint8_t*)(x))[5] << 16) | \ |
||
145 | ((uint64_t)((const uint8_t*)(x))[6] << 8) | \ |
||
146 | (uint64_t)((const uint8_t*)(x))[7]) |
||
147 | 803ca89c | Jindřich Makovička | #define AV_WB64(p, d) do { \ |
148 | 9e010b41 | Ivo van Poorten | ((uint8_t*)(p))[7] = (d); \
|
149 | ((uint8_t*)(p))[6] = (d)>>8; \ |
||
150 | ((uint8_t*)(p))[5] = (d)>>16; \ |
||
151 | ((uint8_t*)(p))[4] = (d)>>24; \ |
||
152 | ((uint8_t*)(p))[3] = (d)>>32; \ |
||
153 | ((uint8_t*)(p))[2] = (d)>>40; \ |
||
154 | ((uint8_t*)(p))[1] = (d)>>48; \ |
||
155 | 803ca89c | Jindřich Makovička | ((uint8_t*)(p))[0] = (d)>>56; } while(0) |
156 | 9e010b41 | Ivo van Poorten | |
157 | ff794171 | Michael Niedermayer | #define AV_RL64(x) (((uint64_t)((const uint8_t*)(x))[7] << 56) | \ |
158 | ((uint64_t)((const uint8_t*)(x))[6] << 48) | \ |
||
159 | ((uint64_t)((const uint8_t*)(x))[5] << 40) | \ |
||
160 | ((uint64_t)((const uint8_t*)(x))[4] << 32) | \ |
||
161 | ((uint64_t)((const uint8_t*)(x))[3] << 24) | \ |
||
162 | ((uint64_t)((const uint8_t*)(x))[2] << 16) | \ |
||
163 | ((uint64_t)((const uint8_t*)(x))[1] << 8) | \ |
||
164 | (uint64_t)((const uint8_t*)(x))[0]) |
||
165 | 803ca89c | Jindřich Makovička | #define AV_WL64(p, d) do { \ |
166 | 9e010b41 | Ivo van Poorten | ((uint8_t*)(p))[0] = (d); \
|
167 | ((uint8_t*)(p))[1] = (d)>>8; \ |
||
168 | ((uint8_t*)(p))[2] = (d)>>16; \ |
||
169 | ((uint8_t*)(p))[3] = (d)>>24; \ |
||
170 | ((uint8_t*)(p))[4] = (d)>>32; \ |
||
171 | ((uint8_t*)(p))[5] = (d)>>40; \ |
||
172 | ((uint8_t*)(p))[6] = (d)>>48; \ |
||
173 | 803ca89c | Jindřich Makovička | ((uint8_t*)(p))[7] = (d)>>56; } while(0) |
174 | fbbea48e | Måns Rullgård | #endif /* HAVE_FAST_UNALIGNED */ |
175 | |||
176 | #define AV_RB24(x) ((((const uint8_t*)(x))[0] << 16) | \ |
||
177 | (((const uint8_t*)(x))[1] << 8) | \ |
||
178 | ((const uint8_t*)(x))[2]) |
||
179 | #define AV_WB24(p, d) do { \ |
||
180 | ((uint8_t*)(p))[2] = (d); \
|
||
181 | ((uint8_t*)(p))[1] = (d)>>8; \ |
||
182 | ((uint8_t*)(p))[0] = (d)>>16; } while(0) |
||
183 | |||
184 | #define AV_RL24(x) ((((const uint8_t*)(x))[2] << 16) | \ |
||
185 | (((const uint8_t*)(x))[1] << 8) | \ |
||
186 | ((const uint8_t*)(x))[0]) |
||
187 | #define AV_WL24(p, d) do { \ |
||
188 | ((uint8_t*)(p))[0] = (d); \
|
||
189 | ((uint8_t*)(p))[1] = (d)>>8; \ |
||
190 | ((uint8_t*)(p))[2] = (d)>>16; } while(0) |
||
191 | 9e010b41 | Ivo van Poorten | |
192 | 5b21bdab | Diego Biurrun | #endif /* FFMPEG_INTREADWRITE_H */ |