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/atomic.h"
32
#include "libavutil/avassert.h"
33
#include "libavutil/qsort.h"
Zdenek Kabelac's avatar
Zdenek Kabelac committed
34
#include "avcodec.h"
35
#include "internal.h"
36
#include "mathops.h"
37
#include "put_bits.h"
38
#include "vlc.h"
Michael Niedermayer's avatar
Michael Niedermayer committed
39

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

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

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

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

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

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

76 77 78 79 80
    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++)
81 82
            put_bits(pb, 8, src[i]);
        flush_put_bits(pb);
83 84
        memcpy(put_bits_ptr(pb), src + i, 2 * words - i);
        skip_put_bytes(pb, 2 * words - i);
85 86
    }

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

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

92 93 94 95 96 97 98 99 100 101
#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;                                              \
102
    case 4:                                                 \
103 104
        v = *(const uint32_t *)ptr;                         \
        break;                                              \
105 106
    default:                                                \
        av_assert1(0);                                      \
107
    }                                                       \
Fabrice Bellard's avatar
Fabrice Bellard committed
108 109 110
}


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

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

131
typedef struct VLCcode {
Loren Merritt's avatar
Loren Merritt committed
132 133 134 135 136 137 138 139
    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
140
{
141
    const VLCcode *sa = a, *sb = b;
Loren Merritt's avatar
Loren Merritt committed
142 143 144 145 146
    return (sa->code >> 1) - (sb->code >> 1);
}
/**
 * Build VLC decoding tables suitable for use with get_vlc().
 *
147
 * @param vlc            the context to be initialized
Loren Merritt's avatar
Loren Merritt committed
148 149 150 151 152 153 154 155 156 157 158 159 160 161 162
 *
 * @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;
163
    uint32_t code;
Lou Logan's avatar
Lou Logan committed
164
    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
165 166

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

Diego Biurrun's avatar
Diego Biurrun committed
175
    /* first pass: map codes and compute auxiliary table sizes */
Loren Merritt's avatar
Loren Merritt committed
176
    for (i = 0; i < nb_codes; i++) {
177 178
        n      = codes[i].bits;
        code   = codes[i].code;
Loren Merritt's avatar
Loren Merritt committed
179
        symbol = codes[i].symbol;
180
        ff_dlog(NULL, "i=%d n=%d code=0x%x\n", i, n, code);
Loren Merritt's avatar
Loren Merritt committed
181 182 183 184 185 186 187 188 189 190
        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++) {
191
                int bits = table[j][1];
192
                ff_dlog(NULL, "%4x: code=%d n=%d\n", j, i, n);
193
                if (bits != 0 && bits != n) {
Loren Merritt's avatar
Loren Merritt committed
194
                    av_log(NULL, AV_LOG_ERROR, "incorrect codes\n");
195
                    return AVERROR_INVALIDDATA;
Loren Merritt's avatar
Loren Merritt committed
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 221
                }
                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;
222
            ff_dlog(NULL, "%4x: n=%d (subtable)\n",
223
                    j, codes[i].bits + table_nb_bits);
Loren Merritt's avatar
Loren Merritt committed
224 225
            index = build_table(vlc, subtable_bits, k-i, codes+i, flags);
            if (index < 0)
226
                return index;
Loren Merritt's avatar
Loren Merritt committed
227
            /* note: realloc has been done, so reload tables */
228
            table = (volatile VLC_TYPE (*)[2])&vlc->table[table_index];
Loren Merritt's avatar
Loren Merritt committed
229 230 231
            table[j][0] = index; //code
            i = k-1;
        }
Fabrice Bellard's avatar
Fabrice Bellard committed
232
    }
233 234 235 236 237 238

    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
239 240 241 242
    return table_index;
}


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

245
   'nb_bits' sets the decoding table size (2^nb_bits) entries. The
246 247
   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.
248

249 250 251 252 253 254
   '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.

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

257 258 259 260
   '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'
261
   or 'codes' tables. Currently 1,2 and 4 are supported.
262

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

   'use_static' should be set to 1 for tables, which should be freed
267
   with av_free_static(), 0 if ff_free_vlc() will be used.
268
*/
269
int ff_init_vlc_sparse(VLC *vlc_arg, int nb_bits, int nb_codes,
270 271 272 273
                       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
274
{
275 276
    VLCcode *buf;
    int i, j, ret;
277
    VLCcode localbuf[1500]; // the maximum currently needed is 1296 by rv34
278
    VLC localvlc, *vlc;
Loren Merritt's avatar
Loren Merritt committed
279

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

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

298

299
    av_assert0(symbols_size <= 2 || !symbols);
Loren Merritt's avatar
Loren Merritt committed
300 301
    j = 0;
#define COPY(condition)\
302 303 304 305
    for (i = 0; i < nb_codes; i++) {                                        \
        GET_DATA(buf[j].bits, bits, i, bits_wrap, bits_size);               \
        if (!(condition))                                                   \
            continue;                                                       \
306
        if (buf[j].bits > 3*nb_bits || buf[j].bits>32) {                    \
307
            av_log(NULL, AV_LOG_ERROR, "Too long VLC (%d) in init_vlc\n", buf[j].bits);\
308 309
            if (!(flags & INIT_VLC_USE_NEW_STATIC))                         \
                av_free(buf);                                               \
310 311
            return -1;                                                      \
        }                                                                   \
312
        GET_DATA(buf[j].code, codes, i, codes_wrap, codes_size);            \
313
        if (buf[j].code >= (1LL<<buf[j].bits)) {                            \
314
            av_log(NULL, AV_LOG_ERROR, "Invalid code %x 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
}