bitstream.c
Go to the documentation of this file.
1 /*
2  * Common bit i/o utils
3  * Copyright (c) 2000, 2001 Fabrice Bellard
4  * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
5  * Copyright (c) 2010 Loren Merritt
6  *
7  * alternative bitstream reader & writer by Michael Niedermayer <michaelni@gmx.at>
8  *
9  * This file is part of FFmpeg.
10  *
11  * FFmpeg is free software; you can redistribute it and/or
12  * modify it under the terms of the GNU Lesser General Public
13  * License as published by the Free Software Foundation; either
14  * version 2.1 of the License, or (at your option) any later version.
15  *
16  * FFmpeg is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19  * Lesser General Public License for more details.
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
24  */
25 
26 /**
27  * @file
28  * bitstream api.
29  */
30 
31 #include "libavutil/avassert.h"
32 #include "avcodec.h"
33 #include "mathops.h"
34 #include "get_bits.h"
35 #include "put_bits.h"
36 
37 const uint8_t ff_log2_run[41]={
38  0, 0, 0, 0, 1, 1, 1, 1,
39  2, 2, 2, 2, 3, 3, 3, 3,
40  4, 4, 5, 5, 6, 6, 7, 7,
41  8, 9,10,11,12,13,14,15,
42 16,17,18,19,20,21,22,23,
43 24,
44 };
45 
47 {
48  put_bits(s,s->bit_left & 7,0);
49 }
50 
51 void avpriv_put_string(PutBitContext *pb, const char *string, int terminate_string)
52 {
53  while(*string){
54  put_bits(pb, 8, *string);
55  string++;
56  }
57  if(terminate_string)
58  put_bits(pb, 8, 0);
59 }
60 
62 {
63  int words= length>>4;
64  int bits= length&15;
65  int i;
66 
67  if(length==0) return;
68 
69  if(CONFIG_SMALL || words < 16 || put_bits_count(pb)&7){
70  for(i=0; i<words; i++) put_bits(pb, 16, AV_RB16(src + 2*i));
71  }else{
72  for(i=0; put_bits_count(pb)&31; i++)
73  put_bits(pb, 8, src[i]);
74  flush_put_bits(pb);
75  memcpy(put_bits_ptr(pb), src+i, 2*words-i);
76  skip_put_bytes(pb, 2*words-i);
77  }
78 
79  put_bits(pb, bits, AV_RB16(src + 2*words)>>(16-bits));
80 }
81 
82 /* VLC decoding */
83 
84 #define GET_DATA(v, table, i, wrap, size) \
85 {\
86  const uint8_t *ptr = (const uint8_t *)table + i * wrap;\
87  switch(size) {\
88  case 1:\
89  v = *(const uint8_t *)ptr;\
90  break;\
91  case 2:\
92  v = *(const uint16_t *)ptr;\
93  break;\
94  default:\
95  v = *(const uint32_t *)ptr;\
96  break;\
97  }\
98 }
99 
100 
101 static int alloc_table(VLC *vlc, int size, int use_static)
102 {
103  int index;
104  index = vlc->table_size;
105  vlc->table_size += size;
106  if (vlc->table_size > vlc->table_allocated) {
107  if(use_static)
108  abort(); // cannot do anything, init_vlc() is used with too little memory
109  vlc->table_allocated += (1 << vlc->bits);
110  vlc->table = av_realloc_f(vlc->table,
111  vlc->table_allocated, sizeof(VLC_TYPE) * 2);
112  if (!vlc->table)
113  return -1;
114  }
115  return index;
116 }
117 
118 static av_always_inline uint32_t bitswap_32(uint32_t x) {
119  return (uint32_t)ff_reverse[x&0xFF]<<24
120  | (uint32_t)ff_reverse[(x>>8)&0xFF]<<16
121  | (uint32_t)ff_reverse[(x>>16)&0xFF]<<8
122  | (uint32_t)ff_reverse[x>>24];
123 }
124 
125 typedef struct {
127  uint16_t symbol;
128  /** codeword, with the first bit-to-be-read in the msb
129  * (even if intended for a little-endian bitstream reader) */
130  uint32_t code;
131 } VLCcode;
132 
133 static int compare_vlcspec(const void *a, const void *b)
134 {
135  const VLCcode *sa=a, *sb=b;
136  return (sa->code >> 1) - (sb->code >> 1);
137 }
138 
139 /**
140  * Build VLC decoding tables suitable for use with get_vlc().
141  *
142  * @param vlc the context to be initted
143  *
144  * @param table_nb_bits max length of vlc codes to store directly in this table
145  * (Longer codes are delegated to subtables.)
146  *
147  * @param nb_codes number of elements in codes[]
148  *
149  * @param codes descriptions of the vlc codes
150  * These must be ordered such that codes going into the same subtable are contiguous.
151  * Sorting by VLCcode.code is sufficient, though not necessary.
152  */
153 static int build_table(VLC *vlc, int table_nb_bits, int nb_codes,
154  VLCcode *codes, int flags)
155 {
156  int table_size, table_index, index, code_prefix, symbol, subtable_bits;
157  int i, j, k, n, nb, inc;
158  uint32_t code;
159  VLC_TYPE (*table)[2];
160 
161  table_size = 1 << table_nb_bits;
162  if (table_nb_bits > 30)
163  return -1;
164  table_index = alloc_table(vlc, table_size, flags & INIT_VLC_USE_NEW_STATIC);
165  av_dlog(NULL, "new table index=%d size=%d\n", table_index, table_size);
166  if (table_index < 0)
167  return -1;
168  table = &vlc->table[table_index];
169 
170  for (i = 0; i < table_size; i++) {
171  table[i][1] = 0; //bits
172  table[i][0] = -1; //codes
173  }
174 
175  /* first pass: map codes and compute auxiliary table sizes */
176  for (i = 0; i < nb_codes; i++) {
177  n = codes[i].bits;
178  code = codes[i].code;
179  symbol = codes[i].symbol;
180  av_dlog(NULL, "i=%d n=%d code=0x%x\n", i, n, code);
181  if (n <= table_nb_bits) {
182  /* no need to add another table */
183  j = code >> (32 - table_nb_bits);
184  nb = 1 << (table_nb_bits - n);
185  inc = 1;
186  if (flags & INIT_VLC_LE) {
187  j = bitswap_32(code);
188  inc = 1 << n;
189  }
190  for (k = 0; k < nb; k++) {
191  av_dlog(NULL, "%4x: code=%d n=%d\n", j, i, n);
192  if (table[j][1] /*bits*/ != 0) {
193  av_log(NULL, AV_LOG_ERROR, "incorrect codes\n");
194  return -1;
195  }
196  table[j][1] = n; //bits
197  table[j][0] = symbol;
198  j += inc;
199  }
200  } else {
201  /* fill auxiliary table recursively */
202  n -= table_nb_bits;
203  code_prefix = code >> (32 - table_nb_bits);
204  subtable_bits = n;
205  codes[i].bits = n;
206  codes[i].code = code << table_nb_bits;
207  for (k = i+1; k < nb_codes; k++) {
208  n = codes[k].bits - table_nb_bits;
209  if (n <= 0)
210  break;
211  code = codes[k].code;
212  if (code >> (32 - table_nb_bits) != code_prefix)
213  break;
214  codes[k].bits = n;
215  codes[k].code = code << table_nb_bits;
216  subtable_bits = FFMAX(subtable_bits, n);
217  }
218  subtable_bits = FFMIN(subtable_bits, table_nb_bits);
219  j = (flags & INIT_VLC_LE) ? bitswap_32(code_prefix) >> (32 - table_nb_bits) : code_prefix;
220  table[j][1] = -subtable_bits;
221  av_dlog(NULL, "%4x: n=%d (subtable)\n",
222  j, codes[i].bits + table_nb_bits);
223  index = build_table(vlc, subtable_bits, k-i, codes+i, flags);
224  if (index < 0)
225  return -1;
226  /* note: realloc has been done, so reload tables */
227  table = &vlc->table[table_index];
228  table[j][0] = index; //code
229  i = k-1;
230  }
231  }
232  return table_index;
233 }
234 
235 
236 /* Build VLC decoding tables suitable for use with get_vlc().
237 
238  'nb_bits' set thee decoding table size (2^nb_bits) entries. The
239  bigger it is, the faster is the decoding. But it should not be too
240  big to save memory and L1 cache. '9' is a good compromise.
241 
242  'nb_codes' : number of vlcs codes
243 
244  'bits' : table which gives the size (in bits) of each vlc code.
245 
246  'codes' : table which gives the bit pattern of of each vlc code.
247 
248  'symbols' : table which gives the values to be returned from get_vlc().
249 
250  'xxx_wrap' : give the number of bytes between each entry of the
251  'bits' or 'codes' tables.
252 
253  'xxx_size' : gives the number of bytes of each entry of the 'bits'
254  or 'codes' tables.
255 
256  'wrap' and 'size' allows to use any memory configuration and types
257  (byte/word/long) to store the 'bits', 'codes', and 'symbols' tables.
258 
259  'use_static' should be set to 1 for tables, which should be freed
260  with av_free_static(), 0 if ff_free_vlc() will be used.
261 */
262 int ff_init_vlc_sparse(VLC *vlc, int nb_bits, int nb_codes,
263  const void *bits, int bits_wrap, int bits_size,
264  const void *codes, int codes_wrap, int codes_size,
265  const void *symbols, int symbols_wrap, int symbols_size,
266  int flags)
267 {
268  VLCcode *buf;
269  int i, j, ret;
270 
271  vlc->bits = nb_bits;
272  if(flags & INIT_VLC_USE_NEW_STATIC){
273  VLC dyn_vlc = *vlc;
274 
275  if (vlc->table_size)
276  return 0;
277 
278  ret = ff_init_vlc_sparse(&dyn_vlc, nb_bits, nb_codes,
279  bits, bits_wrap, bits_size,
280  codes, codes_wrap, codes_size,
281  symbols, symbols_wrap, symbols_size,
282  flags & ~INIT_VLC_USE_NEW_STATIC);
283  av_assert0(ret >= 0);
284  av_assert0(dyn_vlc.table_size <= vlc->table_allocated);
285  if(dyn_vlc.table_size < vlc->table_allocated)
286  av_log(NULL, AV_LOG_ERROR, "needed %d had %d\n", dyn_vlc.table_size, vlc->table_allocated);
287  memcpy(vlc->table, dyn_vlc.table, dyn_vlc.table_size * sizeof(*vlc->table));
288  vlc->table_size = dyn_vlc.table_size;
289  ff_free_vlc(&dyn_vlc);
290  return 0;
291  }else {
292  vlc->table = NULL;
293  vlc->table_allocated = 0;
294  vlc->table_size = 0;
295  }
296 
297  av_dlog(NULL, "build table nb_codes=%d\n", nb_codes);
298 
299  buf = av_malloc((nb_codes+1)*sizeof(VLCcode));
300 
301  av_assert0(symbols_size <= 2 || !symbols);
302  j = 0;
303 #define COPY(condition)\
304  for (i = 0; i < nb_codes; i++) {\
305  GET_DATA(buf[j].bits, bits, i, bits_wrap, bits_size);\
306  if (!(condition))\
307  continue;\
308  if (buf[j].bits > 3*nb_bits || buf[j].bits>32) {\
309  av_log(NULL, AV_LOG_ERROR, "Too long VLC in init_vlc\n");\
310  return -1;\
311  }\
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 in init_vlc\n");\
315  return -1;\
316  }\
317  if (flags & INIT_VLC_LE)\
318  buf[j].code = bitswap_32(buf[j].code);\
319  else\
320  buf[j].code <<= 32 - buf[j].bits;\
321  if (symbols)\
322  GET_DATA(buf[j].symbol, symbols, i, symbols_wrap, symbols_size)\
323  else\
324  buf[j].symbol = i;\
325  j++;\
326  }
327  COPY(buf[j].bits > nb_bits);
328  // qsort is the slowest part of init_vlc, and could probably be improved or avoided
329  qsort(buf, j, sizeof(VLCcode), compare_vlcspec);
330  COPY(buf[j].bits && buf[j].bits <= nb_bits);
331  nb_codes = j;
332 
333  ret = build_table(vlc, nb_bits, nb_codes, buf, flags);
334 
335  av_free(buf);
336  if (ret < 0) {
337  av_freep(&vlc->table);
338  return -1;
339  }
340  return 0;
341 }
342 
343 
344 void ff_free_vlc(VLC *vlc)
345 {
346  av_freep(&vlc->table);
347 }
const uint8_t ff_log2_run[41]
Definition: bitstream.c:37
int table_size
Definition: get_bits.h:66
const char * s
Definition: avisynth_c.h:668
void * av_realloc_f(void *ptr, size_t nelem, size_t elsize)
Allocate or reallocate a block of memory.
Definition: mem.c:168
void avpriv_copy_bits(PutBitContext *pb, const uint8_t *src, int length)
Copy the content of src to the bitstream.
Definition: bitstream.c:61
void avpriv_align_put_bits(PutBitContext *s)
Pad the bitstream with zeros up to the next byte boundary.
Definition: bitstream.c:46
#define CONFIG_SMALL
Definition: config.h:391
#define VLC_TYPE
Definition: get_bits.h:61
av_dlog(ac->avr,"%d samples - audio_convert: %s to %s (%s)\n", len, av_get_sample_fmt_name(ac->in_fmt), av_get_sample_fmt_name(ac->out_fmt), use_generic?ac->func_descr_generic:ac->func_descr)
static int build_table(VLC *vlc, int table_nb_bits, int nb_codes, VLCcode *codes, int flags)
Build VLC decoding tables suitable for use with get_vlc().
Definition: bitstream.c:153
void av_freep(void *arg)
Free a memory block which has been allocated with av_malloc(z)() or av_realloc() and set the pointer ...
Definition: mem.c:198
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:37
int ff_init_vlc_sparse(VLC *vlc, int nb_bits, int nb_codes, 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)
Definition: bitstream.c:262
uint8_t bits
Definition: crc.c:216
uint8_t
static av_always_inline uint32_t bitswap_32(uint32_t x)
Definition: bitstream.c:118
#define b
Definition: input.c:42
#define COPY(condition)
bitstream reader API header.
Discrete Time axis x
static uint8_t * put_bits_ptr(PutBitContext *s)
Return the pointer to the byte where the bitstream writer will put the next bit.
Definition: put_bits.h:199
void av_free(void *ptr)
Free a memory block which has been allocated with av_malloc(z)() or av_realloc(). ...
Definition: mem.c:183
#define AV_RB16
static const struct endianess table[]
uint32_t code
codeword, with the first bit-to-be-read in the msb (even if intended for a little-endian bitstream re...
Definition: bitstream.c:130
simple assert() macros that are a bit more flexible than ISO C assert().
void av_log(void *avcl, int level, const char *fmt,...)
Definition: log.c:246
static void put_bits(J2kEncoderContext *s, int val, int n)
put n times val bit
Definition: j2kenc.c:160
#define FFMAX(a, b)
Definition: common.h:56
external API header
int size
Definition: get_bits.h:63
static int put_bits_count(PutBitContext *s)
Definition: put_bits.h:73
static void skip_put_bytes(PutBitContext *s, int n)
Skip the given number of bytes.
Definition: put_bits.h:208
#define FFMIN(a, b)
Definition: common.h:58
ret
Definition: avfilter.c:821
uint8_t bits
Definition: bitstream.c:126
uint16_t symbol
Definition: bitstream.c:127
static int compare_vlcspec(const void *a, const void *b)
Definition: bitstream.c:133
#define INIT_VLC_USE_NEW_STATIC
Definition: get_bits.h:443
int bits
Definition: get_bits.h:64
int table_allocated
Definition: get_bits.h:66
for k
NULL
Definition: eval.c:55
or the Software in violation of any applicable export control laws in any jurisdiction Except as provided by mandatorily applicable UPF has no obligation to provide you with source code to the Software In the event Software contains any source code
AVS_Value src
Definition: avisynth_c.h:523
int bit_left
Definition: put_bits.h:43
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:148
void * buf
Definition: avisynth_c.h:594
#define INIT_VLC_LE
Definition: get_bits.h:442
void * av_malloc(size_t size)
Allocate a block of size bytes with alignment suitable for all memory accesses (including vectors if ...
Definition: mem.c:73
int index
Definition: gxfenc.c:89
synthesis window for stochastic i
static int flags
Definition: cpu.c:23
static void flush_put_bits(PutBitContext *s)
Pad the end of the output stream with zeros.
Definition: put_bits.h:81
VLC_TYPE(* table)[2]
code, bits
Definition: get_bits.h:65
void avpriv_put_string(PutBitContext *pb, const char *string, int terminate_string)
Put the string string in the bitstream.
Definition: bitstream.c:51
#define av_always_inline
Definition: attributes.h:41
const uint8_t ff_reverse[256]
Definition: mathtables.c:72
const char int length
Definition: avisynth_c.h:668
void ff_free_vlc(VLC *vlc)
Definition: bitstream.c:344
static int alloc_table(VLC *vlc, int size, int use_static)
Definition: bitstream.c:101
bitstream writer API