Statistics
| Branch: | Revision:

ffmpeg / libavcodec / common.c @ 8dbcc9f2

History | View | Annotate | Download (10.8 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 9b879566 Michel Bardiaux
    if(!bit)
200
            av_log(NULL, AV_LOG_INFO, "Marker bit missing %s\n", msg);
201 49c9325f Michael Niedermayer
202
    return bit;
203
}
204
205 de6d9b64 Fabrice Bellard
/* VLC decoding */
206
207
//#define DEBUG_VLC
208
209
#define GET_DATA(v, table, i, wrap, size) \
210
{\
211 0c1a9eda Zdenek Kabelac
    const uint8_t *ptr = (const uint8_t *)table + i * wrap;\
212 de6d9b64 Fabrice Bellard
    switch(size) {\
213
    case 1:\
214 0c1a9eda Zdenek Kabelac
        v = *(const uint8_t *)ptr;\
215 de6d9b64 Fabrice Bellard
        break;\
216
    case 2:\
217 0c1a9eda Zdenek Kabelac
        v = *(const uint16_t *)ptr;\
218 de6d9b64 Fabrice Bellard
        break;\
219
    default:\
220 0c1a9eda Zdenek Kabelac
        v = *(const uint32_t *)ptr;\
221 de6d9b64 Fabrice Bellard
        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);
233 8e1e6f31 Fabrice Bellard
        vlc->table = av_realloc(vlc->table,
234
                                sizeof(VLC_TYPE) * 2 * vlc->table_allocated);
235 8db1a1dd Michael Niedermayer
        if (!vlc->table)
236 de6d9b64 Fabrice Bellard
            return -1;
237
    }
238
    return index;
239
}
240
241 8db1a1dd Michael Niedermayer
static int build_table(VLC *vlc, int table_nb_bits,
242 de6d9b64 Fabrice Bellard
                       int nb_codes,
243
                       const void *bits, int bits_wrap, int bits_size,
244
                       const void *codes, int codes_wrap, int codes_size,
245 0c1a9eda Zdenek Kabelac
                       uint32_t code_prefix, int n_prefix)
246 de6d9b64 Fabrice Bellard
{
247
    int i, j, k, n, table_size, table_index, nb, n1, index;
248 0c1a9eda Zdenek Kabelac
    uint32_t code;
249 8db1a1dd Michael Niedermayer
    VLC_TYPE (*table)[2];
250 de6d9b64 Fabrice Bellard
251
    table_size = 1 << table_nb_bits;
252
    table_index = alloc_table(vlc, table_size);
253
#ifdef DEBUG_VLC
254 8db1a1dd Michael Niedermayer
    printf("new table index=%d size=%d code_prefix=%x n=%d\n",
255 de6d9b64 Fabrice Bellard
           table_index, table_size, code_prefix, n_prefix);
256
#endif
257
    if (table_index < 0)
258
        return -1;
259 8db1a1dd Michael Niedermayer
    table = &vlc->table[table_index];
260 de6d9b64 Fabrice Bellard
261
    for(i=0;i<table_size;i++) {
262 8db1a1dd Michael Niedermayer
        table[i][1] = 0; //bits
263
        table[i][0] = -1; //codes
264 de6d9b64 Fabrice Bellard
    }
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
285 3d0ef6dd Michael Niedermayer
                    av_log(NULL, AV_LOG_DEBUG, "%4x: code=%d n=%d\n",
286 de6d9b64 Fabrice Bellard
                           j, i, n);
287
#endif
288 8db1a1dd Michael Niedermayer
                    if (table[j][1] /*bits*/ != 0) {
289 9b879566 Michel Bardiaux
                        av_log(NULL, AV_LOG_ERROR, "incorrect codes\n");
290 e7124ffc Alex Beregszaszi
                        av_abort();
291 de6d9b64 Fabrice Bellard
                    }
292 8db1a1dd Michael Niedermayer
                    table[j][1] = n; //bits
293
                    table[j][0] = i; //code
294 de6d9b64 Fabrice Bellard
                    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 */
304 8db1a1dd Michael Niedermayer
                n1 = -table[j][1]; //bits
305 de6d9b64 Fabrice Bellard
                if (n > n1)
306
                    n1 = n;
307 8db1a1dd Michael Niedermayer
                table[j][1] = -n1; //bits
308 de6d9b64 Fabrice Bellard
            }
309
        }
310
    }
311
312
    /* second pass : fill auxillary tables recursively */
313
    for(i=0;i<table_size;i++) {
314 8db1a1dd Michael Niedermayer
        n = table[i][1]; //bits
315 de6d9b64 Fabrice Bellard
        if (n < 0) {
316
            n = -n;
317
            if (n > table_nb_bits) {
318
                n = table_nb_bits;
319 8db1a1dd Michael Niedermayer
                table[i][1] = -n; //bits
320 de6d9b64 Fabrice Bellard
            }
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 */
329 8db1a1dd Michael Niedermayer
            table = &vlc->table[table_index];
330 6300c80a Michael Niedermayer
            table[i][0] = index; //code
331 de6d9b64 Fabrice Bellard
        }
332
    }
333
    return table_index;
334
}
335
336
337 4e66ab3b Fabrice Bellard
/* 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
*/
358 de6d9b64 Fabrice Bellard
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;
363 8db1a1dd Michael Niedermayer
    vlc->table = NULL;
364 de6d9b64 Fabrice Bellard
    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) {
374 8db1a1dd Michael Niedermayer
        av_free(vlc->table);
375 de6d9b64 Fabrice Bellard
        return -1;
376
    }
377
    return 0;
378
}
379
380
381
void free_vlc(VLC *vlc)
382
{
383 8db1a1dd Michael Niedermayer
    av_free(vlc->table);
384 de6d9b64 Fabrice Bellard
}
385
386 14bea432 Michael Niedermayer
int64_t ff_gcd(int64_t a, int64_t b){
387 9dbcbd92 Michael Niedermayer
    if(b) return ff_gcd(b, a%b);
388
    else  return a;
389
}