Statistics
| Branch: | Revision:

ffmpeg / libavcodec / bitstream.c @ 6636b7e8

History | View | Annotate | Download (8.5 KB)

1 de6d9b64 Fabrice Bellard
/*
2
 * Common bit i/o utils
3 ff4ec49e Fabrice Bellard
 * Copyright (c) 2000, 2001 Fabrice Bellard.
4 8f2ab833 Michael Niedermayer
 * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
5 de6d9b64 Fabrice Bellard
 *
6 ff4ec49e Fabrice Bellard
 * This library is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU Lesser General Public
8
 * License as published by the Free Software Foundation; either
9
 * version 2 of the License, or (at your option) any later version.
10 de6d9b64 Fabrice Bellard
 *
11 ff4ec49e Fabrice Bellard
 * This library is distributed in the hope that it will be useful,
12 de6d9b64 Fabrice Bellard
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 ff4ec49e Fabrice Bellard
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14
 * Lesser General Public License for more details.
15 de6d9b64 Fabrice Bellard
 *
16 ff4ec49e Fabrice Bellard
 * You should have received a copy of the GNU Lesser General Public
17
 * License along with this library; if not, write to the Free Software
18 5509bffa Diego Biurrun
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19 27a3e2c5 Michael Niedermayer
 *
20 17592475 Michael Niedermayer
 * alternative bitstream reader & writer by Michael Niedermayer <michaelni@gmx.at>
21 de6d9b64 Fabrice Bellard
 */
22 983e3246 Michael Niedermayer
23
/**
24 caa336b4 Michael Niedermayer
 * @file bitstream.c
25
 * bitstream api.
26 983e3246 Michael Niedermayer
 */
27 115329f1 Diego Biurrun
28 df595131 Zdenek Kabelac
#include "avcodec.h"
29 caa336b4 Michael Niedermayer
#include "bitstream.h"
30 c81f0349 Michael Niedermayer
31 de6d9b64 Fabrice Bellard
void align_put_bits(PutBitContext *s)
32
{
33 17592475 Michael Niedermayer
#ifdef ALT_BITSTREAM_WRITER
34
    put_bits(s,(  - s->index) & 7,0);
35
#else
36 d8cf5aea Michael Niedermayer
    put_bits(s,s->bit_left & 7,0);
37 17592475 Michael Niedermayer
#endif
38 de6d9b64 Fabrice Bellard
}
39
40 344b825c Diego Biurrun
void ff_put_string(PutBitContext * pbc, char *s, int put_zero)
41 9717dad8 Michael Niedermayer
{
42
    while(*s){
43
        put_bits(pbc, 8, *s);
44
        s++;
45
    }
46 99683a30 Michael Niedermayer
    if(put_zero)
47
        put_bits(pbc, 8, 0);
48 9717dad8 Michael Niedermayer
}
49
50 de6d9b64 Fabrice Bellard
/* bit input functions */
51
52 115329f1 Diego Biurrun
/**
53 17fb5fd3 Michael Niedermayer
 * reads 0-32 bits.
54
 */
55
unsigned int get_bits_long(GetBitContext *s, int n){
56
    if(n<=17) return get_bits(s, n);
57
    else{
58
        int ret= get_bits(s, 16) << (n-16);
59
        return ret | get_bits(s, n-16);
60
    }
61
}
62
63 115329f1 Diego Biurrun
/**
64 17fb5fd3 Michael Niedermayer
 * shows 0-32 bits.
65
 */
66
unsigned int show_bits_long(GetBitContext *s, int n){
67
    if(n<=17) return show_bits(s, n);
68
    else{
69
        GetBitContext gb= *s;
70
        int ret= get_bits_long(s, n);
71
        *s= gb;
72
        return ret;
73
    }
74
}
75
76 de6d9b64 Fabrice Bellard
void align_get_bits(GetBitContext *s)
77
{
78 8db1a1dd Michael Niedermayer
    int n= (-get_bits_count(s)) & 7;
79
    if(n) skip_bits(s, n);
80 de6d9b64 Fabrice Bellard
}
81 27a3e2c5 Michael Niedermayer
82 18f77016 Zdenek Kabelac
int check_marker(GetBitContext *s, const char *msg)
83 49c9325f Michael Niedermayer
{
84
    int bit= get_bits1(s);
85 9b879566 Michel Bardiaux
    if(!bit)
86 bb270c08 Diego Biurrun
            av_log(NULL, AV_LOG_INFO, "Marker bit missing %s\n", msg);
87 49c9325f Michael Niedermayer
88
    return bit;
89
}
90
91 de6d9b64 Fabrice Bellard
/* VLC decoding */
92
93
//#define DEBUG_VLC
94
95
#define GET_DATA(v, table, i, wrap, size) \
96
{\
97 0c1a9eda Zdenek Kabelac
    const uint8_t *ptr = (const uint8_t *)table + i * wrap;\
98 de6d9b64 Fabrice Bellard
    switch(size) {\
99
    case 1:\
100 0c1a9eda Zdenek Kabelac
        v = *(const uint8_t *)ptr;\
101 de6d9b64 Fabrice Bellard
        break;\
102
    case 2:\
103 0c1a9eda Zdenek Kabelac
        v = *(const uint16_t *)ptr;\
104 de6d9b64 Fabrice Bellard
        break;\
105
    default:\
106 0c1a9eda Zdenek Kabelac
        v = *(const uint32_t *)ptr;\
107 de6d9b64 Fabrice Bellard
        break;\
108
    }\
109
}
110
111
112 073c2593 Burkhard Plaum
static int alloc_table(VLC *vlc, int size, int use_static)
113 de6d9b64 Fabrice Bellard
{
114
    int index;
115
    index = vlc->table_size;
116
    vlc->table_size += size;
117
    if (vlc->table_size > vlc->table_allocated) {
118
        vlc->table_allocated += (1 << vlc->bits);
119 073c2593 Burkhard Plaum
        if(use_static)
120
            vlc->table = av_realloc_static(vlc->table,
121
                                           sizeof(VLC_TYPE) * 2 * vlc->table_allocated);
122
        else
123
            vlc->table = av_realloc(vlc->table,
124
                                    sizeof(VLC_TYPE) * 2 * vlc->table_allocated);
125 8db1a1dd Michael Niedermayer
        if (!vlc->table)
126 de6d9b64 Fabrice Bellard
            return -1;
127
    }
128
    return index;
129
}
130
131 8db1a1dd Michael Niedermayer
static int build_table(VLC *vlc, int table_nb_bits,
132 de6d9b64 Fabrice Bellard
                       int nb_codes,
133
                       const void *bits, int bits_wrap, int bits_size,
134
                       const void *codes, int codes_wrap, int codes_size,
135 cea27ac7 Michael Niedermayer
                       uint32_t code_prefix, int n_prefix, int flags)
136 de6d9b64 Fabrice Bellard
{
137 cea27ac7 Michael Niedermayer
    int i, j, k, n, table_size, table_index, nb, n1, index, code_prefix2;
138 0c1a9eda Zdenek Kabelac
    uint32_t code;
139 8db1a1dd Michael Niedermayer
    VLC_TYPE (*table)[2];
140 de6d9b64 Fabrice Bellard
141
    table_size = 1 << table_nb_bits;
142 cea27ac7 Michael Niedermayer
    table_index = alloc_table(vlc, table_size, flags & INIT_VLC_USE_STATIC);
143 de6d9b64 Fabrice Bellard
#ifdef DEBUG_VLC
144 8db1a1dd Michael Niedermayer
    printf("new table index=%d size=%d code_prefix=%x n=%d\n",
145 de6d9b64 Fabrice Bellard
           table_index, table_size, code_prefix, n_prefix);
146
#endif
147
    if (table_index < 0)
148
        return -1;
149 8db1a1dd Michael Niedermayer
    table = &vlc->table[table_index];
150 de6d9b64 Fabrice Bellard
151
    for(i=0;i<table_size;i++) {
152 8db1a1dd Michael Niedermayer
        table[i][1] = 0; //bits
153
        table[i][0] = -1; //codes
154 de6d9b64 Fabrice Bellard
    }
155
156
    /* first pass: map codes and compute auxillary table sizes */
157
    for(i=0;i<nb_codes;i++) {
158
        GET_DATA(n, bits, i, bits_wrap, bits_size);
159
        GET_DATA(code, codes, i, codes_wrap, codes_size);
160
        /* we accept tables with holes */
161
        if (n <= 0)
162
            continue;
163
#if defined(DEBUG_VLC) && 0
164
        printf("i=%d n=%d code=0x%x\n", i, n, code);
165
#endif
166
        /* if code matches the prefix, it is in the table */
167
        n -= n_prefix;
168 cea27ac7 Michael Niedermayer
        if(flags & INIT_VLC_LE)
169
            code_prefix2= code & (n_prefix>=32 ? 0xffffffff : (1 << n_prefix)-1);
170
        else
171
            code_prefix2= code >> n;
172
        if (n > 0 && code_prefix2 == code_prefix) {
173 de6d9b64 Fabrice Bellard
            if (n <= table_nb_bits) {
174
                /* no need to add another table */
175
                j = (code << (table_nb_bits - n)) & (table_size - 1);
176
                nb = 1 << (table_nb_bits - n);
177
                for(k=0;k<nb;k++) {
178 cea27ac7 Michael Niedermayer
                    if(flags & INIT_VLC_LE)
179
                        j = (code >> n_prefix) + (k<<n);
180 de6d9b64 Fabrice Bellard
#ifdef DEBUG_VLC
181 3d0ef6dd Michael Niedermayer
                    av_log(NULL, AV_LOG_DEBUG, "%4x: code=%d n=%d\n",
182 de6d9b64 Fabrice Bellard
                           j, i, n);
183
#endif
184 8db1a1dd Michael Niedermayer
                    if (table[j][1] /*bits*/ != 0) {
185 9b879566 Michel Bardiaux
                        av_log(NULL, AV_LOG_ERROR, "incorrect codes\n");
186 9fe5a7b8 Michael Niedermayer
                        return -1;
187 de6d9b64 Fabrice Bellard
                    }
188 8db1a1dd Michael Niedermayer
                    table[j][1] = n; //bits
189
                    table[j][0] = i; //code
190 de6d9b64 Fabrice Bellard
                    j++;
191
                }
192
            } else {
193
                n -= table_nb_bits;
194 cea27ac7 Michael Niedermayer
                j = (code >> ((flags & INIT_VLC_LE) ? n_prefix : n)) & ((1 << table_nb_bits) - 1);
195 de6d9b64 Fabrice Bellard
#ifdef DEBUG_VLC
196
                printf("%4x: n=%d (subtable)\n",
197
                       j, n);
198
#endif
199
                /* compute table size */
200 8db1a1dd Michael Niedermayer
                n1 = -table[j][1]; //bits
201 de6d9b64 Fabrice Bellard
                if (n > n1)
202
                    n1 = n;
203 8db1a1dd Michael Niedermayer
                table[j][1] = -n1; //bits
204 de6d9b64 Fabrice Bellard
            }
205
        }
206
    }
207
208
    /* second pass : fill auxillary tables recursively */
209
    for(i=0;i<table_size;i++) {
210 8db1a1dd Michael Niedermayer
        n = table[i][1]; //bits
211 de6d9b64 Fabrice Bellard
        if (n < 0) {
212
            n = -n;
213
            if (n > table_nb_bits) {
214
                n = table_nb_bits;
215 8db1a1dd Michael Niedermayer
                table[i][1] = -n; //bits
216 de6d9b64 Fabrice Bellard
            }
217
            index = build_table(vlc, n, nb_codes,
218
                                bits, bits_wrap, bits_size,
219
                                codes, codes_wrap, codes_size,
220 cea27ac7 Michael Niedermayer
                                (flags & INIT_VLC_LE) ? (code_prefix | (i << n_prefix)) : ((code_prefix << table_nb_bits) | i),
221
                                n_prefix + table_nb_bits, flags);
222 de6d9b64 Fabrice Bellard
            if (index < 0)
223
                return -1;
224
            /* note: realloc has been done, so reload tables */
225 8db1a1dd Michael Niedermayer
            table = &vlc->table[table_index];
226 6300c80a Michael Niedermayer
            table[i][0] = index; //code
227 de6d9b64 Fabrice Bellard
        }
228
    }
229
    return table_index;
230
}
231
232
233 4e66ab3b Fabrice Bellard
/* Build VLC decoding tables suitable for use with get_vlc().
234

235
   'nb_bits' set thee decoding table size (2^nb_bits) entries. The
236
   bigger it is, the faster is the decoding. But it should not be too
237
   big to save memory and L1 cache. '9' is a good compromise.
238 115329f1 Diego Biurrun

239 4e66ab3b Fabrice Bellard
   'nb_codes' : number of vlcs codes
240

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

243
   'codes' : table which gives the bit pattern of of each vlc code.
244

245
   'xxx_wrap' : give the number of bytes between each entry of the
246
   'bits' or 'codes' tables.
247

248
   'xxx_size' : gives the number of bytes of each entry of the 'bits'
249
   or 'codes' tables.
250

251
   'wrap' and 'size' allows to use any memory configuration and types
252 115329f1 Diego Biurrun
   (byte/word/long) to store the 'bits' and 'codes' tables.
253 073c2593 Burkhard Plaum

254
   'use_static' should be set to 1 for tables, which should be freed
255
   with av_free_static(), 0 if free_vlc() will be used.
256 4e66ab3b Fabrice Bellard
*/
257 de6d9b64 Fabrice Bellard
int init_vlc(VLC *vlc, int nb_bits, int nb_codes,
258
             const void *bits, int bits_wrap, int bits_size,
259 073c2593 Burkhard Plaum
             const void *codes, int codes_wrap, int codes_size,
260
             int use_static)
261 de6d9b64 Fabrice Bellard
{
262
    vlc->bits = nb_bits;
263 073c2593 Burkhard Plaum
    if(!use_static) {
264
        vlc->table = NULL;
265
        vlc->table_allocated = 0;
266
        vlc->table_size = 0;
267
    } else {
268
        /* Static tables are initially always NULL, return
269
           if vlc->table != NULL to avoid double allocation */
270
        if(vlc->table)
271
            return 0;
272
    }
273
274 de6d9b64 Fabrice Bellard
#ifdef DEBUG_VLC
275
    printf("build table nb_codes=%d\n", nb_codes);
276
#endif
277
278
    if (build_table(vlc, nb_bits, nb_codes,
279
                    bits, bits_wrap, bits_size,
280
                    codes, codes_wrap, codes_size,
281 073c2593 Burkhard Plaum
                    0, 0, use_static) < 0) {
282 8db1a1dd Michael Niedermayer
        av_free(vlc->table);
283 de6d9b64 Fabrice Bellard
        return -1;
284
    }
285
    return 0;
286
}
287
288
289
void free_vlc(VLC *vlc)
290
{
291 8db1a1dd Michael Niedermayer
    av_free(vlc->table);
292 de6d9b64 Fabrice Bellard
}