Mercurial > libavcodec.hg
annotate bitstream.c @ 10061:09f2db2d7c90 libavcodec
Fix bug caused by difference in stride and picture width.
When a frame is allocated using libschroedinger routines, the frame data size
does not match the actual frame size if the width is not a multiple of 16. So
we cannot do a straightforward memcpy of the frame returned by libschroedinger
into the FFmpeg picture as the stride differs from the width.
Fix this bug by allocating for the libschroedinger frame with the dimensions
in AVCodecContext within libavcodec and passing the frame to libschroedinger.
patch by Anuradha Suraparaju, anuradha rd.bbc.co uk
| author | diego |
|---|---|
| date | Sat, 15 Aug 2009 11:59:53 +0000 |
| parents | f3ff182e9ecf |
| children | fd9dfd5aa5e9 |
| rev | line source |
|---|---|
| 0 | 1 /* |
| 2 * Common bit i/o utils | |
|
8629
04423b2f6e0b
cosmetics: Remove pointless period after copyright statement non-sentences.
diego
parents:
8596
diff
changeset
|
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 * |
| 5214 | 6 * alternative bitstream reader & writer by Michael Niedermayer <michaelni@gmx.at> |
| 7 * | |
|
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3648
diff
changeset
|
8 * This file is part of FFmpeg. |
|
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3648
diff
changeset
|
9 * |
|
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3648
diff
changeset
|
10 * FFmpeg is free software; you can redistribute it and/or |
| 429 | 11 * modify it under the terms of the GNU Lesser General Public |
| 12 * 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
|
13 * version 2.1 of the License, or (at your option) any later version. |
| 0 | 14 * |
|
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3648
diff
changeset
|
15 * FFmpeg is distributed in the hope that it will be useful, |
| 0 | 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 429 | 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| 18 * Lesser General Public License for more details. | |
| 0 | 19 * |
| 429 | 20 * 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
|
21 * 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
|
22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
| 0 | 23 */ |
| 1106 | 24 |
| 25 /** | |
|
8718
e9d9d946f213
Use full internal pathname in doxygen @file directives.
diego
parents:
8629
diff
changeset
|
26 * @file libavcodec/bitstream.c |
|
2398
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" |
| 9428 | 31 #include "get_bits.h" |
|
9411
4cb7c65fc775
Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
9405
diff
changeset
|
32 #include "put_bits.h" |
| 1037 | 33 |
|
7146
d3a1ac3e227b
move ff_log2_run to bitstream.c and reuse in ffv1.c
stefang
parents:
6945
diff
changeset
|
34 const uint8_t ff_log2_run[32]={ |
|
d3a1ac3e227b
move ff_log2_run to bitstream.c and reuse in ffv1.c
stefang
parents:
6945
diff
changeset
|
35 0, 0, 0, 0, 1, 1, 1, 1, |
|
d3a1ac3e227b
move ff_log2_run to bitstream.c and reuse in ffv1.c
stefang
parents:
6945
diff
changeset
|
36 2, 2, 2, 2, 3, 3, 3, 3, |
|
d3a1ac3e227b
move ff_log2_run to bitstream.c and reuse in ffv1.c
stefang
parents:
6945
diff
changeset
|
37 4, 4, 5, 5, 6, 6, 7, 7, |
|
d3a1ac3e227b
move ff_log2_run to bitstream.c and reuse in ffv1.c
stefang
parents:
6945
diff
changeset
|
38 8, 9,10,11,12,13,14,15 |
|
d3a1ac3e227b
move ff_log2_run to bitstream.c and reuse in ffv1.c
stefang
parents:
6945
diff
changeset
|
39 }; |
|
d3a1ac3e227b
move ff_log2_run to bitstream.c and reuse in ffv1.c
stefang
parents:
6945
diff
changeset
|
40 |
|
9218
18dffa8f2382
Remove deprecated functions and structures on next version bump.
diego
parents:
9158
diff
changeset
|
41 #if LIBAVCODEC_VERSION_MAJOR < 53 |
|
4576
ad02fe65f45a
Move the av_realloc_static() declaration out of avcodec.h into bitstream.c.
takis
parents:
3947
diff
changeset
|
42 /** |
|
ad02fe65f45a
Move the av_realloc_static() declaration out of avcodec.h into bitstream.c.
takis
parents:
3947
diff
changeset
|
43 * Same as av_mallocz_static(), but does a realloc. |
|
ad02fe65f45a
Move the av_realloc_static() declaration out of avcodec.h into bitstream.c.
takis
parents:
3947
diff
changeset
|
44 * |
|
ad02fe65f45a
Move the av_realloc_static() declaration out of avcodec.h into bitstream.c.
takis
parents:
3947
diff
changeset
|
45 * @param[in] ptr The block of memory to reallocate. |
|
ad02fe65f45a
Move the av_realloc_static() declaration out of avcodec.h into bitstream.c.
takis
parents:
3947
diff
changeset
|
46 * @param[in] size The requested size. |
|
ad02fe65f45a
Move the av_realloc_static() declaration out of avcodec.h into bitstream.c.
takis
parents:
3947
diff
changeset
|
47 * @return Block of memory of requested size. |
| 5409 | 48 * @deprecated. Code which uses ff_realloc_static is broken/misdesigned |
|
4889
beeb03aad909
patch so that the deprecated items show up correctly
benoit
parents:
4685
diff
changeset
|
49 * and should correctly use static arrays |
|
4576
ad02fe65f45a
Move the av_realloc_static() declaration out of avcodec.h into bitstream.c.
takis
parents:
3947
diff
changeset
|
50 */ |
| 6519 | 51 attribute_deprecated av_alloc_size(2) |
|
6941
da73a98945ea
Move *_static to bitstream.c which is the only file left which needs
michael
parents:
6935
diff
changeset
|
52 static void *ff_realloc_static(void *ptr, unsigned int size); |
|
da73a98945ea
Move *_static to bitstream.c which is the only file left which needs
michael
parents:
6935
diff
changeset
|
53 |
|
da73a98945ea
Move *_static to bitstream.c which is the only file left which needs
michael
parents:
6935
diff
changeset
|
54 static void *ff_realloc_static(void *ptr, unsigned int size) |
|
da73a98945ea
Move *_static to bitstream.c which is the only file left which needs
michael
parents:
6935
diff
changeset
|
55 { |
|
6944
030cc3278868
As *_static are not deallocated anymore except on program termination
michael
parents:
6943
diff
changeset
|
56 return av_realloc(ptr, size); |
|
6941
da73a98945ea
Move *_static to bitstream.c which is the only file left which needs
michael
parents:
6935
diff
changeset
|
57 } |
|
9218
18dffa8f2382
Remove deprecated functions and structures on next version bump.
diego
parents:
9158
diff
changeset
|
58 #endif |
|
6941
da73a98945ea
Move *_static to bitstream.c which is the only file left which needs
michael
parents:
6935
diff
changeset
|
59 |
| 0 | 60 void align_put_bits(PutBitContext *s) |
| 61 { | |
|
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
|
62 #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
|
63 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
|
64 #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
|
65 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
|
66 #endif |
| 0 | 67 } |
| 68 | |
|
9405
9fc81340a5a8
Rename the 'put_zero' parameter of ff_put_string() to
stefano
parents:
9218
diff
changeset
|
69 void ff_put_string(PutBitContext * pbc, const char *s, int terminate_string) |
| 358 | 70 { |
| 71 while(*s){ | |
| 72 put_bits(pbc, 8, *s); | |
| 73 s++; | |
| 74 } | |
|
9405
9fc81340a5a8
Rename the 'put_zero' parameter of ff_put_string() to
stefano
parents:
9218
diff
changeset
|
75 if(terminate_string) |
| 1795 | 76 put_bits(pbc, 8, 0); |
| 358 | 77 } |
| 78 | |
| 6325 | 79 void ff_copy_bits(PutBitContext *pb, const uint8_t *src, int length) |
| 5229 | 80 { |
| 81 int words= length>>4; | |
| 82 int bits= length&15; | |
| 83 int i; | |
| 84 | |
| 85 if(length==0) return; | |
| 86 | |
|
8596
68e959302527
replace all occurrence of ENABLE_ by the corresponding CONFIG_, HAVE_ or ARCH_
aurel
parents:
7146
diff
changeset
|
87 if(CONFIG_SMALL || words < 16 || put_bits_count(pb)&7){ |
| 9905 | 88 for(i=0; i<words; i++) put_bits(pb, 16, AV_RB16(src + 2*i)); |
| 5229 | 89 }else{ |
| 90 for(i=0; put_bits_count(pb)&31; i++) | |
| 91 put_bits(pb, 8, src[i]); | |
| 92 flush_put_bits(pb); | |
| 9431 | 93 memcpy(put_bits_ptr(pb), src+i, 2*words-i); |
| 5229 | 94 skip_put_bytes(pb, 2*words-i); |
| 95 } | |
| 96 | |
| 9905 | 97 put_bits(pb, bits, AV_RB16(src + 2*words)>>(16-bits)); |
| 5229 | 98 } |
| 99 | |
| 0 | 100 /* VLC decoding */ |
| 101 | |
| 102 //#define DEBUG_VLC | |
| 103 | |
| 104 #define GET_DATA(v, table, i, wrap, size) \ | |
| 105 {\ | |
| 1064 | 106 const uint8_t *ptr = (const uint8_t *)table + i * wrap;\ |
| 0 | 107 switch(size) {\ |
| 108 case 1:\ | |
| 1064 | 109 v = *(const uint8_t *)ptr;\ |
| 0 | 110 break;\ |
| 111 case 2:\ | |
| 1064 | 112 v = *(const uint16_t *)ptr;\ |
| 0 | 113 break;\ |
| 114 default:\ | |
| 1064 | 115 v = *(const uint32_t *)ptr;\ |
| 0 | 116 break;\ |
| 117 }\ | |
| 118 } | |
| 119 | |
| 120 | |
|
2370
26560d4fdb1f
Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents:
2281
diff
changeset
|
121 static int alloc_table(VLC *vlc, int size, int use_static) |
| 0 | 122 { |
| 123 int index; | |
| 124 index = vlc->table_size; | |
| 125 vlc->table_size += size; | |
| 126 if (vlc->table_size > vlc->table_allocated) { | |
|
6935
24e01f7cc819
Make init_vlc* support proper static tables instead of this broken beyond
michael
parents:
6519
diff
changeset
|
127 if(use_static>1) |
|
24e01f7cc819
Make init_vlc* support proper static tables instead of this broken beyond
michael
parents:
6519
diff
changeset
|
128 abort(); //cant do anything, init_vlc() is used with too little memory |
| 0 | 129 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
|
130 if(use_static) |
|
4577
88cf097ebe75
av_realloc_static() is an internal function and therefore should use the ff_ prefix instead of av_.
takis
parents:
4576
diff
changeset
|
131 vlc->table = ff_realloc_static(vlc->table, |
|
2370
26560d4fdb1f
Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents:
2281
diff
changeset
|
132 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
|
133 else |
|
26560d4fdb1f
Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents:
2281
diff
changeset
|
134 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
|
135 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
|
136 if (!vlc->table) |
| 0 | 137 return -1; |
| 138 } | |
| 139 return index; | |
| 140 } | |
| 141 | |
|
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
|
142 static int build_table(VLC *vlc, int table_nb_bits, |
| 0 | 143 int nb_codes, |
| 144 const void *bits, int bits_wrap, int bits_size, | |
| 145 const void *codes, int codes_wrap, int codes_size, | |
|
5071
0d503c12092b
add init_vlc_sparse(). faster than init_vlc() if there are lots of holes in the tables.
lorenm
parents:
5013
diff
changeset
|
146 const void *symbols, int symbols_wrap, int symbols_size, |
|
2663
b33be8b00488
LE bitstream reader based upon a patch by (Balatoni Denes <dbalatoni programozo hu)
michael
parents:
2398
diff
changeset
|
147 uint32_t code_prefix, int n_prefix, int flags) |
| 0 | 148 { |
|
5071
0d503c12092b
add init_vlc_sparse(). faster than init_vlc() if there are lots of holes in the tables.
lorenm
parents:
5013
diff
changeset
|
149 int i, j, k, n, table_size, table_index, nb, n1, index, code_prefix2, symbol; |
| 1064 | 150 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
|
151 VLC_TYPE (*table)[2]; |
| 0 | 152 |
| 153 table_size = 1 << table_nb_bits; | |
|
6935
24e01f7cc819
Make init_vlc* support proper static tables instead of this broken beyond
michael
parents:
6519
diff
changeset
|
154 table_index = alloc_table(vlc, table_size, flags & (INIT_VLC_USE_STATIC|INIT_VLC_USE_NEW_STATIC)); |
| 0 | 155 #ifdef DEBUG_VLC |
|
5013
c7904664624c
printf --> av_log, patch by Denis Fortin, fortin nerim net
diego
parents:
4889
diff
changeset
|
156 av_log(NULL,AV_LOG_DEBUG,"new table index=%d size=%d code_prefix=%x n=%d\n", |
| 0 | 157 table_index, table_size, code_prefix, n_prefix); |
| 158 #endif | |
| 159 if (table_index < 0) | |
| 160 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
|
161 table = &vlc->table[table_index]; |
| 0 | 162 |
| 163 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
|
164 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
|
165 table[i][0] = -1; //codes |
| 0 | 166 } |
| 167 | |
| 168 /* first pass: map codes and compute auxillary table sizes */ | |
| 169 for(i=0;i<nb_codes;i++) { | |
| 170 GET_DATA(n, bits, i, bits_wrap, bits_size); | |
| 171 GET_DATA(code, codes, i, codes_wrap, codes_size); | |
| 172 /* we accept tables with holes */ | |
| 173 if (n <= 0) | |
| 174 continue; | |
|
5071
0d503c12092b
add init_vlc_sparse(). faster than init_vlc() if there are lots of holes in the tables.
lorenm
parents:
5013
diff
changeset
|
175 if (!symbols) |
|
0d503c12092b
add init_vlc_sparse(). faster than init_vlc() if there are lots of holes in the tables.
lorenm
parents:
5013
diff
changeset
|
176 symbol = i; |
|
0d503c12092b
add init_vlc_sparse(). faster than init_vlc() if there are lots of holes in the tables.
lorenm
parents:
5013
diff
changeset
|
177 else |
|
0d503c12092b
add init_vlc_sparse(). faster than init_vlc() if there are lots of holes in the tables.
lorenm
parents:
5013
diff
changeset
|
178 GET_DATA(symbol, symbols, i, symbols_wrap, symbols_size); |
| 0 | 179 #if defined(DEBUG_VLC) && 0 |
|
5013
c7904664624c
printf --> av_log, patch by Denis Fortin, fortin nerim net
diego
parents:
4889
diff
changeset
|
180 av_log(NULL,AV_LOG_DEBUG,"i=%d n=%d code=0x%x\n", i, n, code); |
| 0 | 181 #endif |
| 182 /* if code matches the prefix, it is in the table */ | |
| 183 n -= n_prefix; | |
|
2663
b33be8b00488
LE bitstream reader based upon a patch by (Balatoni Denes <dbalatoni programozo hu)
michael
parents:
2398
diff
changeset
|
184 if(flags & INIT_VLC_LE) |
|
b33be8b00488
LE bitstream reader based upon a patch by (Balatoni Denes <dbalatoni programozo hu)
michael
parents:
2398
diff
changeset
|
185 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
|
186 else |
|
b33be8b00488
LE bitstream reader based upon a patch by (Balatoni Denes <dbalatoni programozo hu)
michael
parents:
2398
diff
changeset
|
187 code_prefix2= code >> n; |
|
b33be8b00488
LE bitstream reader based upon a patch by (Balatoni Denes <dbalatoni programozo hu)
michael
parents:
2398
diff
changeset
|
188 if (n > 0 && code_prefix2 == code_prefix) { |
| 0 | 189 if (n <= table_nb_bits) { |
| 190 /* no need to add another table */ | |
| 191 j = (code << (table_nb_bits - n)) & (table_size - 1); | |
| 192 nb = 1 << (table_nb_bits - n); | |
| 193 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
|
194 if(flags & INIT_VLC_LE) |
|
b33be8b00488
LE bitstream reader based upon a patch by (Balatoni Denes <dbalatoni programozo hu)
michael
parents:
2398
diff
changeset
|
195 j = (code >> n_prefix) + (k<<n); |
| 0 | 196 #ifdef DEBUG_VLC |
|
1602
fdb8244da1e5
av_log patch(2 of ?) by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1598
diff
changeset
|
197 av_log(NULL, AV_LOG_DEBUG, "%4x: code=%d n=%d\n", |
| 0 | 198 j, i, n); |
| 199 #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
|
200 if (table[j][1] /*bits*/ != 0) { |
|
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1548
diff
changeset
|
201 av_log(NULL, AV_LOG_ERROR, "incorrect codes\n"); |
| 2281 | 202 return -1; |
| 0 | 203 } |
|
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
|
204 table[j][1] = n; //bits |
|
5071
0d503c12092b
add init_vlc_sparse(). faster than init_vlc() if there are lots of holes in the tables.
lorenm
parents:
5013
diff
changeset
|
205 table[j][0] = symbol; |
| 0 | 206 j++; |
| 207 } | |
| 208 } else { | |
| 209 n -= table_nb_bits; | |
|
2663
b33be8b00488
LE bitstream reader based upon a patch by (Balatoni Denes <dbalatoni programozo hu)
michael
parents:
2398
diff
changeset
|
210 j = (code >> ((flags & INIT_VLC_LE) ? n_prefix : n)) & ((1 << table_nb_bits) - 1); |
| 0 | 211 #ifdef DEBUG_VLC |
|
5013
c7904664624c
printf --> av_log, patch by Denis Fortin, fortin nerim net
diego
parents:
4889
diff
changeset
|
212 av_log(NULL,AV_LOG_DEBUG,"%4x: n=%d (subtable)\n", |
| 0 | 213 j, n); |
| 214 #endif | |
| 215 /* 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
|
216 n1 = -table[j][1]; //bits |
| 0 | 217 if (n > n1) |
| 218 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
|
219 table[j][1] = -n1; //bits |
| 0 | 220 } |
| 221 } | |
| 222 } | |
| 223 | |
| 224 /* second pass : fill auxillary tables recursively */ | |
| 225 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
|
226 n = table[i][1]; //bits |
| 0 | 227 if (n < 0) { |
| 228 n = -n; | |
| 229 if (n > table_nb_bits) { | |
| 230 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
|
231 table[i][1] = -n; //bits |
| 0 | 232 } |
| 233 index = build_table(vlc, n, nb_codes, | |
| 234 bits, bits_wrap, bits_size, | |
| 235 codes, codes_wrap, codes_size, | |
|
5071
0d503c12092b
add init_vlc_sparse(). faster than init_vlc() if there are lots of holes in the tables.
lorenm
parents:
5013
diff
changeset
|
236 symbols, symbols_wrap, symbols_size, |
|
2663
b33be8b00488
LE bitstream reader based upon a patch by (Balatoni Denes <dbalatoni programozo hu)
michael
parents:
2398
diff
changeset
|
237 (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
|
238 n_prefix + table_nb_bits, flags); |
| 0 | 239 if (index < 0) |
| 240 return -1; | |
| 241 /* 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
|
242 table = &vlc->table[table_index]; |
| 535 | 243 table[i][0] = index; //code |
| 0 | 244 } |
| 245 } | |
| 246 return table_index; | |
| 247 } | |
| 248 | |
| 249 | |
| 24 | 250 /* Build VLC decoding tables suitable for use with get_vlc(). |
| 251 | |
| 252 'nb_bits' set thee decoding table size (2^nb_bits) entries. The | |
| 253 bigger it is, the faster is the decoding. But it should not be too | |
| 254 big to save memory and L1 cache. '9' is a good compromise. | |
| 2967 | 255 |
| 24 | 256 'nb_codes' : number of vlcs codes |
| 257 | |
| 258 'bits' : table which gives the size (in bits) of each vlc code. | |
| 259 | |
| 260 'codes' : table which gives the bit pattern of of each vlc code. | |
| 261 | |
|
5071
0d503c12092b
add init_vlc_sparse(). faster than init_vlc() if there are lots of holes in the tables.
lorenm
parents:
5013
diff
changeset
|
262 'symbols' : table which gives the values to be returned from get_vlc(). |
|
0d503c12092b
add init_vlc_sparse(). faster than init_vlc() if there are lots of holes in the tables.
lorenm
parents:
5013
diff
changeset
|
263 |
| 24 | 264 'xxx_wrap' : give the number of bytes between each entry of the |
| 265 'bits' or 'codes' tables. | |
| 266 | |
| 267 'xxx_size' : gives the number of bytes of each entry of the 'bits' | |
| 268 or 'codes' tables. | |
| 269 | |
| 270 'wrap' and 'size' allows to use any memory configuration and types | |
|
5071
0d503c12092b
add init_vlc_sparse(). faster than init_vlc() if there are lots of holes in the tables.
lorenm
parents:
5013
diff
changeset
|
271 (byte/word/long) to store the 'bits', 'codes', and 'symbols' tables. |
|
2370
26560d4fdb1f
Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents:
2281
diff
changeset
|
272 |
|
26560d4fdb1f
Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents:
2281
diff
changeset
|
273 '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
|
274 with av_free_static(), 0 if free_vlc() will be used. |
| 24 | 275 */ |
|
5071
0d503c12092b
add init_vlc_sparse(). faster than init_vlc() if there are lots of holes in the tables.
lorenm
parents:
5013
diff
changeset
|
276 int init_vlc_sparse(VLC *vlc, int nb_bits, int nb_codes, |
| 0 | 277 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
|
278 const void *codes, int codes_wrap, int codes_size, |
|
5071
0d503c12092b
add init_vlc_sparse(). faster than init_vlc() if there are lots of holes in the tables.
lorenm
parents:
5013
diff
changeset
|
279 const void *symbols, int symbols_wrap, int symbols_size, |
| 4685 | 280 int flags) |
| 0 | 281 { |
| 282 vlc->bits = nb_bits; | |
|
6935
24e01f7cc819
Make init_vlc* support proper static tables instead of this broken beyond
michael
parents:
6519
diff
changeset
|
283 if(flags & INIT_VLC_USE_NEW_STATIC){ |
|
24e01f7cc819
Make init_vlc* support proper static tables instead of this broken beyond
michael
parents:
6519
diff
changeset
|
284 if(vlc->table_size && vlc->table_size == vlc->table_allocated){ |
|
24e01f7cc819
Make init_vlc* support proper static tables instead of this broken beyond
michael
parents:
6519
diff
changeset
|
285 return 0; |
|
24e01f7cc819
Make init_vlc* support proper static tables instead of this broken beyond
michael
parents:
6519
diff
changeset
|
286 }else if(vlc->table_size){ |
|
24e01f7cc819
Make init_vlc* support proper static tables instead of this broken beyond
michael
parents:
6519
diff
changeset
|
287 abort(); // fatal error, we are called on a partially initialized table |
|
24e01f7cc819
Make init_vlc* support proper static tables instead of this broken beyond
michael
parents:
6519
diff
changeset
|
288 } |
|
24e01f7cc819
Make init_vlc* support proper static tables instead of this broken beyond
michael
parents:
6519
diff
changeset
|
289 }else if(!(flags & INIT_VLC_USE_STATIC)) { |
|
2370
26560d4fdb1f
Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents:
2281
diff
changeset
|
290 vlc->table = NULL; |
|
26560d4fdb1f
Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents:
2281
diff
changeset
|
291 vlc->table_allocated = 0; |
|
26560d4fdb1f
Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents:
2281
diff
changeset
|
292 vlc->table_size = 0; |
|
26560d4fdb1f
Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents:
2281
diff
changeset
|
293 } else { |
|
26560d4fdb1f
Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents:
2281
diff
changeset
|
294 /* 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
|
295 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
|
296 if(vlc->table) |
|
26560d4fdb1f
Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents:
2281
diff
changeset
|
297 return 0; |
|
26560d4fdb1f
Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents:
2281
diff
changeset
|
298 } |
|
26560d4fdb1f
Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents:
2281
diff
changeset
|
299 |
| 0 | 300 #ifdef DEBUG_VLC |
|
5013
c7904664624c
printf --> av_log, patch by Denis Fortin, fortin nerim net
diego
parents:
4889
diff
changeset
|
301 av_log(NULL,AV_LOG_DEBUG,"build table nb_codes=%d\n", nb_codes); |
| 0 | 302 #endif |
| 303 | |
| 304 if (build_table(vlc, nb_bits, nb_codes, | |
| 305 bits, bits_wrap, bits_size, | |
| 306 codes, codes_wrap, codes_size, | |
|
5071
0d503c12092b
add init_vlc_sparse(). faster than init_vlc() if there are lots of holes in the tables.
lorenm
parents:
5013
diff
changeset
|
307 symbols, symbols_wrap, symbols_size, |
| 4685 | 308 0, 0, flags) < 0) { |
| 5206 | 309 av_freep(&vlc->table); |
| 0 | 310 return -1; |
| 311 } | |
|
6935
24e01f7cc819
Make init_vlc* support proper static tables instead of this broken beyond
michael
parents:
6519
diff
changeset
|
312 if((flags & INIT_VLC_USE_NEW_STATIC) && vlc->table_size != vlc->table_allocated) |
|
24e01f7cc819
Make init_vlc* support proper static tables instead of this broken beyond
michael
parents:
6519
diff
changeset
|
313 av_log(NULL, AV_LOG_ERROR, "needed %d had %d\n", vlc->table_size, vlc->table_allocated); |
| 0 | 314 return 0; |
| 315 } | |
| 316 | |
| 317 | |
| 318 void free_vlc(VLC *vlc) | |
| 319 { | |
| 5206 | 320 av_freep(&vlc->table); |
| 0 | 321 } |
| 322 |
