Mercurial > libavcodec.hg
annotate common.c @ 1757:3906ddbaffec libavcodec
optimization & bugfix extracted from the 4k line diff between ffmpeg 0.4.7 and http://www.alicestreet.com/ffh263.html
the other parts of the diff where
1. spelling fixes (rejected as only a small part of it could be applied automatically)
2. cosmetics (reindention, function reordering, var renaming, ...) with bugs (rejected)
3. rtp related stuff (rejetced as it breaks several codecs)
4. some changes to the intra/inter decission & scene change detection (quality tests needed first)
| author | michael |
|---|---|
| date | Sat, 24 Jan 2004 23:47:33 +0000 |
| parents | 07a484280a82 |
| children | 8488bab5efa2 |
| 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 | |
|
1232
e88d3b1fb2a1
more #ifdef CONFIG_ENCODERS by (Wolfgang Hesseler <qv at multimediaware dot com>)
michaelni
parents:
1126
diff
changeset
|
63 #ifdef CONFIG_ENCODERS |
|
e88d3b1fb2a1
more #ifdef CONFIG_ENCODERS by (Wolfgang Hesseler <qv at multimediaware dot com>)
michaelni
parents:
1126
diff
changeset
|
64 |
| 0 | 65 /* return the number of bits output */ |
| 1660 | 66 int get_bit_count(PutBitContext *s) |
| 0 | 67 { |
|
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
|
68 #ifdef ALT_BITSTREAM_WRITER |
| 1660 | 69 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
|
70 #else |
| 1660 | 71 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
|
72 #endif |
| 0 | 73 } |
| 74 | |
| 75 void align_put_bits(PutBitContext *s) | |
| 76 { | |
|
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
|
77 #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
|
78 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
|
79 #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
|
80 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
|
81 #endif |
| 0 | 82 } |
| 83 | |
|
1232
e88d3b1fb2a1
more #ifdef CONFIG_ENCODERS by (Wolfgang Hesseler <qv at multimediaware dot com>)
michaelni
parents:
1126
diff
changeset
|
84 #endif //CONFIG_ENCODERS |
|
e88d3b1fb2a1
more #ifdef CONFIG_ENCODERS by (Wolfgang Hesseler <qv at multimediaware dot com>)
michaelni
parents:
1126
diff
changeset
|
85 |
| 0 | 86 /* pad the end of the output stream with zeros */ |
| 87 void flush_put_bits(PutBitContext *s) | |
| 88 { | |
|
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
|
89 #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
|
90 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
|
91 #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
|
92 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
|
93 while (s->bit_left < 32) { |
| 0 | 94 /* XXX: should test end of buffer */ |
| 95 *s->buf_ptr++=s->bit_buf >> 24; | |
| 96 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
|
97 s->bit_left+=8; |
| 0 | 98 } |
|
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
|
99 s->bit_left=32; |
| 0 | 100 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
|
101 #endif |
| 0 | 102 } |
| 103 | |
|
1232
e88d3b1fb2a1
more #ifdef CONFIG_ENCODERS by (Wolfgang Hesseler <qv at multimediaware dot com>)
michaelni
parents:
1126
diff
changeset
|
104 #ifdef CONFIG_ENCODERS |
|
e88d3b1fb2a1
more #ifdef CONFIG_ENCODERS by (Wolfgang Hesseler <qv at multimediaware dot com>)
michaelni
parents:
1126
diff
changeset
|
105 |
| 358 | 106 void put_string(PutBitContext * pbc, char *s) |
| 107 { | |
| 108 while(*s){ | |
| 109 put_bits(pbc, 8, *s); | |
| 110 s++; | |
| 111 } | |
| 112 put_bits(pbc, 8, 0); | |
| 113 } | |
| 114 | |
| 0 | 115 /* bit input functions */ |
| 116 | |
|
1232
e88d3b1fb2a1
more #ifdef CONFIG_ENCODERS by (Wolfgang Hesseler <qv at multimediaware dot com>)
michaelni
parents:
1126
diff
changeset
|
117 #endif //CONFIG_ENCODERS |
|
e88d3b1fb2a1
more #ifdef CONFIG_ENCODERS by (Wolfgang Hesseler <qv at multimediaware dot com>)
michaelni
parents:
1126
diff
changeset
|
118 |
| 1249 | 119 /** |
| 120 * init GetBitContext. | |
| 121 * @param buffer bitstream buffer, must be FF_INPUT_BUFFER_PADDING_SIZE bytes larger then the actual read bits | |
| 122 * because some optimized bitstream readers read 32 or 64 bit at once and could read over the end | |
| 123 * @param bit_size the size of the buffer in bits | |
| 124 */ | |
|
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
|
125 void init_get_bits(GetBitContext *s, |
| 1083 | 126 const uint8_t *buffer, int bit_size) |
| 0 | 127 { |
|
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
|
128 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
|
129 |
|
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
|
130 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
|
131 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
|
132 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
|
133 #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
|
134 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
|
135 #elif defined LIBMPEG2_BITSTREAM_READER |
| 1257 | 136 #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
|
137 if ((int)buffer&1) { |
|
604661d34c68
bitstream reader optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents:
1249
diff
changeset
|
138 /* word alignment */ |
|
604661d34c68
bitstream reader optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents:
1249
diff
changeset
|
139 s->cache = (*buffer++)<<24; |
|
604661d34c68
bitstream reader optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents:
1249
diff
changeset
|
140 s->buffer_ptr = buffer; |
|
604661d34c68
bitstream reader optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents:
1249
diff
changeset
|
141 s->bit_count = 16-8; |
|
604661d34c68
bitstream reader optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents:
1249
diff
changeset
|
142 } else |
|
604661d34c68
bitstream reader optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents:
1249
diff
changeset
|
143 #endif |
|
604661d34c68
bitstream reader optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents:
1249
diff
changeset
|
144 { |
|
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 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
|
146 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
|
147 s->cache = 0; |
|
1254
604661d34c68
bitstream reader optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents:
1249
diff
changeset
|
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 #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
|
150 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
|
151 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
|
152 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
|
153 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
|
154 #endif |
|
20
907b67420d84
inlineing common case of get_bits() -> gives 2speedup. more optim coming soon...
arpi_esp
parents:
8
diff
changeset
|
155 { |
|
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
|
156 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
|
157 UPDATE_CACHE(re, s) |
|
1263
9fce515e9894
libmpeg2 style bitstream reader 17 vs 16 bit bugfix
michaelni
parents:
1257
diff
changeset
|
158 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
|
159 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
|
160 } |
|
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 #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
|
162 s->cache1 = 0; |
| 8 | 163 #endif |
| 0 | 164 } |
| 165 | |
| 1257 | 166 /** |
| 167 * reads 0-32 bits. | |
| 168 */ | |
| 169 unsigned int get_bits_long(GetBitContext *s, int n){ | |
| 170 if(n<=17) return get_bits(s, n); | |
| 171 else{ | |
| 172 int ret= get_bits(s, 16) << (n-16); | |
| 173 return ret | get_bits(s, n-16); | |
| 174 } | |
| 175 } | |
| 176 | |
| 177 /** | |
| 178 * shows 0-32 bits. | |
| 179 */ | |
| 180 unsigned int show_bits_long(GetBitContext *s, int n){ | |
| 181 if(n<=17) return show_bits(s, n); | |
| 182 else{ | |
| 183 GetBitContext gb= *s; | |
| 184 int ret= get_bits_long(s, n); | |
| 185 *s= gb; | |
| 186 return ret; | |
| 187 } | |
| 188 } | |
| 189 | |
| 0 | 190 void align_get_bits(GetBitContext *s) |
| 191 { | |
|
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
|
192 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
|
193 if(n) skip_bits(s, n); |
| 0 | 194 } |
|
192
1e5f64be86fc
another bitstream reader code (faster on intel cpus) - patch by Michael Niedermayer <michaelni@gmx.at>
uid46427
parents:
144
diff
changeset
|
195 |
| 862 | 196 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
|
197 { |
|
28c5c62b1c4c
support decoding (with mplayer) of 3 .mp4 files from mphq
michaelni
parents:
238
diff
changeset
|
198 int bit= get_bits1(s); |
|
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1548
diff
changeset
|
199 if(!bit) |
|
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1548
diff
changeset
|
200 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
|
201 |
|
28c5c62b1c4c
support decoding (with mplayer) of 3 .mp4 files from mphq
michaelni
parents:
238
diff
changeset
|
202 return bit; |
|
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 |
| 0 | 205 /* VLC decoding */ |
| 206 | |
| 207 //#define DEBUG_VLC | |
| 208 | |
| 209 #define GET_DATA(v, table, i, wrap, size) \ | |
| 210 {\ | |
| 1064 | 211 const uint8_t *ptr = (const uint8_t *)table + i * wrap;\ |
| 0 | 212 switch(size) {\ |
| 213 case 1:\ | |
| 1064 | 214 v = *(const uint8_t *)ptr;\ |
| 0 | 215 break;\ |
| 216 case 2:\ | |
| 1064 | 217 v = *(const uint16_t *)ptr;\ |
| 0 | 218 break;\ |
| 219 default:\ | |
| 1064 | 220 v = *(const uint32_t *)ptr;\ |
| 0 | 221 break;\ |
| 222 }\ | |
| 223 } | |
| 224 | |
| 225 | |
| 226 static int alloc_table(VLC *vlc, int size) | |
| 227 { | |
| 228 int index; | |
| 229 index = vlc->table_size; | |
| 230 vlc->table_size += size; | |
| 231 if (vlc->table_size > vlc->table_allocated) { | |
| 232 vlc->table_allocated += (1 << vlc->bits); | |
|
1031
19de1445beb2
use av_malloc() functions - added av_strdup and av_realloc()
bellard
parents:
1025
diff
changeset
|
233 vlc->table = av_realloc(vlc->table, |
|
19de1445beb2
use av_malloc() functions - added av_strdup and av_realloc()
bellard
parents:
1025
diff
changeset
|
234 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
|
235 if (!vlc->table) |
| 0 | 236 return -1; |
| 237 } | |
| 238 return index; | |
| 239 } | |
| 240 | |
|
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
|
241 static int build_table(VLC *vlc, int table_nb_bits, |
| 0 | 242 int nb_codes, |
| 243 const void *bits, int bits_wrap, int bits_size, | |
| 244 const void *codes, int codes_wrap, int codes_size, | |
| 1064 | 245 uint32_t code_prefix, int n_prefix) |
| 0 | 246 { |
| 247 int i, j, k, n, table_size, table_index, nb, n1, index; | |
| 1064 | 248 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
|
249 VLC_TYPE (*table)[2]; |
| 0 | 250 |
| 251 table_size = 1 << table_nb_bits; | |
| 252 table_index = alloc_table(vlc, table_size); | |
| 253 #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
|
254 printf("new table index=%d size=%d code_prefix=%x n=%d\n", |
| 0 | 255 table_index, table_size, code_prefix, n_prefix); |
| 256 #endif | |
| 257 if (table_index < 0) | |
| 258 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
|
259 table = &vlc->table[table_index]; |
| 0 | 260 |
| 261 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
|
262 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
|
263 table[i][0] = -1; //codes |
| 0 | 264 } |
| 265 | |
| 266 /* first pass: map codes and compute auxillary table sizes */ | |
| 267 for(i=0;i<nb_codes;i++) { | |
| 268 GET_DATA(n, bits, i, bits_wrap, bits_size); | |
| 269 GET_DATA(code, codes, i, codes_wrap, codes_size); | |
| 270 /* we accept tables with holes */ | |
| 271 if (n <= 0) | |
| 272 continue; | |
| 273 #if defined(DEBUG_VLC) && 0 | |
| 274 printf("i=%d n=%d code=0x%x\n", i, n, code); | |
| 275 #endif | |
| 276 /* if code matches the prefix, it is in the table */ | |
| 277 n -= n_prefix; | |
| 278 if (n > 0 && (code >> n) == code_prefix) { | |
| 279 if (n <= table_nb_bits) { | |
| 280 /* no need to add another table */ | |
| 281 j = (code << (table_nb_bits - n)) & (table_size - 1); | |
| 282 nb = 1 << (table_nb_bits - n); | |
| 283 for(k=0;k<nb;k++) { | |
| 284 #ifdef DEBUG_VLC | |
|
1602
fdb8244da1e5
av_log patch(2 of ?) by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1598
diff
changeset
|
285 av_log(NULL, AV_LOG_DEBUG, "%4x: code=%d n=%d\n", |
| 0 | 286 j, i, n); |
| 287 #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
|
288 if (table[j][1] /*bits*/ != 0) { |
|
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1548
diff
changeset
|
289 av_log(NULL, AV_LOG_ERROR, "incorrect codes\n"); |
| 1387 | 290 av_abort(); |
| 0 | 291 } |
|
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
|
292 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
|
293 table[j][0] = i; //code |
| 0 | 294 j++; |
| 295 } | |
| 296 } else { | |
| 297 n -= table_nb_bits; | |
| 298 j = (code >> n) & ((1 << table_nb_bits) - 1); | |
| 299 #ifdef DEBUG_VLC | |
| 300 printf("%4x: n=%d (subtable)\n", | |
| 301 j, n); | |
| 302 #endif | |
| 303 /* 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
|
304 n1 = -table[j][1]; //bits |
| 0 | 305 if (n > n1) |
| 306 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
|
307 table[j][1] = -n1; //bits |
| 0 | 308 } |
| 309 } | |
| 310 } | |
| 311 | |
| 312 /* second pass : fill auxillary tables recursively */ | |
| 313 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
|
314 n = table[i][1]; //bits |
| 0 | 315 if (n < 0) { |
| 316 n = -n; | |
| 317 if (n > table_nb_bits) { | |
| 318 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
|
319 table[i][1] = -n; //bits |
| 0 | 320 } |
| 321 index = build_table(vlc, n, nb_codes, | |
| 322 bits, bits_wrap, bits_size, | |
| 323 codes, codes_wrap, codes_size, | |
| 324 (code_prefix << table_nb_bits) | i, | |
| 325 n_prefix + table_nb_bits); | |
| 326 if (index < 0) | |
| 327 return -1; | |
| 328 /* 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
|
329 table = &vlc->table[table_index]; |
| 535 | 330 table[i][0] = index; //code |
| 0 | 331 } |
| 332 } | |
| 333 return table_index; | |
| 334 } | |
| 335 | |
| 336 | |
| 24 | 337 /* Build VLC decoding tables suitable for use with get_vlc(). |
| 338 | |
| 339 'nb_bits' set thee decoding table size (2^nb_bits) entries. The | |
| 340 bigger it is, the faster is the decoding. But it should not be too | |
| 341 big to save memory and L1 cache. '9' is a good compromise. | |
| 342 | |
| 343 'nb_codes' : number of vlcs codes | |
| 344 | |
| 345 'bits' : table which gives the size (in bits) of each vlc code. | |
| 346 | |
| 347 'codes' : table which gives the bit pattern of of each vlc code. | |
| 348 | |
| 349 'xxx_wrap' : give the number of bytes between each entry of the | |
| 350 'bits' or 'codes' tables. | |
| 351 | |
| 352 'xxx_size' : gives the number of bytes of each entry of the 'bits' | |
| 353 or 'codes' tables. | |
| 354 | |
| 355 'wrap' and 'size' allows to use any memory configuration and types | |
| 356 (byte/word/long) to store the 'bits' and 'codes' tables. | |
| 357 */ | |
| 0 | 358 int init_vlc(VLC *vlc, int nb_bits, int nb_codes, |
| 359 const void *bits, int bits_wrap, int bits_size, | |
| 360 const void *codes, int codes_wrap, int codes_size) | |
| 361 { | |
| 362 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
|
363 vlc->table = NULL; |
| 0 | 364 vlc->table_allocated = 0; |
| 365 vlc->table_size = 0; | |
| 366 #ifdef DEBUG_VLC | |
| 367 printf("build table nb_codes=%d\n", nb_codes); | |
| 368 #endif | |
| 369 | |
| 370 if (build_table(vlc, nb_bits, nb_codes, | |
| 371 bits, bits_wrap, bits_size, | |
| 372 codes, codes_wrap, codes_size, | |
| 373 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
|
374 av_free(vlc->table); |
| 0 | 375 return -1; |
| 376 } | |
| 377 return 0; | |
| 378 } | |
| 379 | |
| 380 | |
| 381 void free_vlc(VLC *vlc) | |
| 382 { | |
|
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
|
383 av_free(vlc->table); |
| 0 | 384 } |
| 385 | |
|
1126
77ccf7fe3bd0
per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents:
1106
diff
changeset
|
386 int64_t ff_gcd(int64_t a, int64_t b){ |
| 324 | 387 if(b) return ff_gcd(b, a%b); |
| 388 else return a; | |
| 389 } |
