annotate golomb.h @ 8991:ca768cb2bfb6 libavcodec

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