annotate golomb.h @ 1306:799839d1e2e1 libavcodec

golomb rice codes use gradients instead of prediction errors as context model store independant quantization tables for each point merge contexts with opposit sign
author michaelni
date Fri, 13 Jun 2003 21:31:28 +0000
parents fa181d095027
children 8479b875a989
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>
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
4 *
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
5 * This library is free software; you can redistribute it and/or
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
6 * modify it under the terms of the GNU Lesser General Public
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
7 * License as published by the Free Software Foundation; either
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
8 * version 2 of the License, or (at your option) any later version.
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
9 *
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
10 * This library is distributed in the hope that it will be useful,
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
13 * Lesser General Public License for more details.
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
14 *
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
15 * You should have received a copy of the GNU Lesser General Public
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
16 * License along with this library; if not, write to the Free Software
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
18 *
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
19 */
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
20
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
21 /**
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
22 * @file golomb.h
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
23 * @brief
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
24 * exp golomb vlc stuff
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
25 * @author Michael Niedermayer <michaelni@gmx.at>
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
26 */
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
27
1234
fc2a7eefa9cc svq3 decoder by anonymous
michaelni
parents: 1169
diff changeset
28 #define INVALID_VLC 0x80000000
fc2a7eefa9cc svq3 decoder by anonymous
michaelni
parents: 1169
diff changeset
29
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
30 extern const uint8_t ff_golomb_vlc_len[512];
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
31 extern const uint8_t ff_ue_golomb_vlc_code[512];
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
32 extern const int8_t ff_se_golomb_vlc_code[512];
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
33 extern const uint8_t ff_ue_golomb_len[256];
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
34
1250
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
35 extern const uint8_t ff_interleaved_golomb_vlc_len[256];
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
36 extern const uint8_t ff_interleaved_ue_golomb_vlc_code[256];
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
37 extern const int8_t ff_interleaved_se_golomb_vlc_code[256];
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
38
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
39
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
40 /**
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
41 * read unsigned exp golomb code.
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
42 */
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
43 static inline int get_ue_golomb(GetBitContext *gb){
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
44 unsigned int buf;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
45 int log;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
46
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
47 OPEN_READER(re, gb);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
48 UPDATE_CACHE(re, gb);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
49 buf=GET_CACHE(re, gb);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
50
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
51 if(buf >= (1<<27)){
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
52 buf >>= 32 - 9;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
53 LAST_SKIP_BITS(re, gb, ff_golomb_vlc_len[buf]);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
54 CLOSE_READER(re, gb);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
55
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
56 return ff_ue_golomb_vlc_code[buf];
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
57 }else{
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
58 log= 2*av_log2(buf) - 31;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
59 buf>>= log;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
60 buf--;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
61 LAST_SKIP_BITS(re, gb, 32 - log);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
62 CLOSE_READER(re, gb);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
63
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
64 return buf;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
65 }
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
66 }
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
67
1234
fc2a7eefa9cc svq3 decoder by anonymous
michaelni
parents: 1169
diff changeset
68 static inline int svq3_get_ue_golomb(GetBitContext *gb){
1250
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
69 uint32_t buf;
1234
fc2a7eefa9cc svq3 decoder by anonymous
michaelni
parents: 1169
diff changeset
70 int log;
fc2a7eefa9cc svq3 decoder by anonymous
michaelni
parents: 1169
diff changeset
71
fc2a7eefa9cc svq3 decoder by anonymous
michaelni
parents: 1169
diff changeset
72 OPEN_READER(re, gb);
fc2a7eefa9cc svq3 decoder by anonymous
michaelni
parents: 1169
diff changeset
73 UPDATE_CACHE(re, gb);
1250
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
74 buf=GET_CACHE(re, gb);
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
75
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
76 if(buf&0xAA800000){
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
77 buf >>= 32 - 8;
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
78 LAST_SKIP_BITS(re, gb, ff_interleaved_golomb_vlc_len[buf]);
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
79 CLOSE_READER(re, gb);
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
80
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
81 return ff_interleaved_ue_golomb_vlc_code[buf];
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
82 }else{
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
83 buf|=1;
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
84 if((buf & 0xAAAAAAAA) == 0)
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
85 return INVALID_VLC;
1234
fc2a7eefa9cc svq3 decoder by anonymous
michaelni
parents: 1169
diff changeset
86
1250
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
87 for(log=31; (buf & 0x80000000) == 0; log--){
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
88 buf = (buf << 2) - ((buf << log) >> (log - 1)) + (buf >> 30);
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
89 }
1234
fc2a7eefa9cc svq3 decoder by anonymous
michaelni
parents: 1169
diff changeset
90
1250
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
91 LAST_SKIP_BITS(re, gb, 63 - 2*log);
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
92 CLOSE_READER(re, gb);
1234
fc2a7eefa9cc svq3 decoder by anonymous
michaelni
parents: 1169
diff changeset
93
1250
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
94 return ((buf << log) >> log) - 1;
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
95 }
1234
fc2a7eefa9cc svq3 decoder by anonymous
michaelni
parents: 1169
diff changeset
96 }
fc2a7eefa9cc svq3 decoder by anonymous
michaelni
parents: 1169
diff changeset
97
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
98 /**
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
99 * read unsigned truncated exp golomb code.
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
100 */
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
101 static inline int get_te0_golomb(GetBitContext *gb, int range){
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
102 assert(range >= 1);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
103
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
104 if(range==1) return 0;
1169
4e891257d3e2 multiple reference frames support
michaelni
parents: 1168
diff changeset
105 else if(range==2) return get_bits1(gb)^1;
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
106 else return get_ue_golomb(gb);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
107 }
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
108
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
109 /**
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
110 * read unsigned truncated exp golomb code.
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
111 */
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
112 static inline int get_te_golomb(GetBitContext *gb, int range){
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
113 assert(range >= 1);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
114
1169
4e891257d3e2 multiple reference frames support
michaelni
parents: 1168
diff changeset
115 if(range==2) return get_bits1(gb)^1;
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
116 else return get_ue_golomb(gb);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
117 }
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
118
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
119
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
120 /**
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
121 * read signed exp golomb code.
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
122 */
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
123 static inline int get_se_golomb(GetBitContext *gb){
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
124 unsigned int buf;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
125 int log;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
126
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
127 OPEN_READER(re, gb);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
128 UPDATE_CACHE(re, gb);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
129 buf=GET_CACHE(re, gb);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
130
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
131 if(buf >= (1<<27)){
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
132 buf >>= 32 - 9;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
133 LAST_SKIP_BITS(re, gb, ff_golomb_vlc_len[buf]);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
134 CLOSE_READER(re, gb);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
135
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
136 return ff_se_golomb_vlc_code[buf];
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
137 }else{
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
138 log= 2*av_log2(buf) - 31;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
139 buf>>= log;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
140
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
141 LAST_SKIP_BITS(re, gb, 32 - log);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
142 CLOSE_READER(re, gb);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
143
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
144 if(buf&1) buf= -(buf>>1);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
145 else buf= (buf>>1);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
146
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
147 return buf;
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
1234
fc2a7eefa9cc svq3 decoder by anonymous
michaelni
parents: 1169
diff changeset
151 static inline int svq3_get_se_golomb(GetBitContext *gb){
fc2a7eefa9cc svq3 decoder by anonymous
michaelni
parents: 1169
diff changeset
152 unsigned int buf;
fc2a7eefa9cc svq3 decoder by anonymous
michaelni
parents: 1169
diff changeset
153 int log;
fc2a7eefa9cc svq3 decoder by anonymous
michaelni
parents: 1169
diff changeset
154
fc2a7eefa9cc svq3 decoder by anonymous
michaelni
parents: 1169
diff changeset
155 OPEN_READER(re, gb);
fc2a7eefa9cc svq3 decoder by anonymous
michaelni
parents: 1169
diff changeset
156 UPDATE_CACHE(re, gb);
1250
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
157 buf=GET_CACHE(re, gb);
1234
fc2a7eefa9cc svq3 decoder by anonymous
michaelni
parents: 1169
diff changeset
158
1250
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
159 if(buf&0xAA800000){
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
160 buf >>= 32 - 8;
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
161 LAST_SKIP_BITS(re, gb, ff_interleaved_golomb_vlc_len[buf]);
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
162 CLOSE_READER(re, gb);
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
163
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
164 return ff_interleaved_se_golomb_vlc_code[buf];
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
165 }else{
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
166 buf |=1;
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
167 if((buf & 0xAAAAAAAA) == 0)
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
168 return INVALID_VLC;
1234
fc2a7eefa9cc svq3 decoder by anonymous
michaelni
parents: 1169
diff changeset
169
1250
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
170 for(log=31; (buf & 0x80000000) == 0; log--){
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
171 buf = (buf << 2) - ((buf << log) >> (log - 1)) + (buf >> 30);
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
172 }
1234
fc2a7eefa9cc svq3 decoder by anonymous
michaelni
parents: 1169
diff changeset
173
1250
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
174 LAST_SKIP_BITS(re, gb, 63 - 2*log);
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
175 CLOSE_READER(re, gb);
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
176
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
177 return (signed) (((((buf << log) >> log) - 1) ^ -(buf & 0x1)) + 1) >> 1;
fa181d095027 optimizations
michaelni
parents: 1234
diff changeset
178 }
1234
fc2a7eefa9cc svq3 decoder by anonymous
michaelni
parents: 1169
diff changeset
179 }
fc2a7eefa9cc svq3 decoder by anonymous
michaelni
parents: 1169
diff changeset
180
1306
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
181 /**
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
182 * read unsigned golomb rice code.
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
183 */
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
184 static inline int get_ur_golomb(GetBitContext *gb, int k, int limit, int esc_len){
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
185 unsigned int buf;
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
186 int log;
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
187
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
188 OPEN_READER(re, gb);
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
189 UPDATE_CACHE(re, gb);
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
190 buf=GET_CACHE(re, gb);
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
191
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
192 log= av_log2(buf);
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
193 //printf("buf:%X log:%d\n", buf, log);
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
194 if(log > 31-limit){
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
195 buf >>= log - k;
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
196 buf += (30-log)<<k;
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
197 LAST_SKIP_BITS(re, gb, 32 + k - log);
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
198 CLOSE_READER(re, gb);
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
199
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
200 return buf;
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
201 }else if(log == 31-limit){
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
202 buf >>= log - esc_len;
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
203 buf -= 1<<esc_len;
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
204 LAST_SKIP_BITS(re, gb, esc_len + limit + 1);
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
205 CLOSE_READER(re, gb);
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
206
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
207 return buf + 1;
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
208 }else
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
209 return -1;
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
210 }
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
211
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
212 #ifdef TRACE
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
213
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
214 static inline int get_ue(GetBitContext *s, char *file, char *func, int line){
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
215 int show= show_bits(s, 24);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
216 int pos= get_bits_count(s);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
217 int i= get_ue_golomb(s);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
218 int len= get_bits_count(s) - pos;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
219 int bits= show>>(24-len);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
220
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
221 print_bin(bits, len);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
222
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
223 printf("%5d %2d %3d ue @%5d in %s %s:%d\n", bits, len, i, pos, file, func, line);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
224
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
225 return i;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
226 }
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
227
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
228 static inline int get_se(GetBitContext *s, char *file, char *func, int line){
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
229 int show= show_bits(s, 24);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
230 int pos= get_bits_count(s);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
231 int i= get_se_golomb(s);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
232 int len= get_bits_count(s) - pos;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
233 int bits= show>>(24-len);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
234
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
235 print_bin(bits, len);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
236
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
237 printf("%5d %2d %3d se @%5d in %s %s:%d\n", bits, len, i, pos, file, func, line);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
238
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
239 return i;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
240 }
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
241
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
242 static inline int get_te(GetBitContext *s, int r, char *file, char *func, int line){
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
243 int show= show_bits(s, 24);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
244 int pos= get_bits_count(s);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
245 int i= get_te0_golomb(s, r);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
246 int len= get_bits_count(s) - pos;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
247 int bits= show>>(24-len);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
248
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
249 print_bin(bits, len);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
250
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
251 printf("%5d %2d %3d te @%5d in %s %s:%d\n", bits, len, i, pos, file, func, line);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
252
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
253 return i;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
254 }
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
255
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
256 #define get_ue_golomb(a) get_ue(a, __FILE__, __PRETTY_FUNCTION__, __LINE__)
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
257 #define get_se_golomb(a) get_se(a, __FILE__, __PRETTY_FUNCTION__, __LINE__)
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
258 #define get_te_golomb(a, r) get_te(a, r, __FILE__, __PRETTY_FUNCTION__, __LINE__)
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
259 #define get_te0_golomb(a, r) get_te(a, r, __FILE__, __PRETTY_FUNCTION__, __LINE__)
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
260
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
261 #endif
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
262
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
263 /**
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
264 * write unsigned exp golomb code.
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
265 */
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
266 static inline void set_ue_golomb(PutBitContext *pb, int i){
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
267 int e;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
268
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
269 assert(i>=0);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
270
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
271 #if 0
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
272 if(i=0){
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
273 put_bits(pb, 1, 1);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
274 return;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
275 }
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
276 #endif
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
277 if(i<256)
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
278 put_bits(pb, ff_ue_golomb_len[i], i+1);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
279 else{
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
280 e= av_log2(i+1);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
281
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
282 put_bits(pb, 2*e+1, i+1);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
283 }
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
284 }
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
285
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
286 /**
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
287 * write truncated unsigned exp golomb code.
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
288 */
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
289 static inline void set_te_golomb(PutBitContext *pb, int i, int range){
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
290 assert(range >= 1);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
291 assert(i<=range);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
292
1169
4e891257d3e2 multiple reference frames support
michaelni
parents: 1168
diff changeset
293 if(range==2) put_bits(pb, 1, i^1);
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
294 else set_ue_golomb(pb, i);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
295 }
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
296
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
297 /**
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
298 * write signed exp golomb code.
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
299 */
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
300 static inline void set_se_golomb(PutBitContext *pb, int i){
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
301 #if 0
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
302 if(i<=0) i= -2*i;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
303 else i= 2*i-1;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
304 #elif 1
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
305 i= 2*i-1;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
306 if(i<0) i^= -1; //FIXME check if gcc does the right thing
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
307 #else
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
308 i= 2*i-1;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
309 i^= (i>>31);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
310 #endif
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
311 set_ue_golomb(pb, i);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
312 }
1306
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
313
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
314 /**
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
315 * write unsigned golomb rice code.
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
316 */
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
317 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
318 int e;
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
319
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
320 assert(i>=0);
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
321
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
322 e= i>>k;
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
323 if(e<limit){
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
324 put_bits(pb, e + k + 1, (1<<k) + (i&((1<<k)-1)));
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
325 }else{
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
326 // printf("set %08X, %d\n", (1<<esc_len) + i - 1, limit + esc_len + 1);
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
327 put_bits(pb, limit + esc_len + 1, (1<<esc_len) + i - 1);
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
328 // put_bits(pb, 1, limit + 1);
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
329 // put_bits(pb, i - 1, esc_len);
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
330 }
799839d1e2e1 golomb rice codes
michaelni
parents: 1250
diff changeset
331 }