Mercurial > libavcodec.hg
annotate bitstream.c @ 3995:b00c06477dff libavcodec
write cabac low and range variables as early as possible to prevent stalls from reading them before they where written, the P4 is said to disslike that alot, on P3 its 2% faster (START/STOP_TIMER over decode_residual)
author | michael |
---|---|
date | Wed, 11 Oct 2006 16:11:41 +0000 |
parents | c8c591fe26f8 |
children | ad02fe65f45a |
rev | line source |
---|---|
0 | 1 /* |
2 * Common bit i/o utils | |
429 | 3 * Copyright (c) 2000, 2001 Fabrice Bellard. |
1739
07a484280a82
copyright year update of the files i touched and remembered, things look annoyingly unmaintained otherwise
michael
parents:
1660
diff
changeset
|
4 * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at> |
0 | 5 * |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3648
diff
changeset
|
6 * This file is part of FFmpeg. |
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3648
diff
changeset
|
7 * |
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3648
diff
changeset
|
8 * FFmpeg is free software; you can redistribute it and/or |
429 | 9 * modify it under the terms of the GNU Lesser General Public |
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:
3648
diff
changeset
|
11 * version 2.1 of the License, or (at your option) any later version. |
0 | 12 * |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3648
diff
changeset
|
13 * FFmpeg is distributed in the hope that it will be useful, |
0 | 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
429 | 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
16 * Lesser General Public License for more details. | |
0 | 17 * |
429 | 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:
3648
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 |
192
1e5f64be86fc
another bitstream reader code (faster on intel cpus) - patch by Michael Niedermayer <michaelni@gmx.at>
uid46427
parents:
144
diff
changeset
|
21 * |
234
5fc0c3af3fe4
alternative bitstream writer (disabled by default, uncomment #define ALT_BISTREAM_WRITER in common.h if u want to try it)
michaelni
parents:
219
diff
changeset
|
22 * alternative bitstream reader & writer by Michael Niedermayer <michaelni@gmx.at> |
0 | 23 */ |
1106 | 24 |
25 /** | |
2398
582e635cfa08
common.c -> bitstream.c (and the single non bitstream func -> utils.c)
michael
parents:
2370
diff
changeset
|
26 * @file bitstream.c |
582e635cfa08
common.c -> bitstream.c (and the single non bitstream func -> utils.c)
michael
parents:
2370
diff
changeset
|
27 * bitstream api. |
1106 | 28 */ |
2967 | 29 |
524 | 30 #include "avcodec.h" |
2398
582e635cfa08
common.c -> bitstream.c (and the single non bitstream func -> utils.c)
michael
parents:
2370
diff
changeset
|
31 #include "bitstream.h" |
1037 | 32 |
0 | 33 void align_put_bits(PutBitContext *s) |
34 { | |
234
5fc0c3af3fe4
alternative bitstream writer (disabled by default, uncomment #define ALT_BISTREAM_WRITER in common.h if u want to try it)
michaelni
parents:
219
diff
changeset
|
35 #ifdef ALT_BITSTREAM_WRITER |
5fc0c3af3fe4
alternative bitstream writer (disabled by default, uncomment #define ALT_BISTREAM_WRITER in common.h if u want to try it)
michaelni
parents:
219
diff
changeset
|
36 put_bits(s,( - s->index) & 7,0); |
5fc0c3af3fe4
alternative bitstream writer (disabled by default, uncomment #define ALT_BISTREAM_WRITER in common.h if u want to try it)
michaelni
parents:
219
diff
changeset
|
37 #else |
238
99a9f903f0e3
optimized the normal bitstream writer, its faster than the alternative one on p3 now ... lets hope its at least not slower on p4 & k7
michaelni
parents:
234
diff
changeset
|
38 put_bits(s,s->bit_left & 7,0); |
234
5fc0c3af3fe4
alternative bitstream writer (disabled by default, uncomment #define ALT_BISTREAM_WRITER in common.h if u want to try it)
michaelni
parents:
219
diff
changeset
|
39 #endif |
0 | 40 } |
41 | |
2885
5dfb90019814
Rename put_string to ff_put_string to avoid a symbol clash on Mac OS X.
diego
parents:
2663
diff
changeset
|
42 void ff_put_string(PutBitContext * pbc, char *s, int put_zero) |
358 | 43 { |
44 while(*s){ | |
45 put_bits(pbc, 8, *s); | |
46 s++; | |
47 } | |
1795 | 48 if(put_zero) |
49 put_bits(pbc, 8, 0); | |
358 | 50 } |
51 | |
0 | 52 /* VLC decoding */ |
53 | |
54 //#define DEBUG_VLC | |
55 | |
56 #define GET_DATA(v, table, i, wrap, size) \ | |
57 {\ | |
1064 | 58 const uint8_t *ptr = (const uint8_t *)table + i * wrap;\ |
0 | 59 switch(size) {\ |
60 case 1:\ | |
1064 | 61 v = *(const uint8_t *)ptr;\ |
0 | 62 break;\ |
63 case 2:\ | |
1064 | 64 v = *(const uint16_t *)ptr;\ |
0 | 65 break;\ |
66 default:\ | |
1064 | 67 v = *(const uint32_t *)ptr;\ |
0 | 68 break;\ |
69 }\ | |
70 } | |
71 | |
72 | |
2370
26560d4fdb1f
Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents:
2281
diff
changeset
|
73 static int alloc_table(VLC *vlc, int size, int use_static) |
0 | 74 { |
75 int index; | |
76 index = vlc->table_size; | |
77 vlc->table_size += size; | |
78 if (vlc->table_size > vlc->table_allocated) { | |
79 vlc->table_allocated += (1 << vlc->bits); | |
2370
26560d4fdb1f
Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents:
2281
diff
changeset
|
80 if(use_static) |
26560d4fdb1f
Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents:
2281
diff
changeset
|
81 vlc->table = av_realloc_static(vlc->table, |
26560d4fdb1f
Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents:
2281
diff
changeset
|
82 sizeof(VLC_TYPE) * 2 * vlc->table_allocated); |
26560d4fdb1f
Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents:
2281
diff
changeset
|
83 else |
26560d4fdb1f
Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents:
2281
diff
changeset
|
84 vlc->table = av_realloc(vlc->table, |
26560d4fdb1f
Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents:
2281
diff
changeset
|
85 sizeof(VLC_TYPE) * 2 * vlc->table_allocated); |
520
19a5e2a81e1a
new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents:
497
diff
changeset
|
86 if (!vlc->table) |
0 | 87 return -1; |
88 } | |
89 return index; | |
90 } | |
91 | |
520
19a5e2a81e1a
new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents:
497
diff
changeset
|
92 static int build_table(VLC *vlc, int table_nb_bits, |
0 | 93 int nb_codes, |
94 const void *bits, int bits_wrap, int bits_size, | |
95 const void *codes, int codes_wrap, int codes_size, | |
2663
b33be8b00488
LE bitstream reader based upon a patch by (Balatoni Denes <dbalatoni programozo hu)
michael
parents:
2398
diff
changeset
|
96 uint32_t code_prefix, int n_prefix, int flags) |
0 | 97 { |
2663
b33be8b00488
LE bitstream reader based upon a patch by (Balatoni Denes <dbalatoni programozo hu)
michael
parents:
2398
diff
changeset
|
98 int i, j, k, n, table_size, table_index, nb, n1, index, code_prefix2; |
1064 | 99 uint32_t code; |
520
19a5e2a81e1a
new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents:
497
diff
changeset
|
100 VLC_TYPE (*table)[2]; |
0 | 101 |
102 table_size = 1 << table_nb_bits; | |
2663
b33be8b00488
LE bitstream reader based upon a patch by (Balatoni Denes <dbalatoni programozo hu)
michael
parents:
2398
diff
changeset
|
103 table_index = alloc_table(vlc, table_size, flags & INIT_VLC_USE_STATIC); |
0 | 104 #ifdef DEBUG_VLC |
520
19a5e2a81e1a
new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents:
497
diff
changeset
|
105 printf("new table index=%d size=%d code_prefix=%x n=%d\n", |
0 | 106 table_index, table_size, code_prefix, n_prefix); |
107 #endif | |
108 if (table_index < 0) | |
109 return -1; | |
520
19a5e2a81e1a
new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents:
497
diff
changeset
|
110 table = &vlc->table[table_index]; |
0 | 111 |
112 for(i=0;i<table_size;i++) { | |
520
19a5e2a81e1a
new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents:
497
diff
changeset
|
113 table[i][1] = 0; //bits |
19a5e2a81e1a
new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents:
497
diff
changeset
|
114 table[i][0] = -1; //codes |
0 | 115 } |
116 | |
117 /* first pass: map codes and compute auxillary table sizes */ | |
118 for(i=0;i<nb_codes;i++) { | |
119 GET_DATA(n, bits, i, bits_wrap, bits_size); | |
120 GET_DATA(code, codes, i, codes_wrap, codes_size); | |
121 /* we accept tables with holes */ | |
122 if (n <= 0) | |
123 continue; | |
124 #if defined(DEBUG_VLC) && 0 | |
125 printf("i=%d n=%d code=0x%x\n", i, n, code); | |
126 #endif | |
127 /* if code matches the prefix, it is in the table */ | |
128 n -= n_prefix; | |
2663
b33be8b00488
LE bitstream reader based upon a patch by (Balatoni Denes <dbalatoni programozo hu)
michael
parents:
2398
diff
changeset
|
129 if(flags & INIT_VLC_LE) |
b33be8b00488
LE bitstream reader based upon a patch by (Balatoni Denes <dbalatoni programozo hu)
michael
parents:
2398
diff
changeset
|
130 code_prefix2= code & (n_prefix>=32 ? 0xffffffff : (1 << n_prefix)-1); |
b33be8b00488
LE bitstream reader based upon a patch by (Balatoni Denes <dbalatoni programozo hu)
michael
parents:
2398
diff
changeset
|
131 else |
b33be8b00488
LE bitstream reader based upon a patch by (Balatoni Denes <dbalatoni programozo hu)
michael
parents:
2398
diff
changeset
|
132 code_prefix2= code >> n; |
b33be8b00488
LE bitstream reader based upon a patch by (Balatoni Denes <dbalatoni programozo hu)
michael
parents:
2398
diff
changeset
|
133 if (n > 0 && code_prefix2 == code_prefix) { |
0 | 134 if (n <= table_nb_bits) { |
135 /* no need to add another table */ | |
136 j = (code << (table_nb_bits - n)) & (table_size - 1); | |
137 nb = 1 << (table_nb_bits - n); | |
138 for(k=0;k<nb;k++) { | |
2663
b33be8b00488
LE bitstream reader based upon a patch by (Balatoni Denes <dbalatoni programozo hu)
michael
parents:
2398
diff
changeset
|
139 if(flags & INIT_VLC_LE) |
b33be8b00488
LE bitstream reader based upon a patch by (Balatoni Denes <dbalatoni programozo hu)
michael
parents:
2398
diff
changeset
|
140 j = (code >> n_prefix) + (k<<n); |
0 | 141 #ifdef DEBUG_VLC |
1602
fdb8244da1e5
av_log patch(2 of ?) by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1598
diff
changeset
|
142 av_log(NULL, AV_LOG_DEBUG, "%4x: code=%d n=%d\n", |
0 | 143 j, i, n); |
144 #endif | |
520
19a5e2a81e1a
new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents:
497
diff
changeset
|
145 if (table[j][1] /*bits*/ != 0) { |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1548
diff
changeset
|
146 av_log(NULL, AV_LOG_ERROR, "incorrect codes\n"); |
2281 | 147 return -1; |
0 | 148 } |
520
19a5e2a81e1a
new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents:
497
diff
changeset
|
149 table[j][1] = n; //bits |
19a5e2a81e1a
new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents:
497
diff
changeset
|
150 table[j][0] = i; //code |
0 | 151 j++; |
152 } | |
153 } else { | |
154 n -= table_nb_bits; | |
2663
b33be8b00488
LE bitstream reader based upon a patch by (Balatoni Denes <dbalatoni programozo hu)
michael
parents:
2398
diff
changeset
|
155 j = (code >> ((flags & INIT_VLC_LE) ? n_prefix : n)) & ((1 << table_nb_bits) - 1); |
0 | 156 #ifdef DEBUG_VLC |
157 printf("%4x: n=%d (subtable)\n", | |
158 j, n); | |
159 #endif | |
160 /* compute table size */ | |
520
19a5e2a81e1a
new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents:
497
diff
changeset
|
161 n1 = -table[j][1]; //bits |
0 | 162 if (n > n1) |
163 n1 = n; | |
520
19a5e2a81e1a
new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents:
497
diff
changeset
|
164 table[j][1] = -n1; //bits |
0 | 165 } |
166 } | |
167 } | |
168 | |
169 /* second pass : fill auxillary tables recursively */ | |
170 for(i=0;i<table_size;i++) { | |
520
19a5e2a81e1a
new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents:
497
diff
changeset
|
171 n = table[i][1]; //bits |
0 | 172 if (n < 0) { |
173 n = -n; | |
174 if (n > table_nb_bits) { | |
175 n = table_nb_bits; | |
520
19a5e2a81e1a
new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents:
497
diff
changeset
|
176 table[i][1] = -n; //bits |
0 | 177 } |
178 index = build_table(vlc, n, nb_codes, | |
179 bits, bits_wrap, bits_size, | |
180 codes, codes_wrap, codes_size, | |
2663
b33be8b00488
LE bitstream reader based upon a patch by (Balatoni Denes <dbalatoni programozo hu)
michael
parents:
2398
diff
changeset
|
181 (flags & INIT_VLC_LE) ? (code_prefix | (i << n_prefix)) : ((code_prefix << table_nb_bits) | i), |
b33be8b00488
LE bitstream reader based upon a patch by (Balatoni Denes <dbalatoni programozo hu)
michael
parents:
2398
diff
changeset
|
182 n_prefix + table_nb_bits, flags); |
0 | 183 if (index < 0) |
184 return -1; | |
185 /* note: realloc has been done, so reload tables */ | |
520
19a5e2a81e1a
new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents:
497
diff
changeset
|
186 table = &vlc->table[table_index]; |
535 | 187 table[i][0] = index; //code |
0 | 188 } |
189 } | |
190 return table_index; | |
191 } | |
192 | |
193 | |
24 | 194 /* Build VLC decoding tables suitable for use with get_vlc(). |
195 | |
196 'nb_bits' set thee decoding table size (2^nb_bits) entries. The | |
197 bigger it is, the faster is the decoding. But it should not be too | |
198 big to save memory and L1 cache. '9' is a good compromise. | |
2967 | 199 |
24 | 200 'nb_codes' : number of vlcs codes |
201 | |
202 'bits' : table which gives the size (in bits) of each vlc code. | |
203 | |
204 'codes' : table which gives the bit pattern of of each vlc code. | |
205 | |
206 'xxx_wrap' : give the number of bytes between each entry of the | |
207 'bits' or 'codes' tables. | |
208 | |
209 'xxx_size' : gives the number of bytes of each entry of the 'bits' | |
210 or 'codes' tables. | |
211 | |
212 'wrap' and 'size' allows to use any memory configuration and types | |
2967 | 213 (byte/word/long) to store the 'bits' and 'codes' tables. |
2370
26560d4fdb1f
Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents:
2281
diff
changeset
|
214 |
26560d4fdb1f
Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents:
2281
diff
changeset
|
215 'use_static' should be set to 1 for tables, which should be freed |
26560d4fdb1f
Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents:
2281
diff
changeset
|
216 with av_free_static(), 0 if free_vlc() will be used. |
24 | 217 */ |
0 | 218 int init_vlc(VLC *vlc, int nb_bits, int nb_codes, |
219 const void *bits, int bits_wrap, int bits_size, | |
2370
26560d4fdb1f
Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents:
2281
diff
changeset
|
220 const void *codes, int codes_wrap, int codes_size, |
26560d4fdb1f
Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents:
2281
diff
changeset
|
221 int use_static) |
0 | 222 { |
223 vlc->bits = nb_bits; | |
2370
26560d4fdb1f
Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents:
2281
diff
changeset
|
224 if(!use_static) { |
26560d4fdb1f
Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents:
2281
diff
changeset
|
225 vlc->table = NULL; |
26560d4fdb1f
Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents:
2281
diff
changeset
|
226 vlc->table_allocated = 0; |
26560d4fdb1f
Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents:
2281
diff
changeset
|
227 vlc->table_size = 0; |
26560d4fdb1f
Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents:
2281
diff
changeset
|
228 } else { |
26560d4fdb1f
Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents:
2281
diff
changeset
|
229 /* Static tables are initially always NULL, return |
26560d4fdb1f
Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents:
2281
diff
changeset
|
230 if vlc->table != NULL to avoid double allocation */ |
26560d4fdb1f
Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents:
2281
diff
changeset
|
231 if(vlc->table) |
26560d4fdb1f
Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents:
2281
diff
changeset
|
232 return 0; |
26560d4fdb1f
Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents:
2281
diff
changeset
|
233 } |
26560d4fdb1f
Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents:
2281
diff
changeset
|
234 |
0 | 235 #ifdef DEBUG_VLC |
236 printf("build table nb_codes=%d\n", nb_codes); | |
237 #endif | |
238 | |
239 if (build_table(vlc, nb_bits, nb_codes, | |
240 bits, bits_wrap, bits_size, | |
241 codes, codes_wrap, codes_size, | |
2370
26560d4fdb1f
Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents:
2281
diff
changeset
|
242 0, 0, use_static) < 0) { |
520
19a5e2a81e1a
new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents:
497
diff
changeset
|
243 av_free(vlc->table); |
0 | 244 return -1; |
245 } | |
246 return 0; | |
247 } | |
248 | |
249 | |
250 void free_vlc(VLC *vlc) | |
251 { | |
520
19a5e2a81e1a
new bitstream reader API (old get_bits() based one is emulated and will still be supported in the future cuz its simpler)
michaelni
parents:
497
diff
changeset
|
252 av_free(vlc->table); |
0 | 253 } |
254 |