static int build_table(VLC *vlc, int table_nb_bits,

                       int nb_codes,

                       const void *bits, int bits_wrap, int bits_size,

                       const void *codes, int codes_wrap, int codes_size,

                       uint32_t code_prefix, int n_prefix)

{

    int i, j, k, n, table_size, table_index, nb, n1, index;

    uint32_t code;

    VLC_TYPE (*table)[2];



    table_size = 1 << table_nb_bits;

    table_index = alloc_table(vlc, table_size);

#ifdef DEBUG_VLC

    printf("new table index=%d size=%d code_prefix=%x n=%d\n",

           table_index, table_size, code_prefix, n_prefix);

#endif

    if (table_index < 0)

        return -1;

    table = &vlc->table[table_index];



    for(i=0;i<table_size;i++) {

        table[i][1] = 0; //bits

        table[i][0] = -1; //codes

    }



    /* first pass: map codes and compute auxillary table sizes */

    for(i=0;i<nb_codes;i++) {

        GET_DATA(n, bits, i, bits_wrap, bits_size);

        GET_DATA(code, codes, i, codes_wrap, codes_size);

        /* we accept tables with holes */

        if (n <= 0)

            continue;

#if defined(DEBUG_VLC) && 0

        printf("i=%d n=%d code=0x%x\n", i, n, code);

#endif

        /* if code matches the prefix, it is in the table */

        n -= n_prefix;

        if (n > 0 && (code >> n) == code_prefix) {

            if (n <= table_nb_bits) {

                /* no need to add another table */

                j = (code << (table_nb_bits - n)) & (table_size - 1);

                nb = 1 << (table_nb_bits - n);

                for(k=0;k<nb;k++) {

#ifdef DEBUG_VLC

                    av_log(NULL, AV_LOG_DEBUG, "%4x: code=%d n=%d\n",

                           j, i, n);

#endif

                    if (table[j][1] /*bits*/ != 0) {

                        av_log(NULL, AV_LOG_ERROR, "incorrect codes\n");

                        return -1;

                    }

                    table[j][1] = n; //bits

                    table[j][0] = i; //code

                    j++;

                }

            } else {

                n -= table_nb_bits;

                j = (code >> n) & ((1 << table_nb_bits) - 1);

#ifdef DEBUG_VLC

                printf("%4x: n=%d (subtable)\n",

                       j, n);

#endif

                /* compute table size */

                n1 = -table[j][1]; //bits

                if (n > n1)

                    n1 = n;

                table[j][1] = -n1; //bits

            }

        }

    }



    /* second pass : fill auxillary tables recursively */

    for(i=0;i<table_size;i++) {

        n = table[i][1]; //bits

        if (n < 0) {

            n = -n;

            if (n > table_nb_bits) {

                n = table_nb_bits;

                table[i][1] = -n; //bits

            }

            index = build_table(vlc, n, nb_codes,

                                bits, bits_wrap, bits_size,

                                codes, codes_wrap, codes_size,

                                (code_prefix << table_nb_bits) | i,

                                n_prefix + table_nb_bits);

            if (index < 0)

                return -1;

            /* note: realloc has been done, so reload tables */

            table = &vlc->table[table_index];

            table[i][0] = index; //code

        }

    }

    return table_index;

}

static int build_table(VLC *vlc, int table_nb_bits,

                       int nb_codes,

                       const void *bits, int bits_wrap, int bits_size,

                       const void *codes, int codes_wrap, int codes_size,

                       uint32_t code_prefix, int n_prefix)

{

    int i, j, k, n, table_size, table_index, nb, n1, index;

    uint32_t code;

    VLC_TYPE (*table)[2];



    table_size = 1 << table_nb_bits;

    table_index = alloc_table(vlc, table_size);

#ifdef DEBUG_VLC

    printf("new table index=%d size=%d code_prefix=%x n=%d\n",

           table_index, table_size, code_prefix, n_prefix);

#endif

    if (table_index < 0)

        return -1;

    table = &vlc->table[table_index];



    for(i=0;i<table_size;i++) {

        table[i][1] = 0; 

        table[i][0] = -1; 

    }



    

    for(i=0;i<nb_codes;i++) {

        GET_DATA(n, bits, i, bits_wrap, bits_size);

        GET_DATA(code, codes, i, codes_wrap, codes_size);

        

        if (n <= 0)

            continue;

#if defined(DEBUG_VLC) && 0

        printf("i=%d n=%d code=0x%x\n", i, n, code);

#endif

        

        n -= n_prefix;

        if (n > 0 && (code >> n) == code_prefix) {

            if (n <= table_nb_bits) {

                

                j = (code << (table_nb_bits - n)) & (table_size - 1);

                nb = 1 << (table_nb_bits - n);

                for(k=0;k<nb;k++) {

#ifdef DEBUG_VLC

                    av_log(NULL, AV_LOG_DEBUG, "%4x: code=%d n=%d\n",

                           j, i, n);

#endif

                    if (table[j][1]  != 0) {

                        av_log(NULL, AV_LOG_ERROR, "incorrect codes\n");

                        return -1;

                    }

                    table[j][1] = n; 

                    table[j][0] = i; 

                    j++;

                }

            } else {

                n -= table_nb_bits;

                j = (code >> n) & ((1 << table_nb_bits) - 1);

#ifdef DEBUG_VLC

                printf("%4x: n=%d (subtable)\n",

                       j, n);

#endif

                

                n1 = -table[j][1]; 

                if (n > n1)

                    n1 = n;

                table[j][1] = -n1; 

            }

        }

    }



    

    for(i=0;i<table_size;i++) {

        n = table[i][1]; 

        if (n < 0) {

            n = -n;

            if (n > table_nb_bits) {

                n = table_nb_bits;

                table[i][1] = -n; 

            }

            index = build_table(vlc, n, nb_codes,

                                bits, bits_wrap, bits_size,

                                codes, codes_wrap, codes_size,

                                (code_prefix << table_nb_bits) | i,

                                n_prefix + table_nb_bits);

            if (index < 0)

                return -1;

            

            table = &vlc->table[table_index];

            table[i][0] = index; 

        }

    }

    return table_index;

}

                       uint32_t code_prefix, int n_prefix)     table_index = alloc_table(vlc, table_size);                                 n_prefix + table_nb_bits);
static int FUNC_0(VLC *VAR_0, int VAR_1,

                       int VAR_2,

                       const void *VAR_3, int VAR_4, int VAR_5,

                       const void *VAR_6, int VAR_7, int VAR_8,

                       uint32_t VAR_9, int VAR_10)

{

    int VAR_11, VAR_12, VAR_13, VAR_14, VAR_15, VAR_16, VAR_17, VAR_18, VAR_19;

    uint32_t code;

    VLC_TYPE (*table)[2];



    VAR_15 = 1 << VAR_1;

    VAR_16 = alloc_table(VAR_0, VAR_15);

#ifdef DEBUG_VLC

    printf("new table VAR_19=%d size=%d VAR_9=%x VAR_14=%d\VAR_14",

           VAR_16, VAR_15, VAR_9, VAR_10);

#endif

    if (VAR_16 < 0)

        return -1;

    table = &VAR_0->table[VAR_16];



    for(VAR_11=0;VAR_11<VAR_15;VAR_11++) {

        table[VAR_11][1] = 0; 

        table[VAR_11][0] = -1; 

    }



    

    for(VAR_11=0;VAR_11<VAR_2;VAR_11++) {

        GET_DATA(VAR_14, VAR_3, VAR_11, VAR_4, VAR_5);

        GET_DATA(code, VAR_6, VAR_11, VAR_7, VAR_8);

        

        if (VAR_14 <= 0)

            continue;

#if defined(DEBUG_VLC) && 0

        printf("VAR_11=%d VAR_14=%d code=0x%x\VAR_14", VAR_11, VAR_14, code);

#endif

        

        VAR_14 -= VAR_10;

        if (VAR_14 > 0 && (code >> VAR_14) == VAR_9) {

            if (VAR_14 <= VAR_1) {

                

                VAR_12 = (code << (VAR_1 - VAR_14)) & (VAR_15 - 1);

                VAR_17 = 1 << (VAR_1 - VAR_14);

                for(VAR_13=0;VAR_13<VAR_17;VAR_13++) {

#ifdef DEBUG_VLC

                    av_log(NULL, AV_LOG_DEBUG, "%4x: code=%d VAR_14=%d\VAR_14",

                           VAR_12, VAR_11, VAR_14);

#endif

                    if (table[VAR_12][1]  != 0) {

                        av_log(NULL, AV_LOG_ERROR, "incorrect VAR_6\VAR_14");

                        return -1;

                    }

                    table[VAR_12][1] = VAR_14; 

                    table[VAR_12][0] = VAR_11; 

                    VAR_12++;

                }

            } else {

                VAR_14 -= VAR_1;

                VAR_12 = (code >> VAR_14) & ((1 << VAR_1) - 1);

#ifdef DEBUG_VLC

                printf("%4x: VAR_14=%d (subtable)\VAR_14",

                       VAR_12, VAR_14);

#endif

                

                VAR_18 = -table[VAR_12][1]; 

                if (VAR_14 > VAR_18)

                    VAR_18 = VAR_14;

                table[VAR_12][1] = -VAR_18; 

            }

        }

    }



    

    for(VAR_11=0;VAR_11<VAR_15;VAR_11++) {

        VAR_14 = table[VAR_11][1]; 

        if (VAR_14 < 0) {

            VAR_14 = -VAR_14;

            if (VAR_14 > VAR_1) {

                VAR_14 = VAR_1;

                table[VAR_11][1] = -VAR_14; 

            }

            VAR_19 = FUNC_0(VAR_0, VAR_14, VAR_2,

                                VAR_3, VAR_4, VAR_5,

                                VAR_6, VAR_7, VAR_8,

                                (VAR_9 << VAR_1) | VAR_11,

                                VAR_10 + VAR_1);

            if (VAR_19 < 0)

                return -1;

            

            table = &VAR_0->table[VAR_16];

            table[VAR_11][0] = VAR_19; 

        }

    }

    return VAR_16;

}

static int FUNC_0(VLC *VAR_0, int VAR_1,
int VAR_2,
const void *VAR_3, int VAR_4, int VAR_5,
const void *VAR_6, int VAR_7, int VAR_8,
uint32_t VAR_9, int VAR_10)
{ int VAR_11, VAR_12, VAR_13, VAR_14, VAR_15, VAR_16, VAR_17, VAR_18, VAR_19; uint32_t code; VLC_TYPE (*table)[2]; VAR_15 = 1 << VAR_1; VAR_16 = alloc_table(VAR_0, VAR_15); #ifdef DEBUG_VLC
printf("new table VAR_19=%d size=%d VAR_9=%x VAR_14=%d\VAR_14",
VAR_16, VAR_15, VAR_9, VAR_10); #endif
if (VAR_16 < 0)
return -1; table = &VAR_0->table[VAR_16]; for(VAR_11=0;VAR_11<VAR_15;VAR_11++) { table[VAR_11][1] = 0; table[VAR_11][0] = -1; } for(VAR_11=0;VAR_11<VAR_2;VAR_11++) { GET_DATA(VAR_14, VAR_3, VAR_11, VAR_4, VAR_5); GET_DATA(code, VAR_6, VAR_11, VAR_7, VAR_8); if (VAR_14 <= 0)
continue; #if defined(DEBUG_VLC) && 0
printf("VAR_11=%d VAR_14=%d code=0x%x\VAR_14", VAR_11, VAR_14, code); #endif
VAR_14 -= VAR_10; if (VAR_14 > 0 && (code >> VAR_14) == VAR_9) { if (VAR_14 <= VAR_1) { VAR_12 = (code << (VAR_1 - VAR_14)) & (VAR_15 - 1); VAR_17 = 1 << (VAR_1 - VAR_14); for(VAR_13=0;VAR_13<VAR_17;VAR_13++) { #ifdef DEBUG_VLC
av_log(NULL, AV_LOG_DEBUG, "%4x: code=%d VAR_14=%d\VAR_14",
VAR_12, VAR_11, VAR_14); #endif
if (table[VAR_12][1]  != 0) { av_log(NULL, AV_LOG_ERROR, "incorrect VAR_6\VAR_14"); return -1; } table[VAR_12][1] = VAR_14; table[VAR_12][0] = VAR_11; VAR_12++; } } else { VAR_14 -= VAR_1; VAR_12 = (code >> VAR_14) & ((1 << VAR_1) - 1); #ifdef DEBUG_VLC
printf("%4x: VAR_14=%d (subtable)\VAR_14",
VAR_12, VAR_14); #endif
VAR_18 = -table[VAR_12][1]; if (VAR_14 > VAR_18)
VAR_18 = VAR_14; table[VAR_12][1] = -VAR_18; } } } for(VAR_11=0;VAR_11<VAR_15;VAR_11++) { VAR_14 = table[VAR_11][1]; if (VAR_14 < 0) { VAR_14 = -VAR_14; if (VAR_14 > VAR_1) { VAR_14 = VAR_1; table[VAR_11][1] = -VAR_14; } VAR_19 = FUNC_0(VAR_0, VAR_14, VAR_2,
VAR_3, VAR_4, VAR_5,
VAR_6, VAR_7, VAR_8,
(VAR_9 << VAR_1) | VAR_11,
VAR_10 + VAR_1); if (VAR_19 < 0)
return -1; table = &VAR_0->table[VAR_16]; table[VAR_11][0] = VAR_19; } } return VAR_16; }