annotate common.h @ 1795:920e6381e1fe libavcodec

2 byte shorter userdata for mpeg4 in the past it was startcode,string,00,7F,startcode now it is startcode,string,stratcode both are mpeg4 compliant, as according to the standard the userdata lasts until the next 00 00 01 (startcode prefix) but some very primitive decoders which simply skip until the first 00 byte and then expect the next valid startcode might fail with the old variant, just a theory though (didnt test if quicktime can decode it now)
author michael
date Sun, 08 Feb 2004 22:52:35 +0000
parents b7340afa261a
children 95612d423fde
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1106
1e39f273ecd6 per file doxy
michaelni
parents: 1083
diff changeset
1 /**
1e39f273ecd6 per file doxy
michaelni
parents: 1083
diff changeset
2 * @file common.h
1e39f273ecd6 per file doxy
michaelni
parents: 1083
diff changeset
3 * common internal api header.
1e39f273ecd6 per file doxy
michaelni
parents: 1083
diff changeset
4 */
1e39f273ecd6 per file doxy
michaelni
parents: 1083
diff changeset
5
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
6 #ifndef COMMON_H
986e461dc072 Initial revision
glantau
parents:
diff changeset
7 #define COMMON_H
986e461dc072 Initial revision
glantau
parents:
diff changeset
8
213
e80ad397d30e Cygwin's mangling by Felix Buenemann <atmosfear@users.sourceforge.net>
nickols_k
parents: 199
diff changeset
9 #if defined(WIN32) && !defined(__MINGW32__) && !defined(__CYGWIN__)
708
1aa1cbb8c3c1 indenting preprocessor stuff, as its completly unreadable otherwise
michaelni
parents: 706
diff changeset
10 # define CONFIG_WIN32
64
5aa6292a1660 win32 fixes
glantau
parents: 21
diff changeset
11 #endif
5aa6292a1660 win32 fixes
glantau
parents: 21
diff changeset
12
234
5fc0c3af3fe4 alternative bitstream writer (disabled by default, uncomment #define ALT_BISTREAM_WRITER in common.h if u want to try it)
michaelni
parents: 213
diff changeset
13 //#define ALT_BITSTREAM_WRITER
235
41f0ef2cd942 aligned bitstream writer (1% slower on p3 but perhaps its faster on p4?)
michaelni
parents: 234
diff changeset
14 //#define ALIGNED_BITSTREAM_WRITER
512
ba67fefada47 Activate ALT_BITSTREAM_READER by default on Alpha, since it seems to
mellum
parents: 496
diff changeset
15
520
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
16 #define ALT_BITSTREAM_READER
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
17 //#define LIBMPEG2_BITSTREAM_READER
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
18 //#define A32_BITSTREAM_READER
1254
604661d34c68 bitstream reader optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1226
diff changeset
19 #define LIBMPEG2_BITSTREAM_READER_HACK //add BERO
520
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
20
1758
d49aae2f9027 freebsd fix for mpeg12.c (moving INT64_MAX to common.h)
alex
parents: 1756
diff changeset
21 #ifndef M_PI
d49aae2f9027 freebsd fix for mpeg12.c (moving INT64_MAX to common.h)
alex
parents: 1756
diff changeset
22 #define M_PI 3.14159265358979323846
d49aae2f9027 freebsd fix for mpeg12.c (moving INT64_MAX to common.h)
alex
parents: 1756
diff changeset
23 #endif
d49aae2f9027 freebsd fix for mpeg12.c (moving INT64_MAX to common.h)
alex
parents: 1756
diff changeset
24
10
f439e6867cac added HAVE_AV_CONFIG_H
glantau
parents: 2
diff changeset
25 #ifdef HAVE_AV_CONFIG_H
64
5aa6292a1660 win32 fixes
glantau
parents: 21
diff changeset
26 /* only include the following when compiling package */
708
1aa1cbb8c3c1 indenting preprocessor stuff, as its completly unreadable otherwise
michaelni
parents: 706
diff changeset
27 # include "config.h"
64
5aa6292a1660 win32 fixes
glantau
parents: 21
diff changeset
28
708
1aa1cbb8c3c1 indenting preprocessor stuff, as its completly unreadable otherwise
michaelni
parents: 706
diff changeset
29 # include <stdlib.h>
1aa1cbb8c3c1 indenting preprocessor stuff, as its completly unreadable otherwise
michaelni
parents: 706
diff changeset
30 # include <stdio.h>
1aa1cbb8c3c1 indenting preprocessor stuff, as its completly unreadable otherwise
michaelni
parents: 706
diff changeset
31 # include <string.h>
1444
958d9c0cedba ctype.h is a common header
bellard
parents: 1413
diff changeset
32 # include <ctype.h>
708
1aa1cbb8c3c1 indenting preprocessor stuff, as its completly unreadable otherwise
michaelni
parents: 706
diff changeset
33 # ifndef __BEOS__
1aa1cbb8c3c1 indenting preprocessor stuff, as its completly unreadable otherwise
michaelni
parents: 706
diff changeset
34 # include <errno.h>
1aa1cbb8c3c1 indenting preprocessor stuff, as its completly unreadable otherwise
michaelni
parents: 706
diff changeset
35 # else
1aa1cbb8c3c1 indenting preprocessor stuff, as its completly unreadable otherwise
michaelni
parents: 706
diff changeset
36 # include "berrno.h"
1aa1cbb8c3c1 indenting preprocessor stuff, as its completly unreadable otherwise
michaelni
parents: 706
diff changeset
37 # endif
1aa1cbb8c3c1 indenting preprocessor stuff, as its completly unreadable otherwise
michaelni
parents: 706
diff changeset
38 # include <math.h>
64
5aa6292a1660 win32 fixes
glantau
parents: 21
diff changeset
39
708
1aa1cbb8c3c1 indenting preprocessor stuff, as its completly unreadable otherwise
michaelni
parents: 706
diff changeset
40 # ifndef ENODATA
1aa1cbb8c3c1 indenting preprocessor stuff, as its completly unreadable otherwise
michaelni
parents: 706
diff changeset
41 # define ENODATA 61
1aa1cbb8c3c1 indenting preprocessor stuff, as its completly unreadable otherwise
michaelni
parents: 706
diff changeset
42 # endif
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
43
1059
890b9fb44e84 * still unfinished code for Options
kabi
parents: 1039
diff changeset
44 #include <stddef.h>
890b9fb44e84 * still unfinished code for Options
kabi
parents: 1039
diff changeset
45 #ifndef offsetof
890b9fb44e84 * still unfinished code for Options
kabi
parents: 1039
diff changeset
46 # define offsetof(T,F) ((unsigned int)((char *)&((T *)0)->F))
890b9fb44e84 * still unfinished code for Options
kabi
parents: 1039
diff changeset
47 #endif
890b9fb44e84 * still unfinished code for Options
kabi
parents: 1039
diff changeset
48
890b9fb44e84 * still unfinished code for Options
kabi
parents: 1039
diff changeset
49 #define AVOPTION_CODEC_BOOL(name, help, field) \
890b9fb44e84 * still unfinished code for Options
kabi
parents: 1039
diff changeset
50 { name, help, offsetof(AVCodecContext, field), FF_OPT_TYPE_BOOL }
1130
c8dfb8579606 * added more options
kabi
parents: 1126
diff changeset
51 #define AVOPTION_CODEC_DOUBLE(name, help, field, minv, maxv, defval) \
c8dfb8579606 * added more options
kabi
parents: 1126
diff changeset
52 { name, help, offsetof(AVCodecContext, field), FF_OPT_TYPE_DOUBLE, minv, maxv, defval }
1059
890b9fb44e84 * still unfinished code for Options
kabi
parents: 1039
diff changeset
53 #define AVOPTION_CODEC_FLAG(name, help, field, flag, defval) \
890b9fb44e84 * still unfinished code for Options
kabi
parents: 1039
diff changeset
54 { name, help, offsetof(AVCodecContext, field), FF_OPT_TYPE_FLAG, flag, 0, defval }
890b9fb44e84 * still unfinished code for Options
kabi
parents: 1039
diff changeset
55 #define AVOPTION_CODEC_INT(name, help, field, minv, maxv, defval) \
890b9fb44e84 * still unfinished code for Options
kabi
parents: 1039
diff changeset
56 { name, help, offsetof(AVCodecContext, field), FF_OPT_TYPE_INT, minv, maxv, defval }
890b9fb44e84 * still unfinished code for Options
kabi
parents: 1039
diff changeset
57 #define AVOPTION_CODEC_STRING(name, help, field, str, val) \
890b9fb44e84 * still unfinished code for Options
kabi
parents: 1039
diff changeset
58 { name, help, offsetof(AVCodecContext, field), FF_OPT_TYPE_STRING, .defval = val, .defstr = str }
890b9fb44e84 * still unfinished code for Options
kabi
parents: 1039
diff changeset
59 #define AVOPTION_CODEC_RCOVERRIDE(name, help, field) \
890b9fb44e84 * still unfinished code for Options
kabi
parents: 1039
diff changeset
60 { name, help, offsetof(AVCodecContext, field), FF_OPT_TYPE_RCOVERRIDE, .defval = 0, .defstr = NULL }
1114
e4762efc3617 * more generic avoption_parse
kabi
parents: 1112
diff changeset
61 #define AVOPTION_SUB(ptr) { .name = NULL, .help = (const char*)ptr }
1059
890b9fb44e84 * still unfinished code for Options
kabi
parents: 1039
diff changeset
62 #define AVOPTION_END() AVOPTION_SUB(NULL)
890b9fb44e84 * still unfinished code for Options
kabi
parents: 1039
diff changeset
63
1124
64c7c76ed17c * 'externaly' visible option list begins avoptions_ prefix
kabi
parents: 1118
diff changeset
64 struct AVOption;
64c7c76ed17c * 'externaly' visible option list begins avoptions_ prefix
kabi
parents: 1118
diff changeset
65 #ifdef HAVE_MMX
64c7c76ed17c * 'externaly' visible option list begins avoptions_ prefix
kabi
parents: 1118
diff changeset
66 extern const struct AVOption avoptions_common[3 + 5];
64c7c76ed17c * 'externaly' visible option list begins avoptions_ prefix
kabi
parents: 1118
diff changeset
67 #else
64c7c76ed17c * 'externaly' visible option list begins avoptions_ prefix
kabi
parents: 1118
diff changeset
68 extern const struct AVOption avoptions_common[3];
64c7c76ed17c * 'externaly' visible option list begins avoptions_ prefix
kabi
parents: 1118
diff changeset
69 #endif
64c7c76ed17c * 'externaly' visible option list begins avoptions_ prefix
kabi
parents: 1118
diff changeset
70 extern const struct AVOption avoptions_workaround_bug[11];
64c7c76ed17c * 'externaly' visible option list begins avoptions_ prefix
kabi
parents: 1118
diff changeset
71
390
48e08d9871da added proper memory handling functions - fixed include paths
glantau
parents: 370
diff changeset
72 #endif /* HAVE_AV_CONFIG_H */
64
5aa6292a1660 win32 fixes
glantau
parents: 21
diff changeset
73
517
389e30fe7269 * Move "restrict" fallback to common.h
mellum
parents: 512
diff changeset
74 /* Suppress restrict if it was not defined in config.h. */
389e30fe7269 * Move "restrict" fallback to common.h
mellum
parents: 512
diff changeset
75 #ifndef restrict
708
1aa1cbb8c3c1 indenting preprocessor stuff, as its completly unreadable otherwise
michaelni
parents: 706
diff changeset
76 # define restrict
517
389e30fe7269 * Move "restrict" fallback to common.h
mellum
parents: 512
diff changeset
77 #endif
389e30fe7269 * Move "restrict" fallback to common.h
mellum
parents: 512
diff changeset
78
550
b746a7d75ce6 Force inlining on get_vlc2.
mellum
parents: 542
diff changeset
79 #if defined(__GNUC__) && (__GNUC__ > 3 || __GNUC__ == 3 && __GNUC_MINOR__ > 0)
708
1aa1cbb8c3c1 indenting preprocessor stuff, as its completly unreadable otherwise
michaelni
parents: 706
diff changeset
80 # define always_inline __attribute__((always_inline)) inline
550
b746a7d75ce6 Force inlining on get_vlc2.
mellum
parents: 542
diff changeset
81 #else
708
1aa1cbb8c3c1 indenting preprocessor stuff, as its completly unreadable otherwise
michaelni
parents: 706
diff changeset
82 # define always_inline inline
550
b746a7d75ce6 Force inlining on get_vlc2.
mellum
parents: 542
diff changeset
83 #endif
b746a7d75ce6 Force inlining on get_vlc2.
mellum
parents: 542
diff changeset
84
1738
378e98870df4 more sane inttypes emulation behavior if libavcodec is used outside ffmpeg
michael
parents: 1735
diff changeset
85 #ifndef EMULATE_INTTYPES
1735
cb0abe523bc6 inttypes emulation cleanup patch by ("Chris Flerackers" <cflerackers at androme dot be>)
michael
parents: 1660
diff changeset
86 # include <inttypes.h>
cb0abe523bc6 inttypes emulation cleanup patch by ("Chris Flerackers" <cflerackers at androme dot be>)
michael
parents: 1660
diff changeset
87 #else
cb0abe523bc6 inttypes emulation cleanup patch by ("Chris Flerackers" <cflerackers at androme dot be>)
michael
parents: 1660
diff changeset
88 typedef signed char int8_t;
cb0abe523bc6 inttypes emulation cleanup patch by ("Chris Flerackers" <cflerackers at androme dot be>)
michael
parents: 1660
diff changeset
89 typedef signed short int16_t;
cb0abe523bc6 inttypes emulation cleanup patch by ("Chris Flerackers" <cflerackers at androme dot be>)
michael
parents: 1660
diff changeset
90 typedef signed int int32_t;
cb0abe523bc6 inttypes emulation cleanup patch by ("Chris Flerackers" <cflerackers at androme dot be>)
michael
parents: 1660
diff changeset
91 typedef unsigned char uint8_t;
cb0abe523bc6 inttypes emulation cleanup patch by ("Chris Flerackers" <cflerackers at androme dot be>)
michael
parents: 1660
diff changeset
92 typedef unsigned short uint16_t;
cb0abe523bc6 inttypes emulation cleanup patch by ("Chris Flerackers" <cflerackers at androme dot be>)
michael
parents: 1660
diff changeset
93 typedef unsigned int uint32_t;
cb0abe523bc6 inttypes emulation cleanup patch by ("Chris Flerackers" <cflerackers at androme dot be>)
michael
parents: 1660
diff changeset
94
cb0abe523bc6 inttypes emulation cleanup patch by ("Chris Flerackers" <cflerackers at androme dot be>)
michael
parents: 1660
diff changeset
95 # ifdef CONFIG_WIN32
cb0abe523bc6 inttypes emulation cleanup patch by ("Chris Flerackers" <cflerackers at androme dot be>)
michael
parents: 1660
diff changeset
96 typedef signed __int64 int64_t;
cb0abe523bc6 inttypes emulation cleanup patch by ("Chris Flerackers" <cflerackers at androme dot be>)
michael
parents: 1660
diff changeset
97 typedef unsigned __int64 uint64_t;
cb0abe523bc6 inttypes emulation cleanup patch by ("Chris Flerackers" <cflerackers at androme dot be>)
michael
parents: 1660
diff changeset
98 # else /* other OS */
cb0abe523bc6 inttypes emulation cleanup patch by ("Chris Flerackers" <cflerackers at androme dot be>)
michael
parents: 1660
diff changeset
99 typedef signed long long int64_t;
cb0abe523bc6 inttypes emulation cleanup patch by ("Chris Flerackers" <cflerackers at androme dot be>)
michael
parents: 1660
diff changeset
100 typedef unsigned long long uint64_t;
cb0abe523bc6 inttypes emulation cleanup patch by ("Chris Flerackers" <cflerackers at androme dot be>)
michael
parents: 1660
diff changeset
101 # endif /* other OS */
cb0abe523bc6 inttypes emulation cleanup patch by ("Chris Flerackers" <cflerackers at androme dot be>)
michael
parents: 1660
diff changeset
102 #endif /* HAVE_INTTYPES_H */
cb0abe523bc6 inttypes emulation cleanup patch by ("Chris Flerackers" <cflerackers at androme dot be>)
michael
parents: 1660
diff changeset
103
1761
3620e301643a int64max fix by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1758
diff changeset
104 #ifndef INT64_MAX
3620e301643a int64max fix by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1758
diff changeset
105 #define INT64_MAX 9223372036854775807LL
3620e301643a int64max fix by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1758
diff changeset
106 #endif
3620e301643a int64max fix by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1758
diff changeset
107
1603
3a633a3feef6 * fixes for broken builds on Solaris, OS2 and all bingendian
romansh
parents: 1598
diff changeset
108 #ifdef EMULATE_FAST_INT
3a633a3feef6 * fixes for broken builds on Solaris, OS2 and all bingendian
romansh
parents: 1598
diff changeset
109 /* note that we don't emulate 64bit ints */
3a633a3feef6 * fixes for broken builds on Solaris, OS2 and all bingendian
romansh
parents: 1598
diff changeset
110 typedef signed char int_fast8_t;
3a633a3feef6 * fixes for broken builds on Solaris, OS2 and all bingendian
romansh
parents: 1598
diff changeset
111 typedef signed int int_fast16_t;
3a633a3feef6 * fixes for broken builds on Solaris, OS2 and all bingendian
romansh
parents: 1598
diff changeset
112 typedef signed int int_fast32_t;
3a633a3feef6 * fixes for broken builds on Solaris, OS2 and all bingendian
romansh
parents: 1598
diff changeset
113 typedef unsigned char uint_fast8_t;
3a633a3feef6 * fixes for broken builds on Solaris, OS2 and all bingendian
romansh
parents: 1598
diff changeset
114 typedef unsigned int uint_fast16_t;
3a633a3feef6 * fixes for broken builds on Solaris, OS2 and all bingendian
romansh
parents: 1598
diff changeset
115 typedef unsigned int uint_fast32_t;
3a633a3feef6 * fixes for broken builds on Solaris, OS2 and all bingendian
romansh
parents: 1598
diff changeset
116 #endif
3a633a3feef6 * fixes for broken builds on Solaris, OS2 and all bingendian
romansh
parents: 1598
diff changeset
117
3a633a3feef6 * fixes for broken builds on Solaris, OS2 and all bingendian
romansh
parents: 1598
diff changeset
118 #if defined(CONFIG_OS2) || defined(CONFIG_SUNOS)
3a633a3feef6 * fixes for broken builds on Solaris, OS2 and all bingendian
romansh
parents: 1598
diff changeset
119 static inline float floorf(float f) {
3a633a3feef6 * fixes for broken builds on Solaris, OS2 and all bingendian
romansh
parents: 1598
diff changeset
120 return floor(f);
3a633a3feef6 * fixes for broken builds on Solaris, OS2 and all bingendian
romansh
parents: 1598
diff changeset
121 }
3a633a3feef6 * fixes for broken builds on Solaris, OS2 and all bingendian
romansh
parents: 1598
diff changeset
122 #endif
3a633a3feef6 * fixes for broken builds on Solaris, OS2 and all bingendian
romansh
parents: 1598
diff changeset
123
64
5aa6292a1660 win32 fixes
glantau
parents: 21
diff changeset
124 #ifdef CONFIG_WIN32
5aa6292a1660 win32 fixes
glantau
parents: 21
diff changeset
125
5aa6292a1660 win32 fixes
glantau
parents: 21
diff changeset
126 /* windows */
5aa6292a1660 win32 fixes
glantau
parents: 21
diff changeset
127
708
1aa1cbb8c3c1 indenting preprocessor stuff, as its completly unreadable otherwise
michaelni
parents: 706
diff changeset
128 # ifndef __MINGW32__
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1059
diff changeset
129 # define int64_t_C(c) (c ## i64)
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1059
diff changeset
130 # define uint64_t_C(c) (c ## i64)
64
5aa6292a1660 win32 fixes
glantau
parents: 21
diff changeset
131
1509
750b460ceb66 recommit of
michael
parents: 1444
diff changeset
132 # ifdef HAVE_AV_CONFIG_H
750b460ceb66 recommit of
michael
parents: 1444
diff changeset
133 # define inline __inline
750b460ceb66 recommit of
michael
parents: 1444
diff changeset
134 # endif
64
5aa6292a1660 win32 fixes
glantau
parents: 21
diff changeset
135
708
1aa1cbb8c3c1 indenting preprocessor stuff, as its completly unreadable otherwise
michaelni
parents: 706
diff changeset
136 # else
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1059
diff changeset
137 # define int64_t_C(c) (c ## LL)
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1059
diff changeset
138 # define uint64_t_C(c) (c ## ULL)
708
1aa1cbb8c3c1 indenting preprocessor stuff, as its completly unreadable otherwise
michaelni
parents: 706
diff changeset
139 # endif /* __MINGW32__ */
76
0b09bd08ef4b win32 fixes
glantau
parents: 66
diff changeset
140
1509
750b460ceb66 recommit of
michael
parents: 1444
diff changeset
141 # ifdef HAVE_AV_CONFIG_H
750b460ceb66 recommit of
michael
parents: 1444
diff changeset
142 # ifdef _DEBUG
750b460ceb66 recommit of
michael
parents: 1444
diff changeset
143 # define DEBUG
750b460ceb66 recommit of
michael
parents: 1444
diff changeset
144 # endif
750b460ceb66 recommit of
michael
parents: 1444
diff changeset
145
750b460ceb66 recommit of
michael
parents: 1444
diff changeset
146 # define snprintf _snprintf
750b460ceb66 recommit of
michael
parents: 1444
diff changeset
147 # define vsnprintf _vsnprintf
708
1aa1cbb8c3c1 indenting preprocessor stuff, as its completly unreadable otherwise
michaelni
parents: 706
diff changeset
148 # endif
64
5aa6292a1660 win32 fixes
glantau
parents: 21
diff changeset
149
994
7701ff462e3a os2 support patch by ("Slavik Gnatenko" <miracle9 at newmail dot ru>)
michaelni
parents: 976
diff changeset
150 /* CONFIG_WIN32 end */
7701ff462e3a os2 support patch by ("Slavik Gnatenko" <miracle9 at newmail dot ru>)
michaelni
parents: 976
diff changeset
151 #elif defined (CONFIG_OS2)
7701ff462e3a os2 support patch by ("Slavik Gnatenko" <miracle9 at newmail dot ru>)
michaelni
parents: 976
diff changeset
152 /* OS/2 EMX */
7701ff462e3a os2 support patch by ("Slavik Gnatenko" <miracle9 at newmail dot ru>)
michaelni
parents: 976
diff changeset
153
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1059
diff changeset
154 #ifndef int64_t_C
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1059
diff changeset
155 #define int64_t_C(c) (c ## LL)
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1059
diff changeset
156 #define uint64_t_C(c) (c ## ULL)
994
7701ff462e3a os2 support patch by ("Slavik Gnatenko" <miracle9 at newmail dot ru>)
michaelni
parents: 976
diff changeset
157 #endif
7701ff462e3a os2 support patch by ("Slavik Gnatenko" <miracle9 at newmail dot ru>)
michaelni
parents: 976
diff changeset
158
1413
724e6477f2a8 export int64_t_C as it is needed by libavformat.h
bellard
parents: 1401
diff changeset
159 #ifdef HAVE_AV_CONFIG_H
724e6477f2a8 export int64_t_C as it is needed by libavformat.h
bellard
parents: 1401
diff changeset
160
994
7701ff462e3a os2 support patch by ("Slavik Gnatenko" <miracle9 at newmail dot ru>)
michaelni
parents: 976
diff changeset
161 #ifdef USE_FASTMEMCPY
7701ff462e3a os2 support patch by ("Slavik Gnatenko" <miracle9 at newmail dot ru>)
michaelni
parents: 976
diff changeset
162 #include "fastmemcpy.h"
7701ff462e3a os2 support patch by ("Slavik Gnatenko" <miracle9 at newmail dot ru>)
michaelni
parents: 976
diff changeset
163 #endif
7701ff462e3a os2 support patch by ("Slavik Gnatenko" <miracle9 at newmail dot ru>)
michaelni
parents: 976
diff changeset
164
7701ff462e3a os2 support patch by ("Slavik Gnatenko" <miracle9 at newmail dot ru>)
michaelni
parents: 976
diff changeset
165 #include <float.h>
7701ff462e3a os2 support patch by ("Slavik Gnatenko" <miracle9 at newmail dot ru>)
michaelni
parents: 976
diff changeset
166
7701ff462e3a os2 support patch by ("Slavik Gnatenko" <miracle9 at newmail dot ru>)
michaelni
parents: 976
diff changeset
167 #endif /* HAVE_AV_CONFIG_H */
7701ff462e3a os2 support patch by ("Slavik Gnatenko" <miracle9 at newmail dot ru>)
michaelni
parents: 976
diff changeset
168
7701ff462e3a os2 support patch by ("Slavik Gnatenko" <miracle9 at newmail dot ru>)
michaelni
parents: 976
diff changeset
169 /* CONFIG_OS2 end */
7701ff462e3a os2 support patch by ("Slavik Gnatenko" <miracle9 at newmail dot ru>)
michaelni
parents: 976
diff changeset
170 #else
64
5aa6292a1660 win32 fixes
glantau
parents: 21
diff changeset
171
5aa6292a1660 win32 fixes
glantau
parents: 21
diff changeset
172 /* unix */
5aa6292a1660 win32 fixes
glantau
parents: 21
diff changeset
173
1413
724e6477f2a8 export int64_t_C as it is needed by libavformat.h
bellard
parents: 1401
diff changeset
174 #ifndef int64_t_C
724e6477f2a8 export int64_t_C as it is needed by libavformat.h
bellard
parents: 1401
diff changeset
175 #define int64_t_C(c) (c ## LL)
724e6477f2a8 export int64_t_C as it is needed by libavformat.h
bellard
parents: 1401
diff changeset
176 #define uint64_t_C(c) (c ## ULL)
724e6477f2a8 export int64_t_C as it is needed by libavformat.h
bellard
parents: 1401
diff changeset
177 #endif
724e6477f2a8 export int64_t_C as it is needed by libavformat.h
bellard
parents: 1401
diff changeset
178
724e6477f2a8 export int64_t_C as it is needed by libavformat.h
bellard
parents: 1401
diff changeset
179 #ifdef HAVE_AV_CONFIG_H
64
5aa6292a1660 win32 fixes
glantau
parents: 21
diff changeset
180
708
1aa1cbb8c3c1 indenting preprocessor stuff, as its completly unreadable otherwise
michaelni
parents: 706
diff changeset
181 # ifdef USE_FASTMEMCPY
1aa1cbb8c3c1 indenting preprocessor stuff, as its completly unreadable otherwise
michaelni
parents: 706
diff changeset
182 # include "fastmemcpy.h"
1aa1cbb8c3c1 indenting preprocessor stuff, as its completly unreadable otherwise
michaelni
parents: 706
diff changeset
183 # endif
1aa1cbb8c3c1 indenting preprocessor stuff, as its completly unreadable otherwise
michaelni
parents: 706
diff changeset
184 # endif /* HAVE_AV_CONFIG_H */
76
0b09bd08ef4b win32 fixes
glantau
parents: 66
diff changeset
185
994
7701ff462e3a os2 support patch by ("Slavik Gnatenko" <miracle9 at newmail dot ru>)
michaelni
parents: 976
diff changeset
186 #endif /* !CONFIG_WIN32 && !CONFIG_OS2 */
76
0b09bd08ef4b win32 fixes
glantau
parents: 66
diff changeset
187
488
90227eb98bf9 do not export internal functions - use stdint.h
bellard
parents: 451
diff changeset
188 #ifdef HAVE_AV_CONFIG_H
192
1e5f64be86fc another bitstream reader code (faster on intel cpus) - patch by Michael Niedermayer <michaelni@gmx.at>
uid46427
parents: 151
diff changeset
189
708
1aa1cbb8c3c1 indenting preprocessor stuff, as its completly unreadable otherwise
michaelni
parents: 706
diff changeset
190 # include "bswap.h"
426
a69ba632a048 better logic for bswap
glantau
parents: 423
diff changeset
191
708
1aa1cbb8c3c1 indenting preprocessor stuff, as its completly unreadable otherwise
michaelni
parents: 706
diff changeset
192 # if defined(__MINGW32__) || defined(__CYGWIN__) || \
1226
dbc7e3c814a9 Tiny patch for OpenBSD by (Bj«Órn Sandell <biorn at dce dot chalmers dot se>)
michaelni
parents: 1177
diff changeset
193 defined(__OS2__) || (defined (__OpenBSD__) && !defined(__ELF__))
708
1aa1cbb8c3c1 indenting preprocessor stuff, as its completly unreadable otherwise
michaelni
parents: 706
diff changeset
194 # define MANGLE(a) "_" #a
1aa1cbb8c3c1 indenting preprocessor stuff, as its completly unreadable otherwise
michaelni
parents: 706
diff changeset
195 # else
1aa1cbb8c3c1 indenting preprocessor stuff, as its completly unreadable otherwise
michaelni
parents: 706
diff changeset
196 # define MANGLE(a) #a
1aa1cbb8c3c1 indenting preprocessor stuff, as its completly unreadable otherwise
michaelni
parents: 706
diff changeset
197 # endif
432
b245457fb912 fixed mangle issue
bellard
parents: 426
diff changeset
198
76
0b09bd08ef4b win32 fixes
glantau
parents: 66
diff changeset
199 /* debug stuff */
0b09bd08ef4b win32 fixes
glantau
parents: 66
diff changeset
200
708
1aa1cbb8c3c1 indenting preprocessor stuff, as its completly unreadable otherwise
michaelni
parents: 706
diff changeset
201 # ifndef DEBUG
1aa1cbb8c3c1 indenting preprocessor stuff, as its completly unreadable otherwise
michaelni
parents: 706
diff changeset
202 # define NDEBUG
1aa1cbb8c3c1 indenting preprocessor stuff, as its completly unreadable otherwise
michaelni
parents: 706
diff changeset
203 # endif
1aa1cbb8c3c1 indenting preprocessor stuff, as its completly unreadable otherwise
michaelni
parents: 706
diff changeset
204 # include <assert.h>
64
5aa6292a1660 win32 fixes
glantau
parents: 21
diff changeset
205
76
0b09bd08ef4b win32 fixes
glantau
parents: 66
diff changeset
206 /* dprintf macros */
708
1aa1cbb8c3c1 indenting preprocessor stuff, as its completly unreadable otherwise
michaelni
parents: 706
diff changeset
207 # if defined(CONFIG_WIN32) && !defined(__MINGW32__)
76
0b09bd08ef4b win32 fixes
glantau
parents: 66
diff changeset
208
0b09bd08ef4b win32 fixes
glantau
parents: 66
diff changeset
209 inline void dprintf(const char* fmt,...) {}
0b09bd08ef4b win32 fixes
glantau
parents: 66
diff changeset
210
708
1aa1cbb8c3c1 indenting preprocessor stuff, as its completly unreadable otherwise
michaelni
parents: 706
diff changeset
211 # else
76
0b09bd08ef4b win32 fixes
glantau
parents: 66
diff changeset
212
708
1aa1cbb8c3c1 indenting preprocessor stuff, as its completly unreadable otherwise
michaelni
parents: 706
diff changeset
213 # ifdef DEBUG
1545
b340e83b8d0d gcc->C99 and warning fixes patch by (Dan Christiansen <danchr at daimi dot au dot dk>)
michael
parents: 1522
diff changeset
214 # define dprintf(fmt,...) printf(fmt, __VA_ARGS__)
708
1aa1cbb8c3c1 indenting preprocessor stuff, as its completly unreadable otherwise
michaelni
parents: 706
diff changeset
215 # else
1545
b340e83b8d0d gcc->C99 and warning fixes patch by (Dan Christiansen <danchr at daimi dot au dot dk>)
michael
parents: 1522
diff changeset
216 # define dprintf(fmt,...)
708
1aa1cbb8c3c1 indenting preprocessor stuff, as its completly unreadable otherwise
michaelni
parents: 706
diff changeset
217 # endif
64
5aa6292a1660 win32 fixes
glantau
parents: 21
diff changeset
218
708
1aa1cbb8c3c1 indenting preprocessor stuff, as its completly unreadable otherwise
michaelni
parents: 706
diff changeset
219 # endif /* !CONFIG_WIN32 */
64
5aa6292a1660 win32 fixes
glantau
parents: 21
diff changeset
220
1598
932d306bf1dc av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1548
diff changeset
221 # define av_abort() do { av_log(NULL, AV_LOG_ERROR, "Abort at %s:%d\n", __FILE__, __LINE__); abort(); } while (0)
423
ed6098c4216a Add an av_abort macro that aborts, but also prints out the location of the abort.
philipjsg
parents: 408
diff changeset
222
753
8e1f0939d15d complete mpeg4 GMC decoding support
michaelni
parents: 708
diff changeset
223 //rounded divison & shift
8e1f0939d15d complete mpeg4 GMC decoding support
michaelni
parents: 708
diff changeset
224 #define RSHIFT(a,b) ((a) > 0 ? ((a) + (1<<((b)-1)))>>(b) : ((a) + (1<<((b)-1))-1)>>(b))
344
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 327
diff changeset
225 /* assume b>0 */
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 327
diff changeset
226 #define ROUNDED_DIV(a,b) (((a)>0 ? (a) + ((b)>>1) : (a) - ((b)>>1))/(b))
359
df0736462b9f move ABS() to common.h
michaelni
parents: 358
diff changeset
227 #define ABS(a) ((a) >= 0 ? (a) : (-(a)))
823
5344ecb2c677 put MIN/MAX under ifndef MAX/MIN
michaelni
parents: 753
diff changeset
228
847
f3c369b8ddca reversing header game
michaelni
parents: 840
diff changeset
229 #define FFMAX(a,b) ((a) > (b) ? (a) : (b))
f3c369b8ddca reversing header game
michaelni
parents: 840
diff changeset
230 #define FFMIN(a,b) ((a) > (b) ? (b) : (a))
344
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 327
diff changeset
231
1261
362947395f5c fastdiv patch by (BERO <bero at geocities dot co dot jp>) with fixes & cleanup by me
michaelni
parents: 1257
diff changeset
232 extern const uint32_t inverse[256];
362947395f5c fastdiv patch by (BERO <bero at geocities dot co dot jp>) with fixes & cleanup by me
michaelni
parents: 1257
diff changeset
233
362947395f5c fastdiv patch by (BERO <bero at geocities dot co dot jp>) with fixes & cleanup by me
michaelni
parents: 1257
diff changeset
234 #ifdef ARCH_X86
362947395f5c fastdiv patch by (BERO <bero at geocities dot co dot jp>) with fixes & cleanup by me
michaelni
parents: 1257
diff changeset
235 # define FASTDIV(a,b) \
362947395f5c fastdiv patch by (BERO <bero at geocities dot co dot jp>) with fixes & cleanup by me
michaelni
parents: 1257
diff changeset
236 ({\
362947395f5c fastdiv patch by (BERO <bero at geocities dot co dot jp>) with fixes & cleanup by me
michaelni
parents: 1257
diff changeset
237 int ret,dmy;\
362947395f5c fastdiv patch by (BERO <bero at geocities dot co dot jp>) with fixes & cleanup by me
michaelni
parents: 1257
diff changeset
238 asm volatile(\
362947395f5c fastdiv patch by (BERO <bero at geocities dot co dot jp>) with fixes & cleanup by me
michaelni
parents: 1257
diff changeset
239 "mull %3"\
362947395f5c fastdiv patch by (BERO <bero at geocities dot co dot jp>) with fixes & cleanup by me
michaelni
parents: 1257
diff changeset
240 :"=d"(ret),"=a"(dmy)\
362947395f5c fastdiv patch by (BERO <bero at geocities dot co dot jp>) with fixes & cleanup by me
michaelni
parents: 1257
diff changeset
241 :"1"(a),"g"(inverse[b])\
362947395f5c fastdiv patch by (BERO <bero at geocities dot co dot jp>) with fixes & cleanup by me
michaelni
parents: 1257
diff changeset
242 );\
362947395f5c fastdiv patch by (BERO <bero at geocities dot co dot jp>) with fixes & cleanup by me
michaelni
parents: 1257
diff changeset
243 ret;\
362947395f5c fastdiv patch by (BERO <bero at geocities dot co dot jp>) with fixes & cleanup by me
michaelni
parents: 1257
diff changeset
244 })
362947395f5c fastdiv patch by (BERO <bero at geocities dot co dot jp>) with fixes & cleanup by me
michaelni
parents: 1257
diff changeset
245 #elif defined(CONFIG_FASTDIV)
362947395f5c fastdiv patch by (BERO <bero at geocities dot co dot jp>) with fixes & cleanup by me
michaelni
parents: 1257
diff changeset
246 # define FASTDIV(a,b) ((uint32_t)((((uint64_t)a)*inverse[b])>>32))
362947395f5c fastdiv patch by (BERO <bero at geocities dot co dot jp>) with fixes & cleanup by me
michaelni
parents: 1257
diff changeset
247 #else
362947395f5c fastdiv patch by (BERO <bero at geocities dot co dot jp>) with fixes & cleanup by me
michaelni
parents: 1257
diff changeset
248 # define FASTDIV(a,b) ((a)/(b))
362947395f5c fastdiv patch by (BERO <bero at geocities dot co dot jp>) with fixes & cleanup by me
michaelni
parents: 1257
diff changeset
249 #endif
362947395f5c fastdiv patch by (BERO <bero at geocities dot co dot jp>) with fixes & cleanup by me
michaelni
parents: 1257
diff changeset
250
525
985187bc2fa3 c std doesnt like negative shifts -> use asm
michaelni
parents: 522
diff changeset
251 #ifdef ARCH_X86
985187bc2fa3 c std doesnt like negative shifts -> use asm
michaelni
parents: 522
diff changeset
252 // avoid +32 for shift optimization (gcc should do that ...)
985187bc2fa3 c std doesnt like negative shifts -> use asm
michaelni
parents: 522
diff changeset
253 static inline int32_t NEG_SSR32( int32_t a, int8_t s){
985187bc2fa3 c std doesnt like negative shifts -> use asm
michaelni
parents: 522
diff changeset
254 asm ("sarl %1, %0\n\t"
985187bc2fa3 c std doesnt like negative shifts -> use asm
michaelni
parents: 522
diff changeset
255 : "+r" (a)
985187bc2fa3 c std doesnt like negative shifts -> use asm
michaelni
parents: 522
diff changeset
256 : "ic" ((uint8_t)(-s))
985187bc2fa3 c std doesnt like negative shifts -> use asm
michaelni
parents: 522
diff changeset
257 );
985187bc2fa3 c std doesnt like negative shifts -> use asm
michaelni
parents: 522
diff changeset
258 return a;
985187bc2fa3 c std doesnt like negative shifts -> use asm
michaelni
parents: 522
diff changeset
259 }
985187bc2fa3 c std doesnt like negative shifts -> use asm
michaelni
parents: 522
diff changeset
260 static inline uint32_t NEG_USR32(uint32_t a, int8_t s){
985187bc2fa3 c std doesnt like negative shifts -> use asm
michaelni
parents: 522
diff changeset
261 asm ("shrl %1, %0\n\t"
985187bc2fa3 c std doesnt like negative shifts -> use asm
michaelni
parents: 522
diff changeset
262 : "+r" (a)
985187bc2fa3 c std doesnt like negative shifts -> use asm
michaelni
parents: 522
diff changeset
263 : "ic" ((uint8_t)(-s))
985187bc2fa3 c std doesnt like negative shifts -> use asm
michaelni
parents: 522
diff changeset
264 );
985187bc2fa3 c std doesnt like negative shifts -> use asm
michaelni
parents: 522
diff changeset
265 return a;
985187bc2fa3 c std doesnt like negative shifts -> use asm
michaelni
parents: 522
diff changeset
266 }
520
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
267 #else
708
1aa1cbb8c3c1 indenting preprocessor stuff, as its completly unreadable otherwise
michaelni
parents: 706
diff changeset
268 # define NEG_SSR32(a,s) ((( int32_t)(a))>>(32-(s)))
1aa1cbb8c3c1 indenting preprocessor stuff, as its completly unreadable otherwise
michaelni
parents: 706
diff changeset
269 # define NEG_USR32(a,s) (((uint32_t)(a))>>(32-(s)))
520
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
270 #endif
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
271
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
272 /* bit output */
986e461dc072 Initial revision
glantau
parents:
diff changeset
273
986e461dc072 Initial revision
glantau
parents:
diff changeset
274 struct PutBitContext;
986e461dc072 Initial revision
glantau
parents:
diff changeset
275
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1059
diff changeset
276 typedef void (*WriteDataFunc)(void *, uint8_t *, int);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
277
986e461dc072 Initial revision
glantau
parents:
diff changeset
278 typedef struct PutBitContext {
234
5fc0c3af3fe4 alternative bitstream writer (disabled by default, uncomment #define ALT_BISTREAM_WRITER in common.h if u want to try it)
michaelni
parents: 213
diff changeset
279 #ifdef ALT_BITSTREAM_WRITER
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1059
diff changeset
280 uint8_t *buf, *buf_end;
234
5fc0c3af3fe4 alternative bitstream writer (disabled by default, uncomment #define ALT_BISTREAM_WRITER in common.h if u want to try it)
michaelni
parents: 213
diff changeset
281 int index;
5fc0c3af3fe4 alternative bitstream writer (disabled by default, uncomment #define ALT_BISTREAM_WRITER in common.h if u want to try it)
michaelni
parents: 213
diff changeset
282 #else
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1059
diff changeset
283 uint32_t bit_buf;
238
99a9f903f0e3 optimized the normal bitstream writer, its faster than the alternative one on p3 now ... lets hope its at least not slower on p4 & k7
michaelni
parents: 235
diff changeset
284 int bit_left;
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1059
diff changeset
285 uint8_t *buf, *buf_ptr, *buf_end;
234
5fc0c3af3fe4 alternative bitstream writer (disabled by default, uncomment #define ALT_BISTREAM_WRITER in common.h if u want to try it)
michaelni
parents: 213
diff changeset
286 #endif
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
287 } PutBitContext;
986e461dc072 Initial revision
glantau
parents:
diff changeset
288
1522
79dddc5cd990 removed the obsolete and unused parameters of init_put_bits
alex
parents: 1509
diff changeset
289 void init_put_bits(PutBitContext *s, uint8_t *buffer, int buffer_size);
234
5fc0c3af3fe4 alternative bitstream writer (disabled by default, uncomment #define ALT_BISTREAM_WRITER in common.h if u want to try it)
michaelni
parents: 213
diff changeset
290
1786
b7340afa261a get_bit_count -> put_bits_count
alex
parents: 1761
diff changeset
291 int put_bits_count(PutBitContext *s);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
292 void align_put_bits(PutBitContext *s);
986e461dc072 Initial revision
glantau
parents:
diff changeset
293 void flush_put_bits(PutBitContext *s);
1795
920e6381e1fe 2 byte shorter userdata for mpeg4
michael
parents: 1786
diff changeset
294 void put_string(PutBitContext * pbc, char *s, int put_zero);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
295
986e461dc072 Initial revision
glantau
parents:
diff changeset
296 /* bit input */
986e461dc072 Initial revision
glantau
parents:
diff changeset
297
986e461dc072 Initial revision
glantau
parents:
diff changeset
298 typedef struct GetBitContext {
1083
b923be2fc4b5 * using const buffers for reading
kabi
parents: 1079
diff changeset
299 const uint8_t *buffer, *buffer_end;
192
1e5f64be86fc another bitstream reader code (faster on intel cpus) - patch by Michael Niedermayer <michaelni@gmx.at>
uid46427
parents: 151
diff changeset
300 #ifdef ALT_BITSTREAM_READER
1e5f64be86fc another bitstream reader code (faster on intel cpus) - patch by Michael Niedermayer <michaelni@gmx.at>
uid46427
parents: 151
diff changeset
301 int index;
520
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
302 #elif defined LIBMPEG2_BITSTREAM_READER
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1059
diff changeset
303 uint8_t *buffer_ptr;
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1059
diff changeset
304 uint32_t cache;
520
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
305 int bit_count;
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
306 #elif defined A32_BITSTREAM_READER
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1059
diff changeset
307 uint32_t *buffer_ptr;
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1059
diff changeset
308 uint32_t cache0;
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1059
diff changeset
309 uint32_t cache1;
520
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
310 int bit_count;
192
1e5f64be86fc another bitstream reader code (faster on intel cpus) - patch by Michael Niedermayer <michaelni@gmx.at>
uid46427
parents: 151
diff changeset
311 #endif
1025
1f9afd8b9131 GetBitContext.size is allways multiplied by 8 -> use size_in_bits to avoid useless *8 in a few inner loops
michaelni
parents: 994
diff changeset
312 int size_in_bits;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
313 } GetBitContext;
986e461dc072 Initial revision
glantau
parents:
diff changeset
314
290
2899263586cd resync marker support, needed for some mp4 files
michaelni
parents: 277
diff changeset
315 static inline int get_bits_count(GetBitContext *s);
2899263586cd resync marker support, needed for some mp4 files
michaelni
parents: 277
diff changeset
316
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1059
diff changeset
317 #define VLC_TYPE int16_t
520
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
318
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
319 typedef struct VLC {
986e461dc072 Initial revision
glantau
parents:
diff changeset
320 int bits;
1112
54be6aece1be more cosmetics so that doxygen output is readable ...
michaelni
parents: 1106
diff changeset
321 VLC_TYPE (*table)[2]; ///< code, bits
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
322 int table_size, table_allocated;
986e461dc072 Initial revision
glantau
parents:
diff changeset
323 } VLC;
986e461dc072 Initial revision
glantau
parents:
diff changeset
324
542
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 535
diff changeset
325 typedef struct RL_VLC_ELEM {
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 535
diff changeset
326 int16_t level;
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 535
diff changeset
327 int8_t len;
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 535
diff changeset
328 uint8_t run;
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 535
diff changeset
329 } RL_VLC_ELEM;
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 535
diff changeset
330
891
d3fc77a6d57e Add some rudimentary support for sparc64
philipjsg
parents: 880
diff changeset
331 #ifdef ARCH_SPARC64
d3fc77a6d57e Add some rudimentary support for sparc64
philipjsg
parents: 880
diff changeset
332 #define UNALIGNED_STORES_ARE_BAD
d3fc77a6d57e Add some rudimentary support for sparc64
philipjsg
parents: 880
diff changeset
333 #endif
d3fc77a6d57e Add some rudimentary support for sparc64
philipjsg
parents: 880
diff changeset
334
193
b691dd3e9088 aligned bitstream support (optional) - patch by ichael Niedermayer <michaelni@gmx.at>
arpi_esp
parents: 192
diff changeset
335 /* used to avoid missaligned exceptions on some archs (alpha, ...) */
b691dd3e9088 aligned bitstream support (optional) - patch by ichael Niedermayer <michaelni@gmx.at>
arpi_esp
parents: 192
diff changeset
336 #ifdef ARCH_X86
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1059
diff changeset
337 # define unaligned32(a) (*(uint32_t*)(a))
193
b691dd3e9088 aligned bitstream support (optional) - patch by ichael Niedermayer <michaelni@gmx.at>
arpi_esp
parents: 192
diff changeset
338 #else
708
1aa1cbb8c3c1 indenting preprocessor stuff, as its completly unreadable otherwise
michaelni
parents: 706
diff changeset
339 # ifdef __GNUC__
193
b691dd3e9088 aligned bitstream support (optional) - patch by ichael Niedermayer <michaelni@gmx.at>
arpi_esp
parents: 192
diff changeset
340 static inline uint32_t unaligned32(const void *v) {
b691dd3e9088 aligned bitstream support (optional) - patch by ichael Niedermayer <michaelni@gmx.at>
arpi_esp
parents: 192
diff changeset
341 struct Unaligned {
b691dd3e9088 aligned bitstream support (optional) - patch by ichael Niedermayer <michaelni@gmx.at>
arpi_esp
parents: 192
diff changeset
342 uint32_t i;
b691dd3e9088 aligned bitstream support (optional) - patch by ichael Niedermayer <michaelni@gmx.at>
arpi_esp
parents: 192
diff changeset
343 } __attribute__((packed));
b691dd3e9088 aligned bitstream support (optional) - patch by ichael Niedermayer <michaelni@gmx.at>
arpi_esp
parents: 192
diff changeset
344
b691dd3e9088 aligned bitstream support (optional) - patch by ichael Niedermayer <michaelni@gmx.at>
arpi_esp
parents: 192
diff changeset
345 return ((const struct Unaligned *) v)->i;
b691dd3e9088 aligned bitstream support (optional) - patch by ichael Niedermayer <michaelni@gmx.at>
arpi_esp
parents: 192
diff changeset
346 }
708
1aa1cbb8c3c1 indenting preprocessor stuff, as its completly unreadable otherwise
michaelni
parents: 706
diff changeset
347 # elif defined(__DECC)
193
b691dd3e9088 aligned bitstream support (optional) - patch by ichael Niedermayer <michaelni@gmx.at>
arpi_esp
parents: 192
diff changeset
348 static inline uint32_t unaligned32(const void *v) {
b691dd3e9088 aligned bitstream support (optional) - patch by ichael Niedermayer <michaelni@gmx.at>
arpi_esp
parents: 192
diff changeset
349 return *(const __unaligned uint32_t *) v;
b691dd3e9088 aligned bitstream support (optional) - patch by ichael Niedermayer <michaelni@gmx.at>
arpi_esp
parents: 192
diff changeset
350 }
708
1aa1cbb8c3c1 indenting preprocessor stuff, as its completly unreadable otherwise
michaelni
parents: 706
diff changeset
351 # else
193
b691dd3e9088 aligned bitstream support (optional) - patch by ichael Niedermayer <michaelni@gmx.at>
arpi_esp
parents: 192
diff changeset
352 static inline uint32_t unaligned32(const void *v) {
b691dd3e9088 aligned bitstream support (optional) - patch by ichael Niedermayer <michaelni@gmx.at>
arpi_esp
parents: 192
diff changeset
353 return *(const uint32_t *) v;
b691dd3e9088 aligned bitstream support (optional) - patch by ichael Niedermayer <michaelni@gmx.at>
arpi_esp
parents: 192
diff changeset
354 }
708
1aa1cbb8c3c1 indenting preprocessor stuff, as its completly unreadable otherwise
michaelni
parents: 706
diff changeset
355 # endif
193
b691dd3e9088 aligned bitstream support (optional) - patch by ichael Niedermayer <michaelni@gmx.at>
arpi_esp
parents: 192
diff changeset
356 #endif //!ARCH_X86
b691dd3e9088 aligned bitstream support (optional) - patch by ichael Niedermayer <michaelni@gmx.at>
arpi_esp
parents: 192
diff changeset
357
238
99a9f903f0e3 optimized the normal bitstream writer, its faster than the alternative one on p3 now ... lets hope its at least not slower on p4 & k7
michaelni
parents: 235
diff changeset
358 #ifndef ALT_BITSTREAM_WRITER
99a9f903f0e3 optimized the normal bitstream writer, its faster than the alternative one on p3 now ... lets hope its at least not slower on p4 & k7
michaelni
parents: 235
diff changeset
359 static inline void put_bits(PutBitContext *s, int n, unsigned int value)
99a9f903f0e3 optimized the normal bitstream writer, its faster than the alternative one on p3 now ... lets hope its at least not slower on p4 & k7
michaelni
parents: 235
diff changeset
360 {
99a9f903f0e3 optimized the normal bitstream writer, its faster than the alternative one on p3 now ... lets hope its at least not slower on p4 & k7
michaelni
parents: 235
diff changeset
361 unsigned int bit_buf;
99a9f903f0e3 optimized the normal bitstream writer, its faster than the alternative one on p3 now ... lets hope its at least not slower on p4 & k7
michaelni
parents: 235
diff changeset
362 int bit_left;
99a9f903f0e3 optimized the normal bitstream writer, its faster than the alternative one on p3 now ... lets hope its at least not slower on p4 & k7
michaelni
parents: 235
diff changeset
363
99a9f903f0e3 optimized the normal bitstream writer, its faster than the alternative one on p3 now ... lets hope its at least not slower on p4 & k7
michaelni
parents: 235
diff changeset
364 #ifdef STATS
99a9f903f0e3 optimized the normal bitstream writer, its faster than the alternative one on p3 now ... lets hope its at least not slower on p4 & k7
michaelni
parents: 235
diff changeset
365 st_out_bit_counts[st_current_index] += n;
99a9f903f0e3 optimized the normal bitstream writer, its faster than the alternative one on p3 now ... lets hope its at least not slower on p4 & k7
michaelni
parents: 235
diff changeset
366 #endif
99a9f903f0e3 optimized the normal bitstream writer, its faster than the alternative one on p3 now ... lets hope its at least not slower on p4 & k7
michaelni
parents: 235
diff changeset
367 // printf("put_bits=%d %x\n", n, value);
99a9f903f0e3 optimized the normal bitstream writer, its faster than the alternative one on p3 now ... lets hope its at least not slower on p4 & k7
michaelni
parents: 235
diff changeset
368 assert(n == 32 || value < (1U << n));
306
ebfd518cbbbf dump_stream support (nicely formated 0s and 1s)
michaelni
parents: 290
diff changeset
369
238
99a9f903f0e3 optimized the normal bitstream writer, its faster than the alternative one on p3 now ... lets hope its at least not slower on p4 & k7
michaelni
parents: 235
diff changeset
370 bit_buf = s->bit_buf;
99a9f903f0e3 optimized the normal bitstream writer, its faster than the alternative one on p3 now ... lets hope its at least not slower on p4 & k7
michaelni
parents: 235
diff changeset
371 bit_left = s->bit_left;
99a9f903f0e3 optimized the normal bitstream writer, its faster than the alternative one on p3 now ... lets hope its at least not slower on p4 & k7
michaelni
parents: 235
diff changeset
372
99a9f903f0e3 optimized the normal bitstream writer, its faster than the alternative one on p3 now ... lets hope its at least not slower on p4 & k7
michaelni
parents: 235
diff changeset
373 // printf("n=%d value=%x cnt=%d buf=%x\n", n, value, bit_cnt, bit_buf);
99a9f903f0e3 optimized the normal bitstream writer, its faster than the alternative one on p3 now ... lets hope its at least not slower on p4 & k7
michaelni
parents: 235
diff changeset
374 /* XXX: optimize */
99a9f903f0e3 optimized the normal bitstream writer, its faster than the alternative one on p3 now ... lets hope its at least not slower on p4 & k7
michaelni
parents: 235
diff changeset
375 if (n < bit_left) {
99a9f903f0e3 optimized the normal bitstream writer, its faster than the alternative one on p3 now ... lets hope its at least not slower on p4 & k7
michaelni
parents: 235
diff changeset
376 bit_buf = (bit_buf<<n) | value;
99a9f903f0e3 optimized the normal bitstream writer, its faster than the alternative one on p3 now ... lets hope its at least not slower on p4 & k7
michaelni
parents: 235
diff changeset
377 bit_left-=n;
99a9f903f0e3 optimized the normal bitstream writer, its faster than the alternative one on p3 now ... lets hope its at least not slower on p4 & k7
michaelni
parents: 235
diff changeset
378 } else {
99a9f903f0e3 optimized the normal bitstream writer, its faster than the alternative one on p3 now ... lets hope its at least not slower on p4 & k7
michaelni
parents: 235
diff changeset
379 bit_buf<<=bit_left;
99a9f903f0e3 optimized the normal bitstream writer, its faster than the alternative one on p3 now ... lets hope its at least not slower on p4 & k7
michaelni
parents: 235
diff changeset
380 bit_buf |= value >> (n - bit_left);
891
d3fc77a6d57e Add some rudimentary support for sparc64
philipjsg
parents: 880
diff changeset
381 #ifdef UNALIGNED_STORES_ARE_BAD
d3fc77a6d57e Add some rudimentary support for sparc64
philipjsg
parents: 880
diff changeset
382 if (3 & (int) s->buf_ptr) {
d3fc77a6d57e Add some rudimentary support for sparc64
philipjsg
parents: 880
diff changeset
383 s->buf_ptr[0] = bit_buf >> 24;
d3fc77a6d57e Add some rudimentary support for sparc64
philipjsg
parents: 880
diff changeset
384 s->buf_ptr[1] = bit_buf >> 16;
d3fc77a6d57e Add some rudimentary support for sparc64
philipjsg
parents: 880
diff changeset
385 s->buf_ptr[2] = bit_buf >> 8;
d3fc77a6d57e Add some rudimentary support for sparc64
philipjsg
parents: 880
diff changeset
386 s->buf_ptr[3] = bit_buf ;
d3fc77a6d57e Add some rudimentary support for sparc64
philipjsg
parents: 880
diff changeset
387 } else
d3fc77a6d57e Add some rudimentary support for sparc64
philipjsg
parents: 880
diff changeset
388 #endif
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1059
diff changeset
389 *(uint32_t *)s->buf_ptr = be2me_32(bit_buf);
238
99a9f903f0e3 optimized the normal bitstream writer, its faster than the alternative one on p3 now ... lets hope its at least not slower on p4 & k7
michaelni
parents: 235
diff changeset
390 //printf("bitbuf = %08x\n", bit_buf);
99a9f903f0e3 optimized the normal bitstream writer, its faster than the alternative one on p3 now ... lets hope its at least not slower on p4 & k7
michaelni
parents: 235
diff changeset
391 s->buf_ptr+=4;
99a9f903f0e3 optimized the normal bitstream writer, its faster than the alternative one on p3 now ... lets hope its at least not slower on p4 & k7
michaelni
parents: 235
diff changeset
392 bit_left+=32 - n;
99a9f903f0e3 optimized the normal bitstream writer, its faster than the alternative one on p3 now ... lets hope its at least not slower on p4 & k7
michaelni
parents: 235
diff changeset
393 bit_buf = value;
99a9f903f0e3 optimized the normal bitstream writer, its faster than the alternative one on p3 now ... lets hope its at least not slower on p4 & k7
michaelni
parents: 235
diff changeset
394 }
99a9f903f0e3 optimized the normal bitstream writer, its faster than the alternative one on p3 now ... lets hope its at least not slower on p4 & k7
michaelni
parents: 235
diff changeset
395
99a9f903f0e3 optimized the normal bitstream writer, its faster than the alternative one on p3 now ... lets hope its at least not slower on p4 & k7
michaelni
parents: 235
diff changeset
396 s->bit_buf = bit_buf;
99a9f903f0e3 optimized the normal bitstream writer, its faster than the alternative one on p3 now ... lets hope its at least not slower on p4 & k7
michaelni
parents: 235
diff changeset
397 s->bit_left = bit_left;
99a9f903f0e3 optimized the normal bitstream writer, its faster than the alternative one on p3 now ... lets hope its at least not slower on p4 & k7
michaelni
parents: 235
diff changeset
398 }
99a9f903f0e3 optimized the normal bitstream writer, its faster than the alternative one on p3 now ... lets hope its at least not slower on p4 & k7
michaelni
parents: 235
diff changeset
399 #endif
99a9f903f0e3 optimized the normal bitstream writer, its faster than the alternative one on p3 now ... lets hope its at least not slower on p4 & k7
michaelni
parents: 235
diff changeset
400
99a9f903f0e3 optimized the normal bitstream writer, its faster than the alternative one on p3 now ... lets hope its at least not slower on p4 & k7
michaelni
parents: 235
diff changeset
401
234
5fc0c3af3fe4 alternative bitstream writer (disabled by default, uncomment #define ALT_BISTREAM_WRITER in common.h if u want to try it)
michaelni
parents: 213
diff changeset
402 #ifdef ALT_BITSTREAM_WRITER
235
41f0ef2cd942 aligned bitstream writer (1% slower on p3 but perhaps its faster on p4?)
michaelni
parents: 234
diff changeset
403 static inline void put_bits(PutBitContext *s, int n, unsigned int value)
234
5fc0c3af3fe4 alternative bitstream writer (disabled by default, uncomment #define ALT_BISTREAM_WRITER in common.h if u want to try it)
michaelni
parents: 213
diff changeset
404 {
708
1aa1cbb8c3c1 indenting preprocessor stuff, as its completly unreadable otherwise
michaelni
parents: 706
diff changeset
405 # ifdef ALIGNED_BITSTREAM_WRITER
1aa1cbb8c3c1 indenting preprocessor stuff, as its completly unreadable otherwise
michaelni
parents: 706
diff changeset
406 # ifdef ARCH_X86
235
41f0ef2cd942 aligned bitstream writer (1% slower on p3 but perhaps its faster on p4?)
michaelni
parents: 234
diff changeset
407 asm volatile(
41f0ef2cd942 aligned bitstream writer (1% slower on p3 but perhaps its faster on p4?)
michaelni
parents: 234
diff changeset
408 "movl %0, %%ecx \n\t"
41f0ef2cd942 aligned bitstream writer (1% slower on p3 but perhaps its faster on p4?)
michaelni
parents: 234
diff changeset
409 "xorl %%eax, %%eax \n\t"
41f0ef2cd942 aligned bitstream writer (1% slower on p3 but perhaps its faster on p4?)
michaelni
parents: 234
diff changeset
410 "shrdl %%cl, %1, %%eax \n\t"
41f0ef2cd942 aligned bitstream writer (1% slower on p3 but perhaps its faster on p4?)
michaelni
parents: 234
diff changeset
411 "shrl %%cl, %1 \n\t"
41f0ef2cd942 aligned bitstream writer (1% slower on p3 but perhaps its faster on p4?)
michaelni
parents: 234
diff changeset
412 "movl %0, %%ecx \n\t"
41f0ef2cd942 aligned bitstream writer (1% slower on p3 but perhaps its faster on p4?)
michaelni
parents: 234
diff changeset
413 "shrl $3, %%ecx \n\t"
41f0ef2cd942 aligned bitstream writer (1% slower on p3 but perhaps its faster on p4?)
michaelni
parents: 234
diff changeset
414 "andl $0xFFFFFFFC, %%ecx \n\t"
41f0ef2cd942 aligned bitstream writer (1% slower on p3 but perhaps its faster on p4?)
michaelni
parents: 234
diff changeset
415 "bswapl %1 \n\t"
41f0ef2cd942 aligned bitstream writer (1% slower on p3 but perhaps its faster on p4?)
michaelni
parents: 234
diff changeset
416 "orl %1, (%2, %%ecx) \n\t"
41f0ef2cd942 aligned bitstream writer (1% slower on p3 but perhaps its faster on p4?)
michaelni
parents: 234
diff changeset
417 "bswapl %%eax \n\t"
41f0ef2cd942 aligned bitstream writer (1% slower on p3 but perhaps its faster on p4?)
michaelni
parents: 234
diff changeset
418 "addl %3, %0 \n\t"
41f0ef2cd942 aligned bitstream writer (1% slower on p3 but perhaps its faster on p4?)
michaelni
parents: 234
diff changeset
419 "movl %%eax, 4(%2, %%ecx) \n\t"
41f0ef2cd942 aligned bitstream writer (1% slower on p3 but perhaps its faster on p4?)
michaelni
parents: 234
diff changeset
420 : "=&r" (s->index), "=&r" (value)
41f0ef2cd942 aligned bitstream writer (1% slower on p3 but perhaps its faster on p4?)
michaelni
parents: 234
diff changeset
421 : "r" (s->buf), "r" (n), "0" (s->index), "1" (value<<(-n))
41f0ef2cd942 aligned bitstream writer (1% slower on p3 but perhaps its faster on p4?)
michaelni
parents: 234
diff changeset
422 : "%eax", "%ecx"
41f0ef2cd942 aligned bitstream writer (1% slower on p3 but perhaps its faster on p4?)
michaelni
parents: 234
diff changeset
423 );
708
1aa1cbb8c3c1 indenting preprocessor stuff, as its completly unreadable otherwise
michaelni
parents: 706
diff changeset
424 # else
235
41f0ef2cd942 aligned bitstream writer (1% slower on p3 but perhaps its faster on p4?)
michaelni
parents: 234
diff changeset
425 int index= s->index;
41f0ef2cd942 aligned bitstream writer (1% slower on p3 but perhaps its faster on p4?)
michaelni
parents: 234
diff changeset
426 uint32_t *ptr= ((uint32_t *)s->buf)+(index>>5);
41f0ef2cd942 aligned bitstream writer (1% slower on p3 but perhaps its faster on p4?)
michaelni
parents: 234
diff changeset
427
41f0ef2cd942 aligned bitstream writer (1% slower on p3 but perhaps its faster on p4?)
michaelni
parents: 234
diff changeset
428 value<<= 32-n;
41f0ef2cd942 aligned bitstream writer (1% slower on p3 but perhaps its faster on p4?)
michaelni
parents: 234
diff changeset
429
41f0ef2cd942 aligned bitstream writer (1% slower on p3 but perhaps its faster on p4?)
michaelni
parents: 234
diff changeset
430 ptr[0] |= be2me_32(value>>(index&31));
41f0ef2cd942 aligned bitstream writer (1% slower on p3 but perhaps its faster on p4?)
michaelni
parents: 234
diff changeset
431 ptr[1] = be2me_32(value<<(32-(index&31)));
41f0ef2cd942 aligned bitstream writer (1% slower on p3 but perhaps its faster on p4?)
michaelni
parents: 234
diff changeset
432 //if(n>24) printf("%d %d\n", n, value);
41f0ef2cd942 aligned bitstream writer (1% slower on p3 but perhaps its faster on p4?)
michaelni
parents: 234
diff changeset
433 index+= n;
41f0ef2cd942 aligned bitstream writer (1% slower on p3 but perhaps its faster on p4?)
michaelni
parents: 234
diff changeset
434 s->index= index;
708
1aa1cbb8c3c1 indenting preprocessor stuff, as its completly unreadable otherwise
michaelni
parents: 706
diff changeset
435 # endif
1aa1cbb8c3c1 indenting preprocessor stuff, as its completly unreadable otherwise
michaelni
parents: 706
diff changeset
436 # else //ALIGNED_BITSTREAM_WRITER
1aa1cbb8c3c1 indenting preprocessor stuff, as its completly unreadable otherwise
michaelni
parents: 706
diff changeset
437 # ifdef ARCH_X86
234
5fc0c3af3fe4 alternative bitstream writer (disabled by default, uncomment #define ALT_BISTREAM_WRITER in common.h if u want to try it)
michaelni
parents: 213
diff changeset
438 asm volatile(
5fc0c3af3fe4 alternative bitstream writer (disabled by default, uncomment #define ALT_BISTREAM_WRITER in common.h if u want to try it)
michaelni
parents: 213
diff changeset
439 "movl $7, %%ecx \n\t"
5fc0c3af3fe4 alternative bitstream writer (disabled by default, uncomment #define ALT_BISTREAM_WRITER in common.h if u want to try it)
michaelni
parents: 213
diff changeset
440 "andl %0, %%ecx \n\t"
5fc0c3af3fe4 alternative bitstream writer (disabled by default, uncomment #define ALT_BISTREAM_WRITER in common.h if u want to try it)
michaelni
parents: 213
diff changeset
441 "addl %3, %%ecx \n\t"
5fc0c3af3fe4 alternative bitstream writer (disabled by default, uncomment #define ALT_BISTREAM_WRITER in common.h if u want to try it)
michaelni
parents: 213
diff changeset
442 "negl %%ecx \n\t"
5fc0c3af3fe4 alternative bitstream writer (disabled by default, uncomment #define ALT_BISTREAM_WRITER in common.h if u want to try it)
michaelni
parents: 213
diff changeset
443 "shll %%cl, %1 \n\t"
5fc0c3af3fe4 alternative bitstream writer (disabled by default, uncomment #define ALT_BISTREAM_WRITER in common.h if u want to try it)
michaelni
parents: 213
diff changeset
444 "bswapl %1 \n\t"
5fc0c3af3fe4 alternative bitstream writer (disabled by default, uncomment #define ALT_BISTREAM_WRITER in common.h if u want to try it)
michaelni
parents: 213
diff changeset
445 "movl %0, %%ecx \n\t"
5fc0c3af3fe4 alternative bitstream writer (disabled by default, uncomment #define ALT_BISTREAM_WRITER in common.h if u want to try it)
michaelni
parents: 213
diff changeset
446 "shrl $3, %%ecx \n\t"
5fc0c3af3fe4 alternative bitstream writer (disabled by default, uncomment #define ALT_BISTREAM_WRITER in common.h if u want to try it)
michaelni
parents: 213
diff changeset
447 "orl %1, (%%ecx, %2) \n\t"
5fc0c3af3fe4 alternative bitstream writer (disabled by default, uncomment #define ALT_BISTREAM_WRITER in common.h if u want to try it)
michaelni
parents: 213
diff changeset
448 "addl %3, %0 \n\t"
5fc0c3af3fe4 alternative bitstream writer (disabled by default, uncomment #define ALT_BISTREAM_WRITER in common.h if u want to try it)
michaelni
parents: 213
diff changeset
449 "movl $0, 4(%%ecx, %2) \n\t"
5fc0c3af3fe4 alternative bitstream writer (disabled by default, uncomment #define ALT_BISTREAM_WRITER in common.h if u want to try it)
michaelni
parents: 213
diff changeset
450 : "=&r" (s->index), "=&r" (value)
5fc0c3af3fe4 alternative bitstream writer (disabled by default, uncomment #define ALT_BISTREAM_WRITER in common.h if u want to try it)
michaelni
parents: 213
diff changeset
451 : "r" (s->buf), "r" (n), "0" (s->index), "1" (value)
5fc0c3af3fe4 alternative bitstream writer (disabled by default, uncomment #define ALT_BISTREAM_WRITER in common.h if u want to try it)
michaelni
parents: 213
diff changeset
452 : "%ecx"
5fc0c3af3fe4 alternative bitstream writer (disabled by default, uncomment #define ALT_BISTREAM_WRITER in common.h if u want to try it)
michaelni
parents: 213
diff changeset
453 );
708
1aa1cbb8c3c1 indenting preprocessor stuff, as its completly unreadable otherwise
michaelni
parents: 706
diff changeset
454 # else
234
5fc0c3af3fe4 alternative bitstream writer (disabled by default, uncomment #define ALT_BISTREAM_WRITER in common.h if u want to try it)
michaelni
parents: 213
diff changeset
455 int index= s->index;
5fc0c3af3fe4 alternative bitstream writer (disabled by default, uncomment #define ALT_BISTREAM_WRITER in common.h if u want to try it)
michaelni
parents: 213
diff changeset
456 uint32_t *ptr= (uint32_t*)(((uint8_t *)s->buf)+(index>>3));
5fc0c3af3fe4 alternative bitstream writer (disabled by default, uncomment #define ALT_BISTREAM_WRITER in common.h if u want to try it)
michaelni
parents: 213
diff changeset
457
5fc0c3af3fe4 alternative bitstream writer (disabled by default, uncomment #define ALT_BISTREAM_WRITER in common.h if u want to try it)
michaelni
parents: 213
diff changeset
458 ptr[0] |= be2me_32(value<<(32-n-(index&7) ));
5fc0c3af3fe4 alternative bitstream writer (disabled by default, uncomment #define ALT_BISTREAM_WRITER in common.h if u want to try it)
michaelni
parents: 213
diff changeset
459 ptr[1] = 0;
5fc0c3af3fe4 alternative bitstream writer (disabled by default, uncomment #define ALT_BISTREAM_WRITER in common.h if u want to try it)
michaelni
parents: 213
diff changeset
460 //if(n>24) printf("%d %d\n", n, value);
5fc0c3af3fe4 alternative bitstream writer (disabled by default, uncomment #define ALT_BISTREAM_WRITER in common.h if u want to try it)
michaelni
parents: 213
diff changeset
461 index+= n;
5fc0c3af3fe4 alternative bitstream writer (disabled by default, uncomment #define ALT_BISTREAM_WRITER in common.h if u want to try it)
michaelni
parents: 213
diff changeset
462 s->index= index;
708
1aa1cbb8c3c1 indenting preprocessor stuff, as its completly unreadable otherwise
michaelni
parents: 706
diff changeset
463 # endif
1aa1cbb8c3c1 indenting preprocessor stuff, as its completly unreadable otherwise
michaelni
parents: 706
diff changeset
464 # endif //!ALIGNED_BITSTREAM_WRITER
234
5fc0c3af3fe4 alternative bitstream writer (disabled by default, uncomment #define ALT_BISTREAM_WRITER in common.h if u want to try it)
michaelni
parents: 213
diff changeset
465 }
5fc0c3af3fe4 alternative bitstream writer (disabled by default, uncomment #define ALT_BISTREAM_WRITER in common.h if u want to try it)
michaelni
parents: 213
diff changeset
466 #endif
5fc0c3af3fe4 alternative bitstream writer (disabled by default, uncomment #define ALT_BISTREAM_WRITER in common.h if u want to try it)
michaelni
parents: 213
diff changeset
467
5fc0c3af3fe4 alternative bitstream writer (disabled by default, uncomment #define ALT_BISTREAM_WRITER in common.h if u want to try it)
michaelni
parents: 213
diff changeset
468
5fc0c3af3fe4 alternative bitstream writer (disabled by default, uncomment #define ALT_BISTREAM_WRITER in common.h if u want to try it)
michaelni
parents: 213
diff changeset
469 static inline uint8_t* pbBufPtr(PutBitContext *s)
5fc0c3af3fe4 alternative bitstream writer (disabled by default, uncomment #define ALT_BISTREAM_WRITER in common.h if u want to try it)
michaelni
parents: 213
diff changeset
470 {
5fc0c3af3fe4 alternative bitstream writer (disabled by default, uncomment #define ALT_BISTREAM_WRITER in common.h if u want to try it)
michaelni
parents: 213
diff changeset
471 #ifdef ALT_BITSTREAM_WRITER
5fc0c3af3fe4 alternative bitstream writer (disabled by default, uncomment #define ALT_BISTREAM_WRITER in common.h if u want to try it)
michaelni
parents: 213
diff changeset
472 return s->buf + (s->index>>3);
5fc0c3af3fe4 alternative bitstream writer (disabled by default, uncomment #define ALT_BISTREAM_WRITER in common.h if u want to try it)
michaelni
parents: 213
diff changeset
473 #else
5fc0c3af3fe4 alternative bitstream writer (disabled by default, uncomment #define ALT_BISTREAM_WRITER in common.h if u want to try it)
michaelni
parents: 213
diff changeset
474 return s->buf_ptr;
5fc0c3af3fe4 alternative bitstream writer (disabled by default, uncomment #define ALT_BISTREAM_WRITER in common.h if u want to try it)
michaelni
parents: 213
diff changeset
475 #endif
5fc0c3af3fe4 alternative bitstream writer (disabled by default, uncomment #define ALT_BISTREAM_WRITER in common.h if u want to try it)
michaelni
parents: 213
diff changeset
476 }
5fc0c3af3fe4 alternative bitstream writer (disabled by default, uncomment #define ALT_BISTREAM_WRITER in common.h if u want to try it)
michaelni
parents: 213
diff changeset
477
520
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
478 /* Bitstream reader API docs:
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
479 name
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
480 abritary name which is used as prefix for the internal variables
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
481
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
482 gb
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
483 getbitcontext
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
484
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
485 OPEN_READER(name, gb)
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
486 loads gb into local variables
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
487
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
488 CLOSE_READER(name, gb)
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
489 stores local vars in gb
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
490
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
491 UPDATE_CACHE(name, gb)
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
492 refills the internal cache from the bitstream
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
493 after this call at least MIN_CACHE_BITS will be available,
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
494
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
495 GET_CACHE(name, gb)
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
496 will output the contents of the internal cache, next bit is MSB of 32 or 64 bit (FIXME 64bit)
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
497
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
498 SHOW_UBITS(name, gb, num)
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
499 will return the nest num bits
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
500
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
501 SHOW_SBITS(name, gb, num)
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
502 will return the nest num bits and do sign extension
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
503
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
504 SKIP_BITS(name, gb, num)
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
505 will skip over the next num bits
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
506 note, this is equinvalent to SKIP_CACHE; SKIP_COUNTER
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
507
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
508 SKIP_CACHE(name, gb, num)
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
509 will remove the next num bits from the cache (note SKIP_COUNTER MUST be called before UPDATE_CACHE / CLOSE_READER)
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
510
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
511 SKIP_COUNTER(name, gb, num)
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
512 will increment the internal bit counter (see SKIP_CACHE & SKIP_BITS)
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
513
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
514 LAST_SKIP_CACHE(name, gb, num)
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
515 will remove the next num bits from the cache if it is needed for UPDATE_CACHE otherwise it will do nothing
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
516
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
517 LAST_SKIP_BITS(name, gb, num)
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
518 is equinvalent to SKIP_LAST_CACHE; SKIP_COUNTER
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
519
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
520 for examples see get_bits, show_bits, skip_bits, get_vlc
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
521 */
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
522
1254
604661d34c68 bitstream reader optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1226
diff changeset
523 static inline int unaligned32_be(const void *v)
604661d34c68 bitstream reader optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1226
diff changeset
524 {
604661d34c68 bitstream reader optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1226
diff changeset
525 #ifdef CONFIG_ALIGN
604661d34c68 bitstream reader optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1226
diff changeset
526 const uint8_t *p=v;
604661d34c68 bitstream reader optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1226
diff changeset
527 return (((p[0]<<8) | p[1])<<16) | (p[2]<<8) | (p[3]);
604661d34c68 bitstream reader optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1226
diff changeset
528 #else
604661d34c68 bitstream reader optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1226
diff changeset
529 return be2me_32( unaligned32(v)); //original
604661d34c68 bitstream reader optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1226
diff changeset
530 #endif
604661d34c68 bitstream reader optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1226
diff changeset
531 }
604661d34c68 bitstream reader optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1226
diff changeset
532
520
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
533 #ifdef ALT_BITSTREAM_READER
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
534 # define MIN_CACHE_BITS 25
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
535
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
536 # define OPEN_READER(name, gb)\
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
537 int name##_index= (gb)->index;\
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
538 int name##_cache= 0;\
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
539
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
540 # define CLOSE_READER(name, gb)\
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
541 (gb)->index= name##_index;\
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
542
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
543 # define UPDATE_CACHE(name, gb)\
1254
604661d34c68 bitstream reader optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1226
diff changeset
544 name##_cache= unaligned32_be( ((uint8_t *)(gb)->buffer)+(name##_index>>3) ) << (name##_index&0x07);\
520
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
545
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
546 # define SKIP_CACHE(name, gb, num)\
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
547 name##_cache <<= (num);\
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
548
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
549 // FIXME name?
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
550 # define SKIP_COUNTER(name, gb, num)\
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
551 name##_index += (num);\
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
552
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
553 # define SKIP_BITS(name, gb, num)\
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
554 {\
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
555 SKIP_CACHE(name, gb, num)\
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
556 SKIP_COUNTER(name, gb, num)\
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
557 }\
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
558
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
559 # define LAST_SKIP_BITS(name, gb, num) SKIP_COUNTER(name, gb, num)
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
560 # define LAST_SKIP_CACHE(name, gb, num) ;
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
561
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
562 # define SHOW_UBITS(name, gb, num)\
525
985187bc2fa3 c std doesnt like negative shifts -> use asm
michaelni
parents: 522
diff changeset
563 NEG_USR32(name##_cache, num)
520
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
564
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
565 # define SHOW_SBITS(name, gb, num)\
525
985187bc2fa3 c std doesnt like negative shifts -> use asm
michaelni
parents: 522
diff changeset
566 NEG_SSR32(name##_cache, num)
520
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
567
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
568 # define GET_CACHE(name, gb)\
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
569 ((uint32_t)name##_cache)
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
570
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
571 static inline int get_bits_count(GetBitContext *s){
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
572 return s->index;
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
573 }
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
574 #elif defined LIBMPEG2_BITSTREAM_READER
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
575 //libmpeg2 like reader
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
576
1263
9fce515e9894 libmpeg2 style bitstream reader 17 vs 16 bit bugfix
michaelni
parents: 1261
diff changeset
577 # define MIN_CACHE_BITS 17
520
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
578
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
579 # define OPEN_READER(name, gb)\
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
580 int name##_bit_count=(gb)->bit_count;\
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
581 int name##_cache= (gb)->cache;\
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
582 uint8_t * name##_buffer_ptr=(gb)->buffer_ptr;\
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
583
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
584 # define CLOSE_READER(name, gb)\
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
585 (gb)->bit_count= name##_bit_count;\
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
586 (gb)->cache= name##_cache;\
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
587 (gb)->buffer_ptr= name##_buffer_ptr;\
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
588
1254
604661d34c68 bitstream reader optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1226
diff changeset
589 #ifdef LIBMPEG2_BITSTREAM_READER_HACK
604661d34c68 bitstream reader optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1226
diff changeset
590
604661d34c68 bitstream reader optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1226
diff changeset
591 # define UPDATE_CACHE(name, gb)\
604661d34c68 bitstream reader optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1226
diff changeset
592 if(name##_bit_count >= 0){\
1257
6defe392d5d2 libmpeg2 style bitstream reader fixes
michaelni
parents: 1254
diff changeset
593 name##_cache+= (int)be2me_16(*(uint16_t*)name##_buffer_ptr) << name##_bit_count;\
6defe392d5d2 libmpeg2 style bitstream reader fixes
michaelni
parents: 1254
diff changeset
594 ((uint16_t*)name##_buffer_ptr)++;\
1254
604661d34c68 bitstream reader optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1226
diff changeset
595 name##_bit_count-= 16;\
604661d34c68 bitstream reader optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1226
diff changeset
596 }\
604661d34c68 bitstream reader optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1226
diff changeset
597
604661d34c68 bitstream reader optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1226
diff changeset
598 #else
604661d34c68 bitstream reader optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1226
diff changeset
599
520
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
600 # define UPDATE_CACHE(name, gb)\
1263
9fce515e9894 libmpeg2 style bitstream reader 17 vs 16 bit bugfix
michaelni
parents: 1261
diff changeset
601 if(name##_bit_count >= 0){\
520
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
602 name##_cache+= ((name##_buffer_ptr[0]<<8) + name##_buffer_ptr[1]) << name##_bit_count;\
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
603 name##_buffer_ptr+=2;\
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
604 name##_bit_count-= 16;\
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
605 }\
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
606
1254
604661d34c68 bitstream reader optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1226
diff changeset
607 #endif
604661d34c68 bitstream reader optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1226
diff changeset
608
520
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
609 # define SKIP_CACHE(name, gb, num)\
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
610 name##_cache <<= (num);\
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
611
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
612 # define SKIP_COUNTER(name, gb, num)\
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
613 name##_bit_count += (num);\
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
614
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
615 # define SKIP_BITS(name, gb, num)\
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
616 {\
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
617 SKIP_CACHE(name, gb, num)\
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
618 SKIP_COUNTER(name, gb, num)\
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
619 }\
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
620
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
621 # define LAST_SKIP_BITS(name, gb, num) SKIP_BITS(name, gb, num)
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
622 # define LAST_SKIP_CACHE(name, gb, num) SKIP_CACHE(name, gb, num)
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
623
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
624 # define SHOW_UBITS(name, gb, num)\
525
985187bc2fa3 c std doesnt like negative shifts -> use asm
michaelni
parents: 522
diff changeset
625 NEG_USR32(name##_cache, num)
520
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
626
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
627 # define SHOW_SBITS(name, gb, num)\
525
985187bc2fa3 c std doesnt like negative shifts -> use asm
michaelni
parents: 522
diff changeset
628 NEG_SSR32(name##_cache, num)
520
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
629
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
630 # define GET_CACHE(name, gb)\
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
631 ((uint32_t)name##_cache)
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
632
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
633 static inline int get_bits_count(GetBitContext *s){
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
634 return (s->buffer_ptr - s->buffer)*8 - 16 + s->bit_count;
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
635 }
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
636
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
637 #elif defined A32_BITSTREAM_READER
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
638
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
639 # define MIN_CACHE_BITS 32
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
640
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
641 # define OPEN_READER(name, gb)\
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
642 int name##_bit_count=(gb)->bit_count;\
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
643 uint32_t name##_cache0= (gb)->cache0;\
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
644 uint32_t name##_cache1= (gb)->cache1;\
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
645 uint32_t * name##_buffer_ptr=(gb)->buffer_ptr;\
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
646
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
647 # define CLOSE_READER(name, gb)\
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
648 (gb)->bit_count= name##_bit_count;\
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
649 (gb)->cache0= name##_cache0;\
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
650 (gb)->cache1= name##_cache1;\
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
651 (gb)->buffer_ptr= name##_buffer_ptr;\
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
652
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
653 # define UPDATE_CACHE(name, gb)\
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
654 if(name##_bit_count > 0){\
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
655 const uint32_t next= be2me_32( *name##_buffer_ptr );\
525
985187bc2fa3 c std doesnt like negative shifts -> use asm
michaelni
parents: 522
diff changeset
656 name##_cache0 |= NEG_USR32(next,name##_bit_count);\
520
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
657 name##_cache1 |= next<<name##_bit_count;\
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
658 name##_buffer_ptr++;\
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
659 name##_bit_count-= 32;\
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
660 }\
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
661
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
662 #ifdef ARCH_X86
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
663 # define SKIP_CACHE(name, gb, num)\
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
664 asm(\
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
665 "shldl %2, %1, %0 \n\t"\
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
666 "shll %2, %1 \n\t"\
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
667 : "+r" (name##_cache0), "+r" (name##_cache1)\
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
668 : "Ic" ((uint8_t)num)\
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
669 );
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
670 #else
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
671 # define SKIP_CACHE(name, gb, num)\
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
672 name##_cache0 <<= (num);\
525
985187bc2fa3 c std doesnt like negative shifts -> use asm
michaelni
parents: 522
diff changeset
673 name##_cache0 |= NEG_USR32(name##_cache1,num);\
520
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
674 name##_cache1 <<= (num);
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
675 #endif
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
676
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
677 # define SKIP_COUNTER(name, gb, num)\
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
678 name##_bit_count += (num);\
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
679
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
680 # define SKIP_BITS(name, gb, num)\
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
681 {\
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
682 SKIP_CACHE(name, gb, num)\
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
683 SKIP_COUNTER(name, gb, num)\
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
684 }\
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
685
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
686 # define LAST_SKIP_BITS(name, gb, num) SKIP_BITS(name, gb, num)
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
687 # define LAST_SKIP_CACHE(name, gb, num) SKIP_CACHE(name, gb, num)
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
688
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
689 # define SHOW_UBITS(name, gb, num)\
525
985187bc2fa3 c std doesnt like negative shifts -> use asm
michaelni
parents: 522
diff changeset
690 NEG_USR32(name##_cache0, num)
520
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
691
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
692 # define SHOW_SBITS(name, gb, num)\
525
985187bc2fa3 c std doesnt like negative shifts -> use asm
michaelni
parents: 522
diff changeset
693 NEG_SSR32(name##_cache0, num)
520
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
694
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
695 # define GET_CACHE(name, gb)\
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
696 (name##_cache0)
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
697
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
698 static inline int get_bits_count(GetBitContext *s){
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
699 return ((uint8_t*)s->buffer_ptr - s->buffer)*8 - 32 + s->bit_count;
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
700 }
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
701
192
1e5f64be86fc another bitstream reader code (faster on intel cpus) - patch by Michael Niedermayer <michaelni@gmx.at>
uid46427
parents: 151
diff changeset
702 #endif
20
907b67420d84 inlineing common case of get_bits() -> gives 2speedup. more optim coming soon...
arpi_esp
parents: 10
diff changeset
703
1257
6defe392d5d2 libmpeg2 style bitstream reader fixes
michaelni
parents: 1254
diff changeset
704 /**
6defe392d5d2 libmpeg2 style bitstream reader fixes
michaelni
parents: 1254
diff changeset
705 * read mpeg1 dc style vlc (sign bit + mantisse with no MSB).
6defe392d5d2 libmpeg2 style bitstream reader fixes
michaelni
parents: 1254
diff changeset
706 * if MSB not set it is negative
6defe392d5d2 libmpeg2 style bitstream reader fixes
michaelni
parents: 1254
diff changeset
707 * @param n length in bits
6defe392d5d2 libmpeg2 style bitstream reader fixes
michaelni
parents: 1254
diff changeset
708 * @author BERO
6defe392d5d2 libmpeg2 style bitstream reader fixes
michaelni
parents: 1254
diff changeset
709 */
1254
604661d34c68 bitstream reader optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1226
diff changeset
710 static inline int get_xbits(GetBitContext *s, int n){
604661d34c68 bitstream reader optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1226
diff changeset
711 register int tmp;
604661d34c68 bitstream reader optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1226
diff changeset
712 register int32_t cache;
604661d34c68 bitstream reader optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1226
diff changeset
713 OPEN_READER(re, s)
604661d34c68 bitstream reader optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1226
diff changeset
714 UPDATE_CACHE(re, s)
604661d34c68 bitstream reader optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1226
diff changeset
715 cache = GET_CACHE(re,s);
604661d34c68 bitstream reader optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1226
diff changeset
716 if ((int32_t)cache<0) { //MSB=1
604661d34c68 bitstream reader optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1226
diff changeset
717 tmp = NEG_USR32(cache,n);
604661d34c68 bitstream reader optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1226
diff changeset
718 } else {
604661d34c68 bitstream reader optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1226
diff changeset
719 // tmp = (-1<<n) | NEG_USR32(cache,n) + 1; mpeg12.c algo
604661d34c68 bitstream reader optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1226
diff changeset
720 // tmp = - (NEG_USR32(cache,n) ^ ((1 << n) - 1)); h263.c algo
604661d34c68 bitstream reader optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1226
diff changeset
721 tmp = - NEG_USR32(~cache,n);
604661d34c68 bitstream reader optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1226
diff changeset
722 }
604661d34c68 bitstream reader optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1226
diff changeset
723 LAST_SKIP_BITS(re, s, n)
604661d34c68 bitstream reader optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1226
diff changeset
724 CLOSE_READER(re, s)
604661d34c68 bitstream reader optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1226
diff changeset
725 return tmp;
604661d34c68 bitstream reader optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1226
diff changeset
726 }
604661d34c68 bitstream reader optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1226
diff changeset
727
604661d34c68 bitstream reader optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1226
diff changeset
728 static inline int get_sbits(GetBitContext *s, int n){
604661d34c68 bitstream reader optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1226
diff changeset
729 register int tmp;
604661d34c68 bitstream reader optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1226
diff changeset
730 OPEN_READER(re, s)
604661d34c68 bitstream reader optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1226
diff changeset
731 UPDATE_CACHE(re, s)
604661d34c68 bitstream reader optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1226
diff changeset
732 tmp= SHOW_SBITS(re, s, n);
604661d34c68 bitstream reader optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1226
diff changeset
733 LAST_SKIP_BITS(re, s, n)
604661d34c68 bitstream reader optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1226
diff changeset
734 CLOSE_READER(re, s)
604661d34c68 bitstream reader optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1226
diff changeset
735 return tmp;
604661d34c68 bitstream reader optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1226
diff changeset
736 }
604661d34c68 bitstream reader optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents: 1226
diff changeset
737
1257
6defe392d5d2 libmpeg2 style bitstream reader fixes
michaelni
parents: 1254
diff changeset
738 /**
6defe392d5d2 libmpeg2 style bitstream reader fixes
michaelni
parents: 1254
diff changeset
739 * reads 0-17 bits.
6defe392d5d2 libmpeg2 style bitstream reader fixes
michaelni
parents: 1254
diff changeset
740 * Note, the alt bitstream reader can read upto 25 bits, but the libmpeg2 reader cant
6defe392d5d2 libmpeg2 style bitstream reader fixes
michaelni
parents: 1254
diff changeset
741 */
20
907b67420d84 inlineing common case of get_bits() -> gives 2speedup. more optim coming soon...
arpi_esp
parents: 10
diff changeset
742 static inline unsigned int get_bits(GetBitContext *s, int n){
520
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
743 register int tmp;
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
744 OPEN_READER(re, s)
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
745 UPDATE_CACHE(re, s)
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
746 tmp= SHOW_UBITS(re, s, n);
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
747 LAST_SKIP_BITS(re, s, n)
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
748 CLOSE_READER(re, s)
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
749 return tmp;
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
750 }
192
1e5f64be86fc another bitstream reader code (faster on intel cpus) - patch by Michael Niedermayer <michaelni@gmx.at>
uid46427
parents: 151
diff changeset
751
1257
6defe392d5d2 libmpeg2 style bitstream reader fixes
michaelni
parents: 1254
diff changeset
752 unsigned int get_bits_long(GetBitContext *s, int n);
6defe392d5d2 libmpeg2 style bitstream reader fixes
michaelni
parents: 1254
diff changeset
753
6defe392d5d2 libmpeg2 style bitstream reader fixes
michaelni
parents: 1254
diff changeset
754 /**
6defe392d5d2 libmpeg2 style bitstream reader fixes
michaelni
parents: 1254
diff changeset
755 * shows 0-17 bits.
6defe392d5d2 libmpeg2 style bitstream reader fixes
michaelni
parents: 1254
diff changeset
756 * Note, the alt bitstream reader can read upto 25 bits, but the libmpeg2 reader cant
6defe392d5d2 libmpeg2 style bitstream reader fixes
michaelni
parents: 1254
diff changeset
757 */
520
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
758 static inline unsigned int show_bits(GetBitContext *s, int n){
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
759 register int tmp;
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
760 OPEN_READER(re, s)
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
761 UPDATE_CACHE(re, s)
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
762 tmp= SHOW_UBITS(re, s, n);
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
763 // CLOSE_READER(re, s)
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
764 return tmp;
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
765 }
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
766
1257
6defe392d5d2 libmpeg2 style bitstream reader fixes
michaelni
parents: 1254
diff changeset
767 unsigned int show_bits_long(GetBitContext *s, int n);
6defe392d5d2 libmpeg2 style bitstream reader fixes
michaelni
parents: 1254
diff changeset
768
520
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
769 static inline void skip_bits(GetBitContext *s, int n){
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
770 //Note gcc seems to optimize this to s->index+=n for the ALT_READER :))
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
771 OPEN_READER(re, s)
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
772 UPDATE_CACHE(re, s)
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
773 LAST_SKIP_BITS(re, s, n)
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
774 CLOSE_READER(re, s)
20
907b67420d84 inlineing common case of get_bits() -> gives 2speedup. more optim coming soon...
arpi_esp
parents: 10
diff changeset
775 }
907b67420d84 inlineing common case of get_bits() -> gives 2speedup. more optim coming soon...
arpi_esp
parents: 10
diff changeset
776
21
20e680e7a490 get_bits() specialization, gives 4\speedup
arpi_esp
parents: 20
diff changeset
777 static inline unsigned int get_bits1(GetBitContext *s){
192
1e5f64be86fc another bitstream reader code (faster on intel cpus) - patch by Michael Niedermayer <michaelni@gmx.at>
uid46427
parents: 151
diff changeset
778 #ifdef ALT_BITSTREAM_READER
1e5f64be86fc another bitstream reader code (faster on intel cpus) - patch by Michael Niedermayer <michaelni@gmx.at>
uid46427
parents: 151
diff changeset
779 int index= s->index;
193
b691dd3e9088 aligned bitstream support (optional) - patch by ichael Niedermayer <michaelni@gmx.at>
arpi_esp
parents: 192
diff changeset
780 uint8_t result= s->buffer[ index>>3 ];
199
0f1dba8fc617 (commited by michael / arpi was crazy enough to give me his password)
arpi_esp
parents: 193
diff changeset
781 result<<= (index&0x07);
0f1dba8fc617 (commited by michael / arpi was crazy enough to give me his password)
arpi_esp
parents: 193
diff changeset
782 result>>= 8 - 1;
192
1e5f64be86fc another bitstream reader code (faster on intel cpus) - patch by Michael Niedermayer <michaelni@gmx.at>
uid46427
parents: 151
diff changeset
783 index++;
1e5f64be86fc another bitstream reader code (faster on intel cpus) - patch by Michael Niedermayer <michaelni@gmx.at>
uid46427
parents: 151
diff changeset
784 s->index= index;
520
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
785
192
1e5f64be86fc another bitstream reader code (faster on intel cpus) - patch by Michael Niedermayer <michaelni@gmx.at>
uid46427
parents: 151
diff changeset
786 return result;
1e5f64be86fc another bitstream reader code (faster on intel cpus) - patch by Michael Niedermayer <michaelni@gmx.at>
uid46427
parents: 151
diff changeset
787 #else
520
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
788 return get_bits(s, 1);
192
1e5f64be86fc another bitstream reader code (faster on intel cpus) - patch by Michael Niedermayer <michaelni@gmx.at>
uid46427
parents: 151
diff changeset
789 #endif
21
20e680e7a490 get_bits() specialization, gives 4\speedup
arpi_esp
parents: 20
diff changeset
790 }
20e680e7a490 get_bits() specialization, gives 4\speedup
arpi_esp
parents: 20
diff changeset
791
520
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
792 static inline unsigned int show_bits1(GetBitContext *s){
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
793 return show_bits(s, 1);
21
20e680e7a490 get_bits() specialization, gives 4\speedup
arpi_esp
parents: 20
diff changeset
794 }
20e680e7a490 get_bits() specialization, gives 4\speedup
arpi_esp
parents: 20
diff changeset
795
20e680e7a490 get_bits() specialization, gives 4\speedup
arpi_esp
parents: 20
diff changeset
796 static inline void skip_bits1(GetBitContext *s){
520
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
797 skip_bits(s, 1);
21
20e680e7a490 get_bits() specialization, gives 4\speedup
arpi_esp
parents: 20
diff changeset
798 }
20e680e7a490 get_bits() specialization, gives 4\speedup
arpi_esp
parents: 20
diff changeset
799
520
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
800 void init_get_bits(GetBitContext *s,
1083
b923be2fc4b5 * using const buffers for reading
kabi
parents: 1079
diff changeset
801 const uint8_t *buffer, int buffer_size);
21
20e680e7a490 get_bits() specialization, gives 4\speedup
arpi_esp
parents: 20
diff changeset
802
862
058194d7ade6 * fixing some minor const warnings
kabi
parents: 847
diff changeset
803 int check_marker(GetBitContext *s, const char *msg);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
804 void align_get_bits(GetBitContext *s);
986e461dc072 Initial revision
glantau
parents:
diff changeset
805 int init_vlc(VLC *vlc, int nb_bits, int nb_codes,
986e461dc072 Initial revision
glantau
parents:
diff changeset
806 const void *bits, int bits_wrap, int bits_size,
986e461dc072 Initial revision
glantau
parents:
diff changeset
807 const void *codes, int codes_wrap, int codes_size);
986e461dc072 Initial revision
glantau
parents:
diff changeset
808 void free_vlc(VLC *vlc);
986e461dc072 Initial revision
glantau
parents:
diff changeset
809
1025
1f9afd8b9131 GetBitContext.size is allways multiplied by 8 -> use size_in_bits to avoid useless *8 in a few inner loops
michaelni
parents: 994
diff changeset
810 /**
1f9afd8b9131 GetBitContext.size is allways multiplied by 8 -> use size_in_bits to avoid useless *8 in a few inner loops
michaelni
parents: 994
diff changeset
811 *
1f9afd8b9131 GetBitContext.size is allways multiplied by 8 -> use size_in_bits to avoid useless *8 in a few inner loops
michaelni
parents: 994
diff changeset
812 * if the vlc code is invalid and max_depth=1 than no bits will be removed
1f9afd8b9131 GetBitContext.size is allways multiplied by 8 -> use size_in_bits to avoid useless *8 in a few inner loops
michaelni
parents: 994
diff changeset
813 * if the vlc code is invalid and max_depth>1 than the number of bits removed
1f9afd8b9131 GetBitContext.size is allways multiplied by 8 -> use size_in_bits to avoid useless *8 in a few inner loops
michaelni
parents: 994
diff changeset
814 * is undefined
1f9afd8b9131 GetBitContext.size is allways multiplied by 8 -> use size_in_bits to avoid useless *8 in a few inner loops
michaelni
parents: 994
diff changeset
815 */
529
f1f4d3d755f8 get_vlc() optimization
michaelni
parents: 525
diff changeset
816 #define GET_VLC(code, name, gb, table, bits, max_depth)\
f1f4d3d755f8 get_vlc() optimization
michaelni
parents: 525
diff changeset
817 {\
f1f4d3d755f8 get_vlc() optimization
michaelni
parents: 525
diff changeset
818 int n, index, nb_bits;\
f1f4d3d755f8 get_vlc() optimization
michaelni
parents: 525
diff changeset
819 \
f1f4d3d755f8 get_vlc() optimization
michaelni
parents: 525
diff changeset
820 index= SHOW_UBITS(name, gb, bits);\
f1f4d3d755f8 get_vlc() optimization
michaelni
parents: 525
diff changeset
821 code = table[index][0];\
f1f4d3d755f8 get_vlc() optimization
michaelni
parents: 525
diff changeset
822 n = table[index][1];\
f1f4d3d755f8 get_vlc() optimization
michaelni
parents: 525
diff changeset
823 \
f1f4d3d755f8 get_vlc() optimization
michaelni
parents: 525
diff changeset
824 if(max_depth > 1 && n < 0){\
f1f4d3d755f8 get_vlc() optimization
michaelni
parents: 525
diff changeset
825 LAST_SKIP_BITS(name, gb, bits)\
f1f4d3d755f8 get_vlc() optimization
michaelni
parents: 525
diff changeset
826 UPDATE_CACHE(name, gb)\
f1f4d3d755f8 get_vlc() optimization
michaelni
parents: 525
diff changeset
827 \
f1f4d3d755f8 get_vlc() optimization
michaelni
parents: 525
diff changeset
828 nb_bits = -n;\
f1f4d3d755f8 get_vlc() optimization
michaelni
parents: 525
diff changeset
829 \
535
7f1b09bb34c6 dont trash table in GET_VLC
michaelni
parents: 534
diff changeset
830 index= SHOW_UBITS(name, gb, nb_bits) + code;\
529
f1f4d3d755f8 get_vlc() optimization
michaelni
parents: 525
diff changeset
831 code = table[index][0];\
f1f4d3d755f8 get_vlc() optimization
michaelni
parents: 525
diff changeset
832 n = table[index][1];\
f1f4d3d755f8 get_vlc() optimization
michaelni
parents: 525
diff changeset
833 if(max_depth > 2 && n < 0){\
f1f4d3d755f8 get_vlc() optimization
michaelni
parents: 525
diff changeset
834 LAST_SKIP_BITS(name, gb, nb_bits)\
f1f4d3d755f8 get_vlc() optimization
michaelni
parents: 525
diff changeset
835 UPDATE_CACHE(name, gb)\
f1f4d3d755f8 get_vlc() optimization
michaelni
parents: 525
diff changeset
836 \
f1f4d3d755f8 get_vlc() optimization
michaelni
parents: 525
diff changeset
837 nb_bits = -n;\
f1f4d3d755f8 get_vlc() optimization
michaelni
parents: 525
diff changeset
838 \
535
7f1b09bb34c6 dont trash table in GET_VLC
michaelni
parents: 534
diff changeset
839 index= SHOW_UBITS(name, gb, nb_bits) + code;\
529
f1f4d3d755f8 get_vlc() optimization
michaelni
parents: 525
diff changeset
840 code = table[index][0];\
f1f4d3d755f8 get_vlc() optimization
michaelni
parents: 525
diff changeset
841 n = table[index][1];\
f1f4d3d755f8 get_vlc() optimization
michaelni
parents: 525
diff changeset
842 }\
f1f4d3d755f8 get_vlc() optimization
michaelni
parents: 525
diff changeset
843 }\
f1f4d3d755f8 get_vlc() optimization
michaelni
parents: 525
diff changeset
844 SKIP_BITS(name, gb, n)\
f1f4d3d755f8 get_vlc() optimization
michaelni
parents: 525
diff changeset
845 }
f1f4d3d755f8 get_vlc() optimization
michaelni
parents: 525
diff changeset
846
542
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 535
diff changeset
847 #define GET_RL_VLC(level, run, name, gb, table, bits, max_depth)\
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 535
diff changeset
848 {\
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 535
diff changeset
849 int n, index, nb_bits;\
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 535
diff changeset
850 \
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 535
diff changeset
851 index= SHOW_UBITS(name, gb, bits);\
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 535
diff changeset
852 level = table[index].level;\
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 535
diff changeset
853 n = table[index].len;\
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 535
diff changeset
854 \
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 535
diff changeset
855 if(max_depth > 1 && n < 0){\
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 535
diff changeset
856 LAST_SKIP_BITS(name, gb, bits)\
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 535
diff changeset
857 UPDATE_CACHE(name, gb)\
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 535
diff changeset
858 \
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 535
diff changeset
859 nb_bits = -n;\
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 535
diff changeset
860 \
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 535
diff changeset
861 index= SHOW_UBITS(name, gb, nb_bits) + level;\
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 535
diff changeset
862 level = table[index].level;\
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 535
diff changeset
863 n = table[index].len;\
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 535
diff changeset
864 }\
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 535
diff changeset
865 run= table[index].run;\
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 535
diff changeset
866 SKIP_BITS(name, gb, n)\
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 535
diff changeset
867 }
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 535
diff changeset
868
531
f5d7fcc81787 get_vlc() optimizations
michaelni
parents: 529
diff changeset
869 // deprecated, dont use get_vlc for new code, use get_vlc2 instead or use GET_VLC directly
193
b691dd3e9088 aligned bitstream support (optional) - patch by ichael Niedermayer <michaelni@gmx.at>
arpi_esp
parents: 192
diff changeset
870 static inline int get_vlc(GetBitContext *s, VLC *vlc)
b691dd3e9088 aligned bitstream support (optional) - patch by ichael Niedermayer <michaelni@gmx.at>
arpi_esp
parents: 192
diff changeset
871 {
529
f1f4d3d755f8 get_vlc() optimization
michaelni
parents: 525
diff changeset
872 int code;
f1f4d3d755f8 get_vlc() optimization
michaelni
parents: 525
diff changeset
873 VLC_TYPE (*table)[2]= vlc->table;
f1f4d3d755f8 get_vlc() optimization
michaelni
parents: 525
diff changeset
874
520
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
875 OPEN_READER(re, s)
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
876 UPDATE_CACHE(re, s)
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
877
529
f1f4d3d755f8 get_vlc() optimization
michaelni
parents: 525
diff changeset
878 GET_VLC(code, re, s, table, vlc->bits, 3)
520
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
879
19a5e2a81e1a new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents: 517
diff changeset
880 CLOSE_READER(re, s)
193
b691dd3e9088 aligned bitstream support (optional) - patch by ichael Niedermayer <michaelni@gmx.at>
arpi_esp
parents: 192
diff changeset
881 return code;
b691dd3e9088 aligned bitstream support (optional) - patch by ichael Niedermayer <michaelni@gmx.at>
arpi_esp
parents: 192
diff changeset
882 }
b691dd3e9088 aligned bitstream support (optional) - patch by ichael Niedermayer <michaelni@gmx.at>
arpi_esp
parents: 192
diff changeset
883
1079
89e233c2ef45 get_vlc2() "docs"
michaelni
parents: 1064
diff changeset
884 /**
89e233c2ef45 get_vlc2() "docs"
michaelni
parents: 1064
diff changeset
885 * parses a vlc code, faster then get_vlc()
89e233c2ef45 get_vlc2() "docs"
michaelni
parents: 1064
diff changeset
886 * @param bits is the number of bits which will be read at once, must be
89e233c2ef45 get_vlc2() "docs"
michaelni
parents: 1064
diff changeset
887 * identical to nb_bits in init_vlc()
89e233c2ef45 get_vlc2() "docs"
michaelni
parents: 1064
diff changeset
888 * @param max_depth is the number of times bits bits must be readed to completly
89e233c2ef45 get_vlc2() "docs"
michaelni
parents: 1064
diff changeset
889 * read the longest vlc code
89e233c2ef45 get_vlc2() "docs"
michaelni
parents: 1064
diff changeset
890 * = (max_vlc_length + bits - 1) / bits
89e233c2ef45 get_vlc2() "docs"
michaelni
parents: 1064
diff changeset
891 */
550
b746a7d75ce6 Force inlining on get_vlc2.
mellum
parents: 542
diff changeset
892 static always_inline int get_vlc2(GetBitContext *s, VLC_TYPE (*table)[2],
b746a7d75ce6 Force inlining on get_vlc2.
mellum
parents: 542
diff changeset
893 int bits, int max_depth)
531
f5d7fcc81787 get_vlc() optimizations
michaelni
parents: 529
diff changeset
894 {
f5d7fcc81787 get_vlc() optimizations
michaelni
parents: 529
diff changeset
895 int code;
f5d7fcc81787 get_vlc() optimizations
michaelni
parents: 529
diff changeset
896
f5d7fcc81787 get_vlc() optimizations
michaelni
parents: 529
diff changeset
897 OPEN_READER(re, s)
f5d7fcc81787 get_vlc() optimizations
michaelni
parents: 529
diff changeset
898 UPDATE_CACHE(re, s)
f5d7fcc81787 get_vlc() optimizations
michaelni
parents: 529
diff changeset
899
f5d7fcc81787 get_vlc() optimizations
michaelni
parents: 529
diff changeset
900 GET_VLC(code, re, s, table, bits, max_depth)
f5d7fcc81787 get_vlc() optimizations
michaelni
parents: 529
diff changeset
901
f5d7fcc81787 get_vlc() optimizations
michaelni
parents: 529
diff changeset
902 CLOSE_READER(re, s)
f5d7fcc81787 get_vlc() optimizations
michaelni
parents: 529
diff changeset
903 return code;
f5d7fcc81787 get_vlc() optimizations
michaelni
parents: 529
diff changeset
904 }
f5d7fcc81787 get_vlc() optimizations
michaelni
parents: 529
diff changeset
905
1147
dcb20b7598ed bitstream tracing support
michaelni
parents: 1139
diff changeset
906 //#define TRACE
dcb20b7598ed bitstream tracing support
michaelni
parents: 1139
diff changeset
907
dcb20b7598ed bitstream tracing support
michaelni
parents: 1139
diff changeset
908 #ifdef TRACE
dcb20b7598ed bitstream tracing support
michaelni
parents: 1139
diff changeset
909
dcb20b7598ed bitstream tracing support
michaelni
parents: 1139
diff changeset
910 static inline void print_bin(int bits, int n){
dcb20b7598ed bitstream tracing support
michaelni
parents: 1139
diff changeset
911 int i;
dcb20b7598ed bitstream tracing support
michaelni
parents: 1139
diff changeset
912
dcb20b7598ed bitstream tracing support
michaelni
parents: 1139
diff changeset
913 for(i=n-1; i>=0; i--){
dcb20b7598ed bitstream tracing support
michaelni
parents: 1139
diff changeset
914 printf("%d", (bits>>i)&1);
dcb20b7598ed bitstream tracing support
michaelni
parents: 1139
diff changeset
915 }
dcb20b7598ed bitstream tracing support
michaelni
parents: 1139
diff changeset
916 for(i=n; i<24; i++)
dcb20b7598ed bitstream tracing support
michaelni
parents: 1139
diff changeset
917 printf(" ");
dcb20b7598ed bitstream tracing support
michaelni
parents: 1139
diff changeset
918 }
dcb20b7598ed bitstream tracing support
michaelni
parents: 1139
diff changeset
919
dcb20b7598ed bitstream tracing support
michaelni
parents: 1139
diff changeset
920 static inline int get_bits_trace(GetBitContext *s, int n, char *file, char *func, int line){
dcb20b7598ed bitstream tracing support
michaelni
parents: 1139
diff changeset
921 int r= get_bits(s, n);
dcb20b7598ed bitstream tracing support
michaelni
parents: 1139
diff changeset
922
dcb20b7598ed bitstream tracing support
michaelni
parents: 1139
diff changeset
923 print_bin(r, n);
dcb20b7598ed bitstream tracing support
michaelni
parents: 1139
diff changeset
924 printf("%5d %2d %3d bit @%5d in %s %s:%d\n", r, n, r, get_bits_count(s)-n, file, func, line);
dcb20b7598ed bitstream tracing support
michaelni
parents: 1139
diff changeset
925 return r;
dcb20b7598ed bitstream tracing support
michaelni
parents: 1139
diff changeset
926 }
dcb20b7598ed bitstream tracing support
michaelni
parents: 1139
diff changeset
927 static inline int get_vlc_trace(GetBitContext *s, VLC_TYPE (*table)[2], int bits, int max_depth, char *file, char *func, int line){
dcb20b7598ed bitstream tracing support
michaelni
parents: 1139
diff changeset
928 int show= show_bits(s, 24);
dcb20b7598ed bitstream tracing support
michaelni
parents: 1139
diff changeset
929 int pos= get_bits_count(s);
dcb20b7598ed bitstream tracing support
michaelni
parents: 1139
diff changeset
930 int r= get_vlc2(s, table, bits, max_depth);
dcb20b7598ed bitstream tracing support
michaelni
parents: 1139
diff changeset
931 int len= get_bits_count(s) - pos;
dcb20b7598ed bitstream tracing support
michaelni
parents: 1139
diff changeset
932 int bits2= show>>(24-len);
dcb20b7598ed bitstream tracing support
michaelni
parents: 1139
diff changeset
933
dcb20b7598ed bitstream tracing support
michaelni
parents: 1139
diff changeset
934 print_bin(bits2, len);
dcb20b7598ed bitstream tracing support
michaelni
parents: 1139
diff changeset
935
dcb20b7598ed bitstream tracing support
michaelni
parents: 1139
diff changeset
936 printf("%5d %2d %3d vlc @%5d in %s %s:%d\n", bits2, len, r, pos, file, func, line);
dcb20b7598ed bitstream tracing support
michaelni
parents: 1139
diff changeset
937 return r;
dcb20b7598ed bitstream tracing support
michaelni
parents: 1139
diff changeset
938 }
1273
a979fab41ed8 ASV1 codec
michaelni
parents: 1263
diff changeset
939 static inline int get_xbits_trace(GetBitContext *s, int n, char *file, char *func, int line){
a979fab41ed8 ASV1 codec
michaelni
parents: 1263
diff changeset
940 int show= show_bits(s, n);
a979fab41ed8 ASV1 codec
michaelni
parents: 1263
diff changeset
941 int r= get_xbits(s, n);
a979fab41ed8 ASV1 codec
michaelni
parents: 1263
diff changeset
942
a979fab41ed8 ASV1 codec
michaelni
parents: 1263
diff changeset
943 print_bin(show, n);
a979fab41ed8 ASV1 codec
michaelni
parents: 1263
diff changeset
944 printf("%5d %2d %3d xbt @%5d in %s %s:%d\n", show, n, r, get_bits_count(s)-n, file, func, line);
a979fab41ed8 ASV1 codec
michaelni
parents: 1263
diff changeset
945 return r;
a979fab41ed8 ASV1 codec
michaelni
parents: 1263
diff changeset
946 }
1147
dcb20b7598ed bitstream tracing support
michaelni
parents: 1139
diff changeset
947
dcb20b7598ed bitstream tracing support
michaelni
parents: 1139
diff changeset
948 #define get_bits(s, n) get_bits_trace(s, n, __FILE__, __PRETTY_FUNCTION__, __LINE__)
dcb20b7598ed bitstream tracing support
michaelni
parents: 1139
diff changeset
949 #define get_bits1(s) get_bits_trace(s, 1, __FILE__, __PRETTY_FUNCTION__, __LINE__)
1273
a979fab41ed8 ASV1 codec
michaelni
parents: 1263
diff changeset
950 #define get_xbits(s, n) get_xbits_trace(s, n, __FILE__, __PRETTY_FUNCTION__, __LINE__)
1152
michaelni
parents: 1147
diff changeset
951 #define get_vlc(s, vlc) get_vlc_trace(s, (vlc)->table, (vlc)->bits, 3, __FILE__, __PRETTY_FUNCTION__, __LINE__)
1147
dcb20b7598ed bitstream tracing support
michaelni
parents: 1139
diff changeset
952 #define get_vlc2(s, tab, bits, max) get_vlc_trace(s, tab, bits, max, __FILE__, __PRETTY_FUNCTION__, __LINE__)
dcb20b7598ed bitstream tracing support
michaelni
parents: 1139
diff changeset
953
1170
4710976004a5 #ifdef TRACE printf() -> tprintf()
michaelni
parents: 1152
diff changeset
954 #define tprintf printf
4710976004a5 #ifdef TRACE printf() -> tprintf()
michaelni
parents: 1152
diff changeset
955
4710976004a5 #ifdef TRACE printf() -> tprintf()
michaelni
parents: 1152
diff changeset
956 #else //TRACE
1171
a2c5eb457c41 Fix for buggy (?) g++ (bailling out for beosaudio.cpp)
mmu_man
parents: 1170
diff changeset
957 #define tprintf(_arg...) {}
1170
4710976004a5 #ifdef TRACE printf() -> tprintf()
michaelni
parents: 1152
diff changeset
958 #endif
542
d55978a3c369 rl vlc decoding optimizations
michaelni
parents: 535
diff changeset
959
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
960 /* define it to include statistics code (useful only for optimizing
986e461dc072 Initial revision
glantau
parents:
diff changeset
961 codec efficiency */
986e461dc072 Initial revision
glantau
parents:
diff changeset
962 //#define STATS
986e461dc072 Initial revision
glantau
parents:
diff changeset
963
986e461dc072 Initial revision
glantau
parents:
diff changeset
964 #ifdef STATS
986e461dc072 Initial revision
glantau
parents:
diff changeset
965
986e461dc072 Initial revision
glantau
parents:
diff changeset
966 enum {
986e461dc072 Initial revision
glantau
parents:
diff changeset
967 ST_UNKNOWN,
986e461dc072 Initial revision
glantau
parents:
diff changeset
968 ST_DC,
986e461dc072 Initial revision
glantau
parents:
diff changeset
969 ST_INTRA_AC,
986e461dc072 Initial revision
glantau
parents:
diff changeset
970 ST_INTER_AC,
986e461dc072 Initial revision
glantau
parents:
diff changeset
971 ST_INTRA_MB,
986e461dc072 Initial revision
glantau
parents:
diff changeset
972 ST_INTER_MB,
986e461dc072 Initial revision
glantau
parents:
diff changeset
973 ST_MV,
986e461dc072 Initial revision
glantau
parents:
diff changeset
974 ST_NB,
986e461dc072 Initial revision
glantau
parents:
diff changeset
975 };
986e461dc072 Initial revision
glantau
parents:
diff changeset
976
986e461dc072 Initial revision
glantau
parents:
diff changeset
977 extern int st_current_index;
986e461dc072 Initial revision
glantau
parents:
diff changeset
978 extern unsigned int st_bit_counts[ST_NB];
986e461dc072 Initial revision
glantau
parents:
diff changeset
979 extern unsigned int st_out_bit_counts[ST_NB];
986e461dc072 Initial revision
glantau
parents:
diff changeset
980
986e461dc072 Initial revision
glantau
parents:
diff changeset
981 void print_stats(void);
986e461dc072 Initial revision
glantau
parents:
diff changeset
982 #endif
986e461dc072 Initial revision
glantau
parents:
diff changeset
983
986e461dc072 Initial revision
glantau
parents:
diff changeset
984 /* misc math functions */
1037
44a230c11d83 optimizing av_log2
michaelni
parents: 1031
diff changeset
985 extern const uint8_t ff_log2_tab[256];
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
986
151
ae0516eadae2 fixed gcc-3.0.x compilation (by Michael Niedermayer)
nickols_k
parents: 144
diff changeset
987 static inline int av_log2(unsigned int v)
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
988 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
989 int n;
986e461dc072 Initial revision
glantau
parents:
diff changeset
990
986e461dc072 Initial revision
glantau
parents:
diff changeset
991 n = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
992 if (v & 0xffff0000) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
993 v >>= 16;
986e461dc072 Initial revision
glantau
parents:
diff changeset
994 n += 16;
986e461dc072 Initial revision
glantau
parents:
diff changeset
995 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
996 if (v & 0xff00) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
997 v >>= 8;
986e461dc072 Initial revision
glantau
parents:
diff changeset
998 n += 8;
986e461dc072 Initial revision
glantau
parents:
diff changeset
999 }
1037
44a230c11d83 optimizing av_log2
michaelni
parents: 1031
diff changeset
1000 n += ff_log2_tab[v];
44a230c11d83 optimizing av_log2
michaelni
parents: 1031
diff changeset
1001
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1002 return n;
986e461dc072 Initial revision
glantau
parents:
diff changeset
1003 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
1004
1037
44a230c11d83 optimizing av_log2
michaelni
parents: 1031
diff changeset
1005 static inline int av_log2_16bit(unsigned int v)
44a230c11d83 optimizing av_log2
michaelni
parents: 1031
diff changeset
1006 {
44a230c11d83 optimizing av_log2
michaelni
parents: 1031
diff changeset
1007 int n;
44a230c11d83 optimizing av_log2
michaelni
parents: 1031
diff changeset
1008
44a230c11d83 optimizing av_log2
michaelni
parents: 1031
diff changeset
1009 n = 0;
44a230c11d83 optimizing av_log2
michaelni
parents: 1031
diff changeset
1010 if (v & 0xff00) {
44a230c11d83 optimizing av_log2
michaelni
parents: 1031
diff changeset
1011 v >>= 8;
44a230c11d83 optimizing av_log2
michaelni
parents: 1031
diff changeset
1012 n += 8;
44a230c11d83 optimizing av_log2
michaelni
parents: 1031
diff changeset
1013 }
44a230c11d83 optimizing av_log2
michaelni
parents: 1031
diff changeset
1014 n += ff_log2_tab[v];
44a230c11d83 optimizing av_log2
michaelni
parents: 1031
diff changeset
1015
44a230c11d83 optimizing av_log2
michaelni
parents: 1031
diff changeset
1016 return n;
44a230c11d83 optimizing av_log2
michaelni
parents: 1031
diff changeset
1017 }
44a230c11d83 optimizing av_log2
michaelni
parents: 1031
diff changeset
1018
277
5cb2978e701f new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents: 264
diff changeset
1019 /* median of 3 */
5cb2978e701f new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents: 264
diff changeset
1020 static inline int mid_pred(int a, int b, int c)
5cb2978e701f new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents: 264
diff changeset
1021 {
1756
43a856190778 optimization
michael
parents: 1738
diff changeset
1022 #if 0
43a856190778 optimization
michael
parents: 1738
diff changeset
1023 int t= (a-b)&((a-b)>>31);
43a856190778 optimization
michael
parents: 1738
diff changeset
1024 a-=t;
43a856190778 optimization
michael
parents: 1738
diff changeset
1025 b+=t;
43a856190778 optimization
michael
parents: 1738
diff changeset
1026 b-= (b-c)&((b-c)>>31);
43a856190778 optimization
michael
parents: 1738
diff changeset
1027 b+= (a-b)&((a-b)>>31);
277
5cb2978e701f new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents: 264
diff changeset
1028
1756
43a856190778 optimization
michael
parents: 1738
diff changeset
1029 return b;
43a856190778 optimization
michael
parents: 1738
diff changeset
1030 #else
43a856190778 optimization
michael
parents: 1738
diff changeset
1031 if(a>b){
43a856190778 optimization
michael
parents: 1738
diff changeset
1032 if(c>b){
43a856190778 optimization
michael
parents: 1738
diff changeset
1033 if(c>a) b=a;
43a856190778 optimization
michael
parents: 1738
diff changeset
1034 else b=c;
43a856190778 optimization
michael
parents: 1738
diff changeset
1035 }
43a856190778 optimization
michael
parents: 1738
diff changeset
1036 }else{
43a856190778 optimization
michael
parents: 1738
diff changeset
1037 if(b>c){
43a856190778 optimization
michael
parents: 1738
diff changeset
1038 if(c>a) b=c;
43a856190778 optimization
michael
parents: 1738
diff changeset
1039 else b=a;
43a856190778 optimization
michael
parents: 1738
diff changeset
1040 }
43a856190778 optimization
michael
parents: 1738
diff changeset
1041 }
43a856190778 optimization
michael
parents: 1738
diff changeset
1042 return b;
43a856190778 optimization
michael
parents: 1738
diff changeset
1043 #endif
277
5cb2978e701f new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents: 264
diff changeset
1044 }
5cb2978e701f new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents: 264
diff changeset
1045
327
d359db02fc90 much better ME for b frames (a bit slow though)
michaelni
parents: 324
diff changeset
1046 static inline int clip(int a, int amin, int amax)
d359db02fc90 much better ME for b frames (a bit slow though)
michaelni
parents: 324
diff changeset
1047 {
d359db02fc90 much better ME for b frames (a bit slow though)
michaelni
parents: 324
diff changeset
1048 if (a < amin)
d359db02fc90 much better ME for b frames (a bit slow though)
michaelni
parents: 324
diff changeset
1049 return amin;
d359db02fc90 much better ME for b frames (a bit slow though)
michaelni
parents: 324
diff changeset
1050 else if (a > amax)
d359db02fc90 much better ME for b frames (a bit slow though)
michaelni
parents: 324
diff changeset
1051 return amax;
d359db02fc90 much better ME for b frames (a bit slow though)
michaelni
parents: 324
diff changeset
1052 else
d359db02fc90 much better ME for b frames (a bit slow though)
michaelni
parents: 324
diff changeset
1053 return a;
d359db02fc90 much better ME for b frames (a bit slow though)
michaelni
parents: 324
diff changeset
1054 }
d359db02fc90 much better ME for b frames (a bit slow though)
michaelni
parents: 324
diff changeset
1055
324
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 306
diff changeset
1056 /* math */
1037
44a230c11d83 optimizing av_log2
michaelni
parents: 1031
diff changeset
1057 extern const uint8_t ff_sqrt_tab[128];
609
153a7ffd289b faster ff_sqrt()
michaelni
parents: 580
diff changeset
1058
1126
77ccf7fe3bd0 per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents: 1124
diff changeset
1059 int64_t ff_gcd(int64_t a, int64_t b);
324
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 306
diff changeset
1060
451
michaelni
parents: 437
diff changeset
1061 static inline int ff_sqrt(int a)
michaelni
parents: 437
diff changeset
1062 {
michaelni
parents: 437
diff changeset
1063 int ret=0;
michaelni
parents: 437
diff changeset
1064 int s;
michaelni
parents: 437
diff changeset
1065 int ret_sq=0;
609
153a7ffd289b faster ff_sqrt()
michaelni
parents: 580
diff changeset
1066
153a7ffd289b faster ff_sqrt()
michaelni
parents: 580
diff changeset
1067 if(a<128) return ff_sqrt_tab[a];
153a7ffd289b faster ff_sqrt()
michaelni
parents: 580
diff changeset
1068
451
michaelni
parents: 437
diff changeset
1069 for(s=15; s>=0; s--){
michaelni
parents: 437
diff changeset
1070 int b= ret_sq + (1<<(s*2)) + (ret<<s)*2;
michaelni
parents: 437
diff changeset
1071 if(b<=a){
michaelni
parents: 437
diff changeset
1072 ret_sq=b;
michaelni
parents: 437
diff changeset
1073 ret+= 1<<s;
michaelni
parents: 437
diff changeset
1074 }
michaelni
parents: 437
diff changeset
1075 }
michaelni
parents: 437
diff changeset
1076 return ret;
michaelni
parents: 437
diff changeset
1077 }
701
85b071dfc7e3 ff_get_fourcc() & XVIX support
michaelni
parents: 609
diff changeset
1078
85b071dfc7e3 ff_get_fourcc() & XVIX support
michaelni
parents: 609
diff changeset
1079 /**
85b071dfc7e3 ff_get_fourcc() & XVIX support
michaelni
parents: 609
diff changeset
1080 * converts fourcc string to int
85b071dfc7e3 ff_get_fourcc() & XVIX support
michaelni
parents: 609
diff changeset
1081 */
865
704f13bfc652 * minor warning fix
kabi
parents: 862
diff changeset
1082 static inline int ff_get_fourcc(const char *s){
701
85b071dfc7e3 ff_get_fourcc() & XVIX support
michaelni
parents: 609
diff changeset
1083 assert( strlen(s)==4 );
1401
f5a107782a66 reverse earlier patch
tmmm
parents: 1398
diff changeset
1084
701
85b071dfc7e3 ff_get_fourcc() & XVIX support
michaelni
parents: 609
diff changeset
1085 return (s[0]) + (s[1]<<8) + (s[2]<<16) + (s[3]<<24);
85b071dfc7e3 ff_get_fourcc() & XVIX support
michaelni
parents: 609
diff changeset
1086 }
85b071dfc7e3 ff_get_fourcc() & XVIX support
michaelni
parents: 609
diff changeset
1087
1139
6842feb093c1 rawvideo patch by (Fred Rothganger <rothgang at uiuc dot edu>)
michaelni
parents: 1130
diff changeset
1088 #define MKTAG(a,b,c,d) (a | (b << 8) | (c << 16) | (d << 24))
6842feb093c1 rawvideo patch by (Fred Rothganger <rothgang at uiuc dot edu>)
michaelni
parents: 1130
diff changeset
1089 #define MKBETAG(a,b,c,d) (d | (c << 8) | (b << 16) | (a << 24))
6842feb093c1 rawvideo patch by (Fred Rothganger <rothgang at uiuc dot edu>)
michaelni
parents: 1130
diff changeset
1090
6842feb093c1 rawvideo patch by (Fred Rothganger <rothgang at uiuc dot edu>)
michaelni
parents: 1130
diff changeset
1091
706
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 701
diff changeset
1092 #ifdef ARCH_X86
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 701
diff changeset
1093 #define MASK_ABS(mask, level)\
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 701
diff changeset
1094 asm volatile(\
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 701
diff changeset
1095 "cdq \n\t"\
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 701
diff changeset
1096 "xorl %1, %0 \n\t"\
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 701
diff changeset
1097 "subl %1, %0 \n\t"\
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 701
diff changeset
1098 : "+a" (level), "=&d" (mask)\
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 701
diff changeset
1099 );
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 701
diff changeset
1100 #else
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 701
diff changeset
1101 #define MASK_ABS(mask, level)\
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 701
diff changeset
1102 mask= level>>31;\
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 701
diff changeset
1103 level= (level^mask)-mask;
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 701
diff changeset
1104 #endif
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 701
diff changeset
1105
e65798d228ea idct permutation cleanup, idct can be selected per context now
michaelni
parents: 701
diff changeset
1106
451
michaelni
parents: 437
diff changeset
1107 #if __CPU__ >= 686 && !defined(RUNTIME_CPUDETECT)
michaelni
parents: 437
diff changeset
1108 #define COPY3_IF_LT(x,y,a,b,c,d)\
michaelni
parents: 437
diff changeset
1109 asm volatile (\
michaelni
parents: 437
diff changeset
1110 "cmpl %0, %3 \n\t"\
michaelni
parents: 437
diff changeset
1111 "cmovl %3, %0 \n\t"\
michaelni
parents: 437
diff changeset
1112 "cmovl %4, %1 \n\t"\
michaelni
parents: 437
diff changeset
1113 "cmovl %5, %2 \n\t"\
michaelni
parents: 437
diff changeset
1114 : "+r" (x), "+r" (a), "+r" (c)\
michaelni
parents: 437
diff changeset
1115 : "r" (y), "r" (b), "r" (d)\
michaelni
parents: 437
diff changeset
1116 );
michaelni
parents: 437
diff changeset
1117 #else
michaelni
parents: 437
diff changeset
1118 #define COPY3_IF_LT(x,y,a,b,c,d)\
michaelni
parents: 437
diff changeset
1119 if((y)<(x)){\
michaelni
parents: 437
diff changeset
1120 (x)=(y);\
michaelni
parents: 437
diff changeset
1121 (a)=(b);\
michaelni
parents: 437
diff changeset
1122 (c)=(d);\
michaelni
parents: 437
diff changeset
1123 }
michaelni
parents: 437
diff changeset
1124 #endif
michaelni
parents: 437
diff changeset
1125
1281
37176fafe11e some benchmarking code
michaelni
parents: 1273
diff changeset
1126 #ifdef ARCH_X86
37176fafe11e some benchmarking code
michaelni
parents: 1273
diff changeset
1127 static inline long long rdtsc()
37176fafe11e some benchmarking code
michaelni
parents: 1273
diff changeset
1128 {
37176fafe11e some benchmarking code
michaelni
parents: 1273
diff changeset
1129 long long l;
37176fafe11e some benchmarking code
michaelni
parents: 1273
diff changeset
1130 asm volatile( "rdtsc\n\t"
37176fafe11e some benchmarking code
michaelni
parents: 1273
diff changeset
1131 : "=A" (l)
37176fafe11e some benchmarking code
michaelni
parents: 1273
diff changeset
1132 );
37176fafe11e some benchmarking code
michaelni
parents: 1273
diff changeset
1133 return l;
37176fafe11e some benchmarking code
michaelni
parents: 1273
diff changeset
1134 }
37176fafe11e some benchmarking code
michaelni
parents: 1273
diff changeset
1135
37176fafe11e some benchmarking code
michaelni
parents: 1273
diff changeset
1136 #define START_TIMER \
37176fafe11e some benchmarking code
michaelni
parents: 1273
diff changeset
1137 static uint64_t tsum=0;\
37176fafe11e some benchmarking code
michaelni
parents: 1273
diff changeset
1138 static int tcount=0;\
37176fafe11e some benchmarking code
michaelni
parents: 1273
diff changeset
1139 static int tskip_count=0;\
37176fafe11e some benchmarking code
michaelni
parents: 1273
diff changeset
1140 uint64_t tend;\
37176fafe11e some benchmarking code
michaelni
parents: 1273
diff changeset
1141 uint64_t tstart= rdtsc();\
37176fafe11e some benchmarking code
michaelni
parents: 1273
diff changeset
1142
37176fafe11e some benchmarking code
michaelni
parents: 1273
diff changeset
1143 #define STOP_TIMER(id) \
37176fafe11e some benchmarking code
michaelni
parents: 1273
diff changeset
1144 tend= rdtsc();\
1795
920e6381e1fe 2 byte shorter userdata for mpeg4
michael
parents: 1786
diff changeset
1145 if(tcount<2 || tend - tstart < 8*tsum/tcount){\
1281
37176fafe11e some benchmarking code
michaelni
parents: 1273
diff changeset
1146 tsum+= tend - tstart;\
37176fafe11e some benchmarking code
michaelni
parents: 1273
diff changeset
1147 tcount++;\
37176fafe11e some benchmarking code
michaelni
parents: 1273
diff changeset
1148 }else\
37176fafe11e some benchmarking code
michaelni
parents: 1273
diff changeset
1149 tskip_count++;\
37176fafe11e some benchmarking code
michaelni
parents: 1273
diff changeset
1150 if(256*256*256*64%(tcount+tskip_count)==0){\
37176fafe11e some benchmarking code
michaelni
parents: 1273
diff changeset
1151 fprintf(stderr, "%Ld dezicycles in %s, %d runs, %d skips\n", tsum*10/tcount, id, tcount, tskip_count);\
37176fafe11e some benchmarking code
michaelni
parents: 1273
diff changeset
1152 }
37176fafe11e some benchmarking code
michaelni
parents: 1273
diff changeset
1153 #endif
37176fafe11e some benchmarking code
michaelni
parents: 1273
diff changeset
1154
370
0eca28d16cbd clamp intra matrix to 8bit for mjpeg (workaround for qscale>=25)
al3x
parents: 359
diff changeset
1155 #define CLAMP_TO_8BIT(d) ((d > 0xff) ? 0xff : (d < 0) ? 0 : d)
0eca28d16cbd clamp intra matrix to 8bit for mjpeg (workaround for qscale>=25)
al3x
parents: 359
diff changeset
1156
1031
19de1445beb2 use av_malloc() functions - added av_strdup and av_realloc()
bellard
parents: 1025
diff changeset
1157 /* avoid usage of various functions */
19de1445beb2 use av_malloc() functions - added av_strdup and av_realloc()
bellard
parents: 1025
diff changeset
1158 #define malloc please_use_av_malloc
19de1445beb2 use av_malloc() functions - added av_strdup and av_realloc()
bellard
parents: 1025
diff changeset
1159 #define free please_use_av_free
19de1445beb2 use av_malloc() functions - added av_strdup and av_realloc()
bellard
parents: 1025
diff changeset
1160 #define realloc please_use_av_realloc
19de1445beb2 use av_malloc() functions - added av_strdup and av_realloc()
bellard
parents: 1025
diff changeset
1161
1177
fea03d2c4946 simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents: 1171
diff changeset
1162 #define CHECKED_ALLOCZ(p, size)\
fea03d2c4946 simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents: 1171
diff changeset
1163 {\
fea03d2c4946 simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents: 1171
diff changeset
1164 p= av_mallocz(size);\
1332
018ebc066952 fix CHECKED_ALLOCZ(0)
michaelni
parents: 1281
diff changeset
1165 if(p==NULL && (size)!=0){\
1177
fea03d2c4946 simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents: 1171
diff changeset
1166 perror("malloc");\
fea03d2c4946 simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents: 1171
diff changeset
1167 goto fail;\
fea03d2c4946 simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents: 1171
diff changeset
1168 }\
fea03d2c4946 simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents: 1171
diff changeset
1169 }
fea03d2c4946 simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents: 1171
diff changeset
1170
488
90227eb98bf9 do not export internal functions - use stdint.h
bellard
parents: 451
diff changeset
1171 #endif /* HAVE_AV_CONFIG_H */
90227eb98bf9 do not export internal functions - use stdint.h
bellard
parents: 451
diff changeset
1172
90227eb98bf9 do not export internal functions - use stdint.h
bellard
parents: 451
diff changeset
1173 #endif /* COMMON_H */