annotate golomb.h @ 10025:3fccd61e69d1 libavcodec

ac3dec: simplify zero-bit mantissa dithering by calculating it conditionally during mantissa decoding, then only removing it from the coupling range for coupled channels which do not use dithering.
author jbr
date Wed, 05 Aug 2009 02:30:34 +0000
parents 0dce4fe6e6f3
children 944071b6fcb4
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
1 /*
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
2 * exp golomb vlc stuff
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
3 * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at>
2215
2a767157935e new signed golomb routines
alex
parents: 2087
diff changeset
4 * Copyright (c) 2004 Alex Beregszaszi
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
5 *
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3353
diff changeset
6 * This file is part of FFmpeg.
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3353
diff changeset
7 *
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3353
diff changeset
8 * FFmpeg is free software; you can redistribute it and/or
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
9 * modify it under the terms of the GNU Lesser General Public
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
10 * License as published by the Free Software Foundation; either
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3353
diff changeset
11 * version 2.1 of the License, or (at your option) any later version.
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
12 *
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3353
diff changeset
13 * FFmpeg is distributed in the hope that it will be useful,
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
16 * Lesser General Public License for more details.
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
17 *
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
18 * You should have received a copy of the GNU Lesser General Public
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3353
diff changeset
19 * License along with FFmpeg; if not, write to the Free Software
3036
0b546eab515d Update licensing information: The FSF changed postal address.
diego
parents: 2979
diff changeset
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
21 */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2905
diff changeset
22
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
23 /**
8718
e9d9d946f213 Use full internal pathname in doxygen @file directives.
diego
parents: 8449
diff changeset
24 * @file libavcodec/golomb.h
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2905
diff changeset
25 * @brief
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
26 * exp golomb vlc stuff
2215
2a767157935e new signed golomb routines
alex
parents: 2087
diff changeset
27 * @author Michael Niedermayer <michaelni@gmx.at> and Alex Beregszaszi
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
28 */
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
29
7760
c4a4495715dd Globally rename the header inclusion guard names.
stefano
parents: 7260
diff changeset
30 #ifndef AVCODEC_GOLOMB_H
c4a4495715dd Globally rename the header inclusion guard names.
stefano
parents: 7260
diff changeset
31 #define AVCODEC_GOLOMB_H
5163
9ecbfc0c82bf add multiple inclusion guards to headers
mru
parents: 5162
diff changeset
32
5162
4394344397d8 include all prerequisites in header files
mru
parents: 4053
diff changeset
33 #include <stdint.h>
9428
0dce4fe6e6f3 Rename bitstream.h to get_bits.h.
stefano
parents: 9411
diff changeset
34 #include "get_bits.h"
9411
4cb7c65fc775 Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents: 9020
diff changeset
35 #include "put_bits.h"
5162
4394344397d8 include all prerequisites in header files
mru
parents: 4053
diff changeset
36
1234
fc2a7eefa9cc svq3 decoder by anonymous
michaelni
parents: 1169
diff changeset
37 #define INVALID_VLC 0x80000000
fc2a7eefa9cc svq3 decoder by anonymous
michaelni
parents: 1169
diff changeset
38
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
39 extern const uint8_t ff_golomb_vlc_len[512];
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
40 extern const uint8_t ff_ue_golomb_vlc_code[512];
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
41 extern const int8_t ff_se_golomb_vlc_code[512];
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
42 extern const uint8_t ff_ue_golomb_len[256];
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
43
1250
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
44 extern const uint8_t ff_interleaved_golomb_vlc_len[256];
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
45 extern const uint8_t ff_interleaved_ue_golomb_vlc_code[256];
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
46 extern const int8_t ff_interleaved_se_golomb_vlc_code[256];
5546
e12027d324cc Make the Golomb decoder work for Dirac
marco
parents: 5215
diff changeset
47 extern const uint8_t ff_interleaved_dirac_golomb_vlc_code[256];
1250
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
48
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2905
diff changeset
49
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
50 /**
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
51 * read unsigned exp golomb code.
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
52 */
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
53 static inline int get_ue_golomb(GetBitContext *gb){
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
54 unsigned int buf;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
55 int log;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2905
diff changeset
56
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
57 OPEN_READER(re, gb);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
58 UPDATE_CACHE(re, gb);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
59 buf=GET_CACHE(re, gb);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2905
diff changeset
60
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
61 if(buf >= (1<<27)){
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
62 buf >>= 32 - 9;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
63 LAST_SKIP_BITS(re, gb, ff_golomb_vlc_len[buf]);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
64 CLOSE_READER(re, gb);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2905
diff changeset
65
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
66 return ff_ue_golomb_vlc_code[buf];
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
67 }else{
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
68 log= 2*av_log2(buf) - 31;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
69 buf>>= log;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
70 buf--;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
71 LAST_SKIP_BITS(re, gb, 32 - log);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
72 CLOSE_READER(re, gb);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2905
diff changeset
73
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
74 return buf;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
75 }
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
76 }
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
77
8449
d6faaf27eacf Add get_ue_golomb_31()
michael
parents: 7869
diff changeset
78 /**
8969
9218ef5d5afb Clarify get_ue_golomb_31() behavior with >31.
michael
parents: 8718
diff changeset
79 * read unsigned exp golomb code, constraint to a max of 31.
9218ef5d5afb Clarify get_ue_golomb_31() behavior with >31.
michael
parents: 8718
diff changeset
80 * the return value is undefined if the stored value exceeds 31.
8449
d6faaf27eacf Add get_ue_golomb_31()
michael
parents: 7869
diff changeset
81 */
d6faaf27eacf Add get_ue_golomb_31()
michael
parents: 7869
diff changeset
82 static inline int get_ue_golomb_31(GetBitContext *gb){
d6faaf27eacf Add get_ue_golomb_31()
michael
parents: 7869
diff changeset
83 unsigned int buf;
d6faaf27eacf Add get_ue_golomb_31()
michael
parents: 7869
diff changeset
84
d6faaf27eacf Add get_ue_golomb_31()
michael
parents: 7869
diff changeset
85 OPEN_READER(re, gb);
d6faaf27eacf Add get_ue_golomb_31()
michael
parents: 7869
diff changeset
86 UPDATE_CACHE(re, gb);
d6faaf27eacf Add get_ue_golomb_31()
michael
parents: 7869
diff changeset
87 buf=GET_CACHE(re, gb);
d6faaf27eacf Add get_ue_golomb_31()
michael
parents: 7869
diff changeset
88
d6faaf27eacf Add get_ue_golomb_31()
michael
parents: 7869
diff changeset
89 buf >>= 32 - 9;
d6faaf27eacf Add get_ue_golomb_31()
michael
parents: 7869
diff changeset
90 LAST_SKIP_BITS(re, gb, ff_golomb_vlc_len[buf]);
d6faaf27eacf Add get_ue_golomb_31()
michael
parents: 7869
diff changeset
91 CLOSE_READER(re, gb);
d6faaf27eacf Add get_ue_golomb_31()
michael
parents: 7869
diff changeset
92
d6faaf27eacf Add get_ue_golomb_31()
michael
parents: 7869
diff changeset
93 return ff_ue_golomb_vlc_code[buf];
d6faaf27eacf Add get_ue_golomb_31()
michael
parents: 7869
diff changeset
94 }
d6faaf27eacf Add get_ue_golomb_31()
michael
parents: 7869
diff changeset
95
1234
fc2a7eefa9cc svq3 decoder by anonymous
michaelni
parents: 1169
diff changeset
96 static inline int svq3_get_ue_golomb(GetBitContext *gb){
1250
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
97 uint32_t buf;
1234
fc2a7eefa9cc svq3 decoder by anonymous
michaelni
parents: 1169
diff changeset
98
fc2a7eefa9cc svq3 decoder by anonymous
michaelni
parents: 1169
diff changeset
99 OPEN_READER(re, gb);
fc2a7eefa9cc svq3 decoder by anonymous
michaelni
parents: 1169
diff changeset
100 UPDATE_CACHE(re, gb);
1250
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
101 buf=GET_CACHE(re, gb);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2905
diff changeset
102
1250
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
103 if(buf&0xAA800000){
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
104 buf >>= 32 - 8;
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
105 LAST_SKIP_BITS(re, gb, ff_interleaved_golomb_vlc_len[buf]);
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
106 CLOSE_READER(re, gb);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2905
diff changeset
107
1250
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
108 return ff_interleaved_ue_golomb_vlc_code[buf];
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
109 }else{
5546
e12027d324cc Make the Golomb decoder work for Dirac
marco
parents: 5215
diff changeset
110 int ret = 1;
e12027d324cc Make the Golomb decoder work for Dirac
marco
parents: 5215
diff changeset
111
e12027d324cc Make the Golomb decoder work for Dirac
marco
parents: 5215
diff changeset
112 while (1) {
e12027d324cc Make the Golomb decoder work for Dirac
marco
parents: 5215
diff changeset
113 buf >>= 32 - 8;
e12027d324cc Make the Golomb decoder work for Dirac
marco
parents: 5215
diff changeset
114 LAST_SKIP_BITS(re, gb, FFMIN(ff_interleaved_golomb_vlc_len[buf], 8));
2087
a4d3699c6636 1000l to the ffsvq3 author, our default bitstream reader is only guranteed to be able to read 25bit at a time
michael
parents: 1812
diff changeset
115
5546
e12027d324cc Make the Golomb decoder work for Dirac
marco
parents: 5215
diff changeset
116 if (ff_interleaved_golomb_vlc_len[buf] != 9){
e12027d324cc Make the Golomb decoder work for Dirac
marco
parents: 5215
diff changeset
117 ret <<= (ff_interleaved_golomb_vlc_len[buf] - 1) >> 1;
e12027d324cc Make the Golomb decoder work for Dirac
marco
parents: 5215
diff changeset
118 ret |= ff_interleaved_dirac_golomb_vlc_code[buf];
e12027d324cc Make the Golomb decoder work for Dirac
marco
parents: 5215
diff changeset
119 break;
e12027d324cc Make the Golomb decoder work for Dirac
marco
parents: 5215
diff changeset
120 }
e12027d324cc Make the Golomb decoder work for Dirac
marco
parents: 5215
diff changeset
121 ret = (ret << 4) | ff_interleaved_dirac_golomb_vlc_code[buf];
e12027d324cc Make the Golomb decoder work for Dirac
marco
parents: 5215
diff changeset
122 UPDATE_CACHE(re, gb);
e12027d324cc Make the Golomb decoder work for Dirac
marco
parents: 5215
diff changeset
123 buf = GET_CACHE(re, gb);
1250
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
124 }
1234
fc2a7eefa9cc svq3 decoder by anonymous
michaelni
parents: 1169
diff changeset
125
1250
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
126 CLOSE_READER(re, gb);
5546
e12027d324cc Make the Golomb decoder work for Dirac
marco
parents: 5215
diff changeset
127 return ret - 1;
1250
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
128 }
1234
fc2a7eefa9cc svq3 decoder by anonymous
michaelni
parents: 1169
diff changeset
129 }
fc2a7eefa9cc svq3 decoder by anonymous
michaelni
parents: 1169
diff changeset
130
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
131 /**
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
132 * read unsigned truncated exp golomb code.
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
133 */
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
134 static inline int get_te0_golomb(GetBitContext *gb, int range){
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
135 assert(range >= 1);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2905
diff changeset
136
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
137 if(range==1) return 0;
1169
4e891257d3e2 multiple reference frames support
michaelni
parents: 1168
diff changeset
138 else if(range==2) return get_bits1(gb)^1;
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
139 else return get_ue_golomb(gb);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
140 }
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
141
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
142 /**
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
143 * read unsigned truncated exp golomb code.
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
144 */
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
145 static inline int get_te_golomb(GetBitContext *gb, int range){
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
146 assert(range >= 1);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2905
diff changeset
147
1169
4e891257d3e2 multiple reference frames support
michaelni
parents: 1168
diff changeset
148 if(range==2) return get_bits1(gb)^1;
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
149 else return get_ue_golomb(gb);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
150 }
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
151
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
152
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
153 /**
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
154 * read signed exp golomb code.
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
155 */
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
156 static inline int get_se_golomb(GetBitContext *gb){
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
157 unsigned int buf;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
158 int log;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2905
diff changeset
159
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
160 OPEN_READER(re, gb);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
161 UPDATE_CACHE(re, gb);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
162 buf=GET_CACHE(re, gb);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2905
diff changeset
163
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
164 if(buf >= (1<<27)){
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
165 buf >>= 32 - 9;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
166 LAST_SKIP_BITS(re, gb, ff_golomb_vlc_len[buf]);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
167 CLOSE_READER(re, gb);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2905
diff changeset
168
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
169 return ff_se_golomb_vlc_code[buf];
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
170 }else{
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
171 log= 2*av_log2(buf) - 31;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
172 buf>>= log;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2905
diff changeset
173
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
174 LAST_SKIP_BITS(re, gb, 32 - log);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
175 CLOSE_READER(re, gb);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2905
diff changeset
176
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
177 if(buf&1) buf= -(buf>>1);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
178 else buf= (buf>>1);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
179
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
180 return buf;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
181 }
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
182 }
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
183
1234
fc2a7eefa9cc svq3 decoder by anonymous
michaelni
parents: 1169
diff changeset
184 static inline int svq3_get_se_golomb(GetBitContext *gb){
fc2a7eefa9cc svq3 decoder by anonymous
michaelni
parents: 1169
diff changeset
185 unsigned int buf;
fc2a7eefa9cc svq3 decoder by anonymous
michaelni
parents: 1169
diff changeset
186 int log;
fc2a7eefa9cc svq3 decoder by anonymous
michaelni
parents: 1169
diff changeset
187
fc2a7eefa9cc svq3 decoder by anonymous
michaelni
parents: 1169
diff changeset
188 OPEN_READER(re, gb);
fc2a7eefa9cc svq3 decoder by anonymous
michaelni
parents: 1169
diff changeset
189 UPDATE_CACHE(re, gb);
1250
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
190 buf=GET_CACHE(re, gb);
1234
fc2a7eefa9cc svq3 decoder by anonymous
michaelni
parents: 1169
diff changeset
191
1250
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
192 if(buf&0xAA800000){
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
193 buf >>= 32 - 8;
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
194 LAST_SKIP_BITS(re, gb, ff_interleaved_golomb_vlc_len[buf]);
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
195 CLOSE_READER(re, gb);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2905
diff changeset
196
1250
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
197 return ff_interleaved_se_golomb_vlc_code[buf];
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
198 }else{
2439
6684c0e9e28f svq3_get_se_golomb() fix
michael
parents: 2438
diff changeset
199 LAST_SKIP_BITS(re, gb, 8);
6684c0e9e28f svq3_get_se_golomb() fix
michael
parents: 2438
diff changeset
200 UPDATE_CACHE(re, gb);
6684c0e9e28f svq3_get_se_golomb() fix
michael
parents: 2438
diff changeset
201 buf |= 1 | (GET_CACHE(re, gb) >> 8);
6684c0e9e28f svq3_get_se_golomb() fix
michael
parents: 2438
diff changeset
202
1250
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
203 if((buf & 0xAAAAAAAA) == 0)
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
204 return INVALID_VLC;
1234
fc2a7eefa9cc svq3 decoder by anonymous
michaelni
parents: 1169
diff changeset
205
1250
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
206 for(log=31; (buf & 0x80000000) == 0; log--){
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
207 buf = (buf << 2) - ((buf << log) >> (log - 1)) + (buf >> 30);
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
208 }
1234
fc2a7eefa9cc svq3 decoder by anonymous
michaelni
parents: 1169
diff changeset
209
2439
6684c0e9e28f svq3_get_se_golomb() fix
michael
parents: 2438
diff changeset
210 LAST_SKIP_BITS(re, gb, 63 - 2*log - 8);
1250
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
211 CLOSE_READER(re, gb);
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
212
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
213 return (signed) (((((buf << log) >> log) - 1) ^ -(buf & 0x1)) + 1) >> 1;
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
214 }
1234
fc2a7eefa9cc svq3 decoder by anonymous
michaelni
parents: 1169
diff changeset
215 }
fc2a7eefa9cc svq3 decoder by anonymous
michaelni
parents: 1169
diff changeset
216
5546
e12027d324cc Make the Golomb decoder work for Dirac
marco
parents: 5215
diff changeset
217 static inline int dirac_get_se_golomb(GetBitContext *gb){
e12027d324cc Make the Golomb decoder work for Dirac
marco
parents: 5215
diff changeset
218 uint32_t buf;
e12027d324cc Make the Golomb decoder work for Dirac
marco
parents: 5215
diff changeset
219 uint32_t ret;
e12027d324cc Make the Golomb decoder work for Dirac
marco
parents: 5215
diff changeset
220
e12027d324cc Make the Golomb decoder work for Dirac
marco
parents: 5215
diff changeset
221 ret = svq3_get_ue_golomb(gb);
e12027d324cc Make the Golomb decoder work for Dirac
marco
parents: 5215
diff changeset
222
e12027d324cc Make the Golomb decoder work for Dirac
marco
parents: 5215
diff changeset
223 if (ret) {
e12027d324cc Make the Golomb decoder work for Dirac
marco
parents: 5215
diff changeset
224 OPEN_READER(re, gb);
e12027d324cc Make the Golomb decoder work for Dirac
marco
parents: 5215
diff changeset
225 UPDATE_CACHE(re, gb);
e12027d324cc Make the Golomb decoder work for Dirac
marco
parents: 5215
diff changeset
226 buf = SHOW_SBITS(re, gb, 1);
e12027d324cc Make the Golomb decoder work for Dirac
marco
parents: 5215
diff changeset
227 LAST_SKIP_BITS(re, gb, 1);
e12027d324cc Make the Golomb decoder work for Dirac
marco
parents: 5215
diff changeset
228 ret = (ret ^ buf) - buf;
e12027d324cc Make the Golomb decoder work for Dirac
marco
parents: 5215
diff changeset
229 CLOSE_READER(re, gb);
e12027d324cc Make the Golomb decoder work for Dirac
marco
parents: 5215
diff changeset
230 }
e12027d324cc Make the Golomb decoder work for Dirac
marco
parents: 5215
diff changeset
231
e12027d324cc Make the Golomb decoder work for Dirac
marco
parents: 5215
diff changeset
232 return ret;
e12027d324cc Make the Golomb decoder work for Dirac
marco
parents: 5215
diff changeset
233 }
e12027d324cc Make the Golomb decoder work for Dirac
marco
parents: 5215
diff changeset
234
1306
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
235 /**
1361
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
236 * read unsigned golomb rice code (ffv1).
1306
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
237 */
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
238 static inline int get_ur_golomb(GetBitContext *gb, int k, int limit, int esc_len){
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
239 unsigned int buf;
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
240 int log;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2905
diff changeset
241
1306
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
242 OPEN_READER(re, gb);
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
243 UPDATE_CACHE(re, gb);
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
244 buf=GET_CACHE(re, gb);
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
245
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
246 log= av_log2(buf);
1361
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
247
1306
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
248 if(log > 31-limit){
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
249 buf >>= log - k;
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
250 buf += (30-log)<<k;
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
251 LAST_SKIP_BITS(re, gb, 32 + k - log);
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
252 CLOSE_READER(re, gb);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2905
diff changeset
253
1306
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
254 return buf;
1361
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
255 }else{
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
256 buf >>= 32 - limit - esc_len;
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
257 LAST_SKIP_BITS(re, gb, esc_len + limit);
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
258 CLOSE_READER(re, gb);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2905
diff changeset
259
1361
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
260 return buf + limit - 1;
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
261 }
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
262 }
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
263
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
264 /**
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
265 * read unsigned golomb rice code (jpegls).
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
266 */
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
267 static inline int get_ur_golomb_jpegls(GetBitContext *gb, int k, int limit, int esc_len){
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
268 unsigned int buf;
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
269 int log;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2905
diff changeset
270
1361
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
271 OPEN_READER(re, gb);
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
272 UPDATE_CACHE(re, gb);
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
273 buf=GET_CACHE(re, gb);
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
274
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
275 log= av_log2(buf);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2905
diff changeset
276
9020
97b991a32b85 Fix get_ur_golomb_jpegls() with A32_BITSTREAM_READER
mru
parents: 8969
diff changeset
277 if(log - k >= 32-MIN_CACHE_BITS+(MIN_CACHE_BITS==32) && 32-log < limit){
1361
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
278 buf >>= log - k;
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
279 buf += (30-log)<<k;
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
280 LAST_SKIP_BITS(re, gb, 32 + k - log);
1306
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
281 CLOSE_READER(re, gb);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2905
diff changeset
282
1361
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
283 return buf;
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
284 }else{
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
285 int i;
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
286 for(i=0; SHOW_UBITS(re, gb, 1) == 0; i++){
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
287 LAST_SKIP_BITS(re, gb, 1);
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
288 UPDATE_CACHE(re, gb);
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
289 }
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
290 SKIP_BITS(re, gb, 1);
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
291
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
292 if(i < limit - 1){
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
293 if(k){
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
294 buf = SHOW_UBITS(re, gb, k);
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
295 LAST_SKIP_BITS(re, gb, k);
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
296 }else{
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
297 buf=0;
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
298 }
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
299
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
300 CLOSE_READER(re, gb);
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
301 return buf + (i<<k);
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
302 }else if(i == limit - 1){
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
303 buf = SHOW_UBITS(re, gb, esc_len);
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
304 LAST_SKIP_BITS(re, gb, esc_len);
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
305 CLOSE_READER(re, gb);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2905
diff changeset
306
1361
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
307 return buf + 1;
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
308 }else
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
309 return -1;
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
310 }
1306
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
311 }
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
312
1812
6d762acfff5d flac fixes:
michael
parents: 1362
diff changeset
313 /**
2215
2a767157935e new signed golomb routines
alex
parents: 2087
diff changeset
314 * read signed golomb rice code (ffv1).
2a767157935e new signed golomb routines
alex
parents: 2087
diff changeset
315 */
2220
21947e176d4d get/set_sr_golomb() cleanup
michael
parents: 2215
diff changeset
316 static inline int get_sr_golomb(GetBitContext *gb, int k, int limit, int esc_len){
2215
2a767157935e new signed golomb routines
alex
parents: 2087
diff changeset
317 int v= get_ur_golomb(gb, k, limit, esc_len);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2905
diff changeset
318
2215
2a767157935e new signed golomb routines
alex
parents: 2087
diff changeset
319 v++;
2a767157935e new signed golomb routines
alex
parents: 2087
diff changeset
320 if (v&1) return v>>1;
2a767157935e new signed golomb routines
alex
parents: 2087
diff changeset
321 else return -(v>>1);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2905
diff changeset
322
2215
2a767157935e new signed golomb routines
alex
parents: 2087
diff changeset
323 // return (v>>1) ^ -(v&1);
2a767157935e new signed golomb routines
alex
parents: 2087
diff changeset
324 }
2220
21947e176d4d get/set_sr_golomb() cleanup
michael
parents: 2215
diff changeset
325
2215
2a767157935e new signed golomb routines
alex
parents: 2087
diff changeset
326 /**
2a767157935e new signed golomb routines
alex
parents: 2087
diff changeset
327 * read signed golomb rice code (flac).
1812
6d762acfff5d flac fixes:
michael
parents: 1362
diff changeset
328 */
6d762acfff5d flac fixes:
michael
parents: 1362
diff changeset
329 static inline int get_sr_golomb_flac(GetBitContext *gb, int k, int limit, int esc_len){
6d762acfff5d flac fixes:
michael
parents: 1362
diff changeset
330 int v= get_ur_golomb_jpegls(gb, k, limit, esc_len);
6d762acfff5d flac fixes:
michael
parents: 1362
diff changeset
331 return (v>>1) ^ -(v&1);
6d762acfff5d flac fixes:
michael
parents: 1362
diff changeset
332 }
6d762acfff5d flac fixes:
michael
parents: 1362
diff changeset
333
2525
b47af698085e shorten decoder by (Jeff Muizelaar <jrmuizel gmail com>)
michael
parents: 2439
diff changeset
334 /**
b47af698085e shorten decoder by (Jeff Muizelaar <jrmuizel gmail com>)
michael
parents: 2439
diff changeset
335 * read unsigned golomb rice code (shorten).
b47af698085e shorten decoder by (Jeff Muizelaar <jrmuizel gmail com>)
michael
parents: 2439
diff changeset
336 */
b47af698085e shorten decoder by (Jeff Muizelaar <jrmuizel gmail com>)
michael
parents: 2439
diff changeset
337 static inline unsigned int get_ur_golomb_shorten(GetBitContext *gb, int k){
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
338 return get_ur_golomb_jpegls(gb, k, INT_MAX, 0);
2525
b47af698085e shorten decoder by (Jeff Muizelaar <jrmuizel gmail com>)
michael
parents: 2439
diff changeset
339 }
b47af698085e shorten decoder by (Jeff Muizelaar <jrmuizel gmail com>)
michael
parents: 2439
diff changeset
340
b47af698085e shorten decoder by (Jeff Muizelaar <jrmuizel gmail com>)
michael
parents: 2439
diff changeset
341 /**
b47af698085e shorten decoder by (Jeff Muizelaar <jrmuizel gmail com>)
michael
parents: 2439
diff changeset
342 * read signed golomb rice code (shorten).
b47af698085e shorten decoder by (Jeff Muizelaar <jrmuizel gmail com>)
michael
parents: 2439
diff changeset
343 */
b47af698085e shorten decoder by (Jeff Muizelaar <jrmuizel gmail com>)
michael
parents: 2439
diff changeset
344 static inline int get_sr_golomb_shorten(GetBitContext* gb, int k)
b47af698085e shorten decoder by (Jeff Muizelaar <jrmuizel gmail com>)
michael
parents: 2439
diff changeset
345 {
b47af698085e shorten decoder by (Jeff Muizelaar <jrmuizel gmail com>)
michael
parents: 2439
diff changeset
346 int uvar = get_ur_golomb_jpegls(gb, k + 1, INT_MAX, 0);
b47af698085e shorten decoder by (Jeff Muizelaar <jrmuizel gmail com>)
michael
parents: 2439
diff changeset
347 if (uvar & 1)
b47af698085e shorten decoder by (Jeff Muizelaar <jrmuizel gmail com>)
michael
parents: 2439
diff changeset
348 return ~(uvar >> 1);
b47af698085e shorten decoder by (Jeff Muizelaar <jrmuizel gmail com>)
michael
parents: 2439
diff changeset
349 else
b47af698085e shorten decoder by (Jeff Muizelaar <jrmuizel gmail com>)
michael
parents: 2439
diff changeset
350 return uvar >> 1;
b47af698085e shorten decoder by (Jeff Muizelaar <jrmuizel gmail com>)
michael
parents: 2439
diff changeset
351 }
b47af698085e shorten decoder by (Jeff Muizelaar <jrmuizel gmail com>)
michael
parents: 2439
diff changeset
352
b47af698085e shorten decoder by (Jeff Muizelaar <jrmuizel gmail com>)
michael
parents: 2439
diff changeset
353
b47af698085e shorten decoder by (Jeff Muizelaar <jrmuizel gmail com>)
michael
parents: 2439
diff changeset
354
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
355 #ifdef TRACE
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
356
2438
e98b5e0de86b compile with TRACE define patch by (Loic <lll+ffmpeg m4x org>)
michael
parents: 2220
diff changeset
357 static inline int get_ue(GetBitContext *s, char *file, const char *func, int line){
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
358 int show= show_bits(s, 24);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
359 int pos= get_bits_count(s);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
360 int i= get_ue_golomb(s);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
361 int len= get_bits_count(s) - pos;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
362 int bits= show>>(24-len);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2905
diff changeset
363
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
364 print_bin(bits, len);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2905
diff changeset
365
2215
2a767157935e new signed golomb routines
alex
parents: 2087
diff changeset
366 av_log(NULL, AV_LOG_DEBUG, "%5d %2d %3d ue @%5d in %s %s:%d\n", bits, len, i, pos, file, func, line);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2905
diff changeset
367
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
368 return i;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
369 }
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
370
2438
e98b5e0de86b compile with TRACE define patch by (Loic <lll+ffmpeg m4x org>)
michael
parents: 2220
diff changeset
371 static inline int get_se(GetBitContext *s, char *file, const char *func, int line){
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
372 int show= show_bits(s, 24);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
373 int pos= get_bits_count(s);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
374 int i= get_se_golomb(s);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
375 int len= get_bits_count(s) - pos;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
376 int bits= show>>(24-len);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2905
diff changeset
377
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
378 print_bin(bits, len);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2905
diff changeset
379
2215
2a767157935e new signed golomb routines
alex
parents: 2087
diff changeset
380 av_log(NULL, AV_LOG_DEBUG, "%5d %2d %3d se @%5d in %s %s:%d\n", bits, len, i, pos, file, func, line);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2905
diff changeset
381
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
382 return i;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
383 }
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
384
2438
e98b5e0de86b compile with TRACE define patch by (Loic <lll+ffmpeg m4x org>)
michael
parents: 2220
diff changeset
385 static inline int get_te(GetBitContext *s, int r, char *file, const char *func, int line){
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
386 int show= show_bits(s, 24);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
387 int pos= get_bits_count(s);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
388 int i= get_te0_golomb(s, r);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
389 int len= get_bits_count(s) - pos;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
390 int bits= show>>(24-len);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2905
diff changeset
391
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
392 print_bin(bits, len);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2905
diff changeset
393
2215
2a767157935e new signed golomb routines
alex
parents: 2087
diff changeset
394 av_log(NULL, AV_LOG_DEBUG, "%5d %2d %3d te @%5d in %s %s:%d\n", bits, len, i, pos, file, func, line);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2905
diff changeset
395
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
396 return i;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
397 }
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
398
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
399 #define get_ue_golomb(a) get_ue(a, __FILE__, __PRETTY_FUNCTION__, __LINE__)
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
400 #define get_se_golomb(a) get_se(a, __FILE__, __PRETTY_FUNCTION__, __LINE__)
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
401 #define get_te_golomb(a, r) get_te(a, r, __FILE__, __PRETTY_FUNCTION__, __LINE__)
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
402 #define get_te0_golomb(a, r) get_te(a, r, __FILE__, __PRETTY_FUNCTION__, __LINE__)
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
403
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
404 #endif
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
405
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
406 /**
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
407 * write unsigned exp golomb code.
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
408 */
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
409 static inline void set_ue_golomb(PutBitContext *pb, int i){
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
410 int e;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2905
diff changeset
411
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
412 assert(i>=0);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
413
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
414 #if 0
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
415 if(i=0){
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
416 put_bits(pb, 1, 1);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
417 return;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
418 }
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
419 #endif
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
420 if(i<256)
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
421 put_bits(pb, ff_ue_golomb_len[i], i+1);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
422 else{
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
423 e= av_log2(i+1);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2905
diff changeset
424
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
425 put_bits(pb, 2*e+1, i+1);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
426 }
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
427 }
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
428
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
429 /**
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
430 * write truncated unsigned exp golomb code.
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
431 */
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
432 static inline void set_te_golomb(PutBitContext *pb, int i, int range){
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
433 assert(range >= 1);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
434 assert(i<=range);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
435
1169
4e891257d3e2 multiple reference frames support
michaelni
parents: 1168
diff changeset
436 if(range==2) put_bits(pb, 1, i^1);
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
437 else set_ue_golomb(pb, i);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
438 }
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
439
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
440 /**
2905
926ea374947f set_se_golomb can only write 16bits, add a note about this (ok, maybe it's brain dead using it with more than 16bits, but..)
alex
parents: 2525
diff changeset
441 * write signed exp golomb code. 16 bits at most.
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
442 */
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
443 static inline void set_se_golomb(PutBitContext *pb, int i){
2905
926ea374947f set_se_golomb can only write 16bits, add a note about this (ok, maybe it's brain dead using it with more than 16bits, but..)
alex
parents: 2525
diff changeset
444 // if (i>32767 || i<-32767)
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
445 // av_log(NULL,AV_LOG_ERROR,"value out of range %d\n", i);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2905
diff changeset
446 #if 0
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
447 if(i<=0) i= -2*i;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
448 else i= 2*i-1;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
449 #elif 1
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
450 i= 2*i-1;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
451 if(i<0) i^= -1; //FIXME check if gcc does the right thing
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
452 #else
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
453 i= 2*i-1;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
454 i^= (i>>31);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
455 #endif
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
456 set_ue_golomb(pb, i);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
457 }
1306
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
458
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
459 /**
1361
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
460 * write unsigned golomb rice code (ffv1).
1306
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
461 */
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
462 static inline void set_ur_golomb(PutBitContext *pb, int i, int k, int limit, int esc_len){
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
463 int e;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2905
diff changeset
464
1306
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
465 assert(i>=0);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2905
diff changeset
466
1306
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
467 e= i>>k;
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
468 if(e<limit){
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
469 put_bits(pb, e + k + 1, (1<<k) + (i&((1<<k)-1)));
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
470 }else{
1361
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
471 put_bits(pb, limit + esc_len, i - limit + 1);
1306
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
472 }
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
473 }
1361
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
474
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
475 /**
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
476 * write unsigned golomb rice code (jpegls).
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
477 */
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
478 static inline void set_ur_golomb_jpegls(PutBitContext *pb, int i, int k, int limit, int esc_len){
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
479 int e;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2905
diff changeset
480
1361
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
481 assert(i>=0);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2905
diff changeset
482
1361
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
483 e= (i>>k) + 1;
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
484 if(e<limit){
3353
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents: 3036
diff changeset
485 while(e > 31) {
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents: 3036
diff changeset
486 put_bits(pb, 31, 0);
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents: 3036
diff changeset
487 e -= 31;
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents: 3036
diff changeset
488 }
1361
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
489 put_bits(pb, e, 1);
1362
michaelni
parents: 1361
diff changeset
490 if(k)
7260
3ec34b551aae bitstream: move put_sbits() from flacenc.c to bitstream.h and use it
ramiro
parents: 5830
diff changeset
491 put_sbits(pb, k, i);
1361
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
492 }else{
4053
fb4e436780fb handle limit>32 for set_ur_golomb_jpegls()
kostya
parents: 3947
diff changeset
493 while(limit > 31) {
fb4e436780fb handle limit>32 for set_ur_golomb_jpegls()
kostya
parents: 3947
diff changeset
494 put_bits(pb, 31, 0);
fb4e436780fb handle limit>32 for set_ur_golomb_jpegls()
kostya
parents: 3947
diff changeset
495 limit -= 31;
fb4e436780fb handle limit>32 for set_ur_golomb_jpegls()
kostya
parents: 3947
diff changeset
496 }
1361
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
497 put_bits(pb, limit , 1);
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
498 put_bits(pb, esc_len, i - 1);
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
499 }
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
500 }
2215
2a767157935e new signed golomb routines
alex
parents: 2087
diff changeset
501
2a767157935e new signed golomb routines
alex
parents: 2087
diff changeset
502 /**
2a767157935e new signed golomb routines
alex
parents: 2087
diff changeset
503 * write signed golomb rice code (ffv1).
2a767157935e new signed golomb routines
alex
parents: 2087
diff changeset
504 */
2220
21947e176d4d get/set_sr_golomb() cleanup
michael
parents: 2215
diff changeset
505 static inline void set_sr_golomb(PutBitContext *pb, int i, int k, int limit, int esc_len){
2215
2a767157935e new signed golomb routines
alex
parents: 2087
diff changeset
506 int v;
2a767157935e new signed golomb routines
alex
parents: 2087
diff changeset
507
2a767157935e new signed golomb routines
alex
parents: 2087
diff changeset
508 v = -2*i-1;
2a767157935e new signed golomb routines
alex
parents: 2087
diff changeset
509 v ^= (v>>31);
2a767157935e new signed golomb routines
alex
parents: 2087
diff changeset
510
2a767157935e new signed golomb routines
alex
parents: 2087
diff changeset
511 set_ur_golomb(pb, v, k, limit, esc_len);
2a767157935e new signed golomb routines
alex
parents: 2087
diff changeset
512 }
2a767157935e new signed golomb routines
alex
parents: 2087
diff changeset
513
2a767157935e new signed golomb routines
alex
parents: 2087
diff changeset
514 /**
2a767157935e new signed golomb routines
alex
parents: 2087
diff changeset
515 * write signed golomb rice code (flac).
2a767157935e new signed golomb routines
alex
parents: 2087
diff changeset
516 */
2a767157935e new signed golomb routines
alex
parents: 2087
diff changeset
517 static inline void set_sr_golomb_flac(PutBitContext *pb, int i, int k, int limit, int esc_len){
2a767157935e new signed golomb routines
alex
parents: 2087
diff changeset
518 int v;
2a767157935e new signed golomb routines
alex
parents: 2087
diff changeset
519
2a767157935e new signed golomb routines
alex
parents: 2087
diff changeset
520 v = -2*i-1;
2a767157935e new signed golomb routines
alex
parents: 2087
diff changeset
521 v ^= (v>>31);
2a767157935e new signed golomb routines
alex
parents: 2087
diff changeset
522
2a767157935e new signed golomb routines
alex
parents: 2087
diff changeset
523 set_ur_golomb_jpegls(pb, v, k, limit, esc_len);
2a767157935e new signed golomb routines
alex
parents: 2087
diff changeset
524 }
5163
9ecbfc0c82bf add multiple inclusion guards to headers
mru
parents: 5162
diff changeset
525
7760
c4a4495715dd Globally rename the header inclusion guard names.
stefano
parents: 7260
diff changeset
526 #endif /* AVCODEC_GOLOMB_H */