static void put_codebook_header(PutBitContext * pb, codebook_t * cb) {

    int i;

    int ordered = 0;



    put_bits(pb, 24, 0x564342); //magic

    put_bits(pb, 16, cb->ndimentions);

    put_bits(pb, 24, cb->nentries);



    for (i = 1; i < cb->nentries; i++) if (cb->entries[i].len < cb->entries[i-1].len) break;

    if (i == cb->nentries) ordered = 1;



    put_bits(pb, 1, ordered);

    if (ordered) {

        int len = cb->entries[0].len;

        put_bits(pb, 5, len);

        i = 0;

        while (i < cb->nentries) {

            int j;

            for (j = 0; j+i < cb->nentries; j++) if (cb->entries[j+i].len != len) break;

            put_bits(pb, ilog(cb->nentries - i), j);

            i += j;

            len++;

        }

    } else {

        int sparse = 0;

        for (i = 0; i < cb->nentries; i++) if (!cb->entries[i].len) break;

        if (i != cb->nentries) sparse = 1;

        put_bits(pb, 1, sparse);



        for (i = 0; i < cb->nentries; i++) {

            if (sparse) put_bits(pb, 1, !!cb->entries[i].len);

            if (cb->entries[i].len) put_bits(pb, 5, cb->entries[i].len - 1);

        }

    }



    put_bits(pb, 4, cb->lookup);

    if (cb->lookup) {

        int tmp = cb_lookup_vals(cb->lookup, cb->ndimentions, cb->nentries);

        int bits = ilog(cb->quantlist[0]);



        for (i = 1; i < tmp; i++) bits = FFMAX(bits, ilog(cb->quantlist[i]));



        put_float(pb, cb->min);

        put_float(pb, cb->delta);



        put_bits(pb, 4, bits - 1);

        put_bits(pb, 1, cb->seq_p);



        for (i = 0; i < tmp; i++) put_bits(pb, bits, cb->quantlist[i]);

    }

}

static void put_codebook_header(PutBitContext * pb, codebook_t * cb) {

    int i;

    int ordered = 0;



    put_bits(pb, 24, 0x564342); 

    put_bits(pb, 16, cb->ndimentions);

    put_bits(pb, 24, cb->nentries);



    for (i = 1; i < cb->nentries; i++) if (cb->entries[i].len < cb->entries[i-1].len) break;

    if (i == cb->nentries) ordered = 1;



    put_bits(pb, 1, ordered);

    if (ordered) {

        int len = cb->entries[0].len;

        put_bits(pb, 5, len);

        i = 0;

        while (i < cb->nentries) {

            int j;

            for (j = 0; j+i < cb->nentries; j++) if (cb->entries[j+i].len != len) break;

            put_bits(pb, ilog(cb->nentries - i), j);

            i += j;

            len++;

        }

    } else {

        int sparse = 0;

        for (i = 0; i < cb->nentries; i++) if (!cb->entries[i].len) break;

        if (i != cb->nentries) sparse = 1;

        put_bits(pb, 1, sparse);



        for (i = 0; i < cb->nentries; i++) {

            if (sparse) put_bits(pb, 1, !!cb->entries[i].len);

            if (cb->entries[i].len) put_bits(pb, 5, cb->entries[i].len - 1);

        }

    }



    put_bits(pb, 4, cb->lookup);

    if (cb->lookup) {

        int tmp = cb_lookup_vals(cb->lookup, cb->ndimentions, cb->nentries);

        int bits = ilog(cb->quantlist[0]);



        for (i = 1; i < tmp; i++) bits = FFMAX(bits, ilog(cb->quantlist[i]));



        put_float(pb, cb->min);

        put_float(pb, cb->delta);



        put_bits(pb, 4, bits - 1);

        put_bits(pb, 1, cb->seq_p);



        for (i = 0; i < tmp; i++) put_bits(pb, bits, cb->quantlist[i]);

    }

}

        put_bits(pb, 5, len);
static void FUNC_0(PutBitContext * VAR_0, codebook_t * VAR_1) {

    int VAR_2;

    int VAR_3 = 0;



    put_bits(VAR_0, 24, 0x564342); 

    put_bits(VAR_0, 16, VAR_1->ndimentions);

    put_bits(VAR_0, 24, VAR_1->nentries);



    for (VAR_2 = 1; VAR_2 < VAR_1->nentries; VAR_2++) if (VAR_1->entries[VAR_2].VAR_4 < VAR_1->entries[VAR_2-1].VAR_4) break;

    if (VAR_2 == VAR_1->nentries) VAR_3 = 1;



    put_bits(VAR_0, 1, VAR_3);

    if (VAR_3) {

        int VAR_4 = VAR_1->entries[0].VAR_4;

        put_bits(VAR_0, 5, VAR_4);

        VAR_2 = 0;

        while (VAR_2 < VAR_1->nentries) {

            int VAR_5;

            for (VAR_5 = 0; VAR_5+VAR_2 < VAR_1->nentries; VAR_5++) if (VAR_1->entries[VAR_5+VAR_2].VAR_4 != VAR_4) break;

            put_bits(VAR_0, ilog(VAR_1->nentries - VAR_2), VAR_5);

            VAR_2 += VAR_5;

            VAR_4++;

        }

    } else {

        int VAR_6 = 0;

        for (VAR_2 = 0; VAR_2 < VAR_1->nentries; VAR_2++) if (!VAR_1->entries[VAR_2].VAR_4) break;

        if (VAR_2 != VAR_1->nentries) VAR_6 = 1;

        put_bits(VAR_0, 1, VAR_6);



        for (VAR_2 = 0; VAR_2 < VAR_1->nentries; VAR_2++) {

            if (VAR_6) put_bits(VAR_0, 1, !!VAR_1->entries[VAR_2].VAR_4);

            if (VAR_1->entries[VAR_2].VAR_4) put_bits(VAR_0, 5, VAR_1->entries[VAR_2].VAR_4 - 1);

        }

    }



    put_bits(VAR_0, 4, VAR_1->lookup);

    if (VAR_1->lookup) {

        int VAR_7 = cb_lookup_vals(VAR_1->lookup, VAR_1->ndimentions, VAR_1->nentries);

        int VAR_8 = ilog(VAR_1->quantlist[0]);



        for (VAR_2 = 1; VAR_2 < VAR_7; VAR_2++) VAR_8 = FFMAX(VAR_8, ilog(VAR_1->quantlist[VAR_2]));



        put_float(VAR_0, VAR_1->min);

        put_float(VAR_0, VAR_1->delta);



        put_bits(VAR_0, 4, VAR_8 - 1);

        put_bits(VAR_0, 1, VAR_1->seq_p);



        for (VAR_2 = 0; VAR_2 < VAR_7; VAR_2++) put_bits(VAR_0, VAR_8, VAR_1->quantlist[VAR_2]);

    }

}

static void FUNC_0(PutBitContext * VAR_0, codebook_t * VAR_1) { int VAR_2; int VAR_3 = 0; put_bits(VAR_0, 24, 0x564342); put_bits(VAR_0, 16, VAR_1->ndimentions); put_bits(VAR_0, 24, VAR_1->nentries); for (VAR_2 = 1; VAR_2 < VAR_1->nentries; VAR_2++) if (VAR_1->entries[VAR_2].VAR_4 < VAR_1->entries[VAR_2-1].VAR_4) break; if (VAR_2 == VAR_1->nentries) VAR_3 = 1; put_bits(VAR_0, 1, VAR_3); if (VAR_3) { int VAR_4 = VAR_1->entries[0].VAR_4; put_bits(VAR_0, 5, VAR_4); VAR_2 = 0; while (VAR_2 < VAR_1->nentries) { int VAR_5; for (VAR_5 = 0; VAR_5+VAR_2 < VAR_1->nentries; VAR_5++) if (VAR_1->entries[VAR_5+VAR_2].VAR_4 != VAR_4) break; put_bits(VAR_0, ilog(VAR_1->nentries - VAR_2), VAR_5); VAR_2 += VAR_5; VAR_4++; } } else { int VAR_6 = 0; for (VAR_2 = 0; VAR_2 < VAR_1->nentries; VAR_2++) if (!VAR_1->entries[VAR_2].VAR_4) break; if (VAR_2 != VAR_1->nentries) VAR_6 = 1; put_bits(VAR_0, 1, VAR_6); for (VAR_2 = 0; VAR_2 < VAR_1->nentries; VAR_2++) { if (VAR_6) put_bits(VAR_0, 1, !!VAR_1->entries[VAR_2].VAR_4); if (VAR_1->entries[VAR_2].VAR_4) put_bits(VAR_0, 5, VAR_1->entries[VAR_2].VAR_4 - 1); } } put_bits(VAR_0, 4, VAR_1->lookup); if (VAR_1->lookup) { int VAR_7 = cb_lookup_vals(VAR_1->lookup, VAR_1->ndimentions, VAR_1->nentries); int VAR_8 = ilog(VAR_1->quantlist[0]); for (VAR_2 = 1; VAR_2 < VAR_7; VAR_2++) VAR_8 = FFMAX(VAR_8, ilog(VAR_1->quantlist[VAR_2])); put_float(VAR_0, VAR_1->min); put_float(VAR_0, VAR_1->delta); put_bits(VAR_0, 4, VAR_8 - 1); put_bits(VAR_0, 1, VAR_1->seq_p); for (VAR_2 = 0; VAR_2 < VAR_7; VAR_2++) put_bits(VAR_0, VAR_8, VAR_1->quantlist[VAR_2]); } }