static int choose_table_nonMMX( const int * ix, const int * const end, int * const s ) { int max; int choice, choice2; static const int huf_tbl_noESC[] = { 1, 2, 5, 7, 7,10,10,13,13,13,13,13,13,13,13 /* char not enough ? */ }; max = ix_max(ix, end); switch (max) { case 0: return max; case 1: return count_bit_noESC(ix, end, s); case 2: case 3: return count_bit_noESC_from2(ix, end, huf_tbl_noESC[max - 1], s); case 4: case 5: case 6: case 7: case 8: case 9: case 10: case 11: case 12: case 13: case 14: case 15: return count_bit_noESC_from3(ix, end, huf_tbl_noESC[max - 1], s); default: /* try tables with linbits */ if (max > IXMAX_VAL) { *s = LARGE_BITS; return -1; } max -= 15; for (choice2 = 24; choice2 < 32; choice2++) { if (ht[choice2].linmax >= max) { break; } } for (choice = choice2 - 8; choice < 24; choice++) { if (ht[choice].linmax >= max) { break; } } return count_bit_ESC(ix, end, choice, choice2, s); } }
/* * new_choose_table: * ----------------- * Choose the Huffman table that will encode ix[begin..end] with * the fewest bits. * Note: This code contains knowledge about the sizes and characteristics * of the Huffman tables as defined in the IS (Table B.7), and will not work * with any arbitrary tables. */ int new_choose_table( int ix[GRANULE_SIZE], unsigned int begin, unsigned int end ) { int i, max; int choice[2]; int sum[2]; max = ix_max(ix,begin,end); if(!max) return 0; choice[0] = 0; choice[1] = 0; if(max<15) { /* try tables with no linbits */ for ( i =14; i--; ) if ( shine_huffman_table[i].xlen > max ) { choice[0] = i; break; } sum[0] = count_bit( ix, begin, end, choice[0] ); switch (choice[0]) { case 2: sum[1] = count_bit( ix, begin, end, 3 ); if ( sum[1] <= sum[0] ) choice[0] = 3; break; case 5: sum[1] = count_bit( ix, begin, end, 6 ); if ( sum[1] <= sum[0] ) choice[0] = 6; break; case 7: sum[1] = count_bit( ix, begin, end, 8 ); if ( sum[1] <= sum[0] ) { choice[0] = 8; sum[0] = sum[1]; } sum[1] = count_bit( ix, begin, end, 9 ); if ( sum[1] <= sum[0] ) choice[0] = 9; break; case 10: sum[1] = count_bit( ix, begin, end, 11 ); if ( sum[1] <= sum[0] ) { choice[0] = 11; sum[0] = sum[1]; } sum[1] = count_bit( ix, begin, end, 12 ); if ( sum[1] <= sum[0] ) choice[0] = 12; break; case 13: sum[1] = count_bit( ix, begin, end, 15 ); if ( sum[1] <= sum[0] ) choice[0] = 15; break; } } else { /* try tables with linbits */ max -= 15; for(i=15;i<24;i++) if(shine_huffman_table[i].linmax>=max) { choice[0] = i; break; } for(i=24;i<32;i++) if(shine_huffman_table[i].linmax>=max) { choice[1] = i; break; } sum[0] = count_bit(ix,begin,end,choice[0]); sum[1] = count_bit(ix,begin,end,choice[1]); if (sum[1]<sum[0]) choice[0] = choice[1]; } return choice[0]; }