Mercurial > libavcodec.hg
annotate common.c @ 1795:920e6381e1fe libavcodec
2 byte shorter userdata for mpeg4
in the past it was startcode,string,00,7F,startcode
now it is startcode,string,stratcode
both are mpeg4 compliant, as according to the standard the userdata lasts until the next 00 00 01 (startcode prefix) but some very primitive decoders which simply skip until the first 00 byte and then expect the next valid startcode might fail with the old variant, just a theory though (didnt test if quicktime can decode it now)
author | michael |
---|---|
date | Sun, 08 Feb 2004 22:52:35 +0000 |
parents | b7340afa261a |
children | 45a1592dadca |
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 * |
429 | 6 * This library is free software; you can redistribute it and/or |
7 * modify it under the terms of the GNU Lesser General Public | |
8 * License as published by the Free Software Foundation; either | |
9 * version 2 of the License, or (at your option) any later version. | |
0 | 10 * |
429 | 11 * This library is distributed in the hope that it will be useful, |
0 | 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
429 | 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
14 * Lesser General Public License for more details. | |
0 | 15 * |
429 | 16 * You should have received a copy of the GNU Lesser General Public |
17 * License along with this library; if not, write to the Free Software | |
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
192
1e5f64be86fc
another bitstream reader code (faster on intel cpus) - patch by Michael Niedermayer <michaelni@gmx.at>
uid46427
parents:
144
diff
changeset
|
19 * |
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
|
20 * alternative bitstream reader & writer by Michael Niedermayer <michaelni@gmx.at> |
0 | 21 */ |
1106 | 22 |
23 /** | |
24 * @file common.c | |
25 * common internal api. | |
26 */ | |
27 | |
524 | 28 #include "avcodec.h" |
8 | 29 |
1064 | 30 const uint8_t ff_sqrt_tab[128]={ |
609 | 31 0, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, |
32 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, | |
33 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, | |
34 9, 9, 9, 9,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,11,11,11,11,11,11,11 | |
35 }; | |
36 | |
1037 | 37 const uint8_t ff_log2_tab[256]={ |
38 0,0,1,1,2,2,2,2,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, | |
39 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, | |
40 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, | |
41 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, | |
42 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, | |
43 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, | |
44 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, | |
45 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7 | |
46 }; | |
47 | |
1522
79dddc5cd990
removed the obsolete and unused parameters of init_put_bits
alex
parents:
1387
diff
changeset
|
48 void init_put_bits(PutBitContext *s, uint8_t *buffer, int buffer_size) |
0 | 49 { |
50 s->buf = buffer; | |
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
|
51 s->buf_end = s->buf + buffer_size; |
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
|
52 #ifdef ALT_BITSTREAM_WRITER |
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
|
53 s->index=0; |
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
|
54 ((uint32_t*)(s->buf))[0]=0; |
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
|
55 // memset(buffer, 0, buffer_size); |
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
|
56 #else |
0 | 57 s->buf_ptr = s->buf; |
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
|
58 s->bit_left=32; |
0 | 59 s->bit_buf=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
|
60 #endif |
0 | 61 } |
62 | |
1771
8488bab5efa2
these functions (get_bit_count and align_put_bits) are referenced even
melanson
parents:
1739
diff
changeset
|
63 //#ifdef CONFIG_ENCODERS |
8488bab5efa2
these functions (get_bit_count and align_put_bits) are referenced even
melanson
parents:
1739
diff
changeset
|
64 #if 1 |
1232
e88d3b1fb2a1
more #ifdef CONFIG_ENCODERS by (Wolfgang Hesseler <qv at multimediaware dot com>)
michaelni
parents:
1126
diff
changeset
|
65 |
0 | 66 /* return the number of bits output */ |
1786 | 67 int put_bits_count(PutBitContext *s) |
0 | 68 { |
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
|
69 #ifdef ALT_BITSTREAM_WRITER |
1660 | 70 return s->index; |
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
|
71 #else |
1660 | 72 return (s->buf_ptr - s->buf) * 8 + 32 - s->bit_left; |
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
|
73 #endif |
0 | 74 } |
75 | |
76 void align_put_bits(PutBitContext *s) | |
77 { | |
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
|
78 #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
|
79 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
|
80 #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
|
81 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
|
82 #endif |
0 | 83 } |
84 | |
1232
e88d3b1fb2a1
more #ifdef CONFIG_ENCODERS by (Wolfgang Hesseler <qv at multimediaware dot com>)
michaelni
parents:
1126
diff
changeset
|
85 #endif //CONFIG_ENCODERS |
e88d3b1fb2a1
more #ifdef CONFIG_ENCODERS by (Wolfgang Hesseler <qv at multimediaware dot com>)
michaelni
parents:
1126
diff
changeset
|
86 |
0 | 87 /* pad the end of the output stream with zeros */ |
88 void flush_put_bits(PutBitContext *s) | |
89 { | |
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
|
90 #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
|
91 align_put_bits(s); |
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
|
92 #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
|
93 s->bit_buf<<= s->bit_left; |
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
|
94 while (s->bit_left < 32) { |
0 | 95 /* XXX: should test end of buffer */ |
96 *s->buf_ptr++=s->bit_buf >> 24; | |
97 s->bit_buf<<=8; | |
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
|
98 s->bit_left+=8; |
0 | 99 } |
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
|
100 s->bit_left=32; |
0 | 101 s->bit_buf=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
|
102 #endif |
0 | 103 } |
104 | |
1232
e88d3b1fb2a1
more #ifdef CONFIG_ENCODERS by (Wolfgang Hesseler <qv at multimediaware dot com>)
michaelni
parents:
1126
diff
changeset
|
105 #ifdef CONFIG_ENCODERS |
e88d3b1fb2a1
more #ifdef CONFIG_ENCODERS by (Wolfgang Hesseler <qv at multimediaware dot com>)
michaelni
parents:
1126
diff
changeset
|
106 |
1795 | 107 void put_string(PutBitContext * pbc, char *s, int put_zero) |
358 | 108 { |
109 while(*s){ | |
110 put_bits(pbc, 8, *s); | |
111 s++; | |
112 } | |
1795 | 113 if(put_zero) |
114 put_bits(pbc, 8, 0); | |
358 | 115 } |
116 | |
0 | 117 /* bit input functions */ |
118 | |
1232
e88d3b1fb2a1
more #ifdef CONFIG_ENCODERS by (Wolfgang Hesseler <qv at multimediaware dot com>)
michaelni
parents:
1126
diff
changeset
|
119 #endif //CONFIG_ENCODERS |
e88d3b1fb2a1
more #ifdef CONFIG_ENCODERS by (Wolfgang Hesseler <qv at multimediaware dot com>)
michaelni
parents:
1126
diff
changeset
|
120 |
1249 | 121 /** |
122 * init GetBitContext. | |
123 * @param buffer bitstream buffer, must be FF_INPUT_BUFFER_PADDING_SIZE bytes larger then the actual read bits | |
124 * because some optimized bitstream readers read 32 or 64 bit at once and could read over the end | |
125 * @param bit_size the size of the buffer in bits | |
126 */ | |
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
|
127 void init_get_bits(GetBitContext *s, |
1083 | 128 const uint8_t *buffer, int bit_size) |
0 | 129 { |
1025
1f9afd8b9131
GetBitContext.size is allways multiplied by 8 -> use size_in_bits to avoid useless *8 in a few inner loops
michaelni
parents:
880
diff
changeset
|
130 const int buffer_size= (bit_size+7)>>3; |
1f9afd8b9131
GetBitContext.size is allways multiplied by 8 -> use size_in_bits to avoid useless *8 in a few inner loops
michaelni
parents:
880
diff
changeset
|
131 |
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
|
132 s->buffer= buffer; |
1025
1f9afd8b9131
GetBitContext.size is allways multiplied by 8 -> use size_in_bits to avoid useless *8 in a few inner loops
michaelni
parents:
880
diff
changeset
|
133 s->size_in_bits= bit_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
|
134 s->buffer_end= buffer + buffer_size; |
192
1e5f64be86fc
another bitstream reader code (faster on intel cpus) - patch by Michael Niedermayer <michaelni@gmx.at>
uid46427
parents:
144
diff
changeset
|
135 #ifdef ALT_BITSTREAM_READER |
1e5f64be86fc
another bitstream reader code (faster on intel cpus) - patch by Michael Niedermayer <michaelni@gmx.at>
uid46427
parents:
144
diff
changeset
|
136 s->index=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
|
137 #elif defined LIBMPEG2_BITSTREAM_READER |
1257 | 138 #ifdef LIBMPEG2_BITSTREAM_READER_HACK |
1254
604661d34c68
bitstream reader optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents:
1249
diff
changeset
|
139 if ((int)buffer&1) { |
604661d34c68
bitstream reader optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents:
1249
diff
changeset
|
140 /* word alignment */ |
604661d34c68
bitstream reader optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents:
1249
diff
changeset
|
141 s->cache = (*buffer++)<<24; |
604661d34c68
bitstream reader optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents:
1249
diff
changeset
|
142 s->buffer_ptr = buffer; |
604661d34c68
bitstream reader optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents:
1249
diff
changeset
|
143 s->bit_count = 16-8; |
604661d34c68
bitstream reader optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents:
1249
diff
changeset
|
144 } else |
604661d34c68
bitstream reader optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents:
1249
diff
changeset
|
145 #endif |
604661d34c68
bitstream reader optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents:
1249
diff
changeset
|
146 { |
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
|
147 s->buffer_ptr = buffer; |
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
|
148 s->bit_count = 16; |
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 s->cache = 0; |
1254
604661d34c68
bitstream reader optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents:
1249
diff
changeset
|
150 } |
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 #elif defined A32_BITSTREAM_READER |
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
|
152 s->buffer_ptr = (uint32_t*)buffer; |
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
|
153 s->bit_count = 32; |
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
|
154 s->cache0 = 0; |
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
|
155 s->cache1 = 0; |
192
1e5f64be86fc
another bitstream reader code (faster on intel cpus) - patch by Michael Niedermayer <michaelni@gmx.at>
uid46427
parents:
144
diff
changeset
|
156 #endif |
20
907b67420d84
inlineing common case of get_bits() -> gives 2speedup. more optim coming soon...
arpi_esp
parents:
8
diff
changeset
|
157 { |
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
|
158 OPEN_READER(re, s) |
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
|
159 UPDATE_CACHE(re, s) |
1263
9fce515e9894
libmpeg2 style bitstream reader 17 vs 16 bit bugfix
michaelni
parents:
1257
diff
changeset
|
160 UPDATE_CACHE(re, s) |
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 CLOSE_READER(re, s) |
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
|
162 } |
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
|
163 #ifdef A32_BITSTREAM_READER |
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 s->cache1 = 0; |
8 | 165 #endif |
0 | 166 } |
167 | |
1257 | 168 /** |
169 * reads 0-32 bits. | |
170 */ | |
171 unsigned int get_bits_long(GetBitContext *s, int n){ | |
172 if(n<=17) return get_bits(s, n); | |
173 else{ | |
174 int ret= get_bits(s, 16) << (n-16); | |
175 return ret | get_bits(s, n-16); | |
176 } | |
177 } | |
178 | |
179 /** | |
180 * shows 0-32 bits. | |
181 */ | |
182 unsigned int show_bits_long(GetBitContext *s, int n){ | |
183 if(n<=17) return show_bits(s, n); | |
184 else{ | |
185 GetBitContext gb= *s; | |
186 int ret= get_bits_long(s, n); | |
187 *s= gb; | |
188 return ret; | |
189 } | |
190 } | |
191 | |
0 | 192 void align_get_bits(GetBitContext *s) |
193 { | |
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
|
194 int n= (-get_bits_count(s)) & 7; |
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
|
195 if(n) skip_bits(s, n); |
0 | 196 } |
192
1e5f64be86fc
another bitstream reader code (faster on intel cpus) - patch by Michael Niedermayer <michaelni@gmx.at>
uid46427
parents:
144
diff
changeset
|
197 |
862 | 198 int check_marker(GetBitContext *s, const char *msg) |
264
28c5c62b1c4c
support decoding (with mplayer) of 3 .mp4 files from mphq
michaelni
parents:
238
diff
changeset
|
199 { |
28c5c62b1c4c
support decoding (with mplayer) of 3 .mp4 files from mphq
michaelni
parents:
238
diff
changeset
|
200 int bit= get_bits1(s); |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1548
diff
changeset
|
201 if(!bit) |
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1548
diff
changeset
|
202 av_log(NULL, AV_LOG_INFO, "Marker bit missing %s\n", msg); |
264
28c5c62b1c4c
support decoding (with mplayer) of 3 .mp4 files from mphq
michaelni
parents:
238
diff
changeset
|
203 |
28c5c62b1c4c
support decoding (with mplayer) of 3 .mp4 files from mphq
michaelni
parents:
238
diff
changeset
|
204 return bit; |
28c5c62b1c4c
support decoding (with mplayer) of 3 .mp4 files from mphq
michaelni
parents:
238
diff
changeset
|
205 } |
28c5c62b1c4c
support decoding (with mplayer) of 3 .mp4 files from mphq
michaelni
parents:
238
diff
changeset
|
206 |
0 | 207 /* VLC decoding */ |
208 | |
209 //#define DEBUG_VLC | |
210 | |
211 #define GET_DATA(v, table, i, wrap, size) \ | |
212 {\ | |
1064 | 213 const uint8_t *ptr = (const uint8_t *)table + i * wrap;\ |
0 | 214 switch(size) {\ |
215 case 1:\ | |
1064 | 216 v = *(const uint8_t *)ptr;\ |
0 | 217 break;\ |
218 case 2:\ | |
1064 | 219 v = *(const uint16_t *)ptr;\ |
0 | 220 break;\ |
221 default:\ | |
1064 | 222 v = *(const uint32_t *)ptr;\ |
0 | 223 break;\ |
224 }\ | |
225 } | |
226 | |
227 | |
228 static int alloc_table(VLC *vlc, int size) | |
229 { | |
230 int index; | |
231 index = vlc->table_size; | |
232 vlc->table_size += size; | |
233 if (vlc->table_size > vlc->table_allocated) { | |
234 vlc->table_allocated += (1 << vlc->bits); | |
1031
19de1445beb2
use av_malloc() functions - added av_strdup and av_realloc()
bellard
parents:
1025
diff
changeset
|
235 vlc->table = av_realloc(vlc->table, |
19de1445beb2
use av_malloc() functions - added av_strdup and av_realloc()
bellard
parents:
1025
diff
changeset
|
236 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
|
237 if (!vlc->table) |
0 | 238 return -1; |
239 } | |
240 return index; | |
241 } | |
242 | |
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 static int build_table(VLC *vlc, int table_nb_bits, |
0 | 244 int nb_codes, |
245 const void *bits, int bits_wrap, int bits_size, | |
246 const void *codes, int codes_wrap, int codes_size, | |
1064 | 247 uint32_t code_prefix, int n_prefix) |
0 | 248 { |
249 int i, j, k, n, table_size, table_index, nb, n1, index; | |
1064 | 250 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
|
251 VLC_TYPE (*table)[2]; |
0 | 252 |
253 table_size = 1 << table_nb_bits; | |
254 table_index = alloc_table(vlc, table_size); | |
255 #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
|
256 printf("new table index=%d size=%d code_prefix=%x n=%d\n", |
0 | 257 table_index, table_size, code_prefix, n_prefix); |
258 #endif | |
259 if (table_index < 0) | |
260 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
|
261 table = &vlc->table[table_index]; |
0 | 262 |
263 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
|
264 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
|
265 table[i][0] = -1; //codes |
0 | 266 } |
267 | |
268 /* first pass: map codes and compute auxillary table sizes */ | |
269 for(i=0;i<nb_codes;i++) { | |
270 GET_DATA(n, bits, i, bits_wrap, bits_size); | |
271 GET_DATA(code, codes, i, codes_wrap, codes_size); | |
272 /* we accept tables with holes */ | |
273 if (n <= 0) | |
274 continue; | |
275 #if defined(DEBUG_VLC) && 0 | |
276 printf("i=%d n=%d code=0x%x\n", i, n, code); | |
277 #endif | |
278 /* if code matches the prefix, it is in the table */ | |
279 n -= n_prefix; | |
280 if (n > 0 && (code >> n) == code_prefix) { | |
281 if (n <= table_nb_bits) { | |
282 /* no need to add another table */ | |
283 j = (code << (table_nb_bits - n)) & (table_size - 1); | |
284 nb = 1 << (table_nb_bits - n); | |
285 for(k=0;k<nb;k++) { | |
286 #ifdef DEBUG_VLC | |
1602
fdb8244da1e5
av_log patch(2 of ?) by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1598
diff
changeset
|
287 av_log(NULL, AV_LOG_DEBUG, "%4x: code=%d n=%d\n", |
0 | 288 j, i, n); |
289 #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
|
290 if (table[j][1] /*bits*/ != 0) { |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1548
diff
changeset
|
291 av_log(NULL, AV_LOG_ERROR, "incorrect codes\n"); |
1387 | 292 av_abort(); |
0 | 293 } |
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
|
294 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
|
295 table[j][0] = i; //code |
0 | 296 j++; |
297 } | |
298 } else { | |
299 n -= table_nb_bits; | |
300 j = (code >> n) & ((1 << table_nb_bits) - 1); | |
301 #ifdef DEBUG_VLC | |
302 printf("%4x: n=%d (subtable)\n", | |
303 j, n); | |
304 #endif | |
305 /* 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
|
306 n1 = -table[j][1]; //bits |
0 | 307 if (n > n1) |
308 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
|
309 table[j][1] = -n1; //bits |
0 | 310 } |
311 } | |
312 } | |
313 | |
314 /* second pass : fill auxillary tables recursively */ | |
315 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
|
316 n = table[i][1]; //bits |
0 | 317 if (n < 0) { |
318 n = -n; | |
319 if (n > table_nb_bits) { | |
320 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
|
321 table[i][1] = -n; //bits |
0 | 322 } |
323 index = build_table(vlc, n, nb_codes, | |
324 bits, bits_wrap, bits_size, | |
325 codes, codes_wrap, codes_size, | |
326 (code_prefix << table_nb_bits) | i, | |
327 n_prefix + table_nb_bits); | |
328 if (index < 0) | |
329 return -1; | |
330 /* 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
|
331 table = &vlc->table[table_index]; |
535 | 332 table[i][0] = index; //code |
0 | 333 } |
334 } | |
335 return table_index; | |
336 } | |
337 | |
338 | |
24 | 339 /* Build VLC decoding tables suitable for use with get_vlc(). |
340 | |
341 'nb_bits' set thee decoding table size (2^nb_bits) entries. The | |
342 bigger it is, the faster is the decoding. But it should not be too | |
343 big to save memory and L1 cache. '9' is a good compromise. | |
344 | |
345 'nb_codes' : number of vlcs codes | |
346 | |
347 'bits' : table which gives the size (in bits) of each vlc code. | |
348 | |
349 'codes' : table which gives the bit pattern of of each vlc code. | |
350 | |
351 'xxx_wrap' : give the number of bytes between each entry of the | |
352 'bits' or 'codes' tables. | |
353 | |
354 'xxx_size' : gives the number of bytes of each entry of the 'bits' | |
355 or 'codes' tables. | |
356 | |
357 'wrap' and 'size' allows to use any memory configuration and types | |
358 (byte/word/long) to store the 'bits' and 'codes' tables. | |
359 */ | |
0 | 360 int init_vlc(VLC *vlc, int nb_bits, int nb_codes, |
361 const void *bits, int bits_wrap, int bits_size, | |
362 const void *codes, int codes_wrap, int codes_size) | |
363 { | |
364 vlc->bits = 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
|
365 vlc->table = NULL; |
0 | 366 vlc->table_allocated = 0; |
367 vlc->table_size = 0; | |
368 #ifdef DEBUG_VLC | |
369 printf("build table nb_codes=%d\n", nb_codes); | |
370 #endif | |
371 | |
372 if (build_table(vlc, nb_bits, nb_codes, | |
373 bits, bits_wrap, bits_size, | |
374 codes, codes_wrap, codes_size, | |
375 0, 0) < 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
|
376 av_free(vlc->table); |
0 | 377 return -1; |
378 } | |
379 return 0; | |
380 } | |
381 | |
382 | |
383 void free_vlc(VLC *vlc) | |
384 { | |
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
|
385 av_free(vlc->table); |
0 | 386 } |
387 | |
1126
77ccf7fe3bd0
per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents:
1106
diff
changeset
|
388 int64_t ff_gcd(int64_t a, int64_t b){ |
324 | 389 if(b) return ff_gcd(b, a%b); |
390 else return a; | |
391 } |