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                                             int nb_bits, 
int nb_codes,
 
  355                                             const int8_t *lens, 
int lens_wrap,
 
  356                                             const void *symbols, 
int symbols_wrap, 
int symbols_size,
 
  362                              symbols, symbols_wrap, symbols_size,
 
  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,
 
  375                              symbols, symbols_wrap, symbols_size,
 
  385                                       int nb_bits, 
int nb_codes,
 
  387                                       const void *codes, 
int codes_wrap, 
int codes_size,
 
  388                                       const void *symbols, 
int symbols_wrap, 
int symbols_size,
 
  395                        codes, codes_wrap, codes_size,
 
  396                        symbols, symbols_wrap, symbols_size,
 
  401                                                  int nb_bits, 
int nb_codes,
 
  403                                                  const void *codes, 
int codes_wrap, 
int codes_size,
 
  404                                                  const void *symbols, 
int symbols_wrap, 
int symbols_size,
 
  411                        codes, codes_wrap, codes_size,
 
  412                        symbols, symbols_wrap, symbols_size,
 
  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,
 
  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;
 
  447                 uint32_t 
val = 
code >> (32 - numbits);
 
  448                 uint32_t  nb = 
val + (1
U << (numbits - l));
 
  450                 info.num = curlevel+1;
 
  453                 levelcnt[curlevel-1]++;
 
  456             if (curlevel+1 < max_symbols && newlimit >= minlen) {
 
  458                           code, l, newlimit, curlevel+1,
 
  466                          const int is16bit, 
const int nb_codes, 
const int numbits,
 
  469     int minbits, maxbits, 
max;
 
  474     for (
int j = 0; j < 1<<numbits; j++) {
 
  477             j += (1 << (numbits - single->
table[j].
len)) - 1;
 
  484     for (
int n = nb_codes - count0; n < nb_codes; n++) {
 
  490     for (
max = nb_codes; 
max > nb_codes - count0; 
max--) {
 
  495         if (buf[
max - 1].
bits+minbits > numbits)
 
  499     for (
int j = 0; j < 1<<numbits; j++) {
 
  509               0, 0, 
FFMIN(maxbits, numbits), 0, minbits, 
max, count, 
info);
 
  512            count[0], count[1], count[2], count[3], count[4], minbits, 
max);
 
  518                                    int nb_codes, 
const int8_t *lens, 
int lens_wrap,
 
  519                                    const void *symbols, 
int symbols_wrap, 
int symbols_size,
 
  524     int ret, j, len_max = 
FFMIN(32, 3 * nb_bits);
 
  535     for (
int i = 0; 
i < nb_codes; 
i++, lens += lens_wrap) {
 
  542                 GET_DATA(sym, symbols, 
i, symbols_wrap, symbols_size)
 
  547         } 
else if (
len <  0) {
 
  551         if (
len > len_max || 
code & ((1
U << (32 - 
len)) - 1)) {
 
  556         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.
 
For static VLCs, the number of bits can often be hardcoded at each get_vlc2() callsite.
 
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 inc(int num, int period)
 
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
 
av_cold void ff_vlc_init_table_from_lengths(VLCElem table[], int table_size, 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)
 
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)
 
const av_cold VLCElem * ff_vlc_init_tables_sparse(VLCInitState *state, 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)
 
const av_cold VLCElem * ff_vlc_init_tables_from_lengths(VLCInitState *state, 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)
 
#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
 
av_cold void ff_vlc_init_table_sparse(VLCElem table[], int table_size, 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)