1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * API for creating VLC trees 3cabdff1aSopenharmony_ci * Copyright (c) 2000, 2001 Fabrice Bellard 4cabdff1aSopenharmony_ci * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at> 5cabdff1aSopenharmony_ci * Copyright (c) 2010 Loren Merritt 6cabdff1aSopenharmony_ci * 7cabdff1aSopenharmony_ci * This file is part of FFmpeg. 8cabdff1aSopenharmony_ci * 9cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 10cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 11cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 12cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 13cabdff1aSopenharmony_ci * 14cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 15cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 16cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 17cabdff1aSopenharmony_ci * Lesser General Public License for more details. 18cabdff1aSopenharmony_ci * 19cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 20cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 21cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 22cabdff1aSopenharmony_ci */ 23cabdff1aSopenharmony_ci 24cabdff1aSopenharmony_ci#include <inttypes.h> 25cabdff1aSopenharmony_ci#include <stdint.h> 26cabdff1aSopenharmony_ci#include <stdlib.h> 27cabdff1aSopenharmony_ci#include <string.h> 28cabdff1aSopenharmony_ci 29cabdff1aSopenharmony_ci#include "libavutil/attributes.h" 30cabdff1aSopenharmony_ci#include "libavutil/avassert.h" 31cabdff1aSopenharmony_ci#include "libavutil/error.h" 32cabdff1aSopenharmony_ci#include "libavutil/internal.h" 33cabdff1aSopenharmony_ci#include "libavutil/log.h" 34cabdff1aSopenharmony_ci#include "libavutil/macros.h" 35cabdff1aSopenharmony_ci#include "libavutil/mem.h" 36cabdff1aSopenharmony_ci#include "libavutil/qsort.h" 37cabdff1aSopenharmony_ci#include "libavutil/reverse.h" 38cabdff1aSopenharmony_ci#include "vlc.h" 39cabdff1aSopenharmony_ci 40cabdff1aSopenharmony_ci#define GET_DATA(v, table, i, wrap, size) \ 41cabdff1aSopenharmony_ci{ \ 42cabdff1aSopenharmony_ci const uint8_t *ptr = (const uint8_t *)table + i * wrap; \ 43cabdff1aSopenharmony_ci switch(size) { \ 44cabdff1aSopenharmony_ci case 1: \ 45cabdff1aSopenharmony_ci v = *(const uint8_t *)ptr; \ 46cabdff1aSopenharmony_ci break; \ 47cabdff1aSopenharmony_ci case 2: \ 48cabdff1aSopenharmony_ci v = *(const uint16_t *)ptr; \ 49cabdff1aSopenharmony_ci break; \ 50cabdff1aSopenharmony_ci case 4: \ 51cabdff1aSopenharmony_ci default: \ 52cabdff1aSopenharmony_ci av_assert1(size == 4); \ 53cabdff1aSopenharmony_ci v = *(const uint32_t *)ptr; \ 54cabdff1aSopenharmony_ci break; \ 55cabdff1aSopenharmony_ci } \ 56cabdff1aSopenharmony_ci} 57cabdff1aSopenharmony_ci 58cabdff1aSopenharmony_ci 59cabdff1aSopenharmony_cistatic int alloc_table(VLC *vlc, int size, int use_static) 60cabdff1aSopenharmony_ci{ 61cabdff1aSopenharmony_ci int index = vlc->table_size; 62cabdff1aSopenharmony_ci 63cabdff1aSopenharmony_ci vlc->table_size += size; 64cabdff1aSopenharmony_ci if (vlc->table_size > vlc->table_allocated) { 65cabdff1aSopenharmony_ci if (use_static) 66cabdff1aSopenharmony_ci abort(); // cannot do anything, init_vlc() is used with too little memory 67cabdff1aSopenharmony_ci vlc->table_allocated += (1 << vlc->bits); 68cabdff1aSopenharmony_ci vlc->table = av_realloc_f(vlc->table, vlc->table_allocated, sizeof(*vlc->table)); 69cabdff1aSopenharmony_ci if (!vlc->table) { 70cabdff1aSopenharmony_ci vlc->table_allocated = 0; 71cabdff1aSopenharmony_ci vlc->table_size = 0; 72cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 73cabdff1aSopenharmony_ci } 74cabdff1aSopenharmony_ci memset(vlc->table + vlc->table_allocated - (1 << vlc->bits), 0, sizeof(*vlc->table) << vlc->bits); 75cabdff1aSopenharmony_ci } 76cabdff1aSopenharmony_ci return index; 77cabdff1aSopenharmony_ci} 78cabdff1aSopenharmony_ci 79cabdff1aSopenharmony_ci#define LOCALBUF_ELEMS 1500 // the maximum currently needed is 1296 by rv34 80cabdff1aSopenharmony_ci 81cabdff1aSopenharmony_cistatic av_always_inline uint32_t bitswap_32(uint32_t x) 82cabdff1aSopenharmony_ci{ 83cabdff1aSopenharmony_ci return (uint32_t)ff_reverse[ x & 0xFF] << 24 | 84cabdff1aSopenharmony_ci (uint32_t)ff_reverse[(x >> 8) & 0xFF] << 16 | 85cabdff1aSopenharmony_ci (uint32_t)ff_reverse[(x >> 16) & 0xFF] << 8 | 86cabdff1aSopenharmony_ci (uint32_t)ff_reverse[ x >> 24]; 87cabdff1aSopenharmony_ci} 88cabdff1aSopenharmony_ci 89cabdff1aSopenharmony_citypedef struct VLCcode { 90cabdff1aSopenharmony_ci uint8_t bits; 91cabdff1aSopenharmony_ci VLCBaseType symbol; 92cabdff1aSopenharmony_ci /** codeword, with the first bit-to-be-read in the msb 93cabdff1aSopenharmony_ci * (even if intended for a little-endian bitstream reader) */ 94cabdff1aSopenharmony_ci uint32_t code; 95cabdff1aSopenharmony_ci} VLCcode; 96cabdff1aSopenharmony_ci 97cabdff1aSopenharmony_cistatic int vlc_common_init(VLC *vlc, int nb_bits, int nb_codes, 98cabdff1aSopenharmony_ci VLCcode **buf, int flags) 99cabdff1aSopenharmony_ci{ 100cabdff1aSopenharmony_ci vlc->bits = nb_bits; 101cabdff1aSopenharmony_ci vlc->table_size = 0; 102cabdff1aSopenharmony_ci if (flags & INIT_VLC_USE_NEW_STATIC) { 103cabdff1aSopenharmony_ci av_assert0(nb_codes <= LOCALBUF_ELEMS); 104cabdff1aSopenharmony_ci } else { 105cabdff1aSopenharmony_ci vlc->table = NULL; 106cabdff1aSopenharmony_ci vlc->table_allocated = 0; 107cabdff1aSopenharmony_ci } 108cabdff1aSopenharmony_ci if (nb_codes > LOCALBUF_ELEMS) { 109cabdff1aSopenharmony_ci *buf = av_malloc_array(nb_codes, sizeof(VLCcode)); 110cabdff1aSopenharmony_ci if (!*buf) 111cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 112cabdff1aSopenharmony_ci } 113cabdff1aSopenharmony_ci 114cabdff1aSopenharmony_ci return 0; 115cabdff1aSopenharmony_ci} 116cabdff1aSopenharmony_ci 117cabdff1aSopenharmony_cistatic int compare_vlcspec(const void *a, const void *b) 118cabdff1aSopenharmony_ci{ 119cabdff1aSopenharmony_ci const VLCcode *sa = a, *sb = b; 120cabdff1aSopenharmony_ci return (sa->code >> 1) - (sb->code >> 1); 121cabdff1aSopenharmony_ci} 122cabdff1aSopenharmony_ci 123cabdff1aSopenharmony_ci/** 124cabdff1aSopenharmony_ci * Build VLC decoding tables suitable for use with get_vlc(). 125cabdff1aSopenharmony_ci * 126cabdff1aSopenharmony_ci * @param vlc the context to be initialized 127cabdff1aSopenharmony_ci * 128cabdff1aSopenharmony_ci * @param table_nb_bits max length of vlc codes to store directly in this table 129cabdff1aSopenharmony_ci * (Longer codes are delegated to subtables.) 130cabdff1aSopenharmony_ci * 131cabdff1aSopenharmony_ci * @param nb_codes number of elements in codes[] 132cabdff1aSopenharmony_ci * 133cabdff1aSopenharmony_ci * @param codes descriptions of the vlc codes 134cabdff1aSopenharmony_ci * These must be ordered such that codes going into the same subtable are contiguous. 135cabdff1aSopenharmony_ci * Sorting by VLCcode.code is sufficient, though not necessary. 136cabdff1aSopenharmony_ci */ 137cabdff1aSopenharmony_cistatic int build_table(VLC *vlc, int table_nb_bits, int nb_codes, 138cabdff1aSopenharmony_ci VLCcode *codes, int flags) 139cabdff1aSopenharmony_ci{ 140cabdff1aSopenharmony_ci int table_size, table_index; 141cabdff1aSopenharmony_ci VLCElem *table; 142cabdff1aSopenharmony_ci 143cabdff1aSopenharmony_ci if (table_nb_bits > 30) 144cabdff1aSopenharmony_ci return AVERROR(EINVAL); 145cabdff1aSopenharmony_ci table_size = 1 << table_nb_bits; 146cabdff1aSopenharmony_ci table_index = alloc_table(vlc, table_size, flags & INIT_VLC_USE_NEW_STATIC); 147cabdff1aSopenharmony_ci ff_dlog(NULL, "new table index=%d size=%d\n", table_index, table_size); 148cabdff1aSopenharmony_ci if (table_index < 0) 149cabdff1aSopenharmony_ci return table_index; 150cabdff1aSopenharmony_ci table = &vlc->table[table_index]; 151cabdff1aSopenharmony_ci 152cabdff1aSopenharmony_ci /* first pass: map codes and compute auxiliary table sizes */ 153cabdff1aSopenharmony_ci for (int i = 0; i < nb_codes; i++) { 154cabdff1aSopenharmony_ci int n = codes[i].bits; 155cabdff1aSopenharmony_ci uint32_t code = codes[i].code; 156cabdff1aSopenharmony_ci int symbol = codes[i].symbol; 157cabdff1aSopenharmony_ci ff_dlog(NULL, "i=%d n=%d code=0x%"PRIx32"\n", i, n, code); 158cabdff1aSopenharmony_ci if (n <= table_nb_bits) { 159cabdff1aSopenharmony_ci /* no need to add another table */ 160cabdff1aSopenharmony_ci int j = code >> (32 - table_nb_bits); 161cabdff1aSopenharmony_ci int nb = 1 << (table_nb_bits - n); 162cabdff1aSopenharmony_ci int inc = 1; 163cabdff1aSopenharmony_ci 164cabdff1aSopenharmony_ci if (flags & INIT_VLC_OUTPUT_LE) { 165cabdff1aSopenharmony_ci j = bitswap_32(code); 166cabdff1aSopenharmony_ci inc = 1 << n; 167cabdff1aSopenharmony_ci } 168cabdff1aSopenharmony_ci for (int k = 0; k < nb; k++) { 169cabdff1aSopenharmony_ci int bits = table[j].len; 170cabdff1aSopenharmony_ci int oldsym = table[j].sym; 171cabdff1aSopenharmony_ci ff_dlog(NULL, "%4x: code=%d n=%d\n", j, i, n); 172cabdff1aSopenharmony_ci if ((bits || oldsym) && (bits != n || oldsym != symbol)) { 173cabdff1aSopenharmony_ci av_log(NULL, AV_LOG_ERROR, "incorrect codes\n"); 174cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 175cabdff1aSopenharmony_ci } 176cabdff1aSopenharmony_ci table[j].len = n; 177cabdff1aSopenharmony_ci table[j].sym = symbol; 178cabdff1aSopenharmony_ci j += inc; 179cabdff1aSopenharmony_ci } 180cabdff1aSopenharmony_ci } else { 181cabdff1aSopenharmony_ci /* fill auxiliary table recursively */ 182cabdff1aSopenharmony_ci uint32_t code_prefix; 183cabdff1aSopenharmony_ci int index, subtable_bits, j, k; 184cabdff1aSopenharmony_ci 185cabdff1aSopenharmony_ci n -= table_nb_bits; 186cabdff1aSopenharmony_ci code_prefix = code >> (32 - table_nb_bits); 187cabdff1aSopenharmony_ci subtable_bits = n; 188cabdff1aSopenharmony_ci codes[i].bits = n; 189cabdff1aSopenharmony_ci codes[i].code = code << table_nb_bits; 190cabdff1aSopenharmony_ci for (k = i + 1; k < nb_codes; k++) { 191cabdff1aSopenharmony_ci n = codes[k].bits - table_nb_bits; 192cabdff1aSopenharmony_ci if (n <= 0) 193cabdff1aSopenharmony_ci break; 194cabdff1aSopenharmony_ci code = codes[k].code; 195cabdff1aSopenharmony_ci if (code >> (32 - table_nb_bits) != code_prefix) 196cabdff1aSopenharmony_ci break; 197cabdff1aSopenharmony_ci codes[k].bits = n; 198cabdff1aSopenharmony_ci codes[k].code = code << table_nb_bits; 199cabdff1aSopenharmony_ci subtable_bits = FFMAX(subtable_bits, n); 200cabdff1aSopenharmony_ci } 201cabdff1aSopenharmony_ci subtable_bits = FFMIN(subtable_bits, table_nb_bits); 202cabdff1aSopenharmony_ci j = (flags & INIT_VLC_OUTPUT_LE) ? bitswap_32(code_prefix) >> (32 - table_nb_bits) : code_prefix; 203cabdff1aSopenharmony_ci table[j].len = -subtable_bits; 204cabdff1aSopenharmony_ci ff_dlog(NULL, "%4x: n=%d (subtable)\n", 205cabdff1aSopenharmony_ci j, codes[i].bits + table_nb_bits); 206cabdff1aSopenharmony_ci index = build_table(vlc, subtable_bits, k-i, codes+i, flags); 207cabdff1aSopenharmony_ci if (index < 0) 208cabdff1aSopenharmony_ci return index; 209cabdff1aSopenharmony_ci /* note: realloc has been done, so reload tables */ 210cabdff1aSopenharmony_ci table = &vlc->table[table_index]; 211cabdff1aSopenharmony_ci table[j].sym = index; 212cabdff1aSopenharmony_ci if (table[j].sym != index) { 213cabdff1aSopenharmony_ci avpriv_request_sample(NULL, "strange codes"); 214cabdff1aSopenharmony_ci return AVERROR_PATCHWELCOME; 215cabdff1aSopenharmony_ci } 216cabdff1aSopenharmony_ci i = k-1; 217cabdff1aSopenharmony_ci } 218cabdff1aSopenharmony_ci } 219cabdff1aSopenharmony_ci 220cabdff1aSopenharmony_ci for (int i = 0; i < table_size; i++) { 221cabdff1aSopenharmony_ci if (table[i].len == 0) 222cabdff1aSopenharmony_ci table[i].sym = -1; 223cabdff1aSopenharmony_ci } 224cabdff1aSopenharmony_ci 225cabdff1aSopenharmony_ci return table_index; 226cabdff1aSopenharmony_ci} 227cabdff1aSopenharmony_ci 228cabdff1aSopenharmony_cistatic int vlc_common_end(VLC *vlc, int nb_bits, int nb_codes, VLCcode *codes, 229cabdff1aSopenharmony_ci int flags, VLCcode localbuf[LOCALBUF_ELEMS]) 230cabdff1aSopenharmony_ci{ 231cabdff1aSopenharmony_ci int ret = build_table(vlc, nb_bits, nb_codes, codes, flags); 232cabdff1aSopenharmony_ci 233cabdff1aSopenharmony_ci if (flags & INIT_VLC_USE_NEW_STATIC) { 234cabdff1aSopenharmony_ci if (vlc->table_size != vlc->table_allocated && 235cabdff1aSopenharmony_ci !(flags & (INIT_VLC_STATIC_OVERLONG & ~INIT_VLC_USE_NEW_STATIC))) 236cabdff1aSopenharmony_ci av_log(NULL, AV_LOG_ERROR, "needed %d had %d\n", vlc->table_size, vlc->table_allocated); 237cabdff1aSopenharmony_ci av_assert0(ret >= 0); 238cabdff1aSopenharmony_ci } else { 239cabdff1aSopenharmony_ci if (codes != localbuf) 240cabdff1aSopenharmony_ci av_free(codes); 241cabdff1aSopenharmony_ci if (ret < 0) { 242cabdff1aSopenharmony_ci av_freep(&vlc->table); 243cabdff1aSopenharmony_ci return ret; 244cabdff1aSopenharmony_ci } 245cabdff1aSopenharmony_ci } 246cabdff1aSopenharmony_ci return 0; 247cabdff1aSopenharmony_ci} 248cabdff1aSopenharmony_ci 249cabdff1aSopenharmony_ci/* Build VLC decoding tables suitable for use with get_vlc(). 250cabdff1aSopenharmony_ci 251cabdff1aSopenharmony_ci 'nb_bits' sets the decoding table size (2^nb_bits) entries. The 252cabdff1aSopenharmony_ci bigger it is, the faster is the decoding. But it should not be too 253cabdff1aSopenharmony_ci big to save memory and L1 cache. '9' is a good compromise. 254cabdff1aSopenharmony_ci 255cabdff1aSopenharmony_ci 'nb_codes' : number of vlcs codes 256cabdff1aSopenharmony_ci 257cabdff1aSopenharmony_ci 'bits' : table which gives the size (in bits) of each vlc code. 258cabdff1aSopenharmony_ci 259cabdff1aSopenharmony_ci 'codes' : table which gives the bit pattern of of each vlc code. 260cabdff1aSopenharmony_ci 261cabdff1aSopenharmony_ci 'symbols' : table which gives the values to be returned from get_vlc(). 262cabdff1aSopenharmony_ci 263cabdff1aSopenharmony_ci 'xxx_wrap' : give the number of bytes between each entry of the 264cabdff1aSopenharmony_ci 'bits' or 'codes' tables. 265cabdff1aSopenharmony_ci 266cabdff1aSopenharmony_ci 'xxx_size' : gives the number of bytes of each entry of the 'bits' 267cabdff1aSopenharmony_ci or 'codes' tables. Currently 1,2 and 4 are supported. 268cabdff1aSopenharmony_ci 269cabdff1aSopenharmony_ci 'wrap' and 'size' make it possible to use any memory configuration and types 270cabdff1aSopenharmony_ci (byte/word/long) to store the 'bits', 'codes', and 'symbols' tables. 271cabdff1aSopenharmony_ci*/ 272cabdff1aSopenharmony_ciint ff_init_vlc_sparse(VLC *vlc, int nb_bits, int nb_codes, 273cabdff1aSopenharmony_ci const void *bits, int bits_wrap, int bits_size, 274cabdff1aSopenharmony_ci const void *codes, int codes_wrap, int codes_size, 275cabdff1aSopenharmony_ci const void *symbols, int symbols_wrap, int symbols_size, 276cabdff1aSopenharmony_ci int flags) 277cabdff1aSopenharmony_ci{ 278cabdff1aSopenharmony_ci VLCcode localbuf[LOCALBUF_ELEMS], *buf = localbuf; 279cabdff1aSopenharmony_ci int j, ret; 280cabdff1aSopenharmony_ci 281cabdff1aSopenharmony_ci ret = vlc_common_init(vlc, nb_bits, nb_codes, &buf, flags); 282cabdff1aSopenharmony_ci if (ret < 0) 283cabdff1aSopenharmony_ci return ret; 284cabdff1aSopenharmony_ci 285cabdff1aSopenharmony_ci av_assert0(symbols_size <= 2 || !symbols); 286cabdff1aSopenharmony_ci j = 0; 287cabdff1aSopenharmony_ci#define COPY(condition)\ 288cabdff1aSopenharmony_ci for (int i = 0; i < nb_codes; i++) { \ 289cabdff1aSopenharmony_ci unsigned len; \ 290cabdff1aSopenharmony_ci GET_DATA(len, bits, i, bits_wrap, bits_size); \ 291cabdff1aSopenharmony_ci if (!(condition)) \ 292cabdff1aSopenharmony_ci continue; \ 293cabdff1aSopenharmony_ci if (len > 3*nb_bits || len > 32) { \ 294cabdff1aSopenharmony_ci av_log(NULL, AV_LOG_ERROR, "Too long VLC (%u) in init_vlc\n", len);\ 295cabdff1aSopenharmony_ci if (buf != localbuf) \ 296cabdff1aSopenharmony_ci av_free(buf); \ 297cabdff1aSopenharmony_ci return AVERROR(EINVAL); \ 298cabdff1aSopenharmony_ci } \ 299cabdff1aSopenharmony_ci buf[j].bits = len; \ 300cabdff1aSopenharmony_ci GET_DATA(buf[j].code, codes, i, codes_wrap, codes_size); \ 301cabdff1aSopenharmony_ci if (buf[j].code >= (1LL<<buf[j].bits)) { \ 302cabdff1aSopenharmony_ci av_log(NULL, AV_LOG_ERROR, "Invalid code %"PRIx32" for %d in " \ 303cabdff1aSopenharmony_ci "init_vlc\n", buf[j].code, i); \ 304cabdff1aSopenharmony_ci if (buf != localbuf) \ 305cabdff1aSopenharmony_ci av_free(buf); \ 306cabdff1aSopenharmony_ci return AVERROR(EINVAL); \ 307cabdff1aSopenharmony_ci } \ 308cabdff1aSopenharmony_ci if (flags & INIT_VLC_INPUT_LE) \ 309cabdff1aSopenharmony_ci buf[j].code = bitswap_32(buf[j].code); \ 310cabdff1aSopenharmony_ci else \ 311cabdff1aSopenharmony_ci buf[j].code <<= 32 - buf[j].bits; \ 312cabdff1aSopenharmony_ci if (symbols) \ 313cabdff1aSopenharmony_ci GET_DATA(buf[j].symbol, symbols, i, symbols_wrap, symbols_size) \ 314cabdff1aSopenharmony_ci else \ 315cabdff1aSopenharmony_ci buf[j].symbol = i; \ 316cabdff1aSopenharmony_ci j++; \ 317cabdff1aSopenharmony_ci } 318cabdff1aSopenharmony_ci COPY(len > nb_bits); 319cabdff1aSopenharmony_ci // qsort is the slowest part of init_vlc, and could probably be improved or avoided 320cabdff1aSopenharmony_ci AV_QSORT(buf, j, struct VLCcode, compare_vlcspec); 321cabdff1aSopenharmony_ci COPY(len && len <= nb_bits); 322cabdff1aSopenharmony_ci nb_codes = j; 323cabdff1aSopenharmony_ci 324cabdff1aSopenharmony_ci return vlc_common_end(vlc, nb_bits, nb_codes, buf, 325cabdff1aSopenharmony_ci flags, localbuf); 326cabdff1aSopenharmony_ci} 327cabdff1aSopenharmony_ci 328cabdff1aSopenharmony_ciint ff_init_vlc_from_lengths(VLC *vlc, int nb_bits, int nb_codes, 329cabdff1aSopenharmony_ci const int8_t *lens, int lens_wrap, 330cabdff1aSopenharmony_ci const void *symbols, int symbols_wrap, int symbols_size, 331cabdff1aSopenharmony_ci int offset, int flags, void *logctx) 332cabdff1aSopenharmony_ci{ 333cabdff1aSopenharmony_ci VLCcode localbuf[LOCALBUF_ELEMS], *buf = localbuf; 334cabdff1aSopenharmony_ci uint64_t code; 335cabdff1aSopenharmony_ci int ret, j, len_max = FFMIN(32, 3 * nb_bits); 336cabdff1aSopenharmony_ci 337cabdff1aSopenharmony_ci ret = vlc_common_init(vlc, nb_bits, nb_codes, &buf, flags); 338cabdff1aSopenharmony_ci if (ret < 0) 339cabdff1aSopenharmony_ci return ret; 340cabdff1aSopenharmony_ci 341cabdff1aSopenharmony_ci j = code = 0; 342cabdff1aSopenharmony_ci for (int i = 0; i < nb_codes; i++, lens += lens_wrap) { 343cabdff1aSopenharmony_ci int len = *lens; 344cabdff1aSopenharmony_ci if (len > 0) { 345cabdff1aSopenharmony_ci unsigned sym; 346cabdff1aSopenharmony_ci 347cabdff1aSopenharmony_ci buf[j].bits = len; 348cabdff1aSopenharmony_ci if (symbols) 349cabdff1aSopenharmony_ci GET_DATA(sym, symbols, i, symbols_wrap, symbols_size) 350cabdff1aSopenharmony_ci else 351cabdff1aSopenharmony_ci sym = i; 352cabdff1aSopenharmony_ci buf[j].symbol = sym + offset; 353cabdff1aSopenharmony_ci buf[j++].code = code; 354cabdff1aSopenharmony_ci } else if (len < 0) { 355cabdff1aSopenharmony_ci len = -len; 356cabdff1aSopenharmony_ci } else 357cabdff1aSopenharmony_ci continue; 358cabdff1aSopenharmony_ci if (len > len_max || code & ((1U << (32 - len)) - 1)) { 359cabdff1aSopenharmony_ci av_log(logctx, AV_LOG_ERROR, "Invalid VLC (length %u)\n", len); 360cabdff1aSopenharmony_ci goto fail; 361cabdff1aSopenharmony_ci } 362cabdff1aSopenharmony_ci code += 1U << (32 - len); 363cabdff1aSopenharmony_ci if (code > UINT32_MAX + 1ULL) { 364cabdff1aSopenharmony_ci av_log(logctx, AV_LOG_ERROR, "Overdetermined VLC tree\n"); 365cabdff1aSopenharmony_ci goto fail; 366cabdff1aSopenharmony_ci } 367cabdff1aSopenharmony_ci } 368cabdff1aSopenharmony_ci return vlc_common_end(vlc, nb_bits, j, buf, flags, localbuf); 369cabdff1aSopenharmony_cifail: 370cabdff1aSopenharmony_ci if (buf != localbuf) 371cabdff1aSopenharmony_ci av_free(buf); 372cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 373cabdff1aSopenharmony_ci} 374cabdff1aSopenharmony_ci 375cabdff1aSopenharmony_civoid ff_free_vlc(VLC *vlc) 376cabdff1aSopenharmony_ci{ 377cabdff1aSopenharmony_ci av_freep(&vlc->table); 378cabdff1aSopenharmony_ci} 379