annotate common.c @ 497:5b33d11bd1fb libavcodec

use #ifdef
author bellard
date Mon, 17 Jun 2002 08:29:03 +0000
parents 297eed976b20
children 19a5e2a81e1a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1 /*
986e461dc072 Initial revision
glantau
parents:
diff changeset
2 * Common bit i/o utils
429
718a22dc121f license/copyright change
glantau
parents: 396
diff changeset
3 * Copyright (c) 2000, 2001 Fabrice Bellard.
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
4 *
429
718a22dc121f license/copyright change
glantau
parents: 396
diff changeset
5 * This library is free software; you can redistribute it and/or
718a22dc121f license/copyright change
glantau
parents: 396
diff changeset
6 * modify it under the terms of the GNU Lesser General Public
718a22dc121f license/copyright change
glantau
parents: 396
diff changeset
7 * License as published by the Free Software Foundation; either
718a22dc121f license/copyright change
glantau
parents: 396
diff changeset
8 * version 2 of the License, or (at your option) any later version.
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
9 *
429
718a22dc121f license/copyright change
glantau
parents: 396
diff changeset
10 * This library is distributed in the hope that it will be useful,
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
429
718a22dc121f license/copyright change
glantau
parents: 396
diff changeset
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
718a22dc121f license/copyright change
glantau
parents: 396
diff changeset
13 * Lesser General Public License for more details.
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
14 *
429
718a22dc121f license/copyright change
glantau
parents: 396
diff changeset
15 * You should have received a copy of the GNU Lesser General Public
718a22dc121f license/copyright change
glantau
parents: 396
diff changeset
16 * License along with this library; if not, write to the Free Software
718a22dc121f license/copyright change
glantau
parents: 396
diff changeset
17 * 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
18 *
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
19 * alternative bitstream reader & writer by Michael Niedermayer <michaelni@gmx.at>
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
20 */
64
5aa6292a1660 win32 fixes
glantau
parents: 24
diff changeset
21 #include "common.h"
8
1b4461b5a7fb Sync with mplayer's stuff
nickols_k
parents: 0
diff changeset
22
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
23 void init_put_bits(PutBitContext *s,
986e461dc072 Initial revision
glantau
parents:
diff changeset
24 UINT8 *buffer, int buffer_size,
986e461dc072 Initial revision
glantau
parents:
diff changeset
25 void *opaque,
986e461dc072 Initial revision
glantau
parents:
diff changeset
26 void (*write_data)(void *, UINT8 *, int))
986e461dc072 Initial revision
glantau
parents:
diff changeset
27 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
28 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
29 s->buf_end = s->buf + buffer_size;
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
30 s->data_out_size = 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
31 if(write_data!=NULL)
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
32 {
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
33 fprintf(stderr, "write Data callback is not supported\n");
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
34 }
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
35 #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
36 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
37 ((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
38 // 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
39 #else
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
40 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
41 s->bit_left=32;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
42 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
43 #endif
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
44 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
45
986e461dc072 Initial revision
glantau
parents:
diff changeset
46 /* return the number of bits output */
64
5aa6292a1660 win32 fixes
glantau
parents: 24
diff changeset
47 INT64 get_bit_count(PutBitContext *s)
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
48 {
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
49 #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
50 return s->data_out_size * 8 + s->index;
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 #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
52 return (s->buf_ptr - s->buf + s->data_out_size) * 8 + 32 - (INT64)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
53 #endif
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
54 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
55
986e461dc072 Initial revision
glantau
parents:
diff changeset
56 void align_put_bits(PutBitContext *s)
986e461dc072 Initial revision
glantau
parents:
diff changeset
57 {
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
58 #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
59 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
60 #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
61 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
62 #endif
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
63 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
64
986e461dc072 Initial revision
glantau
parents:
diff changeset
65 /* pad the end of the output stream with zeros */
986e461dc072 Initial revision
glantau
parents:
diff changeset
66 void flush_put_bits(PutBitContext *s)
986e461dc072 Initial revision
glantau
parents:
diff changeset
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
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 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
70 #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
71 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
72 while (s->bit_left < 32) {
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
73 /* XXX: should test end of buffer */
986e461dc072 Initial revision
glantau
parents:
diff changeset
74 *s->buf_ptr++=s->bit_buf >> 24;
986e461dc072 Initial revision
glantau
parents:
diff changeset
75 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
76 s->bit_left+=8;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
77 }
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
78 s->bit_left=32;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
79 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
80 #endif
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
81 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
82
986e461dc072 Initial revision
glantau
parents:
diff changeset
83 /* pad the end of the output stream with zeros */
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
84 #ifndef ALT_BITSTREAM_WRITER
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
85 void jflush_put_bits(PutBitContext *s)
986e461dc072 Initial revision
glantau
parents:
diff changeset
86 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
87 unsigned int b;
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
88 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
89 s->bit_buf |= ~1U >> (32 - s->bit_left); /* set all the unused bits to one */
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
90
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
91 while (s->bit_left < 32) {
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
92 b = s->bit_buf >> 24;
986e461dc072 Initial revision
glantau
parents:
diff changeset
93 *s->buf_ptr++ = b;
986e461dc072 Initial revision
glantau
parents:
diff changeset
94 if (b == 0xff)
986e461dc072 Initial revision
glantau
parents:
diff changeset
95 *s->buf_ptr++ = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
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
986e461dc072 Initial revision
glantau
parents:
diff changeset
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
986e461dc072 Initial revision
glantau
parents:
diff changeset
100 s->bit_buf=0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
101 }
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 #else
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
103 void jflush_put_bits(PutBitContext *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
104 {
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
105 int num= ( - s->index) & 7;
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
106 jput_bits(s, num,0xFF>>(8-num));
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
107 }
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
108 #endif
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
109
358
2066dc543be4 move put_string() to common.{c,h}
michaelni
parents: 324
diff changeset
110 void put_string(PutBitContext * pbc, char *s)
2066dc543be4 move put_string() to common.{c,h}
michaelni
parents: 324
diff changeset
111 {
2066dc543be4 move put_string() to common.{c,h}
michaelni
parents: 324
diff changeset
112 while(*s){
2066dc543be4 move put_string() to common.{c,h}
michaelni
parents: 324
diff changeset
113 put_bits(pbc, 8, *s);
2066dc543be4 move put_string() to common.{c,h}
michaelni
parents: 324
diff changeset
114 s++;
2066dc543be4 move put_string() to common.{c,h}
michaelni
parents: 324
diff changeset
115 }
2066dc543be4 move put_string() to common.{c,h}
michaelni
parents: 324
diff changeset
116 put_bits(pbc, 8, 0);
2066dc543be4 move put_string() to common.{c,h}
michaelni
parents: 324
diff changeset
117 }
2066dc543be4 move put_string() to common.{c,h}
michaelni
parents: 324
diff changeset
118
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
119 /* bit input functions */
986e461dc072 Initial revision
glantau
parents:
diff changeset
120
986e461dc072 Initial revision
glantau
parents:
diff changeset
121 void init_get_bits(GetBitContext *s,
986e461dc072 Initial revision
glantau
parents:
diff changeset
122 UINT8 *buffer, int buffer_size)
986e461dc072 Initial revision
glantau
parents:
diff changeset
123 {
192
1e5f64be86fc another bitstream reader code (faster on intel cpus) - patch by Michael Niedermayer <michaelni@gmx.at>
uid46427
parents: 144
diff changeset
124 #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
125 s->index=0;
1e5f64be86fc another bitstream reader code (faster on intel cpus) - patch by Michael Niedermayer <michaelni@gmx.at>
uid46427
parents: 144
diff changeset
126 s->buffer= buffer;
1e5f64be86fc another bitstream reader code (faster on intel cpus) - patch by Michael Niedermayer <michaelni@gmx.at>
uid46427
parents: 144
diff changeset
127 #else
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
128 s->buf = buffer;
986e461dc072 Initial revision
glantau
parents:
diff changeset
129 s->buf_ptr = buffer;
986e461dc072 Initial revision
glantau
parents:
diff changeset
130 s->buf_end = buffer + buffer_size;
986e461dc072 Initial revision
glantau
parents:
diff changeset
131 s->bit_cnt = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
132 s->bit_buf = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
133 while (s->buf_ptr < s->buf_end &&
986e461dc072 Initial revision
glantau
parents:
diff changeset
134 s->bit_cnt < 32) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
135 s->bit_buf |= (*s->buf_ptr++ << (24 - s->bit_cnt));
986e461dc072 Initial revision
glantau
parents:
diff changeset
136 s->bit_cnt += 8;
986e461dc072 Initial revision
glantau
parents:
diff changeset
137 }
192
1e5f64be86fc another bitstream reader code (faster on intel cpus) - patch by Michael Niedermayer <michaelni@gmx.at>
uid46427
parents: 144
diff changeset
138 #endif
277
5cb2978e701f new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents: 264
diff changeset
139 s->size= buffer_size;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
140 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
141
192
1e5f64be86fc another bitstream reader code (faster on intel cpus) - patch by Michael Niedermayer <michaelni@gmx.at>
uid46427
parents: 144
diff changeset
142 #ifndef ALT_BITSTREAM_READER
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
143 /* n must be >= 1 and <= 32 */
20
907b67420d84 inlineing common case of get_bits() -> gives 2speedup. more optim coming soon...
arpi_esp
parents: 8
diff changeset
144 /* also true: n > s->bit_cnt */
907b67420d84 inlineing common case of get_bits() -> gives 2speedup. more optim coming soon...
arpi_esp
parents: 8
diff changeset
145 unsigned int get_bits_long(GetBitContext *s, int n)
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
146 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
147 unsigned int val;
986e461dc072 Initial revision
glantau
parents:
diff changeset
148 int bit_cnt;
986e461dc072 Initial revision
glantau
parents:
diff changeset
149 unsigned int bit_buf;
986e461dc072 Initial revision
glantau
parents:
diff changeset
150
986e461dc072 Initial revision
glantau
parents:
diff changeset
151 #ifdef STATS
986e461dc072 Initial revision
glantau
parents:
diff changeset
152 st_bit_counts[st_current_index] += n;
986e461dc072 Initial revision
glantau
parents:
diff changeset
153 #endif
986e461dc072 Initial revision
glantau
parents:
diff changeset
154
986e461dc072 Initial revision
glantau
parents:
diff changeset
155 bit_buf = s->bit_buf;
20
907b67420d84 inlineing common case of get_bits() -> gives 2speedup. more optim coming soon...
arpi_esp
parents: 8
diff changeset
156 bit_cnt = s->bit_cnt - n;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
157
20
907b67420d84 inlineing common case of get_bits() -> gives 2speedup. more optim coming soon...
arpi_esp
parents: 8
diff changeset
158 // if (bit_cnt >= 0) {
907b67420d84 inlineing common case of get_bits() -> gives 2speedup. more optim coming soon...
arpi_esp
parents: 8
diff changeset
159 // val = bit_buf >> (32 - n);
907b67420d84 inlineing common case of get_bits() -> gives 2speedup. more optim coming soon...
arpi_esp
parents: 8
diff changeset
160 // bit_buf <<= n;
907b67420d84 inlineing common case of get_bits() -> gives 2speedup. more optim coming soon...
arpi_esp
parents: 8
diff changeset
161 // } else
907b67420d84 inlineing common case of get_bits() -> gives 2speedup. more optim coming soon...
arpi_esp
parents: 8
diff changeset
162 {
907b67420d84 inlineing common case of get_bits() -> gives 2speedup. more optim coming soon...
arpi_esp
parents: 8
diff changeset
163 UINT8 *buf_ptr;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
164 val = bit_buf >> (32 - n);
986e461dc072 Initial revision
glantau
parents:
diff changeset
165 buf_ptr = s->buf_ptr;
986e461dc072 Initial revision
glantau
parents:
diff changeset
166 buf_ptr += 4;
986e461dc072 Initial revision
glantau
parents:
diff changeset
167 /* handle common case: we can read everything */
986e461dc072 Initial revision
glantau
parents:
diff changeset
168 if (buf_ptr <= s->buf_end) {
497
5b33d11bd1fb use #ifdef
bellard
parents: 452
diff changeset
169 #ifdef ARCH_X86
8
1b4461b5a7fb Sync with mplayer's stuff
nickols_k
parents: 0
diff changeset
170 bit_buf = bswap_32(*((unsigned long*)(&buf_ptr[-4])));
1b4461b5a7fb Sync with mplayer's stuff
nickols_k
parents: 0
diff changeset
171 #else
1b4461b5a7fb Sync with mplayer's stuff
nickols_k
parents: 0
diff changeset
172 bit_buf = (buf_ptr[-4] << 24) |
1b4461b5a7fb Sync with mplayer's stuff
nickols_k
parents: 0
diff changeset
173 (buf_ptr[-3] << 16) |
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
174 (buf_ptr[-2] << 8) |
8
1b4461b5a7fb Sync with mplayer's stuff
nickols_k
parents: 0
diff changeset
175 (buf_ptr[-1]);
1b4461b5a7fb Sync with mplayer's stuff
nickols_k
parents: 0
diff changeset
176 #endif
452
297eed976b20 fixing get_bits_count at the end
michaelni
parents: 429
diff changeset
177 val |= bit_buf >> (32 + bit_cnt);
297eed976b20 fixing get_bits_count at the end
michaelni
parents: 429
diff changeset
178 bit_buf <<= - bit_cnt;
297eed976b20 fixing get_bits_count at the end
michaelni
parents: 429
diff changeset
179 bit_cnt += 32;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
180 } else {
986e461dc072 Initial revision
glantau
parents:
diff changeset
181 buf_ptr -= 4;
986e461dc072 Initial revision
glantau
parents:
diff changeset
182 bit_buf = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
183 if (buf_ptr < s->buf_end)
986e461dc072 Initial revision
glantau
parents:
diff changeset
184 bit_buf |= *buf_ptr++ << 24;
986e461dc072 Initial revision
glantau
parents:
diff changeset
185 if (buf_ptr < s->buf_end)
986e461dc072 Initial revision
glantau
parents:
diff changeset
186 bit_buf |= *buf_ptr++ << 16;
986e461dc072 Initial revision
glantau
parents:
diff changeset
187 if (buf_ptr < s->buf_end)
986e461dc072 Initial revision
glantau
parents:
diff changeset
188 bit_buf |= *buf_ptr++ << 8;
986e461dc072 Initial revision
glantau
parents:
diff changeset
189 if (buf_ptr < s->buf_end)
986e461dc072 Initial revision
glantau
parents:
diff changeset
190 bit_buf |= *buf_ptr++;
452
297eed976b20 fixing get_bits_count at the end
michaelni
parents: 429
diff changeset
191
297eed976b20 fixing get_bits_count at the end
michaelni
parents: 429
diff changeset
192 val |= bit_buf >> (32 + bit_cnt);
297eed976b20 fixing get_bits_count at the end
michaelni
parents: 429
diff changeset
193 bit_buf <<= - bit_cnt;
297eed976b20 fixing get_bits_count at the end
michaelni
parents: 429
diff changeset
194 bit_cnt += 8*(buf_ptr - s->buf_ptr);
297eed976b20 fixing get_bits_count at the end
michaelni
parents: 429
diff changeset
195 if(bit_cnt<0) bit_cnt=0;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
196 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
197 s->buf_ptr = buf_ptr;
986e461dc072 Initial revision
glantau
parents:
diff changeset
198 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
199 s->bit_buf = bit_buf;
986e461dc072 Initial revision
glantau
parents:
diff changeset
200 s->bit_cnt = bit_cnt;
986e461dc072 Initial revision
glantau
parents:
diff changeset
201 return val;
986e461dc072 Initial revision
glantau
parents:
diff changeset
202 }
192
1e5f64be86fc another bitstream reader code (faster on intel cpus) - patch by Michael Niedermayer <michaelni@gmx.at>
uid46427
parents: 144
diff changeset
203 #endif
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
204
986e461dc072 Initial revision
glantau
parents:
diff changeset
205 void align_get_bits(GetBitContext *s)
986e461dc072 Initial revision
glantau
parents:
diff changeset
206 {
192
1e5f64be86fc another bitstream reader code (faster on intel cpus) - patch by Michael Niedermayer <michaelni@gmx.at>
uid46427
parents: 144
diff changeset
207 #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
208 s->index= (s->index + 7) & (~7);
1e5f64be86fc another bitstream reader code (faster on intel cpus) - patch by Michael Niedermayer <michaelni@gmx.at>
uid46427
parents: 144
diff changeset
209 #else
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
210 int n;
986e461dc072 Initial revision
glantau
parents:
diff changeset
211 n = s->bit_cnt & 7;
986e461dc072 Initial revision
glantau
parents:
diff changeset
212 if (n > 0) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
213 get_bits(s, n);
986e461dc072 Initial revision
glantau
parents:
diff changeset
214 }
192
1e5f64be86fc another bitstream reader code (faster on intel cpus) - patch by Michael Niedermayer <michaelni@gmx.at>
uid46427
parents: 144
diff changeset
215 #endif
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
216 }
192
1e5f64be86fc another bitstream reader code (faster on intel cpus) - patch by Michael Niedermayer <michaelni@gmx.at>
uid46427
parents: 144
diff changeset
217
264
28c5c62b1c4c support decoding (with mplayer) of 3 .mp4 files from mphq
michaelni
parents: 238
diff changeset
218 int check_marker(GetBitContext *s, char *msg)
28c5c62b1c4c support decoding (with mplayer) of 3 .mp4 files from mphq
michaelni
parents: 238
diff changeset
219 {
28c5c62b1c4c support decoding (with mplayer) of 3 .mp4 files from mphq
michaelni
parents: 238
diff changeset
220 int bit= get_bits1(s);
28c5c62b1c4c support decoding (with mplayer) of 3 .mp4 files from mphq
michaelni
parents: 238
diff changeset
221 if(!bit) printf("Marker bit missing %s\n", msg);
28c5c62b1c4c support decoding (with mplayer) of 3 .mp4 files from mphq
michaelni
parents: 238
diff changeset
222
28c5c62b1c4c support decoding (with mplayer) of 3 .mp4 files from mphq
michaelni
parents: 238
diff changeset
223 return bit;
28c5c62b1c4c support decoding (with mplayer) of 3 .mp4 files from mphq
michaelni
parents: 238
diff changeset
224 }
28c5c62b1c4c support decoding (with mplayer) of 3 .mp4 files from mphq
michaelni
parents: 238
diff changeset
225
192
1e5f64be86fc another bitstream reader code (faster on intel cpus) - patch by Michael Niedermayer <michaelni@gmx.at>
uid46427
parents: 144
diff changeset
226 #ifndef ALT_BITSTREAM_READER
144
cb5dabd00ba2 - Bug fix on inter MCBPC table for inter+q.
pulento
parents: 64
diff changeset
227 /* This function is identical to get_bits_long(), the */
cb5dabd00ba2 - Bug fix on inter MCBPC table for inter+q.
pulento
parents: 64
diff changeset
228 /* only diference is that it doesn't touch the buffer */
cb5dabd00ba2 - Bug fix on inter MCBPC table for inter+q.
pulento
parents: 64
diff changeset
229 /* it is usefull to see the buffer. */
cb5dabd00ba2 - Bug fix on inter MCBPC table for inter+q.
pulento
parents: 64
diff changeset
230
cb5dabd00ba2 - Bug fix on inter MCBPC table for inter+q.
pulento
parents: 64
diff changeset
231 unsigned int show_bits_long(GetBitContext *s, int n)
cb5dabd00ba2 - Bug fix on inter MCBPC table for inter+q.
pulento
parents: 64
diff changeset
232 {
cb5dabd00ba2 - Bug fix on inter MCBPC table for inter+q.
pulento
parents: 64
diff changeset
233 unsigned int val;
cb5dabd00ba2 - Bug fix on inter MCBPC table for inter+q.
pulento
parents: 64
diff changeset
234 int bit_cnt;
cb5dabd00ba2 - Bug fix on inter MCBPC table for inter+q.
pulento
parents: 64
diff changeset
235 unsigned int bit_buf;
cb5dabd00ba2 - Bug fix on inter MCBPC table for inter+q.
pulento
parents: 64
diff changeset
236 UINT8 *buf_ptr;
cb5dabd00ba2 - Bug fix on inter MCBPC table for inter+q.
pulento
parents: 64
diff changeset
237
cb5dabd00ba2 - Bug fix on inter MCBPC table for inter+q.
pulento
parents: 64
diff changeset
238 bit_buf = s->bit_buf;
cb5dabd00ba2 - Bug fix on inter MCBPC table for inter+q.
pulento
parents: 64
diff changeset
239 bit_cnt = s->bit_cnt - n;
cb5dabd00ba2 - Bug fix on inter MCBPC table for inter+q.
pulento
parents: 64
diff changeset
240
cb5dabd00ba2 - Bug fix on inter MCBPC table for inter+q.
pulento
parents: 64
diff changeset
241 val = bit_buf >> (32 - n);
cb5dabd00ba2 - Bug fix on inter MCBPC table for inter+q.
pulento
parents: 64
diff changeset
242 buf_ptr = s->buf_ptr;
cb5dabd00ba2 - Bug fix on inter MCBPC table for inter+q.
pulento
parents: 64
diff changeset
243 buf_ptr += 4;
cb5dabd00ba2 - Bug fix on inter MCBPC table for inter+q.
pulento
parents: 64
diff changeset
244
cb5dabd00ba2 - Bug fix on inter MCBPC table for inter+q.
pulento
parents: 64
diff changeset
245 /* handle common case: we can read everything */
cb5dabd00ba2 - Bug fix on inter MCBPC table for inter+q.
pulento
parents: 64
diff changeset
246 if (buf_ptr <= s->buf_end) {
cb5dabd00ba2 - Bug fix on inter MCBPC table for inter+q.
pulento
parents: 64
diff changeset
247 #ifdef ARCH_X86
cb5dabd00ba2 - Bug fix on inter MCBPC table for inter+q.
pulento
parents: 64
diff changeset
248 bit_buf = bswap_32(*((unsigned long*)(&buf_ptr[-4])));
cb5dabd00ba2 - Bug fix on inter MCBPC table for inter+q.
pulento
parents: 64
diff changeset
249 #else
cb5dabd00ba2 - Bug fix on inter MCBPC table for inter+q.
pulento
parents: 64
diff changeset
250 bit_buf = (buf_ptr[-4] << 24) |
cb5dabd00ba2 - Bug fix on inter MCBPC table for inter+q.
pulento
parents: 64
diff changeset
251 (buf_ptr[-3] << 16) |
cb5dabd00ba2 - Bug fix on inter MCBPC table for inter+q.
pulento
parents: 64
diff changeset
252 (buf_ptr[-2] << 8) |
cb5dabd00ba2 - Bug fix on inter MCBPC table for inter+q.
pulento
parents: 64
diff changeset
253 (buf_ptr[-1]);
cb5dabd00ba2 - Bug fix on inter MCBPC table for inter+q.
pulento
parents: 64
diff changeset
254 #endif
cb5dabd00ba2 - Bug fix on inter MCBPC table for inter+q.
pulento
parents: 64
diff changeset
255 } else {
cb5dabd00ba2 - Bug fix on inter MCBPC table for inter+q.
pulento
parents: 64
diff changeset
256 buf_ptr -= 4;
cb5dabd00ba2 - Bug fix on inter MCBPC table for inter+q.
pulento
parents: 64
diff changeset
257 bit_buf = 0;
cb5dabd00ba2 - Bug fix on inter MCBPC table for inter+q.
pulento
parents: 64
diff changeset
258 if (buf_ptr < s->buf_end)
cb5dabd00ba2 - Bug fix on inter MCBPC table for inter+q.
pulento
parents: 64
diff changeset
259 bit_buf |= *buf_ptr++ << 24;
cb5dabd00ba2 - Bug fix on inter MCBPC table for inter+q.
pulento
parents: 64
diff changeset
260 if (buf_ptr < s->buf_end)
cb5dabd00ba2 - Bug fix on inter MCBPC table for inter+q.
pulento
parents: 64
diff changeset
261 bit_buf |= *buf_ptr++ << 16;
cb5dabd00ba2 - Bug fix on inter MCBPC table for inter+q.
pulento
parents: 64
diff changeset
262 if (buf_ptr < s->buf_end)
cb5dabd00ba2 - Bug fix on inter MCBPC table for inter+q.
pulento
parents: 64
diff changeset
263 bit_buf |= *buf_ptr++ << 8;
cb5dabd00ba2 - Bug fix on inter MCBPC table for inter+q.
pulento
parents: 64
diff changeset
264 if (buf_ptr < s->buf_end)
cb5dabd00ba2 - Bug fix on inter MCBPC table for inter+q.
pulento
parents: 64
diff changeset
265 bit_buf |= *buf_ptr++;
cb5dabd00ba2 - Bug fix on inter MCBPC table for inter+q.
pulento
parents: 64
diff changeset
266 }
cb5dabd00ba2 - Bug fix on inter MCBPC table for inter+q.
pulento
parents: 64
diff changeset
267 val |= bit_buf >> (32 + bit_cnt);
cb5dabd00ba2 - Bug fix on inter MCBPC table for inter+q.
pulento
parents: 64
diff changeset
268 bit_buf <<= - bit_cnt;
cb5dabd00ba2 - Bug fix on inter MCBPC table for inter+q.
pulento
parents: 64
diff changeset
269 bit_cnt += 32;
cb5dabd00ba2 - Bug fix on inter MCBPC table for inter+q.
pulento
parents: 64
diff changeset
270
cb5dabd00ba2 - Bug fix on inter MCBPC table for inter+q.
pulento
parents: 64
diff changeset
271 return val;
cb5dabd00ba2 - Bug fix on inter MCBPC table for inter+q.
pulento
parents: 64
diff changeset
272 }
192
1e5f64be86fc another bitstream reader code (faster on intel cpus) - patch by Michael Niedermayer <michaelni@gmx.at>
uid46427
parents: 144
diff changeset
273 #endif
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
274
986e461dc072 Initial revision
glantau
parents:
diff changeset
275 /* VLC decoding */
986e461dc072 Initial revision
glantau
parents:
diff changeset
276
986e461dc072 Initial revision
glantau
parents:
diff changeset
277 //#define DEBUG_VLC
986e461dc072 Initial revision
glantau
parents:
diff changeset
278
986e461dc072 Initial revision
glantau
parents:
diff changeset
279 #define GET_DATA(v, table, i, wrap, size) \
986e461dc072 Initial revision
glantau
parents:
diff changeset
280 {\
986e461dc072 Initial revision
glantau
parents:
diff changeset
281 UINT8 *ptr = (UINT8 *)table + i * wrap;\
986e461dc072 Initial revision
glantau
parents:
diff changeset
282 switch(size) {\
986e461dc072 Initial revision
glantau
parents:
diff changeset
283 case 1:\
986e461dc072 Initial revision
glantau
parents:
diff changeset
284 v = *(UINT8 *)ptr;\
986e461dc072 Initial revision
glantau
parents:
diff changeset
285 break;\
986e461dc072 Initial revision
glantau
parents:
diff changeset
286 case 2:\
986e461dc072 Initial revision
glantau
parents:
diff changeset
287 v = *(UINT16 *)ptr;\
986e461dc072 Initial revision
glantau
parents:
diff changeset
288 break;\
986e461dc072 Initial revision
glantau
parents:
diff changeset
289 default:\
986e461dc072 Initial revision
glantau
parents:
diff changeset
290 v = *(UINT32 *)ptr;\
986e461dc072 Initial revision
glantau
parents:
diff changeset
291 break;\
986e461dc072 Initial revision
glantau
parents:
diff changeset
292 }\
986e461dc072 Initial revision
glantau
parents:
diff changeset
293 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
294
986e461dc072 Initial revision
glantau
parents:
diff changeset
295
986e461dc072 Initial revision
glantau
parents:
diff changeset
296 static int alloc_table(VLC *vlc, int size)
986e461dc072 Initial revision
glantau
parents:
diff changeset
297 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
298 int index;
986e461dc072 Initial revision
glantau
parents:
diff changeset
299 index = vlc->table_size;
986e461dc072 Initial revision
glantau
parents:
diff changeset
300 vlc->table_size += size;
986e461dc072 Initial revision
glantau
parents:
diff changeset
301 if (vlc->table_size > vlc->table_allocated) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
302 vlc->table_allocated += (1 << vlc->bits);
986e461dc072 Initial revision
glantau
parents:
diff changeset
303 vlc->table_bits = realloc(vlc->table_bits,
986e461dc072 Initial revision
glantau
parents:
diff changeset
304 sizeof(INT8) * vlc->table_allocated);
986e461dc072 Initial revision
glantau
parents:
diff changeset
305 vlc->table_codes = realloc(vlc->table_codes,
986e461dc072 Initial revision
glantau
parents:
diff changeset
306 sizeof(INT16) * vlc->table_allocated);
986e461dc072 Initial revision
glantau
parents:
diff changeset
307 if (!vlc->table_bits ||
986e461dc072 Initial revision
glantau
parents:
diff changeset
308 !vlc->table_codes)
986e461dc072 Initial revision
glantau
parents:
diff changeset
309 return -1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
310 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
311 return index;
986e461dc072 Initial revision
glantau
parents:
diff changeset
312 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
313
986e461dc072 Initial revision
glantau
parents:
diff changeset
314 static int build_table(VLC *vlc, int table_nb_bits,
986e461dc072 Initial revision
glantau
parents:
diff changeset
315 int nb_codes,
986e461dc072 Initial revision
glantau
parents:
diff changeset
316 const void *bits, int bits_wrap, int bits_size,
986e461dc072 Initial revision
glantau
parents:
diff changeset
317 const void *codes, int codes_wrap, int codes_size,
986e461dc072 Initial revision
glantau
parents:
diff changeset
318 UINT32 code_prefix, int n_prefix)
986e461dc072 Initial revision
glantau
parents:
diff changeset
319 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
320 int i, j, k, n, table_size, table_index, nb, n1, index;
986e461dc072 Initial revision
glantau
parents:
diff changeset
321 UINT32 code;
986e461dc072 Initial revision
glantau
parents:
diff changeset
322 INT8 *table_bits;
986e461dc072 Initial revision
glantau
parents:
diff changeset
323 INT16 *table_codes;
986e461dc072 Initial revision
glantau
parents:
diff changeset
324
986e461dc072 Initial revision
glantau
parents:
diff changeset
325 table_size = 1 << table_nb_bits;
986e461dc072 Initial revision
glantau
parents:
diff changeset
326 table_index = alloc_table(vlc, table_size);
986e461dc072 Initial revision
glantau
parents:
diff changeset
327 #ifdef DEBUG_VLC
986e461dc072 Initial revision
glantau
parents:
diff changeset
328 printf("new table index=%d size=%d code_prefix=%x n=%d\n",
986e461dc072 Initial revision
glantau
parents:
diff changeset
329 table_index, table_size, code_prefix, n_prefix);
986e461dc072 Initial revision
glantau
parents:
diff changeset
330 #endif
986e461dc072 Initial revision
glantau
parents:
diff changeset
331 if (table_index < 0)
986e461dc072 Initial revision
glantau
parents:
diff changeset
332 return -1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
333 table_bits = &vlc->table_bits[table_index];
986e461dc072 Initial revision
glantau
parents:
diff changeset
334 table_codes = &vlc->table_codes[table_index];
986e461dc072 Initial revision
glantau
parents:
diff changeset
335
986e461dc072 Initial revision
glantau
parents:
diff changeset
336 for(i=0;i<table_size;i++) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
337 table_bits[i] = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
338 table_codes[i] = -1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
339 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
340
986e461dc072 Initial revision
glantau
parents:
diff changeset
341 /* first pass: map codes and compute auxillary table sizes */
986e461dc072 Initial revision
glantau
parents:
diff changeset
342 for(i=0;i<nb_codes;i++) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
343 GET_DATA(n, bits, i, bits_wrap, bits_size);
986e461dc072 Initial revision
glantau
parents:
diff changeset
344 GET_DATA(code, codes, i, codes_wrap, codes_size);
986e461dc072 Initial revision
glantau
parents:
diff changeset
345 /* we accept tables with holes */
986e461dc072 Initial revision
glantau
parents:
diff changeset
346 if (n <= 0)
986e461dc072 Initial revision
glantau
parents:
diff changeset
347 continue;
986e461dc072 Initial revision
glantau
parents:
diff changeset
348 #if defined(DEBUG_VLC) && 0
986e461dc072 Initial revision
glantau
parents:
diff changeset
349 printf("i=%d n=%d code=0x%x\n", i, n, code);
986e461dc072 Initial revision
glantau
parents:
diff changeset
350 #endif
986e461dc072 Initial revision
glantau
parents:
diff changeset
351 /* if code matches the prefix, it is in the table */
986e461dc072 Initial revision
glantau
parents:
diff changeset
352 n -= n_prefix;
986e461dc072 Initial revision
glantau
parents:
diff changeset
353 if (n > 0 && (code >> n) == code_prefix) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
354 if (n <= table_nb_bits) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
355 /* no need to add another table */
986e461dc072 Initial revision
glantau
parents:
diff changeset
356 j = (code << (table_nb_bits - n)) & (table_size - 1);
986e461dc072 Initial revision
glantau
parents:
diff changeset
357 nb = 1 << (table_nb_bits - n);
986e461dc072 Initial revision
glantau
parents:
diff changeset
358 for(k=0;k<nb;k++) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
359 #ifdef DEBUG_VLC
986e461dc072 Initial revision
glantau
parents:
diff changeset
360 printf("%4x: code=%d n=%d\n",
986e461dc072 Initial revision
glantau
parents:
diff changeset
361 j, i, n);
986e461dc072 Initial revision
glantau
parents:
diff changeset
362 #endif
986e461dc072 Initial revision
glantau
parents:
diff changeset
363 if (table_bits[j] != 0) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
364 fprintf(stderr, "incorrect codes\n");
986e461dc072 Initial revision
glantau
parents:
diff changeset
365 exit(1);
986e461dc072 Initial revision
glantau
parents:
diff changeset
366 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
367 table_bits[j] = n;
986e461dc072 Initial revision
glantau
parents:
diff changeset
368 table_codes[j] = i;
986e461dc072 Initial revision
glantau
parents:
diff changeset
369 j++;
986e461dc072 Initial revision
glantau
parents:
diff changeset
370 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
371 } else {
986e461dc072 Initial revision
glantau
parents:
diff changeset
372 n -= table_nb_bits;
986e461dc072 Initial revision
glantau
parents:
diff changeset
373 j = (code >> n) & ((1 << table_nb_bits) - 1);
986e461dc072 Initial revision
glantau
parents:
diff changeset
374 #ifdef DEBUG_VLC
986e461dc072 Initial revision
glantau
parents:
diff changeset
375 printf("%4x: n=%d (subtable)\n",
986e461dc072 Initial revision
glantau
parents:
diff changeset
376 j, n);
986e461dc072 Initial revision
glantau
parents:
diff changeset
377 #endif
986e461dc072 Initial revision
glantau
parents:
diff changeset
378 /* compute table size */
986e461dc072 Initial revision
glantau
parents:
diff changeset
379 n1 = -table_bits[j];
986e461dc072 Initial revision
glantau
parents:
diff changeset
380 if (n > n1)
986e461dc072 Initial revision
glantau
parents:
diff changeset
381 n1 = n;
986e461dc072 Initial revision
glantau
parents:
diff changeset
382 table_bits[j] = -n1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
383 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
384 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
385 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
386
986e461dc072 Initial revision
glantau
parents:
diff changeset
387 /* second pass : fill auxillary tables recursively */
986e461dc072 Initial revision
glantau
parents:
diff changeset
388 for(i=0;i<table_size;i++) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
389 n = table_bits[i];
986e461dc072 Initial revision
glantau
parents:
diff changeset
390 if (n < 0) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
391 n = -n;
986e461dc072 Initial revision
glantau
parents:
diff changeset
392 if (n > table_nb_bits) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
393 n = table_nb_bits;
986e461dc072 Initial revision
glantau
parents:
diff changeset
394 table_bits[i] = -n;
986e461dc072 Initial revision
glantau
parents:
diff changeset
395 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
396 index = build_table(vlc, n, nb_codes,
986e461dc072 Initial revision
glantau
parents:
diff changeset
397 bits, bits_wrap, bits_size,
986e461dc072 Initial revision
glantau
parents:
diff changeset
398 codes, codes_wrap, codes_size,
986e461dc072 Initial revision
glantau
parents:
diff changeset
399 (code_prefix << table_nb_bits) | i,
986e461dc072 Initial revision
glantau
parents:
diff changeset
400 n_prefix + table_nb_bits);
986e461dc072 Initial revision
glantau
parents:
diff changeset
401 if (index < 0)
986e461dc072 Initial revision
glantau
parents:
diff changeset
402 return -1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
403 /* note: realloc has been done, so reload tables */
986e461dc072 Initial revision
glantau
parents:
diff changeset
404 table_bits = &vlc->table_bits[table_index];
986e461dc072 Initial revision
glantau
parents:
diff changeset
405 table_codes = &vlc->table_codes[table_index];
986e461dc072 Initial revision
glantau
parents:
diff changeset
406 table_codes[i] = index;
986e461dc072 Initial revision
glantau
parents:
diff changeset
407 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
408 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
409 return table_index;
986e461dc072 Initial revision
glantau
parents:
diff changeset
410 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
411
986e461dc072 Initial revision
glantau
parents:
diff changeset
412
24
08265a63313e added MJPEG decoder + comments
glantau
parents: 20
diff changeset
413 /* Build VLC decoding tables suitable for use with get_vlc().
08265a63313e added MJPEG decoder + comments
glantau
parents: 20
diff changeset
414
08265a63313e added MJPEG decoder + comments
glantau
parents: 20
diff changeset
415 'nb_bits' set thee decoding table size (2^nb_bits) entries. The
08265a63313e added MJPEG decoder + comments
glantau
parents: 20
diff changeset
416 bigger it is, the faster is the decoding. But it should not be too
08265a63313e added MJPEG decoder + comments
glantau
parents: 20
diff changeset
417 big to save memory and L1 cache. '9' is a good compromise.
08265a63313e added MJPEG decoder + comments
glantau
parents: 20
diff changeset
418
08265a63313e added MJPEG decoder + comments
glantau
parents: 20
diff changeset
419 'nb_codes' : number of vlcs codes
08265a63313e added MJPEG decoder + comments
glantau
parents: 20
diff changeset
420
08265a63313e added MJPEG decoder + comments
glantau
parents: 20
diff changeset
421 'bits' : table which gives the size (in bits) of each vlc code.
08265a63313e added MJPEG decoder + comments
glantau
parents: 20
diff changeset
422
08265a63313e added MJPEG decoder + comments
glantau
parents: 20
diff changeset
423 'codes' : table which gives the bit pattern of of each vlc code.
08265a63313e added MJPEG decoder + comments
glantau
parents: 20
diff changeset
424
08265a63313e added MJPEG decoder + comments
glantau
parents: 20
diff changeset
425 'xxx_wrap' : give the number of bytes between each entry of the
08265a63313e added MJPEG decoder + comments
glantau
parents: 20
diff changeset
426 'bits' or 'codes' tables.
08265a63313e added MJPEG decoder + comments
glantau
parents: 20
diff changeset
427
08265a63313e added MJPEG decoder + comments
glantau
parents: 20
diff changeset
428 'xxx_size' : gives the number of bytes of each entry of the 'bits'
08265a63313e added MJPEG decoder + comments
glantau
parents: 20
diff changeset
429 or 'codes' tables.
08265a63313e added MJPEG decoder + comments
glantau
parents: 20
diff changeset
430
08265a63313e added MJPEG decoder + comments
glantau
parents: 20
diff changeset
431 'wrap' and 'size' allows to use any memory configuration and types
08265a63313e added MJPEG decoder + comments
glantau
parents: 20
diff changeset
432 (byte/word/long) to store the 'bits' and 'codes' tables.
08265a63313e added MJPEG decoder + comments
glantau
parents: 20
diff changeset
433 */
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
434 int init_vlc(VLC *vlc, int nb_bits, int nb_codes,
986e461dc072 Initial revision
glantau
parents:
diff changeset
435 const void *bits, int bits_wrap, int bits_size,
986e461dc072 Initial revision
glantau
parents:
diff changeset
436 const void *codes, int codes_wrap, int codes_size)
986e461dc072 Initial revision
glantau
parents:
diff changeset
437 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
438 vlc->bits = nb_bits;
986e461dc072 Initial revision
glantau
parents:
diff changeset
439 vlc->table_bits = NULL;
986e461dc072 Initial revision
glantau
parents:
diff changeset
440 vlc->table_codes = NULL;
986e461dc072 Initial revision
glantau
parents:
diff changeset
441 vlc->table_allocated = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
442 vlc->table_size = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
443 #ifdef DEBUG_VLC
986e461dc072 Initial revision
glantau
parents:
diff changeset
444 printf("build table nb_codes=%d\n", nb_codes);
986e461dc072 Initial revision
glantau
parents:
diff changeset
445 #endif
986e461dc072 Initial revision
glantau
parents:
diff changeset
446
986e461dc072 Initial revision
glantau
parents:
diff changeset
447 if (build_table(vlc, nb_bits, nb_codes,
986e461dc072 Initial revision
glantau
parents:
diff changeset
448 bits, bits_wrap, bits_size,
986e461dc072 Initial revision
glantau
parents:
diff changeset
449 codes, codes_wrap, codes_size,
986e461dc072 Initial revision
glantau
parents:
diff changeset
450 0, 0) < 0) {
396
fce0a2520551 removed useless header includes - use av memory functions
glantau
parents: 358
diff changeset
451 av_free(vlc->table_bits);
fce0a2520551 removed useless header includes - use av memory functions
glantau
parents: 358
diff changeset
452 av_free(vlc->table_codes);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
453 return -1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
454 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
455 return 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
456 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
457
986e461dc072 Initial revision
glantau
parents:
diff changeset
458
986e461dc072 Initial revision
glantau
parents:
diff changeset
459 void free_vlc(VLC *vlc)
986e461dc072 Initial revision
glantau
parents:
diff changeset
460 {
396
fce0a2520551 removed useless header includes - use av memory functions
glantau
parents: 358
diff changeset
461 av_free(vlc->table_bits);
fce0a2520551 removed useless header includes - use av memory functions
glantau
parents: 358
diff changeset
462 av_free(vlc->table_codes);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
463 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
464
324
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 277
diff changeset
465 int ff_gcd(int a, int b){
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 277
diff changeset
466 if(b) return ff_gcd(b, a%b);
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 277
diff changeset
467 else return a;
9c6f056f0e41 fixed mpeg4 time stuff on encoding
michaelni
parents: 277
diff changeset
468 }