annotate golomb.h @ 8520:a0164882aa38 libavcodec

Generic metadata API. avi is updated as example. No version bump, the API still might change slightly ... No update to ffmpeg.c as requested by aurel.
author michael
date Sun, 04 Jan 2009 18:48:37 +0000
parents d6faaf27eacf
children e9d9d946f213
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 /**
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
24 * @file 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>
4394344397d8 include all prerequisites in header files
mru
parents: 4053
diff changeset
34 #include "bitstream.h"
4394344397d8 include all prerequisites in header files
mru
parents: 4053
diff changeset
35
1234
fc2a7eefa9cc svq3 decoder by anonymous
michaelni
parents: 1169
diff changeset
36 #define INVALID_VLC 0x80000000
fc2a7eefa9cc svq3 decoder by anonymous
michaelni
parents: 1169
diff changeset
37
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
38 extern const uint8_t ff_golomb_vlc_len[512];
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
39 extern const uint8_t ff_ue_golomb_vlc_code[512];
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
40 extern const int8_t ff_se_golomb_vlc_code[512];
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
41 extern const uint8_t ff_ue_golomb_len[256];
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
42
1250
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
43 extern const uint8_t ff_interleaved_golomb_vlc_len[256];
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
44 extern const uint8_t ff_interleaved_ue_golomb_vlc_code[256];
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
45 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
46 extern const uint8_t ff_interleaved_dirac_golomb_vlc_code[256];
1250
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
47
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2905
diff changeset
48
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
49 /**
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
50 * read unsigned exp golomb code.
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
51 */
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
52 static inline int get_ue_golomb(GetBitContext *gb){
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
53 unsigned int buf;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
54 int log;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2905
diff changeset
55
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
56 OPEN_READER(re, gb);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
57 UPDATE_CACHE(re, gb);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
58 buf=GET_CACHE(re, gb);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2905
diff changeset
59
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
60 if(buf >= (1<<27)){
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
61 buf >>= 32 - 9;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
62 LAST_SKIP_BITS(re, gb, ff_golomb_vlc_len[buf]);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
63 CLOSE_READER(re, gb);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2905
diff changeset
64
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
65 return ff_ue_golomb_vlc_code[buf];
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
66 }else{
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
67 log= 2*av_log2(buf) - 31;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
68 buf>>= log;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
69 buf--;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
70 LAST_SKIP_BITS(re, gb, 32 - log);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
71 CLOSE_READER(re, gb);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2905
diff changeset
72
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
73 return buf;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
74 }
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
75 }
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
76
8449
d6faaf27eacf Add get_ue_golomb_31()
michael
parents: 7869
diff changeset
77 /**
d6faaf27eacf Add get_ue_golomb_31()
michael
parents: 7869
diff changeset
78 * read unsigned exp golomb code, constraint to a max of 31
d6faaf27eacf Add get_ue_golomb_31()
michael
parents: 7869
diff changeset
79 */
d6faaf27eacf Add get_ue_golomb_31()
michael
parents: 7869
diff changeset
80 static inline int get_ue_golomb_31(GetBitContext *gb){
d6faaf27eacf Add get_ue_golomb_31()
michael
parents: 7869
diff changeset
81 unsigned int buf;
d6faaf27eacf Add get_ue_golomb_31()
michael
parents: 7869
diff changeset
82
d6faaf27eacf Add get_ue_golomb_31()
michael
parents: 7869
diff changeset
83 OPEN_READER(re, gb);
d6faaf27eacf Add get_ue_golomb_31()
michael
parents: 7869
diff changeset
84 UPDATE_CACHE(re, gb);
d6faaf27eacf Add get_ue_golomb_31()
michael
parents: 7869
diff changeset
85 buf=GET_CACHE(re, gb);
d6faaf27eacf Add get_ue_golomb_31()
michael
parents: 7869
diff changeset
86
d6faaf27eacf Add get_ue_golomb_31()
michael
parents: 7869
diff changeset
87 buf >>= 32 - 9;
d6faaf27eacf Add get_ue_golomb_31()
michael
parents: 7869
diff changeset
88 LAST_SKIP_BITS(re, gb, ff_golomb_vlc_len[buf]);
d6faaf27eacf Add get_ue_golomb_31()
michael
parents: 7869
diff changeset
89 CLOSE_READER(re, gb);
d6faaf27eacf Add get_ue_golomb_31()
michael
parents: 7869
diff changeset
90
d6faaf27eacf Add get_ue_golomb_31()
michael
parents: 7869
diff changeset
91 return ff_ue_golomb_vlc_code[buf];
d6faaf27eacf Add get_ue_golomb_31()
michael
parents: 7869
diff changeset
92 }
d6faaf27eacf Add get_ue_golomb_31()
michael
parents: 7869
diff changeset
93
1234
fc2a7eefa9cc svq3 decoder by anonymous
michaelni
parents: 1169
diff changeset
94 static inline int svq3_get_ue_golomb(GetBitContext *gb){
1250
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
95 uint32_t buf;
1234
fc2a7eefa9cc svq3 decoder by anonymous
michaelni
parents: 1169
diff changeset
96
fc2a7eefa9cc svq3 decoder by anonymous
michaelni
parents: 1169
diff changeset
97 OPEN_READER(re, gb);
fc2a7eefa9cc svq3 decoder by anonymous
michaelni
parents: 1169
diff changeset
98 UPDATE_CACHE(re, gb);
1250
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
99 buf=GET_CACHE(re, gb);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2905
diff changeset
100
1250
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
101 if(buf&0xAA800000){
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
102 buf >>= 32 - 8;
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
103 LAST_SKIP_BITS(re, gb, ff_interleaved_golomb_vlc_len[buf]);
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
104 CLOSE_READER(re, gb);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2905
diff changeset
105
1250
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
106 return ff_interleaved_ue_golomb_vlc_code[buf];
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
107 }else{
5546
e12027d324cc Make the Golomb decoder work for Dirac
marco
parents: 5215
diff changeset
108 int ret = 1;
e12027d324cc Make the Golomb decoder work for Dirac
marco
parents: 5215
diff changeset
109
e12027d324cc Make the Golomb decoder work for Dirac
marco
parents: 5215
diff changeset
110 while (1) {
e12027d324cc Make the Golomb decoder work for Dirac
marco
parents: 5215
diff changeset
111 buf >>= 32 - 8;
e12027d324cc Make the Golomb decoder work for Dirac
marco
parents: 5215
diff changeset
112 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
113
5546
e12027d324cc Make the Golomb decoder work for Dirac
marco
parents: 5215
diff changeset
114 if (ff_interleaved_golomb_vlc_len[buf] != 9){
e12027d324cc Make the Golomb decoder work for Dirac
marco
parents: 5215
diff changeset
115 ret <<= (ff_interleaved_golomb_vlc_len[buf] - 1) >> 1;
e12027d324cc Make the Golomb decoder work for Dirac
marco
parents: 5215
diff changeset
116 ret |= ff_interleaved_dirac_golomb_vlc_code[buf];
e12027d324cc Make the Golomb decoder work for Dirac
marco
parents: 5215
diff changeset
117 break;
e12027d324cc Make the Golomb decoder work for Dirac
marco
parents: 5215
diff changeset
118 }
e12027d324cc Make the Golomb decoder work for Dirac
marco
parents: 5215
diff changeset
119 ret = (ret << 4) | ff_interleaved_dirac_golomb_vlc_code[buf];
e12027d324cc Make the Golomb decoder work for Dirac
marco
parents: 5215
diff changeset
120 UPDATE_CACHE(re, gb);
e12027d324cc Make the Golomb decoder work for Dirac
marco
parents: 5215
diff changeset
121 buf = GET_CACHE(re, gb);
1250
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
122 }
1234
fc2a7eefa9cc svq3 decoder by anonymous
michaelni
parents: 1169
diff changeset
123
1250
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
124 CLOSE_READER(re, gb);
5546
e12027d324cc Make the Golomb decoder work for Dirac
marco
parents: 5215
diff changeset
125 return ret - 1;
1250
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
126 }
1234
fc2a7eefa9cc svq3 decoder by anonymous
michaelni
parents: 1169
diff changeset
127 }
fc2a7eefa9cc svq3 decoder by anonymous
michaelni
parents: 1169
diff changeset
128
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
129 /**
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
130 * read unsigned truncated exp golomb code.
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
131 */
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
132 static inline int get_te0_golomb(GetBitContext *gb, int range){
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
133 assert(range >= 1);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2905
diff changeset
134
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
135 if(range==1) return 0;
1169
4e891257d3e2 multiple reference frames support
michaelni
parents: 1168
diff changeset
136 else if(range==2) return get_bits1(gb)^1;
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
137 else return get_ue_golomb(gb);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
138 }
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
139
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
140 /**
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
141 * read unsigned truncated exp golomb code.
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
142 */
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
143 static inline int get_te_golomb(GetBitContext *gb, int range){
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
144 assert(range >= 1);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2905
diff changeset
145
1169
4e891257d3e2 multiple reference frames support
michaelni
parents: 1168
diff changeset
146 if(range==2) return get_bits1(gb)^1;
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
147 else return get_ue_golomb(gb);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
148 }
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
149
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 * read signed exp golomb code.
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
153 */
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
154 static inline int get_se_golomb(GetBitContext *gb){
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
155 unsigned int buf;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
156 int log;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2905
diff changeset
157
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
158 OPEN_READER(re, gb);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
159 UPDATE_CACHE(re, gb);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
160 buf=GET_CACHE(re, gb);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2905
diff changeset
161
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
162 if(buf >= (1<<27)){
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
163 buf >>= 32 - 9;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
164 LAST_SKIP_BITS(re, gb, ff_golomb_vlc_len[buf]);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
165 CLOSE_READER(re, gb);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2905
diff changeset
166
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
167 return ff_se_golomb_vlc_code[buf];
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
168 }else{
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
169 log= 2*av_log2(buf) - 31;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
170 buf>>= log;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2905
diff changeset
171
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
172 LAST_SKIP_BITS(re, gb, 32 - log);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
173 CLOSE_READER(re, gb);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2905
diff changeset
174
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
175 if(buf&1) buf= -(buf>>1);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
176 else buf= (buf>>1);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
177
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
178 return buf;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
179 }
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
180 }
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
181
1234
fc2a7eefa9cc svq3 decoder by anonymous
michaelni
parents: 1169
diff changeset
182 static inline int svq3_get_se_golomb(GetBitContext *gb){
fc2a7eefa9cc svq3 decoder by anonymous
michaelni
parents: 1169
diff changeset
183 unsigned int buf;
fc2a7eefa9cc svq3 decoder by anonymous
michaelni
parents: 1169
diff changeset
184 int log;
fc2a7eefa9cc svq3 decoder by anonymous
michaelni
parents: 1169
diff changeset
185
fc2a7eefa9cc svq3 decoder by anonymous
michaelni
parents: 1169
diff changeset
186 OPEN_READER(re, gb);
fc2a7eefa9cc svq3 decoder by anonymous
michaelni
parents: 1169
diff changeset
187 UPDATE_CACHE(re, gb);
1250
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
188 buf=GET_CACHE(re, gb);
1234
fc2a7eefa9cc svq3 decoder by anonymous
michaelni
parents: 1169
diff changeset
189
1250
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
190 if(buf&0xAA800000){
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
191 buf >>= 32 - 8;
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
192 LAST_SKIP_BITS(re, gb, ff_interleaved_golomb_vlc_len[buf]);
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
193 CLOSE_READER(re, gb);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2905
diff changeset
194
1250
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
195 return ff_interleaved_se_golomb_vlc_code[buf];
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
196 }else{
2439
6684c0e9e28f svq3_get_se_golomb() fix
michael
parents: 2438
diff changeset
197 LAST_SKIP_BITS(re, gb, 8);
6684c0e9e28f svq3_get_se_golomb() fix
michael
parents: 2438
diff changeset
198 UPDATE_CACHE(re, gb);
6684c0e9e28f svq3_get_se_golomb() fix
michael
parents: 2438
diff changeset
199 buf |= 1 | (GET_CACHE(re, gb) >> 8);
6684c0e9e28f svq3_get_se_golomb() fix
michael
parents: 2438
diff changeset
200
1250
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
201 if((buf & 0xAAAAAAAA) == 0)
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
202 return INVALID_VLC;
1234
fc2a7eefa9cc svq3 decoder by anonymous
michaelni
parents: 1169
diff changeset
203
1250
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
204 for(log=31; (buf & 0x80000000) == 0; log--){
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
205 buf = (buf << 2) - ((buf << log) >> (log - 1)) + (buf >> 30);
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
206 }
1234
fc2a7eefa9cc svq3 decoder by anonymous
michaelni
parents: 1169
diff changeset
207
2439
6684c0e9e28f svq3_get_se_golomb() fix
michael
parents: 2438
diff changeset
208 LAST_SKIP_BITS(re, gb, 63 - 2*log - 8);
1250
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
209 CLOSE_READER(re, gb);
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
210
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
211 return (signed) (((((buf << log) >> log) - 1) ^ -(buf & 0x1)) + 1) >> 1;
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
212 }
1234
fc2a7eefa9cc svq3 decoder by anonymous
michaelni
parents: 1169
diff changeset
213 }
fc2a7eefa9cc svq3 decoder by anonymous
michaelni
parents: 1169
diff changeset
214
5546
e12027d324cc Make the Golomb decoder work for Dirac
marco
parents: 5215
diff changeset
215 static inline int dirac_get_se_golomb(GetBitContext *gb){
e12027d324cc Make the Golomb decoder work for Dirac
marco
parents: 5215
diff changeset
216 uint32_t buf;
e12027d324cc Make the Golomb decoder work for Dirac
marco
parents: 5215
diff changeset
217 uint32_t ret;
e12027d324cc Make the Golomb decoder work for Dirac
marco
parents: 5215
diff changeset
218
e12027d324cc Make the Golomb decoder work for Dirac
marco
parents: 5215
diff changeset
219 ret = svq3_get_ue_golomb(gb);
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 if (ret) {
e12027d324cc Make the Golomb decoder work for Dirac
marco
parents: 5215
diff changeset
222 OPEN_READER(re, gb);
e12027d324cc Make the Golomb decoder work for Dirac
marco
parents: 5215
diff changeset
223 UPDATE_CACHE(re, gb);
e12027d324cc Make the Golomb decoder work for Dirac
marco
parents: 5215
diff changeset
224 buf = SHOW_SBITS(re, gb, 1);
e12027d324cc Make the Golomb decoder work for Dirac
marco
parents: 5215
diff changeset
225 LAST_SKIP_BITS(re, gb, 1);
e12027d324cc Make the Golomb decoder work for Dirac
marco
parents: 5215
diff changeset
226 ret = (ret ^ buf) - buf;
e12027d324cc Make the Golomb decoder work for Dirac
marco
parents: 5215
diff changeset
227 CLOSE_READER(re, gb);
e12027d324cc Make the Golomb decoder work for Dirac
marco
parents: 5215
diff changeset
228 }
e12027d324cc Make the Golomb decoder work for Dirac
marco
parents: 5215
diff changeset
229
e12027d324cc Make the Golomb decoder work for Dirac
marco
parents: 5215
diff changeset
230 return ret;
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
1306
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
233 /**
1361
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
234 * read unsigned golomb rice code (ffv1).
1306
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
235 */
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
236 static inline int get_ur_golomb(GetBitContext *gb, int k, int limit, int esc_len){
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
237 unsigned int buf;
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
238 int log;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2905
diff changeset
239
1306
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
240 OPEN_READER(re, gb);
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
241 UPDATE_CACHE(re, gb);
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
242 buf=GET_CACHE(re, gb);
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
243
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
244 log= av_log2(buf);
1361
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
245
1306
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
246 if(log > 31-limit){
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
247 buf >>= log - k;
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
248 buf += (30-log)<<k;
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
249 LAST_SKIP_BITS(re, gb, 32 + k - log);
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
250 CLOSE_READER(re, gb);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2905
diff changeset
251
1306
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
252 return buf;
1361
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
253 }else{
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
254 buf >>= 32 - limit - esc_len;
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
255 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
256 CLOSE_READER(re, gb);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2905
diff changeset
257
1361
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
258 return buf + limit - 1;
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
259 }
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
260 }
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 * read unsigned golomb rice code (jpegls).
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 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
266 unsigned int buf;
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
267 int log;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2905
diff changeset
268
1361
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
269 OPEN_READER(re, gb);
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
270 UPDATE_CACHE(re, gb);
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
271 buf=GET_CACHE(re, gb);
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
272
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
273 log= av_log2(buf);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2905
diff changeset
274
7869
cd18f66b3663 Fix regression test failure caused by golomb limit not being considered
michael
parents: 7866
diff changeset
275 if(log - k >= 32-MIN_CACHE_BITS && 32-log < limit){
1361
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
276 buf >>= log - k;
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
277 buf += (30-log)<<k;
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
278 LAST_SKIP_BITS(re, gb, 32 + k - log);
1306
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
279 CLOSE_READER(re, gb);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2905
diff changeset
280
1361
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
281 return buf;
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
282 }else{
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
283 int i;
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
284 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
285 LAST_SKIP_BITS(re, gb, 1);
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
286 UPDATE_CACHE(re, gb);
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
287 }
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
288 SKIP_BITS(re, gb, 1);
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 if(i < limit - 1){
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
291 if(k){
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
292 buf = SHOW_UBITS(re, gb, k);
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
293 LAST_SKIP_BITS(re, gb, k);
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
294 }else{
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
295 buf=0;
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
296 }
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
297
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
298 CLOSE_READER(re, gb);
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
299 return buf + (i<<k);
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
300 }else if(i == limit - 1){
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
301 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
302 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
303 CLOSE_READER(re, gb);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2905
diff changeset
304
1361
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
305 return buf + 1;
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
306 }else
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
307 return -1;
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
308 }
1306
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
309 }
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
310
1812
6d762acfff5d flac fixes:
michael
parents: 1362
diff changeset
311 /**
2215
2a767157935e new signed golomb routines
alex
parents: 2087
diff changeset
312 * read signed golomb rice code (ffv1).
2a767157935e new signed golomb routines
alex
parents: 2087
diff changeset
313 */
2220
21947e176d4d get/set_sr_golomb() cleanup
michael
parents: 2215
diff changeset
314 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
315 int v= get_ur_golomb(gb, k, limit, esc_len);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2905
diff changeset
316
2215
2a767157935e new signed golomb routines
alex
parents: 2087
diff changeset
317 v++;
2a767157935e new signed golomb routines
alex
parents: 2087
diff changeset
318 if (v&1) return v>>1;
2a767157935e new signed golomb routines
alex
parents: 2087
diff changeset
319 else return -(v>>1);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2905
diff changeset
320
2215
2a767157935e new signed golomb routines
alex
parents: 2087
diff changeset
321 // return (v>>1) ^ -(v&1);
2a767157935e new signed golomb routines
alex
parents: 2087
diff changeset
322 }
2220
21947e176d4d get/set_sr_golomb() cleanup
michael
parents: 2215
diff changeset
323
2215
2a767157935e new signed golomb routines
alex
parents: 2087
diff changeset
324 /**
2a767157935e new signed golomb routines
alex
parents: 2087
diff changeset
325 * read signed golomb rice code (flac).
1812
6d762acfff5d flac fixes:
michael
parents: 1362
diff changeset
326 */
6d762acfff5d flac fixes:
michael
parents: 1362
diff changeset
327 static inline int get_sr_golomb_flac(GetBitContext *gb, int k, int limit, int esc_len){
6d762acfff5d flac fixes:
michael
parents: 1362
diff changeset
328 int v= get_ur_golomb_jpegls(gb, k, limit, esc_len);
6d762acfff5d flac fixes:
michael
parents: 1362
diff changeset
329 return (v>>1) ^ -(v&1);
6d762acfff5d flac fixes:
michael
parents: 1362
diff changeset
330 }
6d762acfff5d flac fixes:
michael
parents: 1362
diff changeset
331
2525
b47af698085e shorten decoder by (Jeff Muizelaar <jrmuizel gmail com>)
michael
parents: 2439
diff changeset
332 /**
b47af698085e shorten decoder by (Jeff Muizelaar <jrmuizel gmail com>)
michael
parents: 2439
diff changeset
333 * read unsigned golomb rice code (shorten).
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 static inline unsigned int get_ur_golomb_shorten(GetBitContext *gb, int k){
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
336 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
337 }
b47af698085e shorten decoder by (Jeff Muizelaar <jrmuizel gmail com>)
michael
parents: 2439
diff changeset
338
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 * read signed golomb rice code (shorten).
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 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
343 {
b47af698085e shorten decoder by (Jeff Muizelaar <jrmuizel gmail com>)
michael
parents: 2439
diff changeset
344 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
345 if (uvar & 1)
b47af698085e shorten decoder by (Jeff Muizelaar <jrmuizel gmail com>)
michael
parents: 2439
diff changeset
346 return ~(uvar >> 1);
b47af698085e shorten decoder by (Jeff Muizelaar <jrmuizel gmail com>)
michael
parents: 2439
diff changeset
347 else
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 }
b47af698085e shorten decoder by (Jeff Muizelaar <jrmuizel gmail com>)
michael
parents: 2439
diff changeset
350
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
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
353 #ifdef TRACE
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
354
2438
e98b5e0de86b compile with TRACE define patch by (Loic <lll+ffmpeg m4x org>)
michael
parents: 2220
diff changeset
355 static inline int get_ue(GetBitContext *s, char *file, const char *func, int line){
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
356 int show= show_bits(s, 24);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
357 int pos= get_bits_count(s);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
358 int i= get_ue_golomb(s);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
359 int len= get_bits_count(s) - pos;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
360 int bits= show>>(24-len);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2905
diff changeset
361
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
362 print_bin(bits, len);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2905
diff changeset
363
2215
2a767157935e new signed golomb routines
alex
parents: 2087
diff changeset
364 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
365
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
366 return i;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
367 }
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
368
2438
e98b5e0de86b compile with TRACE define patch by (Loic <lll+ffmpeg m4x org>)
michael
parents: 2220
diff changeset
369 static inline int get_se(GetBitContext *s, char *file, const char *func, int line){
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
370 int show= show_bits(s, 24);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
371 int pos= get_bits_count(s);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
372 int i= get_se_golomb(s);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
373 int len= get_bits_count(s) - pos;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
374 int bits= show>>(24-len);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2905
diff changeset
375
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
376 print_bin(bits, len);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2905
diff changeset
377
2215
2a767157935e new signed golomb routines
alex
parents: 2087
diff changeset
378 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
379
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
380 return i;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
381 }
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
382
2438
e98b5e0de86b compile with TRACE define patch by (Loic <lll+ffmpeg m4x org>)
michael
parents: 2220
diff changeset
383 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
384 int show= show_bits(s, 24);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
385 int pos= get_bits_count(s);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
386 int i= get_te0_golomb(s, r);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
387 int len= get_bits_count(s) - pos;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
388 int bits= show>>(24-len);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2905
diff changeset
389
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
390 print_bin(bits, len);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2905
diff changeset
391
2215
2a767157935e new signed golomb routines
alex
parents: 2087
diff changeset
392 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
393
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
394 return i;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
395 }
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
396
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
397 #define get_ue_golomb(a) get_ue(a, __FILE__, __PRETTY_FUNCTION__, __LINE__)
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
398 #define get_se_golomb(a) get_se(a, __FILE__, __PRETTY_FUNCTION__, __LINE__)
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
399 #define get_te_golomb(a, r) get_te(a, r, __FILE__, __PRETTY_FUNCTION__, __LINE__)
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
400 #define get_te0_golomb(a, r) get_te(a, r, __FILE__, __PRETTY_FUNCTION__, __LINE__)
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
401
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
402 #endif
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
403
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
404 /**
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
405 * write unsigned exp golomb code.
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
406 */
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
407 static inline void set_ue_golomb(PutBitContext *pb, int i){
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
408 int e;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2905
diff changeset
409
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
410 assert(i>=0);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
411
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
412 #if 0
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
413 if(i=0){
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
414 put_bits(pb, 1, 1);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
415 return;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
416 }
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
417 #endif
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
418 if(i<256)
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
419 put_bits(pb, ff_ue_golomb_len[i], i+1);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
420 else{
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
421 e= av_log2(i+1);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2905
diff changeset
422
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
423 put_bits(pb, 2*e+1, i+1);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
424 }
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
425 }
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 * write truncated unsigned exp golomb code.
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
429 */
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
430 static inline void set_te_golomb(PutBitContext *pb, int i, int range){
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
431 assert(range >= 1);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
432 assert(i<=range);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
433
1169
4e891257d3e2 multiple reference frames support
michaelni
parents: 1168
diff changeset
434 if(range==2) put_bits(pb, 1, i^1);
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
435 else set_ue_golomb(pb, i);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
436 }
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
437
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
438 /**
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
439 * write signed exp golomb code. 16 bits at most.
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
440 */
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
441 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
442 // if (i>32767 || i<-32767)
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
443 // 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
444 #if 0
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
445 if(i<=0) i= -2*i;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
446 else i= 2*i-1;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
447 #elif 1
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
448 i= 2*i-1;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
449 if(i<0) i^= -1; //FIXME check if gcc does the right thing
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
450 #else
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
451 i= 2*i-1;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
452 i^= (i>>31);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
453 #endif
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
454 set_ue_golomb(pb, i);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
455 }
1306
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
456
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
457 /**
1361
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
458 * write unsigned golomb rice code (ffv1).
1306
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
459 */
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
460 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
461 int e;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2905
diff changeset
462
1306
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
463 assert(i>=0);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2905
diff changeset
464
1306
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
465 e= i>>k;
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
466 if(e<limit){
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
467 put_bits(pb, e + k + 1, (1<<k) + (i&((1<<k)-1)));
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
468 }else{
1361
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
469 put_bits(pb, limit + esc_len, i - limit + 1);
1306
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
470 }
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
471 }
1361
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
472
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
473 /**
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
474 * write unsigned golomb rice code (jpegls).
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 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
477 int e;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2905
diff changeset
478
1361
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
479 assert(i>=0);
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 e= (i>>k) + 1;
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
482 if(e<limit){
3353
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents: 3036
diff changeset
483 while(e > 31) {
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents: 3036
diff changeset
484 put_bits(pb, 31, 0);
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents: 3036
diff changeset
485 e -= 31;
5b901881d6ed first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents: 3036
diff changeset
486 }
1361
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
487 put_bits(pb, e, 1);
1362
michaelni
parents: 1361
diff changeset
488 if(k)
7260
3ec34b551aae bitstream: move put_sbits() from flacenc.c to bitstream.h and use it
ramiro
parents: 5830
diff changeset
489 put_sbits(pb, k, i);
1361
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
490 }else{
4053
fb4e436780fb handle limit>32 for set_ur_golomb_jpegls()
kostya
parents: 3947
diff changeset
491 while(limit > 31) {
fb4e436780fb handle limit>32 for set_ur_golomb_jpegls()
kostya
parents: 3947
diff changeset
492 put_bits(pb, 31, 0);
fb4e436780fb handle limit>32 for set_ur_golomb_jpegls()
kostya
parents: 3947
diff changeset
493 limit -= 31;
fb4e436780fb handle limit>32 for set_ur_golomb_jpegls()
kostya
parents: 3947
diff changeset
494 }
1361
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
495 put_bits(pb, limit , 1);
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
496 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
497 }
8479b875a989 golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents: 1306
diff changeset
498 }
2215
2a767157935e new signed golomb routines
alex
parents: 2087
diff changeset
499
2a767157935e new signed golomb routines
alex
parents: 2087
diff changeset
500 /**
2a767157935e new signed golomb routines
alex
parents: 2087
diff changeset
501 * write signed golomb rice code (ffv1).
2a767157935e new signed golomb routines
alex
parents: 2087
diff changeset
502 */
2220
21947e176d4d get/set_sr_golomb() cleanup
michael
parents: 2215
diff changeset
503 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
504 int v;
2a767157935e new signed golomb routines
alex
parents: 2087
diff changeset
505
2a767157935e new signed golomb routines
alex
parents: 2087
diff changeset
506 v = -2*i-1;
2a767157935e new signed golomb routines
alex
parents: 2087
diff changeset
507 v ^= (v>>31);
2a767157935e new signed golomb routines
alex
parents: 2087
diff changeset
508
2a767157935e new signed golomb routines
alex
parents: 2087
diff changeset
509 set_ur_golomb(pb, v, k, limit, esc_len);
2a767157935e new signed golomb routines
alex
parents: 2087
diff changeset
510 }
2a767157935e new signed golomb routines
alex
parents: 2087
diff changeset
511
2a767157935e new signed golomb routines
alex
parents: 2087
diff changeset
512 /**
2a767157935e new signed golomb routines
alex
parents: 2087
diff changeset
513 * write signed golomb rice code (flac).
2a767157935e new signed golomb routines
alex
parents: 2087
diff changeset
514 */
2a767157935e new signed golomb routines
alex
parents: 2087
diff changeset
515 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
516 int v;
2a767157935e new signed golomb routines
alex
parents: 2087
diff changeset
517
2a767157935e new signed golomb routines
alex
parents: 2087
diff changeset
518 v = -2*i-1;
2a767157935e new signed golomb routines
alex
parents: 2087
diff changeset
519 v ^= (v>>31);
2a767157935e new signed golomb routines
alex
parents: 2087
diff changeset
520
2a767157935e new signed golomb routines
alex
parents: 2087
diff changeset
521 set_ur_golomb_jpegls(pb, v, k, limit, esc_len);
2a767157935e new signed golomb routines
alex
parents: 2087
diff changeset
522 }
5163
9ecbfc0c82bf add multiple inclusion guards to headers
mru
parents: 5162
diff changeset
523
7760
c4a4495715dd Globally rename the header inclusion guard names.
stefano
parents: 7260
diff changeset
524 #endif /* AVCODEC_GOLOMB_H */