Statistics
| Branch: | Revision:

ffmpeg / libavcodec / common.c @ 1b245cc2

History | View | Annotate | Download (10.7 KB)

1 de6d9b64 Fabrice Bellard
/*
2
 * Common bit i/o utils
3 ff4ec49e Fabrice Bellard
 * Copyright (c) 2000, 2001 Fabrice Bellard.
4 de6d9b64 Fabrice Bellard
 *
5 ff4ec49e Fabrice Bellard
 * This library is free software; you can redistribute it and/or
6
 * modify it under the terms of the GNU Lesser General Public
7
 * License as published by the Free Software Foundation; either
8
 * version 2 of the License, or (at your option) any later version.
9 de6d9b64 Fabrice Bellard
 *
10 ff4ec49e Fabrice Bellard
 * This library is distributed in the hope that it will be useful,
11 de6d9b64 Fabrice Bellard
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 ff4ec49e Fabrice Bellard
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13
 * Lesser General Public License for more details.
14 de6d9b64 Fabrice Bellard
 *
15 ff4ec49e Fabrice Bellard
 * You should have received a copy of the GNU Lesser General Public
16
 * License along with this library; if not, write to the Free Software
17
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18 27a3e2c5 Michael Niedermayer
 *
19 17592475 Michael Niedermayer
 * alternative bitstream reader & writer by Michael Niedermayer <michaelni@gmx.at>
20 de6d9b64 Fabrice Bellard
 */
21 983e3246 Michael Niedermayer
22
/**
23
 * @file common.c
24
 * common internal api.
25
 */
26
27 df595131 Zdenek Kabelac
#include "avcodec.h"
28 a9b3f630 Nick Kurshev
29 0c1a9eda Zdenek Kabelac
const uint8_t ff_sqrt_tab[128]={
30 f36db5df Michael Niedermayer
        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,
31
        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,
32
        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,
33
        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
34
};
35
36 c81f0349 Michael Niedermayer
const uint8_t ff_log2_tab[256]={
37
        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,
38
        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,
39
        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,
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
        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,
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
};
46
47 ed7debda Alex Beregszaszi
void init_put_bits(PutBitContext *s, uint8_t *buffer, int buffer_size)
48 de6d9b64 Fabrice Bellard
{
49
    s->buf = buffer;
50
    s->buf_end = s->buf + buffer_size;
51
    s->data_out_size = 0;
52 d8cf5aea Michael Niedermayer
#ifdef ALT_BITSTREAM_WRITER
53
    s->index=0;
54
    ((uint32_t*)(s->buf))[0]=0;
55
//    memset(buffer, 0, buffer_size);
56 17592475 Michael Niedermayer
#else
57
    s->buf_ptr = s->buf;
58 d8cf5aea Michael Niedermayer
    s->bit_left=32;
59 17592475 Michael Niedermayer
    s->bit_buf=0;
60
#endif
61 de6d9b64 Fabrice Bellard
}
62
63 5fd74135 Michael Niedermayer
#ifdef CONFIG_ENCODERS
64
65 de6d9b64 Fabrice Bellard
/* return the number of bits output */
66 0c1a9eda Zdenek Kabelac
int64_t get_bit_count(PutBitContext *s)
67 de6d9b64 Fabrice Bellard
{
68 17592475 Michael Niedermayer
#ifdef ALT_BITSTREAM_WRITER
69
    return s->data_out_size * 8 + s->index;
70
#else
71 0c1a9eda Zdenek Kabelac
    return (s->buf_ptr - s->buf + s->data_out_size) * 8 + 32 - (int64_t)s->bit_left;
72 17592475 Michael Niedermayer
#endif
73 de6d9b64 Fabrice Bellard
}
74
75
void align_put_bits(PutBitContext *s)
76
{
77 17592475 Michael Niedermayer
#ifdef ALT_BITSTREAM_WRITER
78
    put_bits(s,(  - s->index) & 7,0);
79
#else
80 d8cf5aea Michael Niedermayer
    put_bits(s,s->bit_left & 7,0);
81 17592475 Michael Niedermayer
#endif
82 de6d9b64 Fabrice Bellard
}
83
84 5fd74135 Michael Niedermayer
#endif //CONFIG_ENCODERS
85
86 de6d9b64 Fabrice Bellard
/* pad the end of the output stream with zeros */
87
void flush_put_bits(PutBitContext *s)
88
{
89 17592475 Michael Niedermayer
#ifdef ALT_BITSTREAM_WRITER
90
    align_put_bits(s);
91
#else
92 d8cf5aea Michael Niedermayer
    s->bit_buf<<= s->bit_left;
93
    while (s->bit_left < 32) {
94 de6d9b64 Fabrice Bellard
        /* XXX: should test end of buffer */
95
        *s->buf_ptr++=s->bit_buf >> 24;
96
        s->bit_buf<<=8;
97 d8cf5aea Michael Niedermayer
        s->bit_left+=8;
98 de6d9b64 Fabrice Bellard
    }
99 d8cf5aea Michael Niedermayer
    s->bit_left=32;
100 de6d9b64 Fabrice Bellard
    s->bit_buf=0;
101 17592475 Michael Niedermayer
#endif
102 de6d9b64 Fabrice Bellard
}
103
104 5fd74135 Michael Niedermayer
#ifdef CONFIG_ENCODERS
105
106 9717dad8 Michael Niedermayer
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
115 de6d9b64 Fabrice Bellard
/* bit input functions */
116
117 5fd74135 Michael Niedermayer
#endif //CONFIG_ENCODERS
118
119 f138f883 Michael Niedermayer
/**
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
 */
125 8db1a1dd Michael Niedermayer
void init_get_bits(GetBitContext *s,
126 ae39132d Zdenek Kabelac
                   const uint8_t *buffer, int bit_size)
127 de6d9b64 Fabrice Bellard
{
128 68f593b4 Michael Niedermayer
    const int buffer_size= (bit_size+7)>>3;
129
130 27a3e2c5 Michael Niedermayer
    s->buffer= buffer;
131 68f593b4 Michael Niedermayer
    s->size_in_bits= bit_size;
132 8db1a1dd Michael Niedermayer
    s->buffer_end= buffer + buffer_size;
133
#ifdef ALT_BITSTREAM_READER
134
    s->index=0;
135
#elif defined LIBMPEG2_BITSTREAM_READER
136 17fb5fd3 Michael Niedermayer
#ifdef LIBMPEG2_BITSTREAM_READER_HACK
137 d8e00c09 BERO
  if ((int)buffer&1) {
138
     /* word alignment */
139
    s->cache = (*buffer++)<<24;
140
    s->buffer_ptr = buffer;
141
    s->bit_count = 16-8;
142
  } else
143
#endif
144
  {
145 8db1a1dd Michael Niedermayer
    s->buffer_ptr = buffer;
146
    s->bit_count = 16;
147
    s->cache = 0;
148 d8e00c09 BERO
  }
149 8db1a1dd Michael Niedermayer
#elif defined A32_BITSTREAM_READER
150
    s->buffer_ptr = (uint32_t*)buffer;
151
    s->bit_count = 32;
152
    s->cache0 = 0;
153
    s->cache1 = 0;
154 de6d9b64 Fabrice Bellard
#endif
155 2931ecb9 Arpi
    {
156 8db1a1dd Michael Niedermayer
        OPEN_READER(re, s)
157
        UPDATE_CACHE(re, s)
158 3bb10888 Michael Niedermayer
        UPDATE_CACHE(re, s)
159 8db1a1dd Michael Niedermayer
        CLOSE_READER(re, s)
160 de6d9b64 Fabrice Bellard
    }
161 8db1a1dd Michael Niedermayer
#ifdef A32_BITSTREAM_READER
162
    s->cache1 = 0;
163 27a3e2c5 Michael Niedermayer
#endif
164 8db1a1dd Michael Niedermayer
}
165 de6d9b64 Fabrice Bellard
166 17fb5fd3 Michael Niedermayer
/** 
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
190 de6d9b64 Fabrice Bellard
void align_get_bits(GetBitContext *s)
191
{
192 8db1a1dd Michael Niedermayer
    int n= (-get_bits_count(s)) & 7;
193
    if(n) skip_bits(s, n);
194 de6d9b64 Fabrice Bellard
}
195 27a3e2c5 Michael Niedermayer
196 18f77016 Zdenek Kabelac
int check_marker(GetBitContext *s, const char *msg)
197 49c9325f Michael Niedermayer
{
198
    int bit= get_bits1(s);
199
    if(!bit) printf("Marker bit missing %s\n", msg);
200
201
    return bit;
202
}
203
204 de6d9b64 Fabrice Bellard
/* VLC decoding */
205
206
//#define DEBUG_VLC
207
208
#define GET_DATA(v, table, i, wrap, size) \
209
{\
210 0c1a9eda Zdenek Kabelac
    const uint8_t *ptr = (const uint8_t *)table + i * wrap;\
211 de6d9b64 Fabrice Bellard
    switch(size) {\
212
    case 1:\
213 0c1a9eda Zdenek Kabelac
        v = *(const uint8_t *)ptr;\
214 de6d9b64 Fabrice Bellard
        break;\
215
    case 2:\
216 0c1a9eda Zdenek Kabelac
        v = *(const uint16_t *)ptr;\
217 de6d9b64 Fabrice Bellard
        break;\
218
    default:\
219 0c1a9eda Zdenek Kabelac
        v = *(const uint32_t *)ptr;\
220 de6d9b64 Fabrice Bellard
        break;\
221
    }\
222
}
223
224
225
static int alloc_table(VLC *vlc, int size)
226
{
227
    int index;
228
    index = vlc->table_size;
229
    vlc->table_size += size;
230
    if (vlc->table_size > vlc->table_allocated) {
231
        vlc->table_allocated += (1 << vlc->bits);
232 8e1e6f31 Fabrice Bellard
        vlc->table = av_realloc(vlc->table,
233
                                sizeof(VLC_TYPE) * 2 * vlc->table_allocated);
234 8db1a1dd Michael Niedermayer
        if (!vlc->table)
235 de6d9b64 Fabrice Bellard
            return -1;
236
    }
237
    return index;
238
}
239
240 8db1a1dd Michael Niedermayer
static int build_table(VLC *vlc, int table_nb_bits,
241 de6d9b64 Fabrice Bellard
                       int nb_codes,
242
                       const void *bits, int bits_wrap, int bits_size,
243
                       const void *codes, int codes_wrap, int codes_size,
244 0c1a9eda Zdenek Kabelac
                       uint32_t code_prefix, int n_prefix)
245 de6d9b64 Fabrice Bellard
{
246
    int i, j, k, n, table_size, table_index, nb, n1, index;
247 0c1a9eda Zdenek Kabelac
    uint32_t code;
248 8db1a1dd Michael Niedermayer
    VLC_TYPE (*table)[2];
249 de6d9b64 Fabrice Bellard
250
    table_size = 1 << table_nb_bits;
251
    table_index = alloc_table(vlc, table_size);
252
#ifdef DEBUG_VLC
253 8db1a1dd Michael Niedermayer
    printf("new table index=%d size=%d code_prefix=%x n=%d\n",
254 de6d9b64 Fabrice Bellard
           table_index, table_size, code_prefix, n_prefix);
255
#endif
256
    if (table_index < 0)
257
        return -1;
258 8db1a1dd Michael Niedermayer
    table = &vlc->table[table_index];
259 de6d9b64 Fabrice Bellard
260
    for(i=0;i<table_size;i++) {
261 8db1a1dd Michael Niedermayer
        table[i][1] = 0; //bits
262
        table[i][0] = -1; //codes
263 de6d9b64 Fabrice Bellard
    }
264
265
    /* first pass: map codes and compute auxillary table sizes */
266
    for(i=0;i<nb_codes;i++) {
267
        GET_DATA(n, bits, i, bits_wrap, bits_size);
268
        GET_DATA(code, codes, i, codes_wrap, codes_size);
269
        /* we accept tables with holes */
270
        if (n <= 0)
271
            continue;
272
#if defined(DEBUG_VLC) && 0
273
        printf("i=%d n=%d code=0x%x\n", i, n, code);
274
#endif
275
        /* if code matches the prefix, it is in the table */
276
        n -= n_prefix;
277
        if (n > 0 && (code >> n) == code_prefix) {
278
            if (n <= table_nb_bits) {
279
                /* no need to add another table */
280
                j = (code << (table_nb_bits - n)) & (table_size - 1);
281
                nb = 1 << (table_nb_bits - n);
282
                for(k=0;k<nb;k++) {
283
#ifdef DEBUG_VLC
284
                    printf("%4x: code=%d n=%d\n",
285
                           j, i, n);
286
#endif
287 8db1a1dd Michael Niedermayer
                    if (table[j][1] /*bits*/ != 0) {
288 de6d9b64 Fabrice Bellard
                        fprintf(stderr, "incorrect codes\n");
289 e7124ffc Alex Beregszaszi
                        av_abort();
290 de6d9b64 Fabrice Bellard
                    }
291 8db1a1dd Michael Niedermayer
                    table[j][1] = n; //bits
292
                    table[j][0] = i; //code
293 de6d9b64 Fabrice Bellard
                    j++;
294
                }
295
            } else {
296
                n -= table_nb_bits;
297
                j = (code >> n) & ((1 << table_nb_bits) - 1);
298
#ifdef DEBUG_VLC
299
                printf("%4x: n=%d (subtable)\n",
300
                       j, n);
301
#endif
302
                /* compute table size */
303 8db1a1dd Michael Niedermayer
                n1 = -table[j][1]; //bits
304 de6d9b64 Fabrice Bellard
                if (n > n1)
305
                    n1 = n;
306 8db1a1dd Michael Niedermayer
                table[j][1] = -n1; //bits
307 de6d9b64 Fabrice Bellard
            }
308
        }
309
    }
310
311
    /* second pass : fill auxillary tables recursively */
312
    for(i=0;i<table_size;i++) {
313 8db1a1dd Michael Niedermayer
        n = table[i][1]; //bits
314 de6d9b64 Fabrice Bellard
        if (n < 0) {
315
            n = -n;
316
            if (n > table_nb_bits) {
317
                n = table_nb_bits;
318 8db1a1dd Michael Niedermayer
                table[i][1] = -n; //bits
319 de6d9b64 Fabrice Bellard
            }
320
            index = build_table(vlc, n, nb_codes,
321
                                bits, bits_wrap, bits_size,
322
                                codes, codes_wrap, codes_size,
323
                                (code_prefix << table_nb_bits) | i,
324
                                n_prefix + table_nb_bits);
325
            if (index < 0)
326
                return -1;
327
            /* note: realloc has been done, so reload tables */
328 8db1a1dd Michael Niedermayer
            table = &vlc->table[table_index];
329 6300c80a Michael Niedermayer
            table[i][0] = index; //code
330 de6d9b64 Fabrice Bellard
        }
331
    }
332
    return table_index;
333
}
334
335
336 4e66ab3b Fabrice Bellard
/* Build VLC decoding tables suitable for use with get_vlc().
337

338
   'nb_bits' set thee decoding table size (2^nb_bits) entries. The
339
   bigger it is, the faster is the decoding. But it should not be too
340
   big to save memory and L1 cache. '9' is a good compromise.
341
   
342
   'nb_codes' : number of vlcs codes
343

344
   'bits' : table which gives the size (in bits) of each vlc code.
345

346
   'codes' : table which gives the bit pattern of of each vlc code.
347

348
   'xxx_wrap' : give the number of bytes between each entry of the
349
   'bits' or 'codes' tables.
350

351
   'xxx_size' : gives the number of bytes of each entry of the 'bits'
352
   or 'codes' tables.
353

354
   'wrap' and 'size' allows to use any memory configuration and types
355
   (byte/word/long) to store the 'bits' and 'codes' tables.  
356
*/
357 de6d9b64 Fabrice Bellard
int init_vlc(VLC *vlc, int nb_bits, int nb_codes,
358
             const void *bits, int bits_wrap, int bits_size,
359
             const void *codes, int codes_wrap, int codes_size)
360
{
361
    vlc->bits = nb_bits;
362 8db1a1dd Michael Niedermayer
    vlc->table = NULL;
363 de6d9b64 Fabrice Bellard
    vlc->table_allocated = 0;
364
    vlc->table_size = 0;
365
#ifdef DEBUG_VLC
366
    printf("build table nb_codes=%d\n", nb_codes);
367
#endif
368
369
    if (build_table(vlc, nb_bits, nb_codes,
370
                    bits, bits_wrap, bits_size,
371
                    codes, codes_wrap, codes_size,
372
                    0, 0) < 0) {
373 8db1a1dd Michael Niedermayer
        av_free(vlc->table);
374 de6d9b64 Fabrice Bellard
        return -1;
375
    }
376
    return 0;
377
}
378
379
380
void free_vlc(VLC *vlc)
381
{
382 8db1a1dd Michael Niedermayer
    av_free(vlc->table);
383 de6d9b64 Fabrice Bellard
}
384
385 14bea432 Michael Niedermayer
int64_t ff_gcd(int64_t a, int64_t b){
386 9dbcbd92 Michael Niedermayer
    if(b) return ff_gcd(b, a%b);
387
    else  return a;
388
}