MCPcopy Create free account
hub / github.com/FFmpeg/FFmpeg / build_table

Function build_table

libavcodec/vlc.c:138–227  ·  view source on GitHub ↗

* Build VLC decoding tables suitable for use with get_vlc(). * * @param vlc the context to be initialized * * @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 *

Source from the content-addressed store, hash-verified

136 * Sorting by VLCcode.code is sufficient, though not necessary.
137 */
138static int build_table(VLC *vlc, int table_nb_bits, int nb_codes,
139 VLCcode *codes, int flags)
140{
141 int table_size, table_index;
142 VLCElem *table;
143
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);
149 if (table_index < 0)
150 return table_index;
151 table = &vlc->table[table_index];
152
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_tlog(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);
163 int inc = 1;
164
165 if (flags & VLC_INIT_OUTPUT_LE) {
166 j = bitswap_32(code);
167 inc = 1 << n;
168 }
169 for (int k = 0; k < nb; k++) {
170 int bits = table[j].len;
171 int oldsym = table[j].sym;
172 ff_tlog(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;
176 }
177 table[j].len = n;
178 table[j].sym = symbol;
179 j += inc;
180 }
181 } else {
182 /* fill auxiliary table recursively */
183 uint32_t code_prefix;
184 int index, subtable_bits, j, k;
185
186 n -= table_nb_bits;
187 code_prefix = code >> (32 - table_nb_bits);
188 subtable_bits = n;
189 codes[i].bits = n;
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;
193 if (n <= 0)
194 break;
195 code = codes[k].code;

Callers 1

vlc_common_endFunction · 0.85

Calls 4

alloc_tableFunction · 0.85
bitswap_32Function · 0.85
av_logFunction · 0.85
avpriv_request_sampleFunction · 0.85

Tested by

no test coverage detected