Go to the documentation of this file.
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; \
80 #define LOCALBUF_ELEMS 1500 // the maximum currently needed is 1296 by rv34
121 return (sa->
code >> 1) - (sb->code >> 1);
141 int table_size, table_index;
144 if (table_nb_bits > 30)
146 table_size = 1 << table_nb_bits;
148 ff_dlog(
NULL,
"new table index=%d size=%d\n", table_index, table_size);
154 for (
int i = 0;
i < nb_codes;
i++) {
155 int n = codes[
i].
bits;
159 if (n <= table_nb_bits) {
161 int j =
code >> (32 - table_nb_bits);
162 int nb = 1 << (table_nb_bits - n);
169 for (
int k = 0; k < nb; k++) {
171 int oldsym =
table[j].sym;
173 if ((
bits || oldsym) && (
bits != n || oldsym != symbol)) {
178 table[j].sym = symbol;
184 int index, subtable_bits, j, k;
191 for (k =
i + 1; k < nb_codes; k++) {
192 n = codes[k].
bits - table_nb_bits;
199 codes[k].
code =
code << table_nb_bits;
200 subtable_bits =
FFMAX(subtable_bits, n);
202 subtable_bits =
FFMIN(subtable_bits, table_nb_bits);
204 table[j].len = -subtable_bits;
206 j, codes[
i].
bits + table_nb_bits);
221 for (
int i = 0;
i < table_size;
i++) {
240 if (codes != localbuf)
252 const void *codes,
int codes_wrap,
int codes_size,
253 const void *symbols,
int symbols_wrap,
int symbols_size,
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) \
307 const int8_t *lens,
int lens_wrap,
308 const void *symbols,
int symbols_wrap,
int symbols_size,
313 int ret, j, len_max =
FFMIN(32, 3 * nb_bits);
320 for (
int i = 0;
i < nb_codes;
i++, lens += lens_wrap) {
327 GET_DATA(sym, symbols,
i, symbols_wrap, symbols_size)
332 }
else if (
len < 0) {
336 if (
len > len_max ||
code & ((1
U << (32 -
len)) - 1)) {
341 if (
code > UINT32_MAX + 1ULL) {
354 const int num,
const int numbits,
356 uint32_t curcode,
int curlen,
357 int curlimit,
int curlevel,
358 const int minlen,
const int max,
362 for (
int i = num-1;
i >=
max;
i--) {
363 for (
int j = 0; j < 2; j++) {
372 code = curcode + (buf[t].
code >> curlen);
373 newlimit = curlimit - l;
376 else info.val[curlevel] = sym&0xFF;
379 uint32_t
val =
code >> (32 - numbits);
380 uint32_t nb =
val + (1
U << (numbits - l));
382 info.num = curlevel+1;
385 levelcnt[curlevel-1]++;
388 if (curlevel+1 < max_symbols && newlimit >= minlen) {
390 code, l, newlimit, curlevel+1,
398 const int is16bit,
const int nb_codes,
const int numbits,
401 int minbits, maxbits,
max;
406 for (
int j = 0; j < 1<<numbits; j++) {
409 j += (1 << (numbits - single->
table[j].
len)) - 1;
416 for (
int n = nb_codes - count0; n < nb_codes; n++) {
422 for (
max = nb_codes;
max > nb_codes - count0;
max--) {
427 if (buf[
max - 1].
bits+minbits > numbits)
431 for (
int j = 0; j < 1<<numbits; j++) {
438 0, 0,
FFMIN(maxbits, numbits), 0, minbits,
max, count,
info);
441 count[0], count[1], count[2], count[3], count[4], minbits,
max);
447 int nb_codes,
const int8_t *lens,
int lens_wrap,
448 const void *symbols,
int symbols_wrap,
int symbols_size,
453 int ret, j, len_max =
FFMIN(32, 3 * nb_bits);
464 for (
int i = 0;
i < nb_codes;
i++, lens += lens_wrap) {
471 GET_DATA(sym, symbols,
i, symbols_wrap, symbols_size)
476 }
else if (
len < 0) {
480 if (
len > len_max ||
code & ((1
U << (32 -
len)) - 1)) {
485 if (
code > UINT32_MAX + 1ULL) {
int ff_vlc_init_from_lengths(VLC *vlc, int nb_bits, int nb_codes, const int8_t *lens, int lens_wrap, const void *symbols, int symbols_wrap, int symbols_size, int offset, int flags, void *logctx)
Build VLC decoding tables suitable for use with get_vlc2()
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
static int vlc_common_init(VLC *vlc, int nb_bits, int nb_codes, VLCcode **buf, int flags)
const uint8_t ff_reverse[256]
static const uint16_t table[]
static int vlc_multi_gen(VLC_MULTI_ELEM *table, const VLC *single, const int is16bit, const int nb_codes, const int numbits, VLCcode *buf, void *logctx)
static int vlc_common_end(VLC *vlc, int nb_bits, int nb_codes, VLCcode *codes, int flags, VLCcode localbuf[LOCALBUF_ELEMS])
static double val(void *priv, double ch)
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
static av_always_inline uint32_t bitswap_32(uint32_t x)
void ff_vlc_free_multi(VLC_MULTI *vlc)
#define av_assert0(cond)
assert() equivalent, that is always enabled.
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
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().
#define av_realloc_f(p, o, n)
#define GET_DATA(v, table, i, wrap, size)
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
int ff_vlc_init_multi_from_lengths(VLC *vlc, VLC_MULTI *multi, int nb_bits, int nb_elems, int nb_codes, const int8_t *lens, int lens_wrap, const void *symbols, int symbols_wrap, int symbols_size, int offset, int flags, void *logctx)
Build VLC decoding tables suitable for use with get_vlc_multi()
#define VLC_MULTI_MAX_SYMBOLS
static int compare_vlcspec(const void *a, const void *b)
The reader does not expect b to be semantically here and if the code is changed by maybe adding a a division or other the signedness will almost certainly be mistaken To avoid this confusion a new type was SUINT is the C unsigned type but it holds a signed int to use the same example SUINT a
static const unsigned code_prefix[]
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf offset
int ff_vlc_init_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)
Build VLC decoding tables suitable for use with get_vlc2().
#define i(width, name, range_min, range_max)
and forward the test the status of outputs and forward it to the corresponding return FFERROR_NOT_READY If the filters stores internally one or a few frame for some it can consider them to be part of the FIFO and delay acknowledging a status change accordingly Example code
#define AV_QSORT(p, num, type, cmp)
Quicksort This sort is fast, and fully inplace but not stable and it is possible to construct input t...
#define av_malloc_array(a, b)
uint32_t code
codeword, with the first bit-to-be-read in the msb (even if intended for a little-endian bitstream re...
static void add_level(VLC_MULTI_ELEM *table, const int is16bit, const int num, const int numbits, const VLCcode *buf, uint32_t curcode, int curlen, int curlimit, int curlevel, const int minlen, const int max, unsigned *levelcnt, VLC_MULTI_ELEM info)
void ff_vlc_free(VLC *vlc)
#define VLC_INIT_STATIC_OVERLONG
static int alloc_table(VLC *vlc, int size, int use_static)
#define avpriv_request_sample(...)
#define VLC_INIT_OUTPUT_LE
#define flags(name, subs,...)
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
#define VLC_INIT_USE_STATIC