* 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 *
| 136 | * Sorting by VLCcode.code is sufficient, though not necessary. |
| 137 | */ |
| 138 | static 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; |
no test coverage detected