/* ----------------------------------------------- defines for use in packJPG processing ----------------------------------------------- */ // action defines #define A_COMPRESS 1 #define A_SPLIT_DUMP 2 #define A_COLL_DUMP 3 #define A_FCOLL_DUMP 4 #define A_ZDST_DUMP 5 #define A_TXT_INFO 6 #define A_DIST_INFO 7 #define A_PGM_DUMP 8 // file type defines #define F_JPG 1 #define F_PJG 2 #define F_UNK 3 /* ----------------------------------------------- compression helper tables ----------------------------------------------- */ // maxima for each frequency in zigzag order // dc maximum is fixed by offset (+4/QUANT) static const unsigned short int freqmax[] = { 1024, 931, 932, 985, 858, 985, 968, 884, 884, 967, 1020, 841, 871, 840, 1020, 968, 932, 875, 876, 932, 969, 1020, 838, 985, 844, 985, 838, 1020, 1020, 854, 878, 967, 967, 878, 854, 1020, 854, 871, 886, 1020, 886, 871, 854, 854, 870, 969, 969, 870, 854, 838, 1010, 838, 1020, 837, 1020, 969, 969, 1020, 838, 1020, 838, 1020, 1020, 838 }; /* // maxima for each frequency - IJG DCT float (not used) static const unsigned short int freqmax_float[] = { 1024, 924, 942, 924, 1020, 924, 942, 924, 924, 837, 854, 837, 924, 837, 854, 837, 942, 854, 871, 854, 942, 854, 871, 854, 924, 837, 854, 837, 924, 837, 854, 837, 1020, 924, 942, 924, 1020, 924, 942, 924, 924, 837, 854, 837, 924, 837, 854, 837, 942, 854, 871, 854, 942, 854, 871, 854, 924, 837, 854, 837, 924, 837, 854, 837 }; */ /* // maxima for each frequency - IJG DCT int (not used) static const unsigned short int freqmax_int[] = { 1024, 924, 942, 924, 1020, 924, 942, 924, 924, 838, 854, 838, 924, 838, 854, 838, 942, 854, 871, 854, 942, 854, 871, 854, 924, 837, 854, 837, 924, 837, 854, 837, 1020, 924, 942, 924, 1020, 924, 942, 924, 924, 838, 854, 838, 924, 838, 854, 838, 942, 854, 871, 854, 942, 854, 871, 854, 924, 838, 854, 838, 924, 838, 854, 838 }; */ /* // maxima for each frequency - IJG DCT fast (not used) static const unsigned short int freqmax_fast[] = { 1024, 931, 985, 968, 1020, 968, 1020, 1020, 932, 858, 884, 840, 932, 812, 854, 854, 985, 884, 849, 875, 985, 878, 821, 821, 967, 841, 876, 844, 967, 886, 870, 726, 1020, 932, 985, 967, 1020, 969, 1020, 1020, 969, 812, 878, 886, 969, 829, 969, 727, 1020, 854, 821, 870, 1010, 969, 1020, 1020, 1020, 854, 821, 725, 1020, 727, 1020, 510 }; */ /* // maxima for each frequency - IJG DCT max (not used) static const unsigned short int freqmax_ijg[] = { 1024, 931, 985, 968, 1020, 968, 1020, 1020, 932, 858, 884, 840, 932, 838, 854, 854, 985, 884, 871, 875, 985, 878, 871, 854, 967, 841, 876, 844, 967, 886, 870, 837, 1020, 932, 985, 967, 1020, 969, 1020, 1020, 969, 838, 878, 886, 969, 838, 969, 838, 1020, 854, 871, 870, 1010, 969, 1020, 1020, 1020, 854, 854, 838, 1020, 838, 1020, 838 }; */ /* // valdist 99.0% quantiles int vdqu[ 3 ][ 64 ] = { // table for statistical id 0 { 206, 346, 187, 126, 91, 68, 51, 42, 353, 173, 124, 87, 63, 49, 39, 33, 186, 119, 93, 70, 53, 42, 34, 29, 127, 84, 68, 55, 44, 35, 29, 25, 88, 63, 53, 44, 36, 30, 25, 22, 67, 48, 42, 36, 30, 26, 22, 20, 48, 38, 33, 29, 25, 22, 20, 18, 43, 32, 29, 26, 23, 20, 18, 17, }, // table for statistical id 1 { 23, 86, 46, 28, 19, 14, 11, 9, 93, 48, 32, 21, 15, 11, 9, 7, 51, 32, 24, 18, 13, 10, 8, 7, 31, 22, 18, 14, 11, 9, 7, 6, 21, 16, 14, 11, 9, 7, 6, 5, 15, 12, 11, 9, 7, 6, 5, 5, 12, 10, 9, 7, 6, 5, 5, 4, 10, 8, 7, 6, 5, 5, 4, 4, }, // table for statistical id 2 { 25, 89, 45, 27, 18, 13, 10, 8, 94, 48, 31, 21, 15, 11, 8, 6, 49, 32, 24, 17, 13, 10, 8, 6, 29, 22, 18, 14, 11, 8, 7, 5, 20, 16, 13, 11, 9, 7, 6, 5, 15, 12, 11, 9, 7, 6, 5, 4, 11, 9, 9, 7, 6, 5, 4, 4, 8, 7, 7, 6, 5, 4, 4, 3, }, }; */ // standard scan = zigzag scan static const unsigned char stdscan[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63 }; // zigzag scan conversion table static const unsigned char zigzag[] = { 0, 1, 5, 6, 14, 15, 27, 28, 2, 4, 7, 13, 16, 26, 29, 42, 3, 8, 12, 17, 25, 30, 41, 43, 9, 11, 18, 24, 31, 40, 44, 53, 10, 19, 23, 32, 39, 45, 52, 54, 20, 22, 33, 38, 46, 51, 55, 60, 21, 34, 37, 47, 50, 56, 59, 61, 35, 36, 48, 49, 57, 58, 62, 63 }; // zigzag scan reverse conversion table static const unsigned char unzigzag[] = { 0, 1, 8, 16, 9, 2, 3, 10, 17, 24, 32, 25, 18, 11, 4, 5, 12, 19, 26, 33, 40, 48, 41, 34, 27, 20, 13, 6, 7, 14, 21, 28, 35, 42, 49, 56, 57, 50, 43, 36, 29, 22, 15, 23, 30, 37, 44, 51, 58, 59, 52, 45, 38, 31, 39, 46, 53, 60, 61, 54, 47, 55, 62, 63 }; // even/uneven zigzag scan conversion table static const unsigned char even_zigzag[] = { 0, 5, 14, 27, 1, 6, 15, 28, 3, 12, 25, 41, 8, 17, 30, 43, 10, 23, 39, 52, 19, 32, 45, 54, 21, 37, 50, 59, 34, 47, 56, 61, 2, 7, 16, 29, 4, 13, 26, 42, 9, 18, 31, 44, 11, 24, 40, 53, 20, 33, 46, 55, 22, 38, 51, 60, 35, 48, 57, 62, 36, 49, 58, 63, }; // context weighting for each band (luminance) (from POTY 2006/2007) static const signed int abs_ctx_weights_lum[ 64 ][ 3 ][ 5 ] = { { // DCT(0/0) { 0, 0, 7, 0, 0, }, { 0, 6, 11, 8, 0, }, { 9, 13, 0, 0, 0, }, }, { // DCT(1/0) { 0, 0, 8, 0, 0, }, { 0, 3, 28, 7, 0, }, { 5, 7, 0, 0, 0, }, }, { // DCT(0/1) { 0, 0, 5, 0, 0, }, { 0, 4, 4, 6, 0, }, { 8, 30, 0, 0, 0, }, }, { // DCT(0/2) { 0, 0, 5, 0, 0, }, { 0, 3, 5, 5, 0, }, { 11, 27, 0, 0, 0, }, }, { // DCT(1/1) { 0, 0, 4, 0, 0, }, { 0, 7, 13, 10, 0, }, { 6, 16, 0, 0, 0, }, }, { // DCT(2/0) { 0, 0, 10, 0, 0, }, { 0, 2, 25, 6, 0, }, { 6, 9, 0, 0, 0, }, }, { // DCT(3/0) { 0, 0, 10, 0, 0, }, { 0, 1, 24, 6, 0, }, { 7, 9, 0, 0, 0, }, }, { // DCT(2/1) { 0, 0, 5, 0, 0, }, { 0, 7, 15, 10, 0, }, { 8, 12, 0, 0, 0, }, }, { // DCT(1/2) { 0, 0, 6, 0, 0, }, { 0, 8, 8, 10, 0, }, { 7, 18, 0, 0, 0, }, }, { // DCT(0/3) { 0, 0, 6, 0, 0, }, { 0, 3, 5, 5, 0, }, { 12, 26, 0, 0, 0, }, }, { // DCT(0/4) { 0, 0, 6, 0, 0, }, { 0, 3, 6, 5, 0, }, { 13, 25, 0, 0, 0, }, }, { // DCT(1/3) { 0, 0, 6, 0, 0, }, { 0, 7, 8, 8, 0, }, { 8, 19, 0, 0, 0, }, }, { // DCT(2/2) { 0, 0, 5, 0, 0, }, { 0, 8, 11, 11, 0, }, { 8, 14, 0, 0, 0, }, }, { // DCT(3/1) { 0, 0, 6, 0, 0, }, { 0, 6, 16, 9, 0, }, { 8, 11, 0, 0, 0, }, }, { // DCT(4/0) { 0, 0, 11, 0, 0, }, { 0, 1, 24, 5, 0, }, { 7, 10, 0, 0, 0, }, }, { // DCT(5/0) { 0, 0, 11, 0, 0, }, { 0, 1, 24, 5, 0, }, { 7, 10, 0, 0, 0, }, }, { // DCT(4/1) { 0, 0, 7, 0, 0, }, { 0, 6, 16, 9, 0, }, { 8, 11, 0, 0, 0, }, }, { // DCT(3/2) { 0, 0, 5, 0, 0, }, { 0, 8, 12, 11, 0, }, { 8, 12, 0, 0, 0, }, }, { // DCT(2/3) { 0, 0, 6, 0, 0, }, { 0, 8, 9, 10, 0, }, { 8, 15, 0, 0, 0, }, }, { // DCT(1/4) { 0, 0, 7, 0, 0, }, { 0, 6, 8, 8, 0, }, { 9, 19, 0, 0, 0, }, }, { // DCT(0/5) { 0, 0, 6, 0, 0, }, { 0, 2, 6, 5, 0, }, { 13, 25, 0, 0, 0, }, }, { // DCT(0/6) { 0, 0, 5, 0, 0, }, { 0, 2, 6, 5, 0, }, { 13, 24, 0, 0, 0, }, }, { // DCT(1/5) { 0, 0, 7, 0, 0, }, { 0, 6, 8, 7, 0, }, { 10, 19, 0, 0, 0, }, }, { // DCT(2/4) { 0, 0, 6, 0, 0, }, { 0, 8, 9, 9, 0, }, { 8, 16, 0, 0, 0, }, }, { // DCT(3/3) { 0, 0, 6, 0, 0, }, { 0, 8, 10, 11, 0, }, { 8, 13, 0, 0, 0, }, }, { // DCT(4/2) { 0, 0, 6, 0, 0, }, { 0, 7, 13, 10, 0, }, { 8, 11, 0, 0, 0, }, }, { // DCT(5/1) { 0, 0, 7, 0, 0, }, { 0, 6, 15, 8, 0, }, { 8, 11, 0, 0, 0, }, }, { // DCT(6/0) { 0, 0, 11, 0, 0, }, { 0, 1, 23, 5, 0, }, { 7, 10, 0, 0, 0, }, }, { // DCT(7/0) { 0, 0, 11, 0, 0, }, { 0, 1, 23, 5, 0, }, { 7, 9, 0, 0, 0, }, }, { // DCT(6/1) { 0, 0, 7, 0, 0, }, { 0, 6, 15, 8, 0, }, { 8, 10, 0, 0, 0, }, }, { // DCT(5/2) { 0, 0, 7, 0, 0, }, { 0, 7, 13, 9, 0, }, { 8, 11, 0, 0, 0, }, }, { // DCT(4/3) { 0, 0, 6, 0, 0, }, { 0, 8, 11, 10, 0, }, { 8, 12, 0, 0, 0, }, }, { // DCT(3/4) { 0, 0, 6, 0, 0, }, { 0, 8, 9, 10, 0, }, { 8, 14, 0, 0, 0, }, }, { // DCT(2/5) { 0, 0, 7, 0, 0, }, { 0, 7, 8, 8, 0, }, { 9, 16, 0, 0, 0, }, }, { // DCT(1/6) { 0, 0, 7, 0, 0, }, { 0, 6, 7, 7, 0, }, { 10, 18, 0, 0, 0, }, }, { // DCT(0/7) { 0, 0, 6, 0, 0, }, { 0, 3, 6, 5, 0, }, { 13, 24, 0, 0, 0, }, }, { // DCT(1/7) { 0, 0, 6, 0, 0, }, { 0, 5, 7, 6, 0, }, { 10, 18, 0, 0, 0, }, }, { // DCT(2/6) { 0, 0, 7, 0, 0, }, { 0, 7, 8, 8, 0, }, { 9, 15, 0, 0, 0, }, }, { // DCT(3/5) { 0, 0, 6, 0, 0, }, { 0, 8, 9, 9, 0, }, { 8, 14, 0, 0, 0, }, }, { // DCT(4/4) { 0, 0, 6, 0, 0, }, { 0, 8, 10, 10, 0, }, { 8, 12, 0, 0, 0, }, }, { // DCT(5/3) { 0, 0, 6, 0, 0, }, { 0, 7, 11, 10, 0, }, { 8, 11, 0, 0, 0, }, }, { // DCT(6/2) { 0, 0, 7, 0, 0, }, { 0, 7, 13, 8, 0, }, { 8, 11, 0, 0, 0, }, }, { // DCT(7/1) { 0, 0, 8, 0, 0, }, { 0, 5, 15, 8, 0, }, { 8, 10, 0, 0, 0, }, }, { // DCT(7/2) { 0, 0, 7, 0, 0, }, { 0, 6, 13, 8, 0, }, { 8, 10, 0, 0, 0, }, }, { // DCT(6/3) { 0, 0, 6, 0, 0, }, { 0, 7, 11, 9, 0, }, { 8, 10, 0, 0, 0, }, }, { // DCT(5/4) { 0, 0, 6, 0, 0, }, { 0, 8, 10, 10, 0, }, { 8, 11, 0, 0, 0, }, }, { // DCT(4/5) { 0, 0, 6, 0, 0, }, { 0, 8, 9, 9, 0, }, { 8, 12, 0, 0, 0, }, }, { // DCT(3/6) { 0, 0, 6, 0, 0, }, { 0, 8, 8, 8, 0, }, { 8, 13, 0, 0, 0, }, }, { // DCT(2/7) { 0, 0, 6, 0, 0, }, { 0, 6, 7, 7, 0, }, { 9, 16, 0, 0, 0, }, }, { // DCT(3/7) { 0, 0, 6, 0, 0, }, { 0, 7, 7, 7, 0, }, { 8, 14, 0, 0, 0, }, }, { // DCT(4/6) { 0, 0, 6, 0, 0, }, { 0, 8, 9, 9, 0, }, { 7, 12, 0, 0, 0, }, }, { // DCT(5/5) { 0, 0, 6, 0, 0, }, { 0, 8, 9, 10, 0, }, { 8, 11, 0, 0, 0, }, }, { // DCT(6/4) { 0, 0, 6, 0, 0, }, { 0, 7, 10, 9, 0, }, { 7, 10, 0, 0, 0, }, }, { // DCT(7/3) { 0, 0, 6, 0, 0, }, { 0, 7, 12, 8, 0, }, { 8, 10, 0, 0, 0, }, }, { // DCT(7/4) { 0, 0, 6, 0, 0, }, { 0, 7, 11, 8, 0, }, { 7, 9, 0, 0, 0, }, }, { // DCT(6/5) { 0, 0, 6, 0, 0, }, { 0, 7, 9, 9, 0, }, { 7, 10, 0, 0, 0, }, }, { // DCT(5/6) { 0, 0, 6, 0, 0, }, { 0, 8, 9, 9, 0, }, { 7, 11, 0, 0, 0, }, }, { // DCT(4/7) { 0, 0, 6, 0, 0, }, { 0, 7, 7, 8, 0, }, { 7, 12, 0, 0, 0, }, }, { // DCT(5/7) { 0, 0, 6, 0, 0, }, { 0, 8, 8, 8, 0, }, { 7, 11, 0, 0, 0, }, }, { // DCT(6/6) { 0, 0, 8, 0, 0, }, { 0, 6, 7, 8, 0, }, { 8, 12, 0, 0, 0, }, }, { // DCT(7/5) { 0, 0, 6, 0, 0, }, { 0, 7, 10, 9, 0, }, { 7, 9, 0, 0, 0, }, }, { // DCT(7/6) { 0, 0, 6, 0, 0, }, { 0, 7, 9, 8, 0, }, { 7, 10, 0, 0, 0, }, }, { // DCT(6/7) { 0, 0, 6, 0, 0, }, { 0, 7, 7, 8, 0, }, { 7, 11, 0, 0, 0, }, }, { // DCT(7/7) { 0, 0, 6, 0, 0, }, { 0, 8, 8, 9, 0, }, { 7, 9, 0, 0, 0, }, }, }; /* // context weighting for each band (chrominance) (from POTY 2006/2007) static const signed int abs_ctx_weights_chr[ 64 ][ 3 ][ 5 ] = { { // DCT(0/0) { 0, 0, 7, 0, 0, }, { 0, 6, 11, 8, 0, }, { 9, 13, 0, 0, 0, }, }, { // DCT(1/0) { 0, 0, 6, 0, 0, }, { 0, 4, 28, 8, 0, }, { 5, 7, 0, 0, 0, }, }, { // DCT(0/1) { 0, 0, 5, 0, 0, }, { 0, 4, 5, 7, 0, }, { 7, 29, 0, 0, 0, }, }, { // DCT(0/2) { 0, 0, 5, 0, 0, }, { 0, 4, 7, 6, 0, }, { 10, 23, 0, 0, 0, }, }, { // DCT(1/1) { 0, 0, 4, 0, 0, }, { 0, 7, 13, 10, 0, }, { 6, 16, 0, 0, 0, }, }, { // DCT(2/0) { 0, 0, 9, 0, 0, }, { 0, 3, 22, 7, 0, }, { 6, 9, 0, 0, 0, }, }, { // DCT(3/0) { 0, 0, 10, 0, 0, }, { 0, 4, 19, 7, 0, }, { 6, 9, 0, 0, 0, }, }, { // DCT(2/1) { 0, 0, 6, 0, 0, }, { 0, 7, 14, 10, 0, }, { 7, 11, 0, 0, 0, }, }, { // DCT(1/2) { 0, 0, 6, 0, 0, }, { 0, 8, 9, 9, 0, }, { 7, 16, 0, 0, 0, }, }, { // DCT(0/3) { 0, 0, 6, 0, 0, }, { 0, 4, 7, 6, 0, }, { 10, 20, 0, 0, 0, }, }, { // DCT(0/4) { 0, 0, 6, 0, 0, }, { 0, 4, 7, 6, 0, }, { 10, 19, 0, 0, 0, }, }, { // DCT(1/3) { 0, 0, 6, 0, 0, }, { 0, 7, 8, 8, 0, }, { 7, 16, 0, 0, 0, }, }, { // DCT(2/2) { 0, 0, 6, 0, 0, }, { 0, 8, 10, 10, 0, }, { 7, 12, 0, 0, 0, }, }, { // DCT(3/1) { 0, 0, 6, 0, 0, }, { 0, 6, 14, 9, 0, }, { 7, 10, 0, 0, 0, }, }, { // DCT(4/0) { 0, 0, 10, 0, 0, }, { 0, 3, 19, 6, 0, }, { 6, 8, 0, 0, 0, }, }, { // DCT(5/0) { 0, 0, 9, 0, 0, }, { 0, 3, 18, 6, 0, }, { 6, 8, 0, 0, 0, }, }, { // DCT(4/1) { 0, 0, 6, 0, 0, }, { 0, 6, 13, 8, 0, }, { 7, 9, 0, 0, 0, }, }, { // DCT(3/2) { 0, 0, 6, 0, 0, }, { 0, 7, 11, 9, 0, }, { 7, 10, 0, 0, 0, }, }, { // DCT(2/3) { 0, 0, 6, 0, 0, }, { 0, 7, 9, 9, 0, }, { 7, 12, 0, 0, 0, }, }, { // DCT(1/4) { 0, 0, 6, 0, 0, }, { 0, 6, 8, 7, 0, }, { 7, 14, 0, 0, 0, }, }, { // DCT(0/5) { 0, 0, 5, 0, 0, }, { 0, 4, 7, 5, 0, }, { 10, 19, 0, 0, 0, }, }, { // DCT(0/6) { 0, 0, 5, 0, 0, }, { 0, 4, 7, 5, 0, }, { 10, 18, 0, 0, 0, }, }, { // DCT(1/5) { 0, 0, 6, 0, 0, }, { 0, 6, 8, 7, 0, }, { 7, 14, 0, 0, 0, }, }, { // DCT(2/4) { 0, 0, 6, 0, 0, }, { 0, 7, 8, 8, 0, }, { 7, 12, 0, 0, 0, }, }, { // DCT(3/3) { 0, 0, 6, 0, 0, }, { 0, 7, 9, 9, 0, }, { 7, 10, 0, 0, 0, }, }, { // DCT(4/2) { 0, 0, 6, 0, 0, }, { 0, 7, 11, 9, 0, }, { 6, 9, 0, 0, 0, }, }, { // DCT(5/1) { 0, 0, 6, 0, 0, }, { 0, 6, 12, 7, 0, }, { 6, 9, 0, 0, 0, }, }, { // DCT(6/0) { 0, 0, 9, 0, 0, }, { 0, 3, 18, 5, 0, }, { 5, 7, 0, 0, 0, }, }, { // DCT(7/0) { 0, 0, 9, 0, 0, }, { 0, 3, 18, 5, 0, }, { 5, 6, 0, 0, 0, }, }, { // DCT(6/1) { 0, 0, 6, 0, 0, }, { 0, 6, 12, 7, 0, }, { 6, 8, 0, 0, 0, }, }, { // DCT(5/2) { 0, 0, 6, 0, 0, }, { 0, 6, 10, 8, 0, }, { 6, 9, 0, 0, 0, }, }, { // DCT(4/3) { 0, 0, 6, 0, 0, }, { 0, 7, 10, 9, 0, }, { 6, 9, 0, 0, 0, }, }, { // DCT(3/4) { 0, 0, 6, 0, 0, }, { 0, 7, 9, 9, 0, }, { 7, 11, 0, 0, 0, }, }, { // DCT(2/5) { 0, 0, 6, 0, 0, }, { 0, 6, 8, 7, 0, }, { 7, 12, 0, 0, 0, }, }, { // DCT(1/6) { 0, 0, 5, 0, 0, }, { 0, 6, 7, 6, 0, }, { 7, 14, 0, 0, 0, }, }, { // DCT(0/7) { 0, 0, 5, 0, 0, }, { 0, 3, 6, 5, 0, }, { 9, 21, 0, 0, 0, }, }, { // DCT(1/7) { 0, 0, 5, 0, 0, }, { 0, 5, 7, 6, 0, }, { 7, 14, 0, 0, 0, }, }, { // DCT(2/6) { 0, 0, 5, 0, 0, }, { 0, 6, 8, 7, 0, }, { 7, 12, 0, 0, 0, }, }, { // DCT(3/5) { 0, 0, 6, 0, 0, }, { 0, 7, 8, 8, 0, }, { 7, 11, 0, 0, 0, }, }, { // DCT(4/4) { 0, 0, 6, 0, 0, }, { 0, 7, 9, 8, 0, }, { 6, 10, 0, 0, 0, }, }, { // DCT(5/3) { 0, 0, 6, 0, 0, }, { 0, 6, 10, 8, 0, }, { 6, 9, 0, 0, 0, }, }, { // DCT(6/2) { 0, 0, 6, 0, 0, }, { 0, 6, 10, 7, 0, }, { 6, 8, 0, 0, 0, }, }, { // DCT(7/1) { 0, 0, 6, 0, 0, }, { 0, 5, 12, 7, 0, }, { 6, 7, 0, 0, 0, }, }, { // DCT(7/2) { 0, 0, 6, 0, 0, }, { 0, 6, 11, 7, 0, }, { 6, 8, 0, 0, 0, }, }, { // DCT(6/3) { 0, 0, 6, 0, 0, }, { 0, 6, 9, 8, 0, }, { 6, 8, 0, 0, 0, }, }, { // DCT(5/4) { 0, 0, 6, 0, 0, }, { 0, 7, 9, 8, 0, }, { 6, 9, 0, 0, 0, }, }, { // DCT(4/5) { 0, 0, 6, 0, 0, }, { 0, 7, 8, 8, 0, }, { 6, 10, 0, 0, 0, }, }, { // DCT(3/6) { 0, 0, 6, 0, 0, }, { 0, 7, 8, 7, 0, }, { 7, 11, 0, 0, 0, }, }, { // DCT(2/7) { 0, 0, 5, 0, 0, }, { 0, 6, 7, 6, 0, }, { 6, 12, 0, 0, 0, }, }, { // DCT(3/7) { 0, 0, 5, 0, 0, }, { 0, 6, 7, 6, 0, }, { 6, 11, 0, 0, 0, }, }, { // DCT(4/6) { 0, 0, 6, 0, 0, }, { 0, 7, 8, 8, 0, }, { 6, 10, 0, 0, 0, }, }, { // DCT(5/5) { 0, 0, 6, 0, 0, }, { 0, 7, 8, 8, 0, }, { 6, 9, 0, 0, 0, }, }, { // DCT(6/4) { 0, 0, 6, 0, 0, }, { 0, 6, 9, 8, 0, }, { 6, 8, 0, 0, 0, }, }, { // DCT(7/3) { 0, 0, 6, 0, 0, }, { 0, 6, 10, 7, 0, }, { 6, 8, 0, 0, 0, }, }, { // DCT(7/4) { 0, 0, 6, 0, 0, }, { 0, 6, 9, 7, 0, }, { 6, 8, 0, 0, 0, }, }, { // DCT(6/5) { 0, 0, 6, 0, 0, }, { 0, 7, 8, 8, 0, }, { 6, 8, 0, 0, 0, }, }, { // DCT(5/6) { 0, 0, 6, 0, 0, }, { 0, 7, 8, 8, 0, }, { 6, 9, 0, 0, 0, }, }, { // DCT(4/7) { 0, 0, 6, 0, 0, }, { 0, 7, 7, 7, 0, }, { 6, 10, 0, 0, 0, }, }, { // DCT(5/7) { 0, 0, 6, 0, 0, }, { 0, 7, 7, 7, 0, }, { 6, 9, 0, 0, 0, }, }, { // DCT(6/6) { 0, 0, 6, 0, 0, }, { 0, 7, 10, 8, 0, }, { 6, 10, 0, 0, 0, }, }, { // DCT(7/5) { 0, 0, 6, 0, 0, }, { 0, 6, 8, 7, 0, }, { 6, 8, 0, 0, 0, }, }, { // DCT(7/6) { 0, 0, 6, 0, 0, }, { 0, 7, 10, 8, 0, }, { 6, 10, 0, 0, 0, }, }, { // DCT(6/7) { 0, 0, 6, 0, 0, }, { 0, 7, 10, 8, 0, }, { 6, 10, 0, 0, 0, }, }, { // DCT(7/7) { 0, 0, 6, 0, 0, }, { 0, 7, 10, 8, 0, }, { 6, 9, 0, 0, 0, }, }, }; */ // tresholds (size of component) for configuration sets static const unsigned int conf_sets[][3] = { { 76800, 19200, 19200 }, // 2480x1920 { 19200, 4800, 4800 }, // 1280x960 { 10800, 2700, 2700 }, // 960x720 { 4800, 1200, 1200 }, // 640x480 { 1200, 300, 300 }, // 320x240 { 0, 0, 0 } // 0x0 }; // configuration sets for number of segments static const unsigned char conf_segm[][3] = { { 10, 10, 10 }, { 10, 10, 10 }, { 10, 10, 10 }, { 10, 10, 10 }, { 10, 10, 10 }, { 10, 10, 10 } }; // configuration sets for noise thresholds static const unsigned char conf_ntrs[][3] = { { 7, 7, 7 }, { 6, 6, 6 }, { 5, 5, 5 }, { 5, 5, 5 }, { 4, 4, 4 }, { 4, 4, 4 } }; // standard huffman tables, found in JPEG specification, Chapter K.3 static const unsigned char std_huff_tables[4][272] = { { // standard luma dc table (0/0) 0x00,0x01,0x05,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B }, { // standard chroma dc table (0/1) 0x00,0x03,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B }, { // standard luma ac table (1/0) 0x00,0x02,0x01,0x03,0x03,0x02,0x04,0x03,0x05,0x05,0x04,0x04,0x00,0x00,0x01,0x7D, 0x01,0x02,0x03,0x00,0x04,0x11,0x05,0x12,0x21,0x31,0x41,0x06,0x13,0x51,0x61,0x07, 0x22,0x71,0x14,0x32,0x81,0x91,0xA1,0x08,0x23,0x42,0xB1,0xC1,0x15,0x52,0xD1,0xF0, 0x24,0x33,0x62,0x72,0x82,0x09,0x0A,0x16,0x17,0x18,0x19,0x1A,0x25,0x26,0x27,0x28, 0x29,0x2A,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x43,0x44,0x45,0x46,0x47,0x48,0x49, 0x4A,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x63,0x64,0x65,0x66,0x67,0x68,0x69, 0x6A,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7A,0x83,0x84,0x85,0x86,0x87,0x88,0x89, 0x8A,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7, 0xA8,0xA9,0xAA,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xC2,0xC3,0xC4,0xC5, 0xC6,0xC7,0xC8,0xC9,0xCA,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xE1,0xE2, 0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8, 0xF9,0xFA }, { // standard chroma ac table (1/1) 0x00,0x02,0x01,0x02,0x04,0x04,0x03,0x04,0x07,0x05,0x04,0x04,0x00,0x01,0x02,0x77, 0x00,0x01,0x02,0x03,0x11,0x04,0x05,0x21,0x31,0x06,0x12,0x41,0x51,0x07,0x61,0x71, 0x13,0x22,0x32,0x81,0x08,0x14,0x42,0x91,0xA1,0xB1,0xC1,0x09,0x23,0x33,0x52,0xF0, 0x15,0x62,0x72,0xD1,0x0A,0x16,0x24,0x34,0xE1,0x25,0xF1,0x17,0x18,0x19,0x1A,0x26, 0x27,0x28,0x29,0x2A,0x35,0x36,0x37,0x38,0x39,0x3A,0x43,0x44,0x45,0x46,0x47,0x48, 0x49,0x4A,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x63,0x64,0x65,0x66,0x67,0x68, 0x69,0x6A,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7A,0x82,0x83,0x84,0x85,0x86,0x87, 0x88,0x89,0x8A,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0xA2,0xA3,0xA4,0xA5, 0xA6,0xA7,0xA8,0xA9,0xAA,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xC2,0xC3, 0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA, 0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8, 0xF9,0xFA } }; // lengths of standard huffmann tables static const unsigned char std_huff_lengths[ 4 ] = { 28, 28, 178, 178 }; // precalculated bit lengths for values 0...1024 int pbitlen_0_1024[] = { 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, // 32 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, // 64 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // 96 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // 128 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, // 160 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, // 192 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, // 224 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, // 256 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, // 288 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, // 320 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, // 352 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, // 384 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, // 416 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, // 448 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, // 480 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, // 512 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // 544 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // 576 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // 608 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // 640 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // 672 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // 704 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // 736 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // 768 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // 800 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // 832 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // 864 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // 896 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // 928 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // 960 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // 992 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // 1024 11 }; // precalculated bit lengths for values -2048...2047 int pbitlen_n2048_2047[] = { 12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // -2016 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // -1984 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // -1952 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // -1920 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // -1888 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // -1856 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // -1824 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // -1792 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // -1760 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // -1728 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // -1696 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // -1664 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // -1632 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // -1600 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // -1568 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // -1536 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // -1504 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // -1472 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // -1440 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // -1408 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // -1376 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // -1344 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // -1312 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // -1280 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // -1248 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // -1216 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // -1184 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // -1152 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // -1120 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // -1088 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // -1056 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // -1024 11,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // -992 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // -960 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // -928 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // -896 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // -864 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // -832 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // -800 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // -768 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // -736 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // -704 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // -672 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // -640 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // -608 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // -576 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // -544 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // -512 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, // -480 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, // -448 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, // -416 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, // -384 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, // -352 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, // -320 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, // -288 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, // -256 9, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, // -224 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, // -192 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, // -160 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, // -128 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // -96 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // -64 7, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, // -32 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 2, 2, 1, // 0 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, // 32 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, // 64 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // 96 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // 128 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, // 160 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, // 192 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, // 224 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, // 256 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, // 288 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, // 320 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, // 352 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, // 384 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, // 416 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, // 448 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, // 480 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, // 512 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // 544 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // 576 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // 608 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // 640 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // 672 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // 704 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // 736 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // 768 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // 800 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // 832 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // 864 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // 896 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // 928 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // 960 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // 992 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, // 1024 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // 1056 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // 1088 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // 1120 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // 1152 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // 1184 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // 1216 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // 1248 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // 1280 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // 1312 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // 1344 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // 1376 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // 1408 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // 1440 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // 1472 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // 1504 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // 1536 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // 1568 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // 1600 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // 1632 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // 1664 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // 1696 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // 1728 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // 1760 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // 1792 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // 1824 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // 1856 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // 1888 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // 1920 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // 1952 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // 1984 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, // 2016 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11 // 2048 }; // precalculated segmentation settings (the 0th setting corresponds to 1 segments) unsigned char segm_tables[ 49 ][ 50 ] = { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // s0 { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }, // s1 { 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, }, // s2 { 0, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, }, // s3 { 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, }, // s4 { 0, 1, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, }, // s5 { 0, 1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, }, // s6 { 0, 1, 2, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, }, // s7 { 0, 1, 2, 3, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, }, // s8 { 0, 1, 2, 3, 4, 4, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, }, // s9 { 0, 1, 2, 3, 4, 5, 5, 6, 6, 6, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, }, // s10 { 0, 1, 2, 3, 4, 5, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, }, // s11 { 0, 1, 2, 3, 4, 5, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, }, // s12 { 0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, }, // s13 { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, }, // s14 { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, }, // s15 { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, }, // s16 { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, }, // s17 { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, }, // s18 { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, }, // s19 { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 15, 15, 15, 16, 16, 16, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, }, // s20 { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, }, // s21 { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 22, }, // s22 { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, 23, }, // s23 { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, }, // s24 { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, }, // s25 { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 21, 22, 22, 22, 22, 23, 23, 23, 23, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, }, // s26 { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 22, 23, 23, 23, 23, 24, 24, 24, 24, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, }, // s27 { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 24, 24, 24, 25, 25, 25, 25, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, }, // s28 { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 25, 25, 25, 26, 26, 26, 26, 27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, }, // s29 { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 26, 26, 27, 27, 27, 27, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 30, 30, 30, 30, 30, 30, 30, }, // s30 { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 27, 27, 28, 28, 28, 28, 29, 29, 29, 29, 30, 30, 30, 30, 30, 31, 31, 31, 31, 31, 31, 31, }, // s31 { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 28, 29, 29, 29, 29, 30, 30, 30, 30, 31, 31, 31, 31, 31, 32, 32, 32, 32, 32, 32, 32, }, // s32 { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 29, 30, 30, 30, 31, 31, 31, 31, 31, 32, 32, 32, 32, 32, 33, 33, 33, 33, 33, 33, }, // s33 { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 31, 31, 31, 32, 32, 32, 32, 33, 33, 33, 33, 33, 34, 34, 34, 34, 34, 34, }, // s34 { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 32, 32, 33, 33, 33, 33, 34, 34, 34, 34, 34, 35, 35, 35, 35, 35, 35, }, // s35 { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 33, 34, 34, 34, 34, 35, 35, 35, 35, 35, 36, 36, 36, 36, 36, 36, }, // s36 { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 34, 35, 35, 35, 35, 36, 36, 36, 36, 37, 37, 37, 37, 37, 37, }, // s37 { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 36, 36, 36, 37, 37, 37, 37, 38, 38, 38, 38, 38, 38, }, // s38 { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 37, 37, 38, 38, 38, 38, 39, 39, 39, 39, 39, 39, }, // s39 { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 38, 39, 39, 39, 39, 40, 40, 40, 40, 40, 40, }, // s40 { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 39, 40, 40, 40, 40, 41, 41, 41, 41, 41, }, // s41 { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 41, 41, 41, 42, 42, 42, 42, 42, }, // s42 { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 42, 42, 43, 43, 43, 43, 43, }, // s43 { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 43, 44, 44, 44, 44, 44, }, // s44 { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 45, 45, 45, 45, }, // s45 { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 46, 46, 46, }, // s46 { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 47, 47, }, // s47 { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 48, }, // s48 }; /* // old stuff starting here - no more used, therefore commented out // zagzig scan, can be used instead of zigzag scan static const unsigned char zagscan[] = { 0, 2, 1, 5, 4, 3, 9, 8, 7, 6, 14, 13, 12, 11, 10, 20, 19, 18, 17, 16, 15, 27, 26, 25, 24, 23, 22, 21, 35, 34, 33, 32, 31, 30, 29, 28, 42, 41, 40, 39, 38, 37, 36, 48, 47, 46, 45, 44, 43, 53, 52, 51, 50, 49, 57, 56, 55, 54, 60, 59, 58, 62, 61, 63 }; // distance scan, can be used instead of zigzag scan static const unsigned char distscan[] = { 0, 2, 1, 4, 3, 5, 7, 8, 12, 6, 9, 11, 13, 17, 18, 10, 14, 16, 19, 24, 25, 23, 20, 32, 31, 15, 26, 22, 33, 30, 39, 38, 40, 27, 21, 34, 29, 41, 37, 46, 45, 44, 47, 35, 28, 51, 36, 42, 52, 50, 48, 43, 53, 49, 56, 55, 54, 57, 59, 60, 58, 62, 61, 63 }; // diagonal / horizontal / vertical scan, don't use this unless you want bad results static const unsigned char dhvscan[] = { 0, 4, 12, 24, 39, 51, 59, 63, 1, 5, 6, 7, 13, 14, 15, 16, 17, 25, 26, 27, 28, 29, 30, 31, 40, 41, 42, 43, 44, 45, 52, 53, 54, 55, 60, 61, 2, 3, 8, 9, 10, 11, 18, 19, 20, 21, 22, 23, 32, 33, 34, 35, 36, 37, 38, 46, 47, 48, 49, 50, 56, 57, 58, 62 }; // sign relevancy scan static const unsigned char sgnscan[] = { 0, 1, 2, 3, 5, 6, 9, 10, 14, 15, 20, 21, 27, 28, 35, 4, 7, 13, 16, 26, 29, 42, 8, 12, 17, 25, 30, 41, 43, 11, 18, 24, 31, 40, 44, 53, 19, 23, 32, 39, 45, 52, 54, 22, 33, 38, 46, 51, 55, 60, 34, 37, 47, 50, 56, 59, 61, 36, 48, 49, 57, 58, 62, 63 }; // even/uneven zigzag scan reverse conversion table static const int even_natural_order[] = { 0, 8, 9, 3, 1, 16, 2, 10, 12, 26, 40, 41, 19, 33, 48, 34, 35, 49, 57, 43, 42, 56, 50, 36, 58, 52, 38, 39, 59, 45, 31, 46, 17, 32, 18, 4, 24, 25, 11, 5, 27, 13, 7, 21, 20, 6, 14, 28, 29, 15, 30, 44, 22, 23, 37, 51, 53, 61, 47, 62, 60, 54, 55, 63, }; // scans for each frequency static const char freqalign[] = { 'm', 'v', 'v', 'v', 'v', 'v', 'v', 'v', 'h', 'm', 'v', 'v', 'v', 'v', 'v', 'v', 'h', 'h', 'm', 'v', 'v', 'v', 'v', 'v', 'h', 'h', 'h', 'm', 'v', 'v', 'v', 'v', 'h', 'h', 'h', 'h', 'm', 'v', 'v', 'v', 'h', 'h', 'h', 'h', 'h', 'm', 'v', 'v', 'h', 'h', 'h', 'h', 'h', 'h', 'm', 'v', 'h', 'h', 'h', 'h', 'h', 'h', 'h', 'm' }; // chengjie tu subband classification static const unsigned char ctxclass[] = { 0, 1, 3, 3, 3, 6, 6, 6, // 0 -> DC (DC subband) 2, 5, 5, 5, 6, 6, 6, 6, // 1 -> PV (principal vertical) 4, 5, 5, 5, 6, 6, 6, 6, // 2 -> PH (principal horizontal) 4, 5, 5, 6, 6, 6, 6, 6, // 3 -> LV (low-frequency vertical) 4, 6, 6, 6, 6, 6, 6, 6, // 4 -> LH (low-frequency horizontal) 6, 6, 6, 6, 6, 6, 6, 6, // 5 -> LD (low-frequency diagonal) 6, 6, 6, 6, 6, 6, 6, 6, // 6 -> HP (high-pass) 6, 6, 6, 6, 6, 6, 6, 6 }; // context weighting for subband classification static const signed int ctx_weights[ 7 ][ 3 ][ 5 ] = { { // 0 -> DC (DC subband) { 0, 0, 2, 0, 0 }, { 0, 3, 4, 3, 0 }, { 2, 4, 0, 0, 0 } }, { // 1 -> PV (principal vertical) { 0, 0, 3, 0, 0 }, { 0, 0, 6, 0, 0 }, { 0, 0, 0, 0, 0 } }, { // 2 -> PH (principal horizontal) { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 3, 6, 0, 0, 0 } }, { // 3 -> LV (low-frequency vertical) { 0, 0, 3, 0, 0 }, { 0, 1, 6, 1, 0 }, { 0, 1, 0, 0, 0 } }, { // 4 -> LH (low-frequency horizontal) { 0, 0, 0, 0, 0 }, { 0, 1, 1, 1, 0 }, { 3, 6, 0, 0, 0 } }, { // 5 -> LD (low-frequency diagonal) { 0, 0, 2, 0, 0 }, { 0, 3, 4, 3, 0 }, { 2, 4, 0, 0, 0 } }, { // 6 -> HP (high-pass) { 0, 0, 2, 0, 0 }, { 0, 3, 4, 3, 0 }, { 2, 4, 0, 0, 0 } } }; // context weighting for each band (from mixedlum27 set) static const signed int abs_ctx_weights[ 64 ][ 3 ][ 5 ] = { { // DCT(0/0) { 0, 0, 7, 0, 0, }, { 0, 6, 11, 8, 0, }, { 9, 13, 0, 0, 0, }, }, { // DCT(1/0) { 0, 0, 7, 0, 0, }, { 0, 4, 30, 6, 0, }, { 5, 6, 0, 0, 0, }, }, { // DCT(0/1) { 0, 0, 4, 0, 0, }, { 0, 3, 3, 6, 0, }, { 7, 35, 0, 0, 0, }, }, { // DCT(0/2) { 0, 0, 5, 0, 0, }, { 0, 2, 5, 6, 0, }, { 10, 29, 0, 0, 0, }, }, { // DCT(1/1) { 0, 0, 4, 0, 0, }, { 0, 7, 13, 11, 0, }, { 5, 16, 0, 0, 0, }, }, { // DCT(2/0) { 0, 0, 10, 0, 0, }, { 0, 2, 27, 6, 0, }, { 5, 8, 0, 0, 0, }, }, { // DCT(3/0) { 0, 0, 11, 0, 0, }, { 0, 2, 24, 6, 0, }, { 6, 9, 0, 0, 0, }, }, { // DCT(2/1) { 0, 0, 5, 0, 0, }, { 0, 8, 15, 10, 0, }, { 6, 12, 0, 0, 0, }, }, { // DCT(1/2) { 0, 0, 6, 0, 0, }, { 0, 7, 9, 11, 0, }, { 7, 17, 0, 0, 0, }, }, { // DCT(0/3) { 0, 0, 6, 0, 0, }, { 0, 3, 6, 6, 0, }, { 11, 26, 0, 0, 0, }, }, { // DCT(0/4) { 0, 0, 6, 0, 0, }, { 0, 3, 6, 7, 0, }, { 11, 24, 0, 0, 0, }, }, { // DCT(1/3) { 0, 0, 6, 0, 0, }, { 0, 6, 9, 10, 0, }, { 8, 17, 0, 0, 0, }, }, { // DCT(2/2) { 0, 0, 5, 0, 0, }, { 0, 9, 11, 11, 0, }, { 7, 13, 0, 0, 0, }, }, { // DCT(3/1) { 0, 0, 6, 0, 0, }, { 0, 7, 16, 10, 0, }, { 7, 11, 0, 0, 0, }, }, { // DCT(4/0) { 0, 0, 11, 0, 0, }, { 0, 3, 22, 6, 0, }, { 7, 9, 0, 0, 0, }, }, { // DCT(5/0) { 0, 0, 11, 0, 0, }, { 0, 3, 19, 6, 0, }, { 7, 9, 0, 0, 0, }, }, { // DCT(4/1) { 0, 0, 7, 0, 0, }, { 0, 7, 15, 9, 0, }, { 8, 11, 0, 0, 0, }, }, { // DCT(3/2) { 0, 0, 6, 0, 0, }, { 0, 8, 13, 10, 0, }, { 7, 12, 0, 0, 0, }, }, { // DCT(2/3) { 0, 0, 6, 0, 0, }, { 0, 8, 10, 11, 0, }, { 7, 14, 0, 0, 0, }, }, { // DCT(1/4) { 0, 0, 7, 0, 0, }, { 0, 6, 9, 10, 0, }, { 8, 16, 0, 0, 0, }, }, { // DCT(0/5) { 0, 0, 5, 0, 0, }, { 0, 3, 6, 6, 0, }, { 13, 24, 0, 0, 0, }, }, { // DCT(0/6) { 0, 0, 5, 0, 0, }, { 0, 3, 6, 6, 0, }, { 13, 20, 0, 0, 0, }, }, { // DCT(1/5) { 0, 0, 7, 0, 0, }, { 0, 7, 9, 9, 0, }, { 8, 15, 0, 0, 0, }, }, { // DCT(2/4) { 0, 0, 7, 0, 0, }, { 0, 8, 10, 10, 0, }, { 7, 13, 0, 0, 0, }, }, { // DCT(3/3) { 0, 0, 7, 0, 0, }, { 0, 9, 10, 11, 0, }, { 7, 12, 0, 0, 0, }, }, { // DCT(4/2) { 0, 0, 7, 0, 0, }, { 0, 8, 12, 9, 0, }, { 8, 11, 0, 0, 0, }, }, { // DCT(5/1) { 0, 0, 7, 0, 0, }, { 0, 7, 13, 9, 0, }, { 8, 10, 0, 0, 0, }, }, { // DCT(6/0) { 0, 0, 12, 0, 0, }, { 0, 3, 18, 5, 0, }, { 5, 7, 0, 0, 0, }, }, { // DCT(7/0) { 0, 0, 13, 0, 0, }, { 0, 3, 19, 3, 0, }, { 5, 6, 0, 0, 0, }, }, { // DCT(6/1) { 0, 0, 7, 0, 0, }, { 0, 6, 11, 8, 0, }, { 7, 9, 0, 0, 0, }, }, { // DCT(5/2) { 0, 0, 7, 0, 0, }, { 0, 7, 11, 8, 0, }, { 7, 10, 0, 0, 0, }, }, { // DCT(4/3) { 0, 0, 6, 0, 0, }, { 0, 8, 10, 10, 0, }, { 7, 11, 0, 0, 0, }, }, { // DCT(3/4) { 0, 0, 7, 0, 0, }, { 0, 8, 10, 10, 0, }, { 7, 11, 0, 0, 0, }, }, { // DCT(2/5) { 0, 0, 6, 0, 0, }, { 0, 7, 9, 9, 0, }, { 8, 12, 0, 0, 0, }, }, { // DCT(1/6) { 0, 0, 6, 0, 0, }, { 0, 6, 8, 8, 0, }, { 8, 12, 0, 0, 0, }, }, { // DCT(0/7) { 0, 0, 3, 0, 0, }, { 0, 1, 4, 4, 0, }, { 17, 24, 0, 0, 0, }, }, { // DCT(1/7) { 0, 0, 5, 0, 0, }, { 0, 5, 7, 7, 0, }, { 6, 11, 0, 0, 0, }, }, { // DCT(2/6) { 0, 0, 6, 0, 0, }, { 0, 7, 8, 7, 0, }, { 7, 10, 0, 0, 0, }, }, { // DCT(3/5) { 0, 0, 6, 0, 0, }, { 0, 7, 9, 8, 0, }, { 7, 11, 0, 0, 0, }, }, { // DCT(4/4) { 0, 0, 6, 0, 0, }, { 0, 7, 9, 9, 0, }, { 7, 10, 0, 0, 0, }, }, { // DCT(5/3) { 0, 0, 6, 0, 0, }, { 0, 7, 9, 8, 0, }, { 7, 9, 0, 0, 0, }, }, { // DCT(6/2) { 0, 0, 7, 0, 0, }, { 0, 6, 9, 7, 0, }, { 6, 9, 0, 0, 0, }, }, { // DCT(7/1) { 0, 0, 8, 0, 0, }, { 0, 7, 11, 8, 0, }, { 8, 9, 0, 0, 0, }, }, { // DCT(7/2) { 0, 0, 7, 0, 0, }, { 0, 7, 9, 8, 0, }, { 8, 10, 0, 0, 0, }, }, { // DCT(6/3) { 0, 0, 5, 0, 0, }, { 0, 6, 9, 7, 0, }, { 6, 8, 0, 0, 0, }, }, { // DCT(5/4) { 0, 0, 6, 0, 0, }, { 0, 7, 8, 8, 0, }, { 6, 8, 0, 0, 0, }, }, { // DCT(4/5) { 0, 0, 5, 0, 0, }, { 0, 7, 9, 8, 0, }, { 6, 9, 0, 0, 0, }, }, { // DCT(3/6) { 0, 0, 6, 0, 0, }, { 0, 7, 7, 7, 0, }, { 6, 10, 0, 0, 0, }, }, { // DCT(2/7) { 0, 0, 5, 0, 0, }, { 0, 6, 6, 6, 0, }, { 6, 10, 0, 0, 0, }, }, { // DCT(3/7) { 0, 0, 5, 0, 0, }, { 0, 6, 6, 6, 0, }, { 6, 9, 0, 0, 0, }, }, { // DCT(4/6) { 0, 0, 6, 0, 0, }, { 0, 5, 7, 7, 0, }, { 6, 8, 0, 0, 0, }, }, { // DCT(5/5) { 0, 0, 6, 0, 0, }, { 0, 6, 7, 7, 0, }, { 6, 8, 0, 0, 0, }, }, { // DCT(6/4) { 0, 0, 5, 0, 0, }, { 0, 5, 7, 7, 0, }, { 6, 8, 0, 0, 0, }, }, { // DCT(7/3) { 0, 0, 6, 0, 0, }, { 0, 6, 9, 7, 0, }, { 7, 8, 0, 0, 0, }, }, { // DCT(7/4) { 0, 0, 6, 0, 0, }, { 0, 5, 7, 6, 0, }, { 7, 8, 0, 0, 0, }, }, { // DCT(6/5) { 0, 0, 5, 0, 0, }, { 0, 5, 6, 6, 0, }, { 6, 6, 0, 0, 0, }, }, { // DCT(5/6) { 0, 0, 5, 0, 0, }, { 0, 5, 6, 6, 0, }, { 5, 8, 0, 0, 0, }, }, { // DCT(4/7) { 0, 0, 5, 0, 0, }, { 0, 5, 7, 5, 0, }, { 7, 7, 0, 0, 0, }, }, { // DCT(5/7) { 0, 0, 7, 0, 0, }, { 0, 3, 7, 6, 0, }, { 6, 7, 0, 0, 0, }, }, { // DCT(6/6) { 0, 0, 5, 0, 0, }, { 0, 4, 5, 6, 0, }, { 5, 6, 0, 0, 0, }, }, { // DCT(7/5) { 0, 0, 5, 0, 0, }, { 0, 4, 7, 5, 0, }, { 7, 8, 0, 0, 0, }, }, { // DCT(7/6) { 0, 0, 5, 0, 0, }, { 0, 4, 7, 5, 0, }, { 5, 6, 0, 0, 0, }, }, { // DCT(6/7) { 0, 0, 6, 0, 0, }, { 0, 6, 6, 6, 0, }, { 6, 7, 0, 0, 0, }, }, { // DCT(7/7) { 0, 0, 10, 0, 0, }, { 0, 4, 8, 5, 0, }, { 11, 8, 0, 0, 0, }, }, }; */