annotate bswap.h @ 914:66b39cb91dde libavutil

bswap: add macros to byteswap constants The normal byteswap functions might use inline asm which is suboptimal with constants (and cannot be used in static initialisers), so special macros for constants only is needed. We should not rely on the gcc __builtin_constant_p() test since it is not always available.
author mru
date Thu, 29 Apr 2010 14:41:20 +0000
parents 0795a743bda1
children e0e9e51684ef
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
108
11be8e0d1344 Add official LGPL license headers to the files that were missing them.
diego
parents: 29
diff changeset
1 /*
11be8e0d1344 Add official LGPL license headers to the files that were missing them.
diego
parents: 29
diff changeset
2 * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>
11be8e0d1344 Add official LGPL license headers to the files that were missing them.
diego
parents: 29
diff changeset
3 *
116
d76a36742464 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 108
diff changeset
4 * This file is part of FFmpeg.
d76a36742464 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 108
diff changeset
5 *
d76a36742464 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 108
diff changeset
6 * FFmpeg is free software; you can redistribute it and/or
108
11be8e0d1344 Add official LGPL license headers to the files that were missing them.
diego
parents: 29
diff changeset
7 * modify it under the terms of the GNU Lesser General Public
11be8e0d1344 Add official LGPL license headers to the files that were missing them.
diego
parents: 29
diff changeset
8 * License as published by the Free Software Foundation; either
116
d76a36742464 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 108
diff changeset
9 * version 2.1 of the License, or (at your option) any later version.
108
11be8e0d1344 Add official LGPL license headers to the files that were missing them.
diego
parents: 29
diff changeset
10 *
116
d76a36742464 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 108
diff changeset
11 * FFmpeg is distributed in the hope that it will be useful,
108
11be8e0d1344 Add official LGPL license headers to the files that were missing them.
diego
parents: 29
diff changeset
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11be8e0d1344 Add official LGPL license headers to the files that were missing them.
diego
parents: 29
diff changeset
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11be8e0d1344 Add official LGPL license headers to the files that were missing them.
diego
parents: 29
diff changeset
14 * Lesser General Public License for more details.
11be8e0d1344 Add official LGPL license headers to the files that were missing them.
diego
parents: 29
diff changeset
15 *
11be8e0d1344 Add official LGPL license headers to the files that were missing them.
diego
parents: 29
diff changeset
16 * You should have received a copy of the GNU Lesser General Public
116
d76a36742464 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 108
diff changeset
17 * License along with FFmpeg; if not, write to the Free Software
108
11be8e0d1344 Add official LGPL license headers to the files that were missing them.
diego
parents: 29
diff changeset
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
11be8e0d1344 Add official LGPL license headers to the files that were missing them.
diego
parents: 29
diff changeset
19 */
11be8e0d1344 Add official LGPL license headers to the files that were missing them.
diego
parents: 29
diff changeset
20
0
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
21 /**
899
0795a743bda1 Remove explicit filename from Doxygen @file commands.
diego
parents: 873
diff changeset
22 * @file
466
f4fd038fcb58 misc spelling fixes
diego
parents: 464
diff changeset
23 * byte swapping routines
0
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
24 */
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
25
567
bd4052d9050c Globally rename the header inclusion guard names.
stefano
parents: 522
diff changeset
26 #ifndef AVUTIL_BSWAP_H
bd4052d9050c Globally rename the header inclusion guard names.
stefano
parents: 522
diff changeset
27 #define AVUTIL_BSWAP_H
0
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
28
343
f21d1907d47c include all prerequisites in header files
mru
parents: 330
diff changeset
29 #include <stdint.h>
469
bdc8433d739e Add #include "config.h" to headers that need it.
diego
parents: 466
diff changeset
30 #include "config.h"
873
4d9ad0ed07d0 Replace many includes of libavutil/common.h with what is actually needed
mru
parents: 770
diff changeset
31 #include "attributes.h"
343
f21d1907d47c include all prerequisites in header files
mru
parents: 330
diff changeset
32
603
880c6441f56a Change semantic of CONFIG_*, HAVE_* and ARCH_*.
aurel
parents: 588
diff changeset
33 #if ARCH_ARM
582
57da90f7c680 split bswap.h into per-arch files
mru
parents: 579
diff changeset
34 # include "arm/bswap.h"
770
7ee08d73ac3a AVR32: inline asm for bswap.h
mru
parents: 758
diff changeset
35 #elif ARCH_AVR32
7ee08d73ac3a AVR32: inline asm for bswap.h
mru
parents: 758
diff changeset
36 # include "avr32/bswap.h"
603
880c6441f56a Change semantic of CONFIG_*, HAVE_* and ARCH_*.
aurel
parents: 588
diff changeset
37 #elif ARCH_BFIN
582
57da90f7c680 split bswap.h into per-arch files
mru
parents: 579
diff changeset
38 # include "bfin/bswap.h"
603
880c6441f56a Change semantic of CONFIG_*, HAVE_* and ARCH_*.
aurel
parents: 588
diff changeset
39 #elif ARCH_SH4
582
57da90f7c680 split bswap.h into per-arch files
mru
parents: 579
diff changeset
40 # include "sh4/bswap.h"
603
880c6441f56a Change semantic of CONFIG_*, HAVE_* and ARCH_*.
aurel
parents: 588
diff changeset
41 #elif ARCH_X86
582
57da90f7c680 split bswap.h into per-arch files
mru
parents: 579
diff changeset
42 # include "x86/bswap.h"
57da90f7c680 split bswap.h into per-arch files
mru
parents: 579
diff changeset
43 #endif
57da90f7c680 split bswap.h into per-arch files
mru
parents: 579
diff changeset
44
914
66b39cb91dde bswap: add macros to byteswap constants
mru
parents: 899
diff changeset
45 #define AV_BSWAP16C(x) (((x) << 8 & 0xff00) | ((x) >> 8 & 0x00ff))
66b39cb91dde bswap: add macros to byteswap constants
mru
parents: 899
diff changeset
46 #define AV_BSWAP32C(x) (AV_BSWAP16C(x) << 16 | AV_BSWAP16C(x >> 16))
66b39cb91dde bswap: add macros to byteswap constants
mru
parents: 899
diff changeset
47 #define AV_BSWAP64C(x) (AV_BSWAP32C(x) << 32 | AV_BSWAP32C(x >> 32))
66b39cb91dde bswap: add macros to byteswap constants
mru
parents: 899
diff changeset
48
66b39cb91dde bswap: add macros to byteswap constants
mru
parents: 899
diff changeset
49 #define AV_BSWAPC(s, x) AV_BSWAP##s##C(x)
66b39cb91dde bswap: add macros to byteswap constants
mru
parents: 899
diff changeset
50
582
57da90f7c680 split bswap.h into per-arch files
mru
parents: 579
diff changeset
51 #ifndef bswap_16
481
f4187c1c15a6 Reapply r12489: Add pure, const and malloc attributes to proper functions
zuxy
parents: 480
diff changeset
52 static av_always_inline av_const uint16_t bswap_16(uint16_t x)
0
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
53 {
330
2e7209604069 reorder bswap functions into bit-depth, special-casing inside the functions.
benoit
parents: 329
diff changeset
54 x= (x>>8) | (x<<8);
0
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
55 return x;
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
56 }
582
57da90f7c680 split bswap.h into per-arch files
mru
parents: 579
diff changeset
57 #endif
0
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
58
582
57da90f7c680 split bswap.h into per-arch files
mru
parents: 579
diff changeset
59 #ifndef bswap_32
481
f4187c1c15a6 Reapply r12489: Add pure, const and malloc attributes to proper functions
zuxy
parents: 480
diff changeset
60 static av_always_inline av_const uint32_t bswap_32(uint32_t x)
0
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
61 {
330
2e7209604069 reorder bswap functions into bit-depth, special-casing inside the functions.
benoit
parents: 329
diff changeset
62 x= ((x<<8)&0xFF00FF00) | ((x>>8)&0x00FF00FF);
2e7209604069 reorder bswap functions into bit-depth, special-casing inside the functions.
benoit
parents: 329
diff changeset
63 x= (x>>16) | (x<<16);
327
e9ee070db39b Faster 32 bit byteswaping code for Blackfin.
diego
parents: 159
diff changeset
64 return x;
e9ee070db39b Faster 32 bit byteswaping code for Blackfin.
diego
parents: 159
diff changeset
65 }
582
57da90f7c680 split bswap.h into per-arch files
mru
parents: 579
diff changeset
66 #endif
327
e9ee070db39b Faster 32 bit byteswaping code for Blackfin.
diego
parents: 159
diff changeset
67
582
57da90f7c680 split bswap.h into per-arch files
mru
parents: 579
diff changeset
68 #ifndef bswap_64
481
f4187c1c15a6 Reapply r12489: Add pure, const and malloc attributes to proper functions
zuxy
parents: 480
diff changeset
69 static inline uint64_t av_const bswap_64(uint64_t x)
0
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
70 {
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
71 #if 0
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
72 x= ((x<< 8)&0xFF00FF00FF00FF00ULL) | ((x>> 8)&0x00FF00FF00FF00FFULL);
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
73 x= ((x<<16)&0xFFFF0000FFFF0000ULL) | ((x>>16)&0x0000FFFF0000FFFFULL);
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
74 return (x>>32) | (x<<32);
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
75 #else
12
ce8f9f4390c3 COSMETICS: Remove all trailing whitespace.
diego
parents: 0
diff changeset
76 union {
0
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
77 uint64_t ll;
12
ce8f9f4390c3 COSMETICS: Remove all trailing whitespace.
diego
parents: 0
diff changeset
78 uint32_t l[2];
0
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
79 } w, r;
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
80 w.ll = x;
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
81 r.l[0] = bswap_32 (w.l[1]);
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
82 r.l[1] = bswap_32 (w.l[0]);
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
83 return r.ll;
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
84 #endif
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
85 }
582
57da90f7c680 split bswap.h into per-arch files
mru
parents: 579
diff changeset
86 #endif
0
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
87
633
8c48a1b999a3 spelling/grammar/consistency review part I
diego
parents: 603
diff changeset
88 // be2me ... big-endian to machine-endian
8c48a1b999a3 spelling/grammar/consistency review part I
diego
parents: 603
diff changeset
89 // le2me ... little-endian to machine-endian
0
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
90
758
22a58fc2125d Replace WORDS_BIGENDIAN with HAVE_BIGENDIAN
mru
parents: 642
diff changeset
91 #if HAVE_BIGENDIAN
0
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
92 #define be2me_16(x) (x)
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
93 #define be2me_32(x) (x)
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
94 #define be2me_64(x) (x)
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
95 #define le2me_16(x) bswap_16(x)
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
96 #define le2me_32(x) bswap_32(x)
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
97 #define le2me_64(x) bswap_64(x)
914
66b39cb91dde bswap: add macros to byteswap constants
mru
parents: 899
diff changeset
98 #define AV_BE2MEC(s, x) (x)
66b39cb91dde bswap: add macros to byteswap constants
mru
parents: 899
diff changeset
99 #define AV_LE2MEC(s, x) AV_BSWAPC(s, x)
0
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
100 #else
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
101 #define be2me_16(x) bswap_16(x)
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
102 #define be2me_32(x) bswap_32(x)
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
103 #define be2me_64(x) bswap_64(x)
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
104 #define le2me_16(x) (x)
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
105 #define le2me_32(x) (x)
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
106 #define le2me_64(x) (x)
914
66b39cb91dde bswap: add macros to byteswap constants
mru
parents: 899
diff changeset
107 #define AV_BE2MEC(s, x) AV_BSWAPC(s, x)
66b39cb91dde bswap: add macros to byteswap constants
mru
parents: 899
diff changeset
108 #define AV_LE2MEC(s, x) (x)
0
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
109 #endif
ee8f44bb7c4d libavutil: Utility code from libavcodec moved to a separate library.
al
parents:
diff changeset
110
914
66b39cb91dde bswap: add macros to byteswap constants
mru
parents: 899
diff changeset
111 #define AV_BE2ME16C(x) AV_BE2MEC(16, x)
66b39cb91dde bswap: add macros to byteswap constants
mru
parents: 899
diff changeset
112 #define AV_BE2ME32C(x) AV_BE2MEC(32, x)
66b39cb91dde bswap: add macros to byteswap constants
mru
parents: 899
diff changeset
113 #define AV_BE2ME64C(x) AV_BE2MEC(64, x)
66b39cb91dde bswap: add macros to byteswap constants
mru
parents: 899
diff changeset
114 #define AV_LE2ME16C(x) AV_LE2MEC(16, x)
66b39cb91dde bswap: add macros to byteswap constants
mru
parents: 899
diff changeset
115 #define AV_LE2ME32C(x) AV_LE2MEC(32, x)
66b39cb91dde bswap: add macros to byteswap constants
mru
parents: 899
diff changeset
116 #define AV_LE2ME64C(x) AV_LE2MEC(64, x)
66b39cb91dde bswap: add macros to byteswap constants
mru
parents: 899
diff changeset
117
567
bd4052d9050c Globally rename the header inclusion guard names.
stefano
parents: 522
diff changeset
118 #endif /* AVUTIL_BSWAP_H */