libavcodec/bitstream.c
de6d9b64
 /*
  * Common bit i/o utils
406792e7
  * Copyright (c) 2000, 2001 Fabrice Bellard
8f2ab833
  * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
32240799
  * Copyright (c) 2010 Loren Merritt
de6d9b64
  *
7b94177e
  * alternative bitstream reader & writer by Michael Niedermayer <michaelni@gmx.at>
  *
b78e7197
  * This file is part of FFmpeg.
  *
  * FFmpeg is free software; you can redistribute it and/or
ff4ec49e
  * modify it under the terms of the GNU Lesser General Public
  * License as published by the Free Software Foundation; either
b78e7197
  * version 2.1 of the License, or (at your option) any later version.
de6d9b64
  *
b78e7197
  * FFmpeg is distributed in the hope that it will be useful,
de6d9b64
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
ff4ec49e
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  * Lesser General Public License for more details.
de6d9b64
  *
ff4ec49e
  * You should have received a copy of the GNU Lesser General Public
b78e7197
  * License along with FFmpeg; if not, write to the Free Software
5509bffa
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
de6d9b64
  */
983e3246
 
 /**
ba87f080
  * @file
caa336b4
  * bitstream api.
983e3246
  */
115329f1
 
df595131
 #include "avcodec.h"
9106a698
 #include "get_bits.h"
b2755007
 #include "put_bits.h"
c81f0349
 
676d380f
 const uint8_t ff_log2_run[41]={
b3bf98aa
  0, 0, 0, 0, 1, 1, 1, 1,
  2, 2, 2, 2, 3, 3, 3, 3,
  4, 4, 5, 5, 6, 6, 7, 7,
676d380f
  8, 9,10,11,12,13,14,15,
 16,17,18,19,20,21,22,23,
 24,
b3bf98aa
 };
 
9f51c682
 void avpriv_align_put_bits(PutBitContext *s)
de6d9b64
 {
d8cf5aea
     put_bits(s,s->bit_left & 7,0);
de6d9b64
 }
 
587edd6a
 void ff_put_string(PutBitContext *pb, const char *string, int terminate_string)
9717dad8
 {
587edd6a
     while(*string){
         put_bits(pb, 8, *string);
         string++;
9717dad8
     }
54b02ccd
     if(terminate_string)
587edd6a
         put_bits(pb, 8, 0);
9717dad8
 }
 
9f51c682
 void avpriv_copy_bits(PutBitContext *pb, const uint8_t *src, int length)
98f7b56b
 {
     int words= length>>4;
     int bits= length&15;
     int i;
 
     if(length==0) return;
 
49fb20cb
     if(CONFIG_SMALL || words < 16 || put_bits_count(pb)&7){
ec62d942
         for(i=0; i<words; i++) put_bits(pb, 16, AV_RB16(src + 2*i));
98f7b56b
     }else{
         for(i=0; put_bits_count(pb)&31; i++)
             put_bits(pb, 8, src[i]);
         flush_put_bits(pb);
fb53b4a0
         memcpy(put_bits_ptr(pb), src+i, 2*words-i);
98f7b56b
         skip_put_bytes(pb, 2*words-i);
     }
 
ec62d942
     put_bits(pb, bits, AV_RB16(src + 2*words)>>(16-bits));
98f7b56b
 }
 
de6d9b64
 /* VLC decoding */
 
 #define GET_DATA(v, table, i, wrap, size) \
 {\
0c1a9eda
     const uint8_t *ptr = (const uint8_t *)table + i * wrap;\
de6d9b64
     switch(size) {\
     case 1:\
0c1a9eda
         v = *(const uint8_t *)ptr;\
de6d9b64
         break;\
     case 2:\
0c1a9eda
         v = *(const uint16_t *)ptr;\
de6d9b64
         break;\
     default:\
0c1a9eda
         v = *(const uint32_t *)ptr;\
de6d9b64
         break;\
     }\
 }
 
 
073c2593
 static int alloc_table(VLC *vlc, int size, int use_static)
de6d9b64
 {
     int index;
     index = vlc->table_size;
     vlc->table_size += size;
     if (vlc->table_size > vlc->table_allocated) {
e518a49f
         if(use_static)
da9cea77
             abort(); // cannot do anything, init_vlc() is used with too little memory
de6d9b64
         vlc->table_allocated += (1 << vlc->bits);
198ed647
         vlc->table = av_realloc_f(vlc->table,
                                   vlc->table_allocated, sizeof(VLC_TYPE) * 2);
8db1a1dd
         if (!vlc->table)
de6d9b64
             return -1;
     }
     return index;
 }
 
32240799
 static av_always_inline uint32_t bitswap_32(uint32_t x) {
19d824e4
     return (uint32_t)av_reverse[x&0xFF]<<24
          | (uint32_t)av_reverse[(x>>8)&0xFF]<<16
          | (uint32_t)av_reverse[(x>>16)&0xFF]<<8
          | (uint32_t)av_reverse[x>>24];
32240799
 }
 
 typedef struct {
     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)
de6d9b64
 {
32240799
     const VLCcode *sa=a, *sb=b;
     return (sa->code >> 1) - (sb->code >> 1);
 }
 
 /**
  * Build VLC decoding tables suitable for use with get_vlc().
  *
  * @param vlc            the context to be initted
  *
  * @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;
0c1a9eda
     uint32_t code;
8db1a1dd
     VLC_TYPE (*table)[2];
de6d9b64
 
     table_size = 1 << table_nb_bits;
2e909b3c
     if (table_nb_bits > 30)
        return -1;
595324e1
     table_index = alloc_table(vlc, table_size, flags & INIT_VLC_USE_NEW_STATIC);
02a8d43a
     av_dlog(NULL, "new table index=%d size=%d\n", table_index, table_size);
de6d9b64
     if (table_index < 0)
         return -1;
8db1a1dd
     table = &vlc->table[table_index];
de6d9b64
 
b23cf13c
     for (i = 0; i < table_size; i++) {
8db1a1dd
         table[i][1] = 0; //bits
         table[i][0] = -1; //codes
de6d9b64
     }
 
     /* first pass: map codes and compute auxillary table sizes */
b23cf13c
     for (i = 0; i < nb_codes; i++) {
32240799
         n = codes[i].bits;
         code = codes[i].code;
         symbol = codes[i].symbol;
02a8d43a
         av_dlog(NULL, "i=%d n=%d code=0x%x\n", i, n, code);
b23cf13c
         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++) {
02a8d43a
                 av_dlog(NULL, "%4x: code=%d n=%d\n", j, i, n);
b23cf13c
                 if (table[j][1] /*bits*/ != 0) {
                     av_log(NULL, AV_LOG_ERROR, "incorrect codes\n");
                     return -1;
                 }
                 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;
02a8d43a
             av_dlog(NULL, "%4x: n=%d (subtable)\n",
                     j, codes[i].bits + table_nb_bits);
b23cf13c
             index = build_table(vlc, subtable_bits, k-i, codes+i, flags);
             if (index < 0)
                 return -1;
             /* note: realloc has been done, so reload tables */
             table = &vlc->table[table_index];
             table[j][0] = index; //code
             i = k-1;
         }
de6d9b64
     }
     return table_index;
 }
 
 
4e66ab3b
 /* Build VLC decoding tables suitable for use with get_vlc().
 
    'nb_bits' set thee decoding table size (2^nb_bits) entries. The
    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.
115329f1
 
4e66ab3b
    '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.
 
b613bacc
    'symbols' : table which gives the values to be returned from get_vlc().
 
4e66ab3b
    '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'
    or 'codes' tables.
 
    'wrap' and 'size' allows to use any memory configuration and types
b613bacc
    (byte/word/long) to store the 'bits', 'codes', and 'symbols' tables.
073c2593
 
    'use_static' should be set to 1 for tables, which should be freed
e96b4a53
    with av_free_static(), 0 if ff_free_vlc() will be used.
4e66ab3b
 */
e96b4a53
 int ff_init_vlc_sparse(VLC *vlc, int nb_bits, int nb_codes,
de6d9b64
              const void *bits, int bits_wrap, int bits_size,
073c2593
              const void *codes, int codes_wrap, int codes_size,
b613bacc
              const void *symbols, int symbols_wrap, int symbols_size,
d7645fb9
              int flags)
de6d9b64
 {
f39ab207
     VLCcode *buf;
     int i, j, ret;
32240799
 
de6d9b64
     vlc->bits = nb_bits;
ccc54864
     if(flags & INIT_VLC_USE_NEW_STATIC){
         if(vlc->table_size && vlc->table_size == vlc->table_allocated){
             return 0;
         }else if(vlc->table_size){
             abort(); // fatal error, we are called on a partially initialized table
         }
595324e1
     }else {
073c2593
         vlc->table = NULL;
         vlc->table_allocated = 0;
         vlc->table_size = 0;
     }
 
02a8d43a
     av_dlog(NULL, "build table nb_codes=%d\n", nb_codes);
de6d9b64
 
f39ab207
     buf = av_malloc((nb_codes+1)*sizeof(VLCcode));
 
32240799
     assert(symbols_size <= 2 || !symbols);
     j = 0;
 #define COPY(condition)\
     for (i = 0; i < nb_codes; i++) {\
         GET_DATA(buf[j].bits, bits, i, bits_wrap, bits_size);\
         if (!(condition))\
             continue;\
         GET_DATA(buf[j].code, codes, i, codes_wrap, codes_size);\
         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)\
         else\
             buf[j].symbol = i;\
         j++;\
     }
     COPY(buf[j].bits > nb_bits);
     // qsort is the slowest part of init_vlc, and could probably be improved or avoided
     qsort(buf, j, sizeof(VLCcode), compare_vlcspec);
     COPY(buf[j].bits && buf[j].bits <= nb_bits);
     nb_codes = j;
 
f39ab207
     ret = build_table(vlc, nb_bits, nb_codes, buf, flags);
 
     av_free(buf);
     if (ret < 0) {
85d366fd
         av_freep(&vlc->table);
de6d9b64
         return -1;
     }
ccc54864
     if((flags & INIT_VLC_USE_NEW_STATIC) && vlc->table_size != vlc->table_allocated)
         av_log(NULL, AV_LOG_ERROR, "needed %d had %d\n", vlc->table_size, vlc->table_allocated);
de6d9b64
     return 0;
 }
 
 
e96b4a53
 void ff_free_vlc(VLC *vlc)
de6d9b64
 {
85d366fd
     av_freep(&vlc->table);
de6d9b64
 }