/* -----------------------------------------------
    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, },
    },
};
*/
