2 * API for creating VLC trees
3 * Copyright (c) 2000, 2001 Fabrice Bellard
4 * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
5 * Copyright (c) 2010 Loren Merritt
7 * This file is part of FFmpeg.
9 * FFmpeg is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Lesser General Public
11 * License as published by the Free Software Foundation; either
12 * version 2.1 of the License, or (at your option) any later version.
14 * FFmpeg is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * Lesser General Public License for more details.
19 * You should have received a copy of the GNU Lesser General Public
20 * License along with FFmpeg; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
29 #include "libavutil/attributes.h"
30 #include "libavutil/avassert.h"
31 #include "libavutil/error.h"
32 #include "libavutil/internal.h"
33 #include "libavutil/intreadwrite.h"
34 #include "libavutil/log.h"
35 #include "libavutil/macros.h"
36 #include "libavutil/mem.h"
37 #include "libavutil/qsort.h"
38 #include "libavutil/reverse.h"
41 #define GET_DATA(v, table, i, wrap, size) \
43 const uint8_t *ptr = (const uint8_t *)table + i * wrap; \
46 v = *(const uint8_t *)ptr; \
49 v = *(const uint16_t *)ptr; \
53 av_assert1(size == 4); \
54 v = *(const uint32_t *)ptr; \
60 static int alloc_table(VLC
*vlc
, int size
, int use_static
)
62 int index
= vlc
->table_size
;
64 vlc
->table_size
+= size
;
65 if (vlc
->table_size
> vlc
->table_allocated
) {
67 abort(); // cannot do anything, vlc_init() is used with too little memory
68 vlc
->table_allocated
+= (1 << vlc
->bits
);
69 vlc
->table
= av_realloc_f(vlc
->table
, vlc
->table_allocated
, sizeof(*vlc
->table
));
71 vlc
->table_allocated
= 0;
73 return AVERROR(ENOMEM
);
75 memset(vlc
->table
+ vlc
->table_allocated
- (1 << vlc
->bits
), 0, sizeof(*vlc
->table
) << vlc
->bits
);
80 #define LOCALBUF_ELEMS 1500 // the maximum currently needed is 1296 by rv34
82 static av_always_inline
uint32_t bitswap_32(uint32_t x
)
84 return (uint32_t)ff_reverse
[ x
& 0xFF] << 24 |
85 (uint32_t)ff_reverse
[(x
>> 8) & 0xFF] << 16 |
86 (uint32_t)ff_reverse
[(x
>> 16) & 0xFF] << 8 |
87 (uint32_t)ff_reverse
[ x
>> 24];
90 typedef struct VLCcode
{
93 /** codeword, with the first bit-to-be-read in the msb
94 * (even if intended for a little-endian bitstream reader) */
98 static int vlc_common_init(VLC
*vlc
, int nb_bits
, int nb_codes
,
99 VLCcode
**buf
, int flags
)
103 if (flags
& VLC_INIT_USE_STATIC
) {
104 av_assert0(nb_codes
<= LOCALBUF_ELEMS
);
107 vlc
->table_allocated
= 0;
109 if (nb_codes
> LOCALBUF_ELEMS
) {
110 *buf
= av_malloc_array(nb_codes
, sizeof(VLCcode
));
112 return AVERROR(ENOMEM
);
118 static int compare_vlcspec(const void *a
, const void *b
)
120 const VLCcode
*sa
= a
, *sb
= b
;
121 return (sa
->code
>> 1) - (sb
->code
>> 1);
125 * Build VLC decoding tables suitable for use with get_vlc().
127 * @param vlc the context to be initialized
129 * @param table_nb_bits max length of vlc codes to store directly in this table
130 * (Longer codes are delegated to subtables.)
132 * @param nb_codes number of elements in codes[]
134 * @param codes descriptions of the vlc codes
135 * These must be ordered such that codes going into the same subtable are contiguous.
136 * Sorting by VLCcode.code is sufficient, though not necessary.
138 static int build_table(VLC
*vlc
, int table_nb_bits
, int nb_codes
,
139 VLCcode
*codes
, int flags
)
141 int table_size
, table_index
;
144 if (table_nb_bits
> 30)
145 return AVERROR(EINVAL
);
146 table_size
= 1 << table_nb_bits
;
147 table_index
= alloc_table(vlc
, table_size
, flags
& VLC_INIT_USE_STATIC
);
148 ff_dlog(NULL
, "new table index=%d size=%d\n", table_index
, table_size
);
151 table
= &vlc
->table
[table_index
];
153 /* first pass: map codes and compute auxiliary table sizes */
154 for (int i
= 0; i
< nb_codes
; i
++) {
155 int n
= codes
[i
].bits
;
156 uint32_t code
= codes
[i
].code
;
157 int symbol
= codes
[i
].symbol
;
158 ff_dlog(NULL
, "i=%d n=%d code=0x%"PRIx32
"\n", i
, n
, code
);
159 if (n
<= table_nb_bits
) {
160 /* no need to add another table */
161 int j
= code
>> (32 - table_nb_bits
);
162 int nb
= 1 << (table_nb_bits
- n
);
165 if (flags
& VLC_INIT_OUTPUT_LE
) {
166 j
= bitswap_32(code
);
169 for (int k
= 0; k
< nb
; k
++) {
170 int bits
= table
[j
].len
;
171 int oldsym
= table
[j
].sym
;
172 ff_dlog(NULL
, "%4x: code=%d n=%d\n", j
, i
, n
);
173 if ((bits
|| oldsym
) && (bits
!= n
|| oldsym
!= symbol
)) {
174 av_log(NULL
, AV_LOG_ERROR
, "incorrect codes\n");
175 return AVERROR_INVALIDDATA
;
178 table
[j
].sym
= symbol
;
182 /* fill auxiliary table recursively */
183 uint32_t code_prefix
;
184 int index
, subtable_bits
, j
, k
;
187 code_prefix
= code
>> (32 - table_nb_bits
);
190 codes
[i
].code
= code
<< table_nb_bits
;
191 for (k
= i
+ 1; k
< nb_codes
; k
++) {
192 n
= codes
[k
].bits
- table_nb_bits
;
195 code
= codes
[k
].code
;
196 if (code
>> (32 - table_nb_bits
) != code_prefix
)
199 codes
[k
].code
= code
<< table_nb_bits
;
200 subtable_bits
= FFMAX(subtable_bits
, n
);
202 subtable_bits
= FFMIN(subtable_bits
, table_nb_bits
);
203 j
= (flags
& VLC_INIT_OUTPUT_LE
) ? bitswap_32(code_prefix
) >> (32 - table_nb_bits
) : code_prefix
;
204 table
[j
].len
= -subtable_bits
;
205 ff_dlog(NULL
, "%4x: n=%d (subtable)\n",
206 j
, codes
[i
].bits
+ table_nb_bits
);
207 index
= build_table(vlc
, subtable_bits
, k
-i
, codes
+i
, flags
);
210 /* note: realloc has been done, so reload tables */
211 table
= &vlc
->table
[table_index
];
212 table
[j
].sym
= index
;
213 if (table
[j
].sym
!= index
) {
214 avpriv_request_sample(NULL
, "strange codes");
215 return AVERROR_PATCHWELCOME
;
221 for (int i
= 0; i
< table_size
; i
++) {
222 if (table
[i
].len
== 0)
229 static int vlc_common_end(VLC
*vlc
, int nb_bits
, int nb_codes
, VLCcode
*codes
,
230 int flags
, VLCcode localbuf
[LOCALBUF_ELEMS
])
232 int ret
= build_table(vlc
, nb_bits
, nb_codes
, codes
, flags
);
234 if (flags
& VLC_INIT_USE_STATIC
) {
235 if (vlc
->table_size
!= vlc
->table_allocated
&&
236 !(flags
& (VLC_INIT_STATIC_OVERLONG
& ~VLC_INIT_USE_STATIC
)))
237 av_log(NULL
, AV_LOG_ERROR
, "needed %d had %d\n", vlc
->table_size
, vlc
->table_allocated
);
238 av_assert0(ret
>= 0);
240 if (codes
!= localbuf
)
243 av_freep(&vlc
->table
);
250 int ff_vlc_init_sparse(VLC
*vlc
, int nb_bits
, int nb_codes
,
251 const void *bits
, int bits_wrap
, int bits_size
,
252 const void *codes
, int codes_wrap
, int codes_size
,
253 const void *symbols
, int symbols_wrap
, int symbols_size
,
256 VLCcode localbuf
[LOCALBUF_ELEMS
], *buf
= localbuf
;
259 ret
= vlc_common_init(vlc
, nb_bits
, nb_codes
, &buf
, flags
);
263 av_assert0(symbols_size
<= 2 || !symbols
);
265 #define COPY(condition)\
266 for (int i = 0; i < nb_codes; i++) { \
268 GET_DATA(len, bits, i, bits_wrap, bits_size); \
271 if (len > 3*nb_bits || len > 32) { \
272 av_log(NULL, AV_LOG_ERROR, "Too long VLC (%u) in vlc_init\n", len);\
273 if (buf != localbuf) \
275 return AVERROR(EINVAL); \
278 GET_DATA(buf[j].code, codes, i, codes_wrap, codes_size); \
279 if (buf[j].code >= (1LL<<buf[j].bits)) { \
280 av_log(NULL, AV_LOG_ERROR, "Invalid code %"PRIx32" for %d in " \
281 "vlc_init\n", buf[j].code, i); \
282 if (buf != localbuf) \
284 return AVERROR(EINVAL); \
286 if (flags & VLC_INIT_INPUT_LE) \
287 buf[j].code = bitswap_32(buf[j].code); \
289 buf[j].code <<= 32 - buf[j].bits; \
291 GET_DATA(buf[j].symbol, symbols, i, symbols_wrap, symbols_size) \
297 // qsort is the slowest part of vlc_init, and could probably be improved or avoided
298 AV_QSORT(buf
, j
, struct VLCcode
, compare_vlcspec
);
299 COPY(len
&& len
<= nb_bits
);
302 return vlc_common_end(vlc
, nb_bits
, nb_codes
, buf
,
306 int ff_vlc_init_from_lengths(VLC
*vlc
, int nb_bits
, int nb_codes
,
307 const int8_t *lens
, int lens_wrap
,
308 const void *symbols
, int symbols_wrap
, int symbols_size
,
309 int offset
, int flags
, void *logctx
)
311 VLCcode localbuf
[LOCALBUF_ELEMS
], *buf
= localbuf
;
313 int ret
, j
, len_max
= FFMIN(32, 3 * nb_bits
);
315 ret
= vlc_common_init(vlc
, nb_bits
, nb_codes
, &buf
, flags
);
320 for (int i
= 0; i
< nb_codes
; i
++, lens
+= lens_wrap
) {
327 GET_DATA(sym
, symbols
, i
, symbols_wrap
, symbols_size
)
330 buf
[j
].symbol
= sym
+ offset
;
331 buf
[j
++].code
= code
;
332 } else if (len
< 0) {
336 if (len
> len_max
|| code
& ((1U << (32 - len
)) - 1)) {
337 av_log(logctx
, AV_LOG_ERROR
, "Invalid VLC (length %u)\n", len
);
340 code
+= 1U << (32 - len
);
341 if (code
> UINT32_MAX
+ 1ULL) {
342 av_log(logctx
, AV_LOG_ERROR
, "Overdetermined VLC tree\n");
346 return vlc_common_end(vlc
, nb_bits
, j
, buf
, flags
, localbuf
);
350 return AVERROR_INVALIDDATA
;
353 av_cold
void ff_vlc_init_table_from_lengths(VLCElem table
[], int table_size
,
354 int nb_bits
, int nb_codes
,
355 const int8_t *lens
, int lens_wrap
,
356 const void *symbols
, int symbols_wrap
, int symbols_size
,
357 int offset
, int flags
)
359 VLC vlc
= { .table
= table
, .table_allocated
= table_size
};
361 ff_vlc_init_from_lengths(&vlc
, nb_bits
, nb_codes
, lens
, lens_wrap
,
362 symbols
, symbols_wrap
, symbols_size
,
363 offset
, flags
| VLC_INIT_USE_STATIC
, NULL
);
366 av_cold
const VLCElem
*ff_vlc_init_tables_from_lengths(VLCInitState
*state
,
367 int nb_bits
, int nb_codes
,
368 const int8_t *lens
, int lens_wrap
,
369 const void *symbols
, int symbols_wrap
, int symbols_size
,
370 int offset
, int flags
)
372 VLC vlc
= { .table
= state
->table
, .table_allocated
= state
->size
};
374 ff_vlc_init_from_lengths(&vlc
, nb_bits
, nb_codes
, lens
, lens_wrap
,
375 symbols
, symbols_wrap
, symbols_size
,
376 offset
, flags
| VLC_INIT_STATIC_OVERLONG
, NULL
);
378 state
->table
+= vlc
.table_size
;
379 state
->size
-= vlc
.table_size
;
384 av_cold
void ff_vlc_init_table_sparse(VLCElem table
[], int table_size
,
385 int nb_bits
, int nb_codes
,
386 const void *bits
, int bits_wrap
, int bits_size
,
387 const void *codes
, int codes_wrap
, int codes_size
,
388 const void *symbols
, int symbols_wrap
, int symbols_size
,
391 VLC vlc
= { .table
= table
, .table_allocated
= table_size
};
393 ff_vlc_init_sparse(&vlc
, nb_bits
, nb_codes
,
394 bits
, bits_wrap
, bits_size
,
395 codes
, codes_wrap
, codes_size
,
396 symbols
, symbols_wrap
, symbols_size
,
397 flags
| VLC_INIT_USE_STATIC
);
400 av_cold
const VLCElem
*ff_vlc_init_tables_sparse(VLCInitState
*state
,
401 int nb_bits
, int nb_codes
,
402 const void *bits
, int bits_wrap
, int bits_size
,
403 const void *codes
, int codes_wrap
, int codes_size
,
404 const void *symbols
, int symbols_wrap
, int symbols_size
,
407 VLC vlc
= { .table
= state
->table
, .table_allocated
= state
->size
};
409 ff_vlc_init_sparse(&vlc
, nb_bits
, nb_codes
,
410 bits
, bits_wrap
, bits_size
,
411 codes
, codes_wrap
, codes_size
,
412 symbols
, symbols_wrap
, symbols_size
,
413 flags
| VLC_INIT_STATIC_OVERLONG
);
415 state
->table
+= vlc
.table_size
;
416 state
->size
-= vlc
.table_size
;
421 static void add_level(VLC_MULTI_ELEM
*table
, const int is16bit
,
422 const int num
, const int numbits
,
424 uint32_t curcode
, int curlen
,
425 int curlimit
, int curlevel
,
426 const int minlen
, const int max
,
427 unsigned* levelcnt
, VLC_MULTI_ELEM info
)
429 int max_symbols
= VLC_MULTI_MAX_SYMBOLS
>> is16bit
;
430 for (int i
= num
-1; i
>= max
; i
--) {
431 for (int j
= 0; j
< 2; j
++) {
440 code
= curcode
+ (buf
[t
].code
>> curlen
);
441 newlimit
= curlimit
- l
;
443 if (is16bit
) info
.val16
[curlevel
] = sym
;
444 else info
.val8
[curlevel
] = sym
&0xFF;
446 if (curlevel
) { // let's not add single entries
447 uint32_t val
= code
>> (32 - numbits
);
448 uint32_t nb
= val
+ (1U << (numbits
- l
));
450 info
.num
= curlevel
+1;
451 for (; val
< nb
; val
++)
452 AV_COPY64(table
+val
, &info
);
453 levelcnt
[curlevel
-1]++;
456 if (curlevel
+1 < max_symbols
&& newlimit
>= minlen
) {
457 add_level(table
, is16bit
, num
, numbits
, buf
,
458 code
, l
, newlimit
, curlevel
+1,
459 minlen
, max
, levelcnt
, info
);
465 static int vlc_multi_gen(VLC_MULTI_ELEM
*table
, const VLC
*single
,
466 const int is16bit
, const int nb_codes
, const int numbits
,
467 VLCcode
*buf
, void *logctx
)
469 int minbits
, maxbits
, max
;
470 unsigned count
[VLC_MULTI_MAX_SYMBOLS
-1] = { 0, };
471 VLC_MULTI_ELEM info
= { 0 };
474 for (int j
= 0; j
< 1<<numbits
; j
++) {
475 if (single
->table
[j
].len
> 0) {
477 j
+= (1 << (numbits
- single
->table
[j
].len
)) - 1;
484 for (int n
= nb_codes
- count0
; n
< nb_codes
; n
++) {
485 minbits
= FFMIN(minbits
, buf
[n
].bits
);
486 maxbits
= FFMAX(maxbits
, buf
[n
].bits
);
488 av_assert0(maxbits
<= numbits
);
490 for (max
= nb_codes
; max
> nb_codes
- count0
; max
--) {
491 // We can only add a code that fits with the shortest other code into the table
492 // We assume the table is sorted by bits and we skip subtables which from our
493 // point of view are basically random corrupted entries
494 // If we have not a single useable vlc we end with max = nb_codes
495 if (buf
[max
- 1].bits
+minbits
> numbits
)
499 for (int j
= 0; j
< 1<<numbits
; j
++) {
500 table
[j
].len
= single
->table
[j
].len
;
501 table
[j
].num
= single
->table
[j
].len
> 0 ? 1 : 0;
503 table
[j
].val16
[0] = single
->table
[j
].sym
;
505 table
[j
].val8
[0] = single
->table
[j
].sym
;
508 add_level(table
, is16bit
, nb_codes
, numbits
, buf
,
509 0, 0, FFMIN(maxbits
, numbits
), 0, minbits
, max
, count
, info
);
511 av_log(logctx
, AV_LOG_DEBUG
, "Joint: %d/%d/%d/%d/%d codes min=%ubits max=%u\n",
512 count
[0], count
[1], count
[2], count
[3], count
[4], minbits
, max
);
517 int ff_vlc_init_multi_from_lengths(VLC
*vlc
, VLC_MULTI
*multi
, int nb_bits
, int nb_elems
,
518 int nb_codes
, const int8_t *lens
, int lens_wrap
,
519 const void *symbols
, int symbols_wrap
, int symbols_size
,
520 int offset
, int flags
, void *logctx
)
522 VLCcode localbuf
[LOCALBUF_ELEMS
], *buf
= localbuf
;
524 int ret
, j
, len_max
= FFMIN(32, 3 * nb_bits
);
526 ret
= vlc_common_init(vlc
, nb_bits
, nb_codes
, &buf
, flags
);
530 multi
->table
= av_malloc(sizeof(*multi
->table
) << nb_bits
);
535 for (int i
= 0; i
< nb_codes
; i
++, lens
+= lens_wrap
) {
542 GET_DATA(sym
, symbols
, i
, symbols_wrap
, symbols_size
)
545 buf
[j
].symbol
= sym
+ offset
;
546 buf
[j
++].code
= code
;
547 } else if (len
< 0) {
551 if (len
> len_max
|| code
& ((1U << (32 - len
)) - 1)) {
552 av_log(logctx
, AV_LOG_ERROR
, "Invalid VLC (length %u)\n", len
);
555 code
+= 1U << (32 - len
);
556 if (code
> UINT32_MAX
+ 1ULL) {
557 av_log(logctx
, AV_LOG_ERROR
, "Overdetermined VLC tree\n");
561 ret
= vlc_common_end(vlc
, nb_bits
, j
, buf
, flags
, buf
);
564 ret
= vlc_multi_gen(multi
->table
, vlc
, nb_elems
> 256, j
, nb_bits
, buf
, logctx
);
571 ff_vlc_free_multi(multi
);
572 return AVERROR_INVALIDDATA
;
575 void ff_vlc_free_multi(VLC_MULTI
*vlc
)
577 av_freep(&vlc
->table
);
580 void ff_vlc_free(VLC
*vlc
)
582 av_freep(&vlc
->table
);