Statistics
| Branch: | Revision:

ffmpeg / libavcodec / common.c @ bec89a84

History | View | Annotate | Download (10.6 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 de6d9b64 Fabrice Bellard
void init_put_bits(PutBitContext *s, 
48 0c1a9eda Zdenek Kabelac
                   uint8_t *buffer, int buffer_size,
49 de6d9b64 Fabrice Bellard
                   void *opaque,
50 0c1a9eda Zdenek Kabelac
                   void (*write_data)(void *, uint8_t *, int))
51 de6d9b64 Fabrice Bellard
{
52
    s->buf = buffer;
53
    s->buf_end = s->buf + buffer_size;
54
    s->data_out_size = 0;
55 17592475 Michael Niedermayer
    if(write_data!=NULL) 
56
    {
57
            fprintf(stderr, "write Data callback is not supported\n");
58
    }
59 d8cf5aea Michael Niedermayer
#ifdef ALT_BITSTREAM_WRITER
60
    s->index=0;
61
    ((uint32_t*)(s->buf))[0]=0;
62
//    memset(buffer, 0, buffer_size);
63 17592475 Michael Niedermayer
#else
64
    s->buf_ptr = s->buf;
65 d8cf5aea Michael Niedermayer
    s->bit_left=32;
66 17592475 Michael Niedermayer
    s->bit_buf=0;
67
#endif
68 de6d9b64 Fabrice Bellard
}
69
70
/* return the number of bits output */
71 0c1a9eda Zdenek Kabelac
int64_t get_bit_count(PutBitContext *s)
72 de6d9b64 Fabrice Bellard
{
73 17592475 Michael Niedermayer
#ifdef ALT_BITSTREAM_WRITER
74
    return s->data_out_size * 8 + s->index;
75
#else
76 0c1a9eda Zdenek Kabelac
    return (s->buf_ptr - s->buf + s->data_out_size) * 8 + 32 - (int64_t)s->bit_left;
77 17592475 Michael Niedermayer
#endif
78 de6d9b64 Fabrice Bellard
}
79
80
void align_put_bits(PutBitContext *s)
81
{
82 17592475 Michael Niedermayer
#ifdef ALT_BITSTREAM_WRITER
83
    put_bits(s,(  - s->index) & 7,0);
84
#else
85 d8cf5aea Michael Niedermayer
    put_bits(s,s->bit_left & 7,0);
86 17592475 Michael Niedermayer
#endif
87 de6d9b64 Fabrice Bellard
}
88
89
/* pad the end of the output stream with zeros */
90
void flush_put_bits(PutBitContext *s)
91
{
92 17592475 Michael Niedermayer
#ifdef ALT_BITSTREAM_WRITER
93
    align_put_bits(s);
94
#else
95 d8cf5aea Michael Niedermayer
    s->bit_buf<<= s->bit_left;
96
    while (s->bit_left < 32) {
97 de6d9b64 Fabrice Bellard
        /* XXX: should test end of buffer */
98
        *s->buf_ptr++=s->bit_buf >> 24;
99
        s->bit_buf<<=8;
100 d8cf5aea Michael Niedermayer
        s->bit_left+=8;
101 de6d9b64 Fabrice Bellard
    }
102 d8cf5aea Michael Niedermayer
    s->bit_left=32;
103 de6d9b64 Fabrice Bellard
    s->bit_buf=0;
104 17592475 Michael Niedermayer
#endif
105 de6d9b64 Fabrice Bellard
}
106
107 9717dad8 Michael Niedermayer
void put_string(PutBitContext * pbc, char *s)
108
{
109
    while(*s){
110
        put_bits(pbc, 8, *s);
111
        s++;
112
    }
113
    put_bits(pbc, 8, 0);
114
}
115
116 de6d9b64 Fabrice Bellard
/* bit input functions */
117
118 8db1a1dd Michael Niedermayer
void init_get_bits(GetBitContext *s,
119 ae39132d Zdenek Kabelac
                   const uint8_t *buffer, int bit_size)
120 de6d9b64 Fabrice Bellard
{
121 68f593b4 Michael Niedermayer
    const int buffer_size= (bit_size+7)>>3;
122
123 27a3e2c5 Michael Niedermayer
    s->buffer= buffer;
124 68f593b4 Michael Niedermayer
    s->size_in_bits= bit_size;
125 8db1a1dd Michael Niedermayer
    s->buffer_end= buffer + buffer_size;
126
#ifdef ALT_BITSTREAM_READER
127
    s->index=0;
128
#elif defined LIBMPEG2_BITSTREAM_READER
129
    s->buffer_ptr = buffer;
130
    s->bit_count = 16;
131
    s->cache = 0;
132
#elif defined A32_BITSTREAM_READER
133
    s->buffer_ptr = (uint32_t*)buffer;
134
    s->bit_count = 32;
135
    s->cache0 = 0;
136
    s->cache1 = 0;
137 de6d9b64 Fabrice Bellard
#endif
138 2931ecb9 Arpi
    {
139 8db1a1dd Michael Niedermayer
        OPEN_READER(re, s)
140
        UPDATE_CACHE(re, s)
141
//        UPDATE_CACHE(re, s)
142
        CLOSE_READER(re, s)
143 de6d9b64 Fabrice Bellard
    }
144 8db1a1dd Michael Niedermayer
#ifdef A32_BITSTREAM_READER
145
    s->cache1 = 0;
146 27a3e2c5 Michael Niedermayer
#endif
147 8db1a1dd Michael Niedermayer
}
148 de6d9b64 Fabrice Bellard
149
void align_get_bits(GetBitContext *s)
150
{
151 8db1a1dd Michael Niedermayer
    int n= (-get_bits_count(s)) & 7;
152
    if(n) skip_bits(s, n);
153 de6d9b64 Fabrice Bellard
}
154 27a3e2c5 Michael Niedermayer
155 18f77016 Zdenek Kabelac
int check_marker(GetBitContext *s, const char *msg)
156 49c9325f Michael Niedermayer
{
157
    int bit= get_bits1(s);
158
    if(!bit) printf("Marker bit missing %s\n", msg);
159
160
    return bit;
161
}
162
163 de6d9b64 Fabrice Bellard
/* VLC decoding */
164
165
//#define DEBUG_VLC
166
167
#define GET_DATA(v, table, i, wrap, size) \
168
{\
169 0c1a9eda Zdenek Kabelac
    const uint8_t *ptr = (const uint8_t *)table + i * wrap;\
170 de6d9b64 Fabrice Bellard
    switch(size) {\
171
    case 1:\
172 0c1a9eda Zdenek Kabelac
        v = *(const uint8_t *)ptr;\
173 de6d9b64 Fabrice Bellard
        break;\
174
    case 2:\
175 0c1a9eda Zdenek Kabelac
        v = *(const uint16_t *)ptr;\
176 de6d9b64 Fabrice Bellard
        break;\
177
    default:\
178 0c1a9eda Zdenek Kabelac
        v = *(const uint32_t *)ptr;\
179 de6d9b64 Fabrice Bellard
        break;\
180
    }\
181
}
182
183
184
static int alloc_table(VLC *vlc, int size)
185
{
186
    int index;
187
    index = vlc->table_size;
188
    vlc->table_size += size;
189
    if (vlc->table_size > vlc->table_allocated) {
190
        vlc->table_allocated += (1 << vlc->bits);
191 8e1e6f31 Fabrice Bellard
        vlc->table = av_realloc(vlc->table,
192
                                sizeof(VLC_TYPE) * 2 * vlc->table_allocated);
193 8db1a1dd Michael Niedermayer
        if (!vlc->table)
194 de6d9b64 Fabrice Bellard
            return -1;
195
    }
196
    return index;
197
}
198
199 8db1a1dd Michael Niedermayer
static int build_table(VLC *vlc, int table_nb_bits,
200 de6d9b64 Fabrice Bellard
                       int nb_codes,
201
                       const void *bits, int bits_wrap, int bits_size,
202
                       const void *codes, int codes_wrap, int codes_size,
203 0c1a9eda Zdenek Kabelac
                       uint32_t code_prefix, int n_prefix)
204 de6d9b64 Fabrice Bellard
{
205
    int i, j, k, n, table_size, table_index, nb, n1, index;
206 0c1a9eda Zdenek Kabelac
    uint32_t code;
207 8db1a1dd Michael Niedermayer
    VLC_TYPE (*table)[2];
208 de6d9b64 Fabrice Bellard
209
    table_size = 1 << table_nb_bits;
210
    table_index = alloc_table(vlc, table_size);
211
#ifdef DEBUG_VLC
212 8db1a1dd Michael Niedermayer
    printf("new table index=%d size=%d code_prefix=%x n=%d\n",
213 de6d9b64 Fabrice Bellard
           table_index, table_size, code_prefix, n_prefix);
214
#endif
215
    if (table_index < 0)
216
        return -1;
217 8db1a1dd Michael Niedermayer
    table = &vlc->table[table_index];
218 de6d9b64 Fabrice Bellard
219
    for(i=0;i<table_size;i++) {
220 8db1a1dd Michael Niedermayer
        table[i][1] = 0; //bits
221
        table[i][0] = -1; //codes
222 de6d9b64 Fabrice Bellard
    }
223
224
    /* first pass: map codes and compute auxillary table sizes */
225
    for(i=0;i<nb_codes;i++) {
226
        GET_DATA(n, bits, i, bits_wrap, bits_size);
227
        GET_DATA(code, codes, i, codes_wrap, codes_size);
228
        /* we accept tables with holes */
229
        if (n <= 0)
230
            continue;
231
#if defined(DEBUG_VLC) && 0
232
        printf("i=%d n=%d code=0x%x\n", i, n, code);
233
#endif
234
        /* if code matches the prefix, it is in the table */
235
        n -= n_prefix;
236
        if (n > 0 && (code >> n) == code_prefix) {
237
            if (n <= table_nb_bits) {
238
                /* no need to add another table */
239
                j = (code << (table_nb_bits - n)) & (table_size - 1);
240
                nb = 1 << (table_nb_bits - n);
241
                for(k=0;k<nb;k++) {
242
#ifdef DEBUG_VLC
243
                    printf("%4x: code=%d n=%d\n",
244
                           j, i, n);
245
#endif
246 8db1a1dd Michael Niedermayer
                    if (table[j][1] /*bits*/ != 0) {
247 de6d9b64 Fabrice Bellard
                        fprintf(stderr, "incorrect codes\n");
248
                        exit(1);
249
                    }
250 8db1a1dd Michael Niedermayer
                    table[j][1] = n; //bits
251
                    table[j][0] = i; //code
252 de6d9b64 Fabrice Bellard
                    j++;
253
                }
254
            } else {
255
                n -= table_nb_bits;
256
                j = (code >> n) & ((1 << table_nb_bits) - 1);
257
#ifdef DEBUG_VLC
258
                printf("%4x: n=%d (subtable)\n",
259
                       j, n);
260
#endif
261
                /* compute table size */
262 8db1a1dd Michael Niedermayer
                n1 = -table[j][1]; //bits
263 de6d9b64 Fabrice Bellard
                if (n > n1)
264
                    n1 = n;
265 8db1a1dd Michael Niedermayer
                table[j][1] = -n1; //bits
266 de6d9b64 Fabrice Bellard
            }
267
        }
268
    }
269
270
    /* second pass : fill auxillary tables recursively */
271
    for(i=0;i<table_size;i++) {
272 8db1a1dd Michael Niedermayer
        n = table[i][1]; //bits
273 de6d9b64 Fabrice Bellard
        if (n < 0) {
274
            n = -n;
275
            if (n > table_nb_bits) {
276
                n = table_nb_bits;
277 8db1a1dd Michael Niedermayer
                table[i][1] = -n; //bits
278 de6d9b64 Fabrice Bellard
            }
279
            index = build_table(vlc, n, nb_codes,
280
                                bits, bits_wrap, bits_size,
281
                                codes, codes_wrap, codes_size,
282
                                (code_prefix << table_nb_bits) | i,
283
                                n_prefix + table_nb_bits);
284
            if (index < 0)
285
                return -1;
286
            /* note: realloc has been done, so reload tables */
287 8db1a1dd Michael Niedermayer
            table = &vlc->table[table_index];
288 6300c80a Michael Niedermayer
            table[i][0] = index; //code
289 de6d9b64 Fabrice Bellard
        }
290
    }
291
    return table_index;
292
}
293
294
295 4e66ab3b Fabrice Bellard
/* Build VLC decoding tables suitable for use with get_vlc().
296

297
   'nb_bits' set thee decoding table size (2^nb_bits) entries. The
298
   bigger it is, the faster is the decoding. But it should not be too
299
   big to save memory and L1 cache. '9' is a good compromise.
300
   
301
   'nb_codes' : number of vlcs codes
302

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

305
   'codes' : table which gives the bit pattern of of each vlc code.
306

307
   'xxx_wrap' : give the number of bytes between each entry of the
308
   'bits' or 'codes' tables.
309

310
   'xxx_size' : gives the number of bytes of each entry of the 'bits'
311
   or 'codes' tables.
312

313
   'wrap' and 'size' allows to use any memory configuration and types
314
   (byte/word/long) to store the 'bits' and 'codes' tables.  
315
*/
316 de6d9b64 Fabrice Bellard
int init_vlc(VLC *vlc, int nb_bits, int nb_codes,
317
             const void *bits, int bits_wrap, int bits_size,
318
             const void *codes, int codes_wrap, int codes_size)
319
{
320
    vlc->bits = nb_bits;
321 8db1a1dd Michael Niedermayer
    vlc->table = NULL;
322 de6d9b64 Fabrice Bellard
    vlc->table_allocated = 0;
323
    vlc->table_size = 0;
324
#ifdef DEBUG_VLC
325
    printf("build table nb_codes=%d\n", nb_codes);
326
#endif
327
328
    if (build_table(vlc, nb_bits, nb_codes,
329
                    bits, bits_wrap, bits_size,
330
                    codes, codes_wrap, codes_size,
331
                    0, 0) < 0) {
332 8db1a1dd Michael Niedermayer
        av_free(vlc->table);
333 de6d9b64 Fabrice Bellard
        return -1;
334
    }
335
    return 0;
336
}
337
338
339
void free_vlc(VLC *vlc)
340
{
341 8db1a1dd Michael Niedermayer
    av_free(vlc->table);
342 de6d9b64 Fabrice Bellard
}
343
344 9dbcbd92 Michael Niedermayer
int ff_gcd(int a, int b){
345
    if(b) return ff_gcd(b, a%b);
346
    else  return a;
347
}
348 5d3cea3a Michael Niedermayer
349
void ff_float2fraction(int *nom_arg, int *denom_arg, double f, int max){
350
    double best_diff=1E10, diff;
351
    int best_denom=1, best_nom=1;
352
    int nom, denom, gcd;
353
    
354
    //brute force here, perhaps we should try continued fractions if we need large max ...
355
    for(denom=1; denom<=max; denom++){
356
        nom= (int)(f*denom + 0.5);
357
        if(nom<=0 || nom>max) continue;
358
        
359
        diff= ABS( f - (double)nom / (double)denom );
360
        if(diff < best_diff){
361
            best_diff= diff;
362
            best_nom= nom;
363
            best_denom= denom;
364
        }
365
    }
366
    
367
    gcd= ff_gcd(best_nom, best_denom);
368
    best_nom   /= gcd;
369
    best_denom /= gcd;
370
371
    *nom_arg= best_nom;
372
    *denom_arg= best_denom;
373
}