bitstream.c 13 KB
Newer Older
Fabrice Bellard's avatar
Fabrice Bellard committed
1 2
/*
 * Common bit i/o utils
3
 * Copyright (c) 2000, 2001 Fabrice Bellard
4
 * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
Loren Merritt's avatar
Loren Merritt committed
5
 * Copyright (c) 2010 Loren Merritt
Fabrice Bellard's avatar
Fabrice Bellard committed
6
 *
7 8
 * alternative bitstream reader & writer by Michael Niedermayer <michaelni@gmx.at>
 *
9 10 11
 * This file is part of FFmpeg.
 *
 * FFmpeg is free software; you can redistribute it and/or
12 13
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
14
 * version 2.1 of the License, or (at your option) any later version.
Fabrice Bellard's avatar
Fabrice Bellard committed
15
 *
16
 * FFmpeg is distributed in the hope that it will be useful,
Fabrice Bellard's avatar
Fabrice Bellard committed
17
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 19
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
Fabrice Bellard's avatar
Fabrice Bellard committed
20
 *
21
 * You should have received a copy of the GNU Lesser General Public
22
 * License along with FFmpeg; if not, write to the Free Software
23
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Fabrice Bellard's avatar
Fabrice Bellard committed
24
 */
Michael Niedermayer's avatar
Michael Niedermayer committed
25 26

/**
27
 * @file
28
 * bitstream api.
Michael Niedermayer's avatar
Michael Niedermayer committed
29
 */
30

31
#include "libavutil/avassert.h"
32
#include "libavutil/qsort.h"
Zdenek Kabelac's avatar
Zdenek Kabelac committed
33
#include "avcodec.h"
34
#include "internal.h"
35
#include "mathops.h"
36
#include "put_bits.h"
37
#include "vlc.h"
Michael Niedermayer's avatar
Michael Niedermayer committed
38

39
const uint8_t ff_log2_run[41]={
40 41 42
 0, 0, 0, 0, 1, 1, 1, 1,
 2, 2, 2, 2, 3, 3, 3, 3,
 4, 4, 5, 5, 6, 6, 7, 7,
43 44 45
 8, 9,10,11,12,13,14,15,
16,17,18,19,20,21,22,23,
24,
46 47
};

48
void avpriv_align_put_bits(PutBitContext *s)
Fabrice Bellard's avatar
Fabrice Bellard committed
49
{
50
    put_bits(s, s->bit_left & 7, 0);
Fabrice Bellard's avatar
Fabrice Bellard committed
51 52
}

53 54
void avpriv_put_string(PutBitContext *pb, const char *string,
                       int terminate_string)
55
{
56
    while (*string) {
57 58
        put_bits(pb, 8, *string);
        string++;
59
    }
60
    if (terminate_string)
61
        put_bits(pb, 8, 0);
62 63
}

64
void avpriv_copy_bits(PutBitContext *pb, const uint8_t *src, int length)
65
{
66 67
    int words = length >> 4;
    int bits  = length & 15;
68 69
    int i;

70 71
    if (length == 0)
        return;
72

73 74
    av_assert0(length <= put_bits_left(pb));

75 76 77 78 79
    if (CONFIG_SMALL || words < 16 || put_bits_count(pb) & 7) {
        for (i = 0; i < words; i++)
            put_bits(pb, 16, AV_RB16(src + 2 * i));
    } else {
        for (i = 0; put_bits_count(pb) & 31; i++)
80 81
            put_bits(pb, 8, src[i]);
        flush_put_bits(pb);
82 83
        memcpy(put_bits_ptr(pb), src + i, 2 * words - i);
        skip_put_bytes(pb, 2 * words - i);
84 85
    }

86
    put_bits(pb, bits, AV_RB16(src + 2 * words) >> (16 - bits));
87 88
}

Fabrice Bellard's avatar
Fabrice Bellard committed
89 90
/* VLC decoding */

91 92 93 94 95 96 97 98 99 100
#define GET_DATA(v, table, i, wrap, size)                   \
{                                                           \
    const uint8_t *ptr = (const uint8_t *)table + i * wrap; \
    switch(size) {                                          \
    case 1:                                                 \
        v = *(const uint8_t *)ptr;                          \
        break;                                              \
    case 2:                                                 \
        v = *(const uint16_t *)ptr;                         \
        break;                                              \
101
    case 4:                                                 \
102 103
        v = *(const uint32_t *)ptr;                         \
        break;                                              \
104 105
    default:                                                \
        av_assert1(0);                                      \
106
    }                                                       \
Fabrice Bellard's avatar
Fabrice Bellard committed
107 108 109
}


110
static int alloc_table(VLC *vlc, int size, int use_static)
Fabrice Bellard's avatar
Fabrice Bellard committed
111
{
112 113
    int index = vlc->table_size;

Fabrice Bellard's avatar
Fabrice Bellard committed
114 115
    vlc->table_size += size;
    if (vlc->table_size > vlc->table_allocated) {
116
        if (use_static)
117
            abort(); // cannot do anything, init_vlc() is used with too little memory
Fabrice Bellard's avatar
Fabrice Bellard committed
118
        vlc->table_allocated += (1 << vlc->bits);
119
        vlc->table = av_realloc_f(vlc->table, vlc->table_allocated, sizeof(VLC_TYPE) * 2);
120
        if (!vlc->table) {
121 122
            vlc->table_allocated = 0;
            vlc->table_size = 0;
123
            return AVERROR(ENOMEM);
124
        }
125
        memset(vlc->table + vlc->table_allocated - (1 << vlc->bits), 0, sizeof(VLC_TYPE) * 2 << vlc->bits);
Fabrice Bellard's avatar
Fabrice Bellard committed
126 127 128 129
    }
    return index;
}

130
typedef struct VLCcode {
Loren Merritt's avatar
Loren Merritt committed
131 132 133 134 135 136 137 138
    uint8_t bits;
    uint16_t symbol;
    /** codeword, with the first bit-to-be-read in the msb
     * (even if intended for a little-endian bitstream reader) */
    uint32_t code;
} VLCcode;

static int compare_vlcspec(const void *a, const void *b)
Fabrice Bellard's avatar
Fabrice Bellard committed
139
{
140
    const VLCcode *sa = a, *sb = b;
Loren Merritt's avatar
Loren Merritt committed
141 142 143 144 145
    return (sa->code >> 1) - (sb->code >> 1);
}
/**
 * Build VLC decoding tables suitable for use with get_vlc().
 *
146
 * @param vlc            the context to be initialized
Loren Merritt's avatar
Loren Merritt committed
147 148 149 150 151 152 153 154 155 156 157 158 159 160 161
 *
 * @param table_nb_bits  max length of vlc codes to store directly in this table
 *                       (Longer codes are delegated to subtables.)
 *
 * @param nb_codes       number of elements in codes[]
 *
 * @param codes          descriptions of the vlc codes
 *                       These must be ordered such that codes going into the same subtable are contiguous.
 *                       Sorting by VLCcode.code is sufficient, though not necessary.
 */
static int build_table(VLC *vlc, int table_nb_bits, int nb_codes,
                       VLCcode *codes, int flags)
{
    int table_size, table_index, index, code_prefix, symbol, subtable_bits;
    int i, j, k, n, nb, inc;
162
    uint32_t code;
Lou Logan's avatar
Lou Logan committed
163
    volatile VLC_TYPE (* volatile table)[2]; // the double volatile is needed to prevent an internal compiler error in gcc 4.2
Fabrice Bellard's avatar
Fabrice Bellard committed
164 165

    table_size = 1 << table_nb_bits;
166 167
    if (table_nb_bits > 30)
       return -1;
168
    table_index = alloc_table(vlc, table_size, flags & INIT_VLC_USE_NEW_STATIC);
169
    ff_dlog(NULL, "new table index=%d size=%d\n", table_index, table_size);
Fabrice Bellard's avatar
Fabrice Bellard committed
170
    if (table_index < 0)
171
        return table_index;
172
    table = (volatile VLC_TYPE (*)[2])&vlc->table[table_index];
Fabrice Bellard's avatar
Fabrice Bellard committed
173

Diego Biurrun's avatar
Diego Biurrun committed
174
    /* first pass: map codes and compute auxiliary table sizes */
Loren Merritt's avatar
Loren Merritt committed
175
    for (i = 0; i < nb_codes; i++) {
176 177
        n      = codes[i].bits;
        code   = codes[i].code;
Loren Merritt's avatar
Loren Merritt committed
178
        symbol = codes[i].symbol;
179
        ff_dlog(NULL, "i=%d n=%d code=0x%"PRIx32"\n", i, n, code);
Loren Merritt's avatar
Loren Merritt committed
180 181 182 183 184 185 186 187 188 189
        if (n <= table_nb_bits) {
            /* no need to add another table */
            j = code >> (32 - table_nb_bits);
            nb = 1 << (table_nb_bits - n);
            inc = 1;
            if (flags & INIT_VLC_LE) {
                j = bitswap_32(code);
                inc = 1 << n;
            }
            for (k = 0; k < nb; k++) {
190
                int bits = table[j][1];
191
                ff_dlog(NULL, "%4x: code=%d n=%d\n", j, i, n);
192
                if (bits != 0 && bits != n) {
Loren Merritt's avatar
Loren Merritt committed
193
                    av_log(NULL, AV_LOG_ERROR, "incorrect codes\n");
194
                    return AVERROR_INVALIDDATA;
Loren Merritt's avatar
Loren Merritt committed
195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220
                }
                table[j][1] = n; //bits
                table[j][0] = symbol;
                j += inc;
            }
        } else {
            /* fill auxiliary table recursively */
            n -= table_nb_bits;
            code_prefix = code >> (32 - table_nb_bits);
            subtable_bits = n;
            codes[i].bits = n;
            codes[i].code = code << table_nb_bits;
            for (k = i+1; k < nb_codes; k++) {
                n = codes[k].bits - table_nb_bits;
                if (n <= 0)
                    break;
                code = codes[k].code;
                if (code >> (32 - table_nb_bits) != code_prefix)
                    break;
                codes[k].bits = n;
                codes[k].code = code << table_nb_bits;
                subtable_bits = FFMAX(subtable_bits, n);
            }
            subtable_bits = FFMIN(subtable_bits, table_nb_bits);
            j = (flags & INIT_VLC_LE) ? bitswap_32(code_prefix) >> (32 - table_nb_bits) : code_prefix;
            table[j][1] = -subtable_bits;
221
            ff_dlog(NULL, "%4x: n=%d (subtable)\n",
222
                    j, codes[i].bits + table_nb_bits);
Loren Merritt's avatar
Loren Merritt committed
223 224
            index = build_table(vlc, subtable_bits, k-i, codes+i, flags);
            if (index < 0)
225
                return index;
Loren Merritt's avatar
Loren Merritt committed
226
            /* note: realloc has been done, so reload tables */
227
            table = (volatile VLC_TYPE (*)[2])&vlc->table[table_index];
Loren Merritt's avatar
Loren Merritt committed
228 229 230
            table[j][0] = index; //code
            i = k-1;
        }
Fabrice Bellard's avatar
Fabrice Bellard committed
231
    }
232 233 234 235 236 237

    for (i = 0; i < table_size; i++) {
        if (table[i][1] == 0) //bits
            table[i][0] = -1; //codes
    }

Fabrice Bellard's avatar
Fabrice Bellard committed
238 239 240 241
    return table_index;
}


242 243
/* Build VLC decoding tables suitable for use with get_vlc().

244
   'nb_bits' sets the decoding table size (2^nb_bits) entries. The
245 246
   bigger it is, the faster is the decoding. But it should not be too
   big to save memory and L1 cache. '9' is a good compromise.
247

248 249 250 251 252 253
   'nb_codes' : number of vlcs codes

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

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

254 255
   'symbols' : table which gives the values to be returned from get_vlc().

256 257 258 259
   'xxx_wrap' : give the number of bytes between each entry of the
   'bits' or 'codes' tables.

   'xxx_size' : gives the number of bytes of each entry of the 'bits'
260
   or 'codes' tables. Currently 1,2 and 4 are supported.
261

262
   'wrap' and 'size' make it possible to use any memory configuration and types
263
   (byte/word/long) to store the 'bits', 'codes', and 'symbols' tables.
264 265

   'use_static' should be set to 1 for tables, which should be freed
266
   with av_free_static(), 0 if ff_free_vlc() will be used.
267
*/
268
int ff_init_vlc_sparse(VLC *vlc_arg, int nb_bits, int nb_codes,
269 270 271 272
                       const void *bits, int bits_wrap, int bits_size,
                       const void *codes, int codes_wrap, int codes_size,
                       const void *symbols, int symbols_wrap, int symbols_size,
                       int flags)
Fabrice Bellard's avatar
Fabrice Bellard committed
273
{
274 275
    VLCcode *buf;
    int i, j, ret;
276
    VLCcode localbuf[1500]; // the maximum currently needed is 1296 by rv34
277
    VLC localvlc, *vlc;
Loren Merritt's avatar
Loren Merritt committed
278

279
    vlc = vlc_arg;
Fabrice Bellard's avatar
Fabrice Bellard committed
280
    vlc->bits = nb_bits;
281
    if (flags & INIT_VLC_USE_NEW_STATIC) {
282 283
        av_assert0(nb_codes + 1 <= FF_ARRAY_ELEMS(localbuf));
        buf = localbuf;
284 285 286
        localvlc = *vlc_arg;
        vlc = &localvlc;
        vlc->table_size = 0;
287 288
    } else {
        vlc->table           = NULL;
289
        vlc->table_allocated = 0;
290
        vlc->table_size      = 0;
291

292
        buf = av_malloc_array((nb_codes + 1), sizeof(VLCcode));
293 294 295
        if (!buf)
            return AVERROR(ENOMEM);
    }
Fabrice Bellard's avatar
Fabrice Bellard committed
296

297

298
    av_assert0(symbols_size <= 2 || !symbols);
Loren Merritt's avatar
Loren Merritt committed
299 300
    j = 0;
#define COPY(condition)\
301 302 303 304
    for (i = 0; i < nb_codes; i++) {                                        \
        GET_DATA(buf[j].bits, bits, i, bits_wrap, bits_size);               \
        if (!(condition))                                                   \
            continue;                                                       \
305
        if (buf[j].bits > 3*nb_bits || buf[j].bits>32) {                    \
306
            av_log(NULL, AV_LOG_ERROR, "Too long VLC (%d) in init_vlc\n", buf[j].bits);\
307 308
            if (!(flags & INIT_VLC_USE_NEW_STATIC))                         \
                av_free(buf);                                               \
309 310
            return -1;                                                      \
        }                                                                   \
311
        GET_DATA(buf[j].code, codes, i, codes_wrap, codes_size);            \
312
        if (buf[j].code >= (1LL<<buf[j].bits)) {                            \
313 314
            av_log(NULL, AV_LOG_ERROR, "Invalid code %"PRIx32" for %d in "  \
                   "init_vlc\n", buf[j].code, i);                           \
315 316
            if (!(flags & INIT_VLC_USE_NEW_STATIC))                         \
                av_free(buf);                                               \
317 318
            return -1;                                                      \
        }                                                                   \
319 320 321 322 323 324
        if (flags & INIT_VLC_LE)                                            \
            buf[j].code = bitswap_32(buf[j].code);                          \
        else                                                                \
            buf[j].code <<= 32 - buf[j].bits;                               \
        if (symbols)                                                        \
            GET_DATA(buf[j].symbol, symbols, i, symbols_wrap, symbols_size) \
325 326
        else                                                                \
            buf[j].symbol = i;                                              \
327
        j++;                                                                \
Loren Merritt's avatar
Loren Merritt committed
328 329 330
    }
    COPY(buf[j].bits > nb_bits);
    // qsort is the slowest part of init_vlc, and could probably be improved or avoided
331
    AV_QSORT(buf, j, struct VLCcode, compare_vlcspec);
Loren Merritt's avatar
Loren Merritt committed
332 333 334
    COPY(buf[j].bits && buf[j].bits <= nb_bits);
    nb_codes = j;

335 336
    ret = build_table(vlc, nb_bits, nb_codes, buf, flags);

337 338 339
    if (flags & INIT_VLC_USE_NEW_STATIC) {
        if(vlc->table_size != vlc->table_allocated)
            av_log(NULL, AV_LOG_ERROR, "needed %d had %d\n", vlc->table_size, vlc->table_allocated);
340

341
        av_assert0(ret >= 0);
342
        *vlc_arg = *vlc;
343
    } else {
344
        av_free(buf);
345 346 347 348
        if (ret < 0) {
            av_freep(&vlc->table);
            return ret;
        }
Fabrice Bellard's avatar
Fabrice Bellard committed
349 350 351 352 353
    }
    return 0;
}


354
void ff_free_vlc(VLC *vlc)
Fabrice Bellard's avatar
Fabrice Bellard committed
355
{
356
    av_freep(&vlc->table);
Fabrice Bellard's avatar
Fabrice Bellard committed
357
}