Statistics
| Branch: | Revision:

ffmpeg / libavcodec / common.c @ cb231c48

History | View | Annotate | Download (11.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 5fd74135 Michael Niedermayer
#ifdef CONFIG_ENCODERS
71
72 de6d9b64 Fabrice Bellard
/* return the number of bits output */
73 0c1a9eda Zdenek Kabelac
int64_t get_bit_count(PutBitContext *s)
74 de6d9b64 Fabrice Bellard
{
75 17592475 Michael Niedermayer
#ifdef ALT_BITSTREAM_WRITER
76
    return s->data_out_size * 8 + s->index;
77
#else
78 0c1a9eda Zdenek Kabelac
    return (s->buf_ptr - s->buf + s->data_out_size) * 8 + 32 - (int64_t)s->bit_left;
79 17592475 Michael Niedermayer
#endif
80 de6d9b64 Fabrice Bellard
}
81
82
void align_put_bits(PutBitContext *s)
83
{
84 17592475 Michael Niedermayer
#ifdef ALT_BITSTREAM_WRITER
85
    put_bits(s,(  - s->index) & 7,0);
86
#else
87 d8cf5aea Michael Niedermayer
    put_bits(s,s->bit_left & 7,0);
88 17592475 Michael Niedermayer
#endif
89 de6d9b64 Fabrice Bellard
}
90
91 5fd74135 Michael Niedermayer
#endif //CONFIG_ENCODERS
92
93 de6d9b64 Fabrice Bellard
/* pad the end of the output stream with zeros */
94
void flush_put_bits(PutBitContext *s)
95
{
96 17592475 Michael Niedermayer
#ifdef ALT_BITSTREAM_WRITER
97
    align_put_bits(s);
98
#else
99 d8cf5aea Michael Niedermayer
    s->bit_buf<<= s->bit_left;
100
    while (s->bit_left < 32) {
101 de6d9b64 Fabrice Bellard
        /* XXX: should test end of buffer */
102
        *s->buf_ptr++=s->bit_buf >> 24;
103
        s->bit_buf<<=8;
104 d8cf5aea Michael Niedermayer
        s->bit_left+=8;
105 de6d9b64 Fabrice Bellard
    }
106 d8cf5aea Michael Niedermayer
    s->bit_left=32;
107 de6d9b64 Fabrice Bellard
    s->bit_buf=0;
108 17592475 Michael Niedermayer
#endif
109 de6d9b64 Fabrice Bellard
}
110
111 5fd74135 Michael Niedermayer
#ifdef CONFIG_ENCODERS
112
113 9717dad8 Michael Niedermayer
void put_string(PutBitContext * pbc, char *s)
114
{
115
    while(*s){
116
        put_bits(pbc, 8, *s);
117
        s++;
118
    }
119
    put_bits(pbc, 8, 0);
120
}
121
122 de6d9b64 Fabrice Bellard
/* bit input functions */
123
124 5fd74135 Michael Niedermayer
#endif //CONFIG_ENCODERS
125
126 f138f883 Michael Niedermayer
/**
127
 * init GetBitContext.
128
 * @param buffer bitstream buffer, must be FF_INPUT_BUFFER_PADDING_SIZE bytes larger then the actual read bits
129
 * because some optimized bitstream readers read 32 or 64 bit at once and could read over the end
130
 * @param bit_size the size of the buffer in bits
131
 */
132 8db1a1dd Michael Niedermayer
void init_get_bits(GetBitContext *s,
133 ae39132d Zdenek Kabelac
                   const uint8_t *buffer, int bit_size)
134 de6d9b64 Fabrice Bellard
{
135 68f593b4 Michael Niedermayer
    const int buffer_size= (bit_size+7)>>3;
136
137 27a3e2c5 Michael Niedermayer
    s->buffer= buffer;
138 68f593b4 Michael Niedermayer
    s->size_in_bits= bit_size;
139 8db1a1dd Michael Niedermayer
    s->buffer_end= buffer + buffer_size;
140
#ifdef ALT_BITSTREAM_READER
141
    s->index=0;
142
#elif defined LIBMPEG2_BITSTREAM_READER
143 17fb5fd3 Michael Niedermayer
#ifdef LIBMPEG2_BITSTREAM_READER_HACK
144 d8e00c09 BERO
  if ((int)buffer&1) {
145
     /* word alignment */
146
    s->cache = (*buffer++)<<24;
147
    s->buffer_ptr = buffer;
148
    s->bit_count = 16-8;
149
  } else
150
#endif
151
  {
152 8db1a1dd Michael Niedermayer
    s->buffer_ptr = buffer;
153
    s->bit_count = 16;
154
    s->cache = 0;
155 d8e00c09 BERO
  }
156 8db1a1dd Michael Niedermayer
#elif defined A32_BITSTREAM_READER
157
    s->buffer_ptr = (uint32_t*)buffer;
158
    s->bit_count = 32;
159
    s->cache0 = 0;
160
    s->cache1 = 0;
161 de6d9b64 Fabrice Bellard
#endif
162 2931ecb9 Arpi
    {
163 8db1a1dd Michael Niedermayer
        OPEN_READER(re, s)
164
        UPDATE_CACHE(re, s)
165 3bb10888 Michael Niedermayer
        UPDATE_CACHE(re, s)
166 8db1a1dd Michael Niedermayer
        CLOSE_READER(re, s)
167 de6d9b64 Fabrice Bellard
    }
168 8db1a1dd Michael Niedermayer
#ifdef A32_BITSTREAM_READER
169
    s->cache1 = 0;
170 27a3e2c5 Michael Niedermayer
#endif
171 8db1a1dd Michael Niedermayer
}
172 de6d9b64 Fabrice Bellard
173 17fb5fd3 Michael Niedermayer
/** 
174
 * reads 0-32 bits.
175
 */
176
unsigned int get_bits_long(GetBitContext *s, int n){
177
    if(n<=17) return get_bits(s, n);
178
    else{
179
        int ret= get_bits(s, 16) << (n-16);
180
        return ret | get_bits(s, n-16);
181
    }
182
}
183
184
/** 
185
 * shows 0-32 bits.
186
 */
187
unsigned int show_bits_long(GetBitContext *s, int n){
188
    if(n<=17) return show_bits(s, n);
189
    else{
190
        GetBitContext gb= *s;
191
        int ret= get_bits_long(s, n);
192
        *s= gb;
193
        return ret;
194
    }
195
}
196
197 de6d9b64 Fabrice Bellard
void align_get_bits(GetBitContext *s)
198
{
199 8db1a1dd Michael Niedermayer
    int n= (-get_bits_count(s)) & 7;
200
    if(n) skip_bits(s, n);
201 de6d9b64 Fabrice Bellard
}
202 27a3e2c5 Michael Niedermayer
203 18f77016 Zdenek Kabelac
int check_marker(GetBitContext *s, const char *msg)
204 49c9325f Michael Niedermayer
{
205
    int bit= get_bits1(s);
206
    if(!bit) printf("Marker bit missing %s\n", msg);
207
208
    return bit;
209
}
210
211 de6d9b64 Fabrice Bellard
/* VLC decoding */
212
213
//#define DEBUG_VLC
214
215
#define GET_DATA(v, table, i, wrap, size) \
216
{\
217 0c1a9eda Zdenek Kabelac
    const uint8_t *ptr = (const uint8_t *)table + i * wrap;\
218 de6d9b64 Fabrice Bellard
    switch(size) {\
219
    case 1:\
220 0c1a9eda Zdenek Kabelac
        v = *(const uint8_t *)ptr;\
221 de6d9b64 Fabrice Bellard
        break;\
222
    case 2:\
223 0c1a9eda Zdenek Kabelac
        v = *(const uint16_t *)ptr;\
224 de6d9b64 Fabrice Bellard
        break;\
225
    default:\
226 0c1a9eda Zdenek Kabelac
        v = *(const uint32_t *)ptr;\
227 de6d9b64 Fabrice Bellard
        break;\
228
    }\
229
}
230
231
232
static int alloc_table(VLC *vlc, int size)
233
{
234
    int index;
235
    index = vlc->table_size;
236
    vlc->table_size += size;
237
    if (vlc->table_size > vlc->table_allocated) {
238
        vlc->table_allocated += (1 << vlc->bits);
239 8e1e6f31 Fabrice Bellard
        vlc->table = av_realloc(vlc->table,
240
                                sizeof(VLC_TYPE) * 2 * vlc->table_allocated);
241 8db1a1dd Michael Niedermayer
        if (!vlc->table)
242 de6d9b64 Fabrice Bellard
            return -1;
243
    }
244
    return index;
245
}
246
247 8db1a1dd Michael Niedermayer
static int build_table(VLC *vlc, int table_nb_bits,
248 de6d9b64 Fabrice Bellard
                       int nb_codes,
249
                       const void *bits, int bits_wrap, int bits_size,
250
                       const void *codes, int codes_wrap, int codes_size,
251 0c1a9eda Zdenek Kabelac
                       uint32_t code_prefix, int n_prefix)
252 de6d9b64 Fabrice Bellard
{
253
    int i, j, k, n, table_size, table_index, nb, n1, index;
254 0c1a9eda Zdenek Kabelac
    uint32_t code;
255 8db1a1dd Michael Niedermayer
    VLC_TYPE (*table)[2];
256 de6d9b64 Fabrice Bellard
257
    table_size = 1 << table_nb_bits;
258
    table_index = alloc_table(vlc, table_size);
259
#ifdef DEBUG_VLC
260 8db1a1dd Michael Niedermayer
    printf("new table index=%d size=%d code_prefix=%x n=%d\n",
261 de6d9b64 Fabrice Bellard
           table_index, table_size, code_prefix, n_prefix);
262
#endif
263
    if (table_index < 0)
264
        return -1;
265 8db1a1dd Michael Niedermayer
    table = &vlc->table[table_index];
266 de6d9b64 Fabrice Bellard
267
    for(i=0;i<table_size;i++) {
268 8db1a1dd Michael Niedermayer
        table[i][1] = 0; //bits
269
        table[i][0] = -1; //codes
270 de6d9b64 Fabrice Bellard
    }
271
272
    /* first pass: map codes and compute auxillary table sizes */
273
    for(i=0;i<nb_codes;i++) {
274
        GET_DATA(n, bits, i, bits_wrap, bits_size);
275
        GET_DATA(code, codes, i, codes_wrap, codes_size);
276
        /* we accept tables with holes */
277
        if (n <= 0)
278
            continue;
279
#if defined(DEBUG_VLC) && 0
280
        printf("i=%d n=%d code=0x%x\n", i, n, code);
281
#endif
282
        /* if code matches the prefix, it is in the table */
283
        n -= n_prefix;
284
        if (n > 0 && (code >> n) == code_prefix) {
285
            if (n <= table_nb_bits) {
286
                /* no need to add another table */
287
                j = (code << (table_nb_bits - n)) & (table_size - 1);
288
                nb = 1 << (table_nb_bits - n);
289
                for(k=0;k<nb;k++) {
290
#ifdef DEBUG_VLC
291
                    printf("%4x: code=%d n=%d\n",
292
                           j, i, n);
293
#endif
294 8db1a1dd Michael Niedermayer
                    if (table[j][1] /*bits*/ != 0) {
295 de6d9b64 Fabrice Bellard
                        fprintf(stderr, "incorrect codes\n");
296 e7124ffc Alex Beregszaszi
                        av_abort();
297 de6d9b64 Fabrice Bellard
                    }
298 8db1a1dd Michael Niedermayer
                    table[j][1] = n; //bits
299
                    table[j][0] = i; //code
300 de6d9b64 Fabrice Bellard
                    j++;
301
                }
302
            } else {
303
                n -= table_nb_bits;
304
                j = (code >> n) & ((1 << table_nb_bits) - 1);
305
#ifdef DEBUG_VLC
306
                printf("%4x: n=%d (subtable)\n",
307
                       j, n);
308
#endif
309
                /* compute table size */
310 8db1a1dd Michael Niedermayer
                n1 = -table[j][1]; //bits
311 de6d9b64 Fabrice Bellard
                if (n > n1)
312
                    n1 = n;
313 8db1a1dd Michael Niedermayer
                table[j][1] = -n1; //bits
314 de6d9b64 Fabrice Bellard
            }
315
        }
316
    }
317
318
    /* second pass : fill auxillary tables recursively */
319
    for(i=0;i<table_size;i++) {
320 8db1a1dd Michael Niedermayer
        n = table[i][1]; //bits
321 de6d9b64 Fabrice Bellard
        if (n < 0) {
322
            n = -n;
323
            if (n > table_nb_bits) {
324
                n = table_nb_bits;
325 8db1a1dd Michael Niedermayer
                table[i][1] = -n; //bits
326 de6d9b64 Fabrice Bellard
            }
327
            index = build_table(vlc, n, nb_codes,
328
                                bits, bits_wrap, bits_size,
329
                                codes, codes_wrap, codes_size,
330
                                (code_prefix << table_nb_bits) | i,
331
                                n_prefix + table_nb_bits);
332
            if (index < 0)
333
                return -1;
334
            /* note: realloc has been done, so reload tables */
335 8db1a1dd Michael Niedermayer
            table = &vlc->table[table_index];
336 6300c80a Michael Niedermayer
            table[i][0] = index; //code
337 de6d9b64 Fabrice Bellard
        }
338
    }
339
    return table_index;
340
}
341
342
343 4e66ab3b Fabrice Bellard
/* Build VLC decoding tables suitable for use with get_vlc().
344

345
   'nb_bits' set thee decoding table size (2^nb_bits) entries. The
346
   bigger it is, the faster is the decoding. But it should not be too
347
   big to save memory and L1 cache. '9' is a good compromise.
348
   
349
   'nb_codes' : number of vlcs codes
350

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

353
   'codes' : table which gives the bit pattern of of each vlc code.
354

355
   'xxx_wrap' : give the number of bytes between each entry of the
356
   'bits' or 'codes' tables.
357

358
   'xxx_size' : gives the number of bytes of each entry of the 'bits'
359
   or 'codes' tables.
360

361
   'wrap' and 'size' allows to use any memory configuration and types
362
   (byte/word/long) to store the 'bits' and 'codes' tables.  
363
*/
364 de6d9b64 Fabrice Bellard
int init_vlc(VLC *vlc, int nb_bits, int nb_codes,
365
             const void *bits, int bits_wrap, int bits_size,
366
             const void *codes, int codes_wrap, int codes_size)
367
{
368
    vlc->bits = nb_bits;
369 8db1a1dd Michael Niedermayer
    vlc->table = NULL;
370 de6d9b64 Fabrice Bellard
    vlc->table_allocated = 0;
371
    vlc->table_size = 0;
372
#ifdef DEBUG_VLC
373
    printf("build table nb_codes=%d\n", nb_codes);
374
#endif
375
376
    if (build_table(vlc, nb_bits, nb_codes,
377
                    bits, bits_wrap, bits_size,
378
                    codes, codes_wrap, codes_size,
379
                    0, 0) < 0) {
380 8db1a1dd Michael Niedermayer
        av_free(vlc->table);
381 de6d9b64 Fabrice Bellard
        return -1;
382
    }
383
    return 0;
384
}
385
386
387
void free_vlc(VLC *vlc)
388
{
389 8db1a1dd Michael Niedermayer
    av_free(vlc->table);
390 de6d9b64 Fabrice Bellard
}
391
392 14bea432 Michael Niedermayer
int64_t ff_gcd(int64_t a, int64_t b){
393 9dbcbd92 Michael Niedermayer
    if(b) return ff_gcd(b, a%b);
394
    else  return a;
395
}
396 5d3cea3a Michael Niedermayer
397
void ff_float2fraction(int *nom_arg, int *denom_arg, double f, int max){
398
    double best_diff=1E10, diff;
399
    int best_denom=1, best_nom=1;
400
    int nom, denom, gcd;
401
    
402
    //brute force here, perhaps we should try continued fractions if we need large max ...
403
    for(denom=1; denom<=max; denom++){
404
        nom= (int)(f*denom + 0.5);
405
        if(nom<=0 || nom>max) continue;
406
        
407
        diff= ABS( f - (double)nom / (double)denom );
408
        if(diff < best_diff){
409
            best_diff= diff;
410
            best_nom= nom;
411
            best_denom= denom;
412
        }
413
    }
414
    
415
    gcd= ff_gcd(best_nom, best_denom);
416
    best_nom   /= gcd;
417
    best_denom /= gcd;
418
419
    *nom_arg= best_nom;
420
    *denom_arg= best_denom;
421
}