| 493 | } |
| 494 | |
| 495 | static void put_codebook_header(PutBitContext *pb, vorbis_enc_codebook *cb) |
| 496 | { |
| 497 | int i; |
| 498 | int ordered = 0; |
| 499 | |
| 500 | put_bits(pb, 24, 0x564342); //magic |
| 501 | put_bits(pb, 16, cb->ndimensions); |
| 502 | put_bits(pb, 24, cb->nentries); |
| 503 | |
| 504 | for (i = 1; i < cb->nentries; i++) |
| 505 | if (cb->lens[i] < cb->lens[i-1]) |
| 506 | break; |
| 507 | if (i == cb->nentries) |
| 508 | ordered = 1; |
| 509 | |
| 510 | put_bits(pb, 1, ordered); |
| 511 | if (ordered) { |
| 512 | int len = cb->lens[0]; |
| 513 | put_bits(pb, 5, len - 1); |
| 514 | i = 0; |
| 515 | while (i < cb->nentries) { |
| 516 | int j; |
| 517 | for (j = 0; j+i < cb->nentries; j++) |
| 518 | if (cb->lens[j+i] != len) |
| 519 | break; |
| 520 | put_bits(pb, ilog(cb->nentries - i), j); |
| 521 | i += j; |
| 522 | len++; |
| 523 | } |
| 524 | } else { |
| 525 | int sparse = 0; |
| 526 | for (i = 0; i < cb->nentries; i++) |
| 527 | if (!cb->lens[i]) |
| 528 | break; |
| 529 | if (i != cb->nentries) |
| 530 | sparse = 1; |
| 531 | put_bits(pb, 1, sparse); |
| 532 | |
| 533 | for (i = 0; i < cb->nentries; i++) { |
| 534 | if (sparse) |
| 535 | put_bits(pb, 1, !!cb->lens[i]); |
| 536 | if (cb->lens[i]) |
| 537 | put_bits(pb, 5, cb->lens[i] - 1); |
| 538 | } |
| 539 | } |
| 540 | |
| 541 | put_bits(pb, 4, cb->lookup); |
| 542 | if (cb->lookup) { |
| 543 | int tmp = cb_lookup_vals(cb->lookup, cb->ndimensions, cb->nentries); |
| 544 | int bits = ilog(cb->quantlist[0]); |
| 545 | |
| 546 | for (i = 1; i < tmp; i++) |
| 547 | bits = FFMAX(bits, ilog(cb->quantlist[i])); |
| 548 | |
| 549 | put_float(pb, cb->min); |
| 550 | put_float(pb, cb->delta); |
| 551 | |
| 552 | put_bits(pb, 4, bits - 1); |
no test coverage detected