/*
 * Copyright (c) 2012-2019, Samsung Electronics Co., Ltd.
 *      http://www.samsung.com
 *
 * DPP poly-phase filter coefficients
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
*/
#ifndef __DPP_COEF_H__
#define __DPP_COEF_H__

/* 8-tap Filter Coefficient */
const int h_coef_8t[7][16][8] = {
    {   /* Ratio <= 65536 (~8:8) Selection = 0 */
        {   0,   0,   0, 512,   0,   0,   0,   0 },
        {  -2,   8, -25, 509,  30,  -9,   2,  -1 },
        {  -4,  14, -46, 499,  64, -19,   5,  -1 },
        {  -5,  20, -62, 482, 101, -30,   8,  -2 },
        {  -6,  23, -73, 458, 142, -41,  12,  -3 },
        {  -6,  25, -80, 429, 185, -53,  15,  -3 },
        {  -6,  26, -83, 395, 228, -63,  19,  -4 },
        {  -6,  25, -82, 357, 273, -71,  21,  -5 },
        {  -5,  23, -78, 316, 316, -78,  23,  -5 },
        {  -5,  21, -71, 273, 357, -82,  25,  -6 },
        {  -4,  19, -63, 228, 395, -83,  26,  -6 },
        {  -3,  15, -53, 185, 429, -80,  25,  -6 },
        {  -3,  12, -41, 142, 458, -73,  23,  -6 },
        {  -2,   8, -30, 101, 482, -62,  20,  -5 },
        {  -1,   5, -19,  64, 499, -46,  14,  -4 },
        {  -1,   2,  -9,  30, 509, -25,   8,  -2 }
    },
    {   /* 65536 < Ratio <= 74898 (~8:7) Selection = 1 */
        { 12, -32,  56, 444,  52, -32,  12,   0 },
        {  9, -24,  29, 445,  82, -39,  13,  -3 },
        {  7, -16,   6, 438, 112, -46,  14,  -3 },
        {  5,  -9, -14, 426, 144, -52,  15,  -3 },
        {  3,  -3, -30, 410, 177, -58,  16,  -3 },
        {  2,   2, -43, 390, 211, -63,  16,  -3 },
        {  1,   7, -53, 365, 244, -66,  16,  -2 },
        {  0,  10, -60, 338, 277, -66,  15,  -2 },
        { -1,  13, -65, 309, 309, -65,  13,  -1 },
        { -2,  15, -66, 277, 338, -60,  10,   0 },
        { -2,  16, -66, 244, 365, -53,   7,   1 },
        { -3,  16, -63, 211, 390, -43,   2,   2 },
        { -3,  16, -58, 177, 410, -30,  -3,   3 },
        { -3,  15, -52, 144, 426, -14,  -9,   5 },
        { -3,  14, -46, 112, 438,   6, -16,   7 },
        { -3,  13, -39,  82, 445,  29, -24,   9 }
    },
    {   /* 74898 < Ratio <= 87381 (~8:6) Selection = 2 */
        {  8, -44, 100, 384, 100, -44,   8,   0 },
        {  9, -40,  77, 382, 123, -47,   8,   0 },
        {  8, -36,  57, 377, 147, -49,   7,   1 },
        {  8, -32,  38, 369, 171, -49,   5,   2 },
        {  8, -27,  20, 358, 196, -48,   3,   2 },
        {  7, -22,   5, 344, 221, -47,   1,   3 },
        {  7, -18,  -9, 329, 245, -43,  -2,   3 },
        {  5, -13, -20, 310, 268, -37,  -5,   4 },
        {  5,  -9, -30, 290, 290, -30,  -9,   5 },
        {  4,  -5, -37, 268, 310, -20, -13,   5 },
        {  3,  -2, -43, 245, 329,  -9, -18,   7 },
        {  3,   1, -47, 221, 344,   5, -22,   7 },
        {  2,   3, -48, 196, 358,  20, -27,   8 },
        {  2,   5, -49, 171, 369,  38, -32,   8 },
        {  1,   7, -49, 147, 377,  57, -36,   8 },
        {  0,   8, -47, 123, 382,  77, -40,   9 }
    },
    {   /* 87381 < Ratio <= 104857 (~8:5) Selection = 3 */
        { -3, -31, 130, 320, 130, -31,  -3,   0 },
        { -3, -32, 113, 319, 147, -29,  -6,   3 },
        { -1, -33,  97, 315, 165, -26,  -8,   3 },
        {  0, -32,  81, 311, 182, -22, -11,   3 },
        {  1, -31,  66, 304, 199, -17, -13,   3 },
        {  2, -30,  52, 296, 216, -11, -16,   3 },
        {  2, -28,  38, 286, 232, -3,  -18,   3 },
        {  3, -25,  26, 274, 247,  5,  -21,   3 },
        {  3, -23,  15, 261, 261, 15,  -23,   3 },
        {  3, -21,   5, 247, 274, 26,  -25,   3 },
        {  3, -18,  -3, 232, 286, 38,  -28,   2 },
        {  3, -16, -11, 216, 296, 52,  -30,   2 },
        {  3, -13, -17, 199, 304, 66,  -31,   1 },
        {  3, -11, -22, 182, 311, 81,  -32,   0 },
        {  3,  -8, -26, 165, 315, 97,  -33,  -1 },
        {  3,  -6, -29, 147, 319, 113, -32,  -3 }
    },
    {   /* 104857 < Ratio <= 131072 (~8:4) Selection = 4 */
        { -11,   0, 140, 255, 140,   0, -12,   0 },
        { -10,  -4, 129, 254, 151,   5, -13,   0 },
        {  -9,  -7, 117, 253, 163,  10, -14,  -1 },
        {  -8, -10, 106, 250, 174,  16, -15,  -1 },
        {  -7, -12,  95, 246, 185,  22, -16,  -1 },
        {  -6, -14,  85, 241, 195,  29, -16,  -2 },
        {  -5, -15,  74, 236, 204,  37, -17,  -2 },
        {  -5, -16,  64, 229, 214,  46, -17,  -3 },
        {  -4, -17,  55, 222, 222,  55, -17,  -4 },
        {  -3, -17,  46, 214, 229,  64, -16,  -5 },
        {  -2, -17,  37, 204, 236,  74, -15,  -5 },
        {  -2, -16,  29, 195, 241,  85, -14,  -6 },
        {  -1, -16,  22, 185, 246,  95, -12,  -7 },
        {  -1, -15,  16, 174, 250, 106, -10,  -8 },
        {  -1, -14,  10, 163, 253, 117,  -7,  -9 },
        {   0, -13,   5, 151, 254, 129,  -4, -10 }
    },
    {   /* 131072 < Ratio <= 174762 (~8:3) Selection = 5 */
        {  -5,  31, 133, 195, 133,  31,  -6,   0 },
        {  -5,  27, 126, 195, 139,  37,  -4,  -3 },
        {  -5,  23, 119, 194, 146,  41,  -3,  -3 },
        {  -5,  19, 112, 193, 152,  47,  -2,  -4 },
        {  -5,  16, 105, 191, 158,  53,  -2,  -4 },
        {  -5,  12,  98, 189, 163,  59,   0,  -4 },
        {  -5,  10,  91, 185, 169,  65,   1,  -4 },
        {  -5,   7,  84, 182, 174,  71,   3,  -4 },
        {  -5,   5,  78, 178, 178,  78,   5,  -5 },
        {  -4,   3,  71, 174, 182,  84,   7,  -5 },
        {  -4,   1,  65, 169, 185,  91,  10,  -5 },
        {  -4,   0,  59, 163, 189,  98,  12,  -5 },
        {  -4,  -2,  53, 158, 191, 105,  16,  -5 },
        {  -4,  -2,  47, 152, 193, 112,  19,  -5 },
        {  -3,  -3,  41, 146, 194, 119,  23,  -5 },
        {  -3,  -4,  37, 139, 195, 126,  27,  -5 }
    },
    {   /* 174762 < Ratio <= 262144 (~8:2) Selection = 6 */
        {  10,  52, 118, 152, 118,  52,  10,   0 },
        {   9,  48, 114, 152, 122,  56,  11,   0 },
        {   7,  45, 110, 151, 125,  60,  13,   1 },
        {   6,  41, 106, 150, 129,  64,  15,   1 },
        {   5,  38, 102, 149, 132,  68,  17,   1 },
        {   4,  35,  98, 148, 135,  72,  19,   1 },
        {   4,  31,  94, 146, 138,  77,  21,   1 },
        {   3,  29,  89, 145, 140,  81,  23,   2 },
        {   2,  26,  85, 143, 143,  85,  26,   2 },
        {   2,  23,  81, 140, 145,  89,  29,   3 },
        {   1,  21,  77, 138, 146,  94,  31,   4 },
        {   1,  19,  72, 135, 148,  98,  35,   4 },
        {   1,  17,  68, 132, 149, 102,  38,   5 },
        {   1,  15,  64, 129, 150, 106,  41,   6 },
        {   1,  13,  60, 125, 151, 110,  45,   7 },
        {   0,  11,  56, 122, 152, 114,  48,   9 }
    }
};

/* 4-tap Filter Coefficient */
const int v_coef_4t[7][16][4] = {
    {   /* Ratio <= 65536 (~8:8) Selection = 0 */
        {   0, 512,   0,   0 },
        { -15, 508,  20,  -1 },
        { -25, 495,  45,  -3 },
        { -31, 473,  75,  -5 },
        { -33, 443, 110,  -8 },
        { -33, 408, 148, -11 },
        { -31, 367, 190, -14 },
        { -27, 324, 234, -19 },
        { -23, 279, 279, -23 },
        { -19, 234, 324, -27 },
        { -14, 190, 367, -31 },
        { -11, 148, 408, -33 },
        {  -8, 110, 443, -33 },
        {  -5,  75, 473, -31 },
        {  -3,  45, 495, -25 },
        {  -1,  20, 508, -15 }
    },
    {   /* 65536 < Ratio <= 74898 (~8:7) Selection = 1 */
        {  32, 448,  32,   0 },
        {  17, 446,  55,  -6 },
        {   3, 437,  79,  -7 },
        {  -7, 421, 107,  -9 },
        { -14, 399, 138, -11 },
        { -18, 373, 170, -13 },
        { -20, 343, 204, -15 },
        { -20, 310, 240, -18 },
        { -19, 275, 275, -19 },
        { -18, 240, 310, -20 },
        { -15, 204, 343, -20 },
        { -13, 170, 373, -18 },
        { -11, 138, 399, -14 },
        {  -9, 107, 421,  -7 },
        {  -7,  79, 437,   3 },
        {  -6,  55, 446,  17 }
    },
    {   /* 74898 < Ratio <= 87381 (~8:6) Selection = 2 */
        {  61, 390,  61,   0 },
        {  46, 390,  83,  -7 },
        {  31, 383, 106,  -8 },
        {  19, 371, 130,  -8 },
        {   9, 356, 156,  -9 },
        {   2, 337, 183, -10 },
        {  -3, 315, 210, -10 },
        {  -7, 291, 238, -10 },
        {  -9, 265, 265,  -9 },
        { -10, 238, 291,  -7 },
        { -10, 210, 315,  -3 },
        { -10, 183, 337,   2 },
        {  -9, 156, 356,   9 },
        {  -8, 130, 371,  19 },
        {  -8, 106, 383,  31 },
        {  -7,  83, 390,  46 }
    },
    {   /* 87381 < Ratio <= 104857 (~8:5) Selection = 3 */
        {  85, 341,  86,   0 },
        {  71, 341, 105,  -5 },
        {  56, 336, 124,  -4 },
        {  43, 328, 145,  -4 },
        {  32, 317, 166,  -3 },
        {  23, 304, 187,  -2 },
        {  16, 288, 209,  -1 },
        {   9, 271, 231,   1 },
        {   5, 251, 251,   5 },
        {   1, 231, 271,   9 },
        {  -1, 209, 288,  16 },
        {  -2, 187, 304,  23 },
        {  -3, 166, 317,  32 },
        {  -4, 145, 328,  43 },
        {  -4, 124, 336,  56 },
        {  -5, 105, 341,  71 }
    },
    {   /* 104857 < Ratio <= 131072 (~8:4) Selection = 4 */
        { 104, 304, 104,   0 },
        {  89, 302, 120,   1 },
        {  76, 298, 136,   2 },
        {  63, 293, 153,   3 },
        {  52, 285, 170,   5 },
        {  42, 275, 188,   7 },
        {  33, 264, 205,  10 },
        {  26, 251, 221,  14 },
        {  20, 236, 236,  20 },
        {  14, 221, 251,  26 },
        {  10, 205, 264,  33 },
        {   7, 188, 275,  42 },
        {   5, 170, 285,  52 },
        {   3, 153, 293,  63 },
        {   2, 136, 298,  76 },
        {   1, 120, 302,  89 }
    },
    {   /* 131072 < Ratio <= 174762 (~8:3) Selection = 5 */
        { 118, 276, 118,   0 },
        { 103, 273, 129,   7 },
        {  90, 270, 143,   9 },
        {  78, 266, 157,  11 },
        {  67, 260, 171,  14 },
        {  57, 253, 185,  17 },
        {  48, 244, 199,  21 },
        {  40, 234, 211,  27 },
        {  33, 223, 223,  33 },
        {  27, 211, 234,  40 },
        {  21, 199, 244,  48 },
        {  17, 185, 253,  57 },
        {  14, 171, 260,  67 },
        {  11, 157, 266,  78 },
        {   9, 143, 270,  90 },
        {   7, 129, 273, 103 }
    },
    {   /* 174762 < Ratio <= 262144 (~8:2) Selection = 6 */
        { 127, 258, 127,   0 },
        { 111, 252, 135,  14 },
        { 100, 250, 147,  15 },
        {  88, 247, 159,  18 },
        {  78, 242, 171,  21 },
        {  68, 237, 182,  25 },
        {  59, 230, 193,  30 },
        {  50, 222, 204,  36 },
        {  43, 213, 213,  43 },
        {  36, 204, 222,  50 },
        {  30, 193, 230,  59 },
        {  25, 182, 237,  68 },
        {  21, 171, 242,  78 },
        {  18, 159, 247,  88 },
        {  15, 147, 250, 100 },
        {  14, 135, 252, 111 }
    }
};

/* 3x3 CSC Coefficient Y2R : 7.9 format */
const uint32_t csc_y2r_3x3_t[16][3][3] = {

    /* 00: CSC_BT601/625/525 line Limited */
    {
        {0x0254, 0x0000, 0x0331},
        {0x0254, 0xFF37, 0xFE60},
        {0x0254, 0x0409, 0x0000},
    },
    /* 01: CSC_BT601/625/525 line Full */
    {
        {0x0200, 0x0000, 0x02BE},
        {0x0200, 0xFF54, 0xFE9B},
        {0x0200, 0x0377, 0x0000},
    },

    /* 02: BT601_625_UNADJUSTED Limited */
    {
        {0x0254, 0x0000, 0x038B},
        {0x0254, 0xFF93, 0xFEE3},
        {0x0254, 0x043B, 0x0000},
    },
    /* 03: BT601_625_UNADJUSTED Full */
    {
        {0x0200, 0x0000, 0x030B},
        {0x0200, 0xFFA3, 0xFF0B},
        {0x0200, 0x03A2, 0x0000},
    },

    /* 04: CSC_BT601/625/525 line Limited */
    {
        {0x0254, 0x0000, 0x0331},
        {0x0254, 0xFF37, 0xFE60},
        {0x0254, 0x0409, 0x0000},
    },
    /* 05: CSC_BT601/625/525 line Full */
    {
        {0x0200, 0x0000, 0x02BE},
        {0x0200, 0xFF54, 0xFE9B},
        {0x0200, 0x0377, 0x0000},
    },

    /* 06: BT601_525_UNADJUSTE Limited */
    {
        {0x0254, 0x0000, 0x0397},
        {0x0254, 0xFF7C, 0xFEEA},
        {0x0254, 0x0428, 0x0000},
    },
    /* 07: BT601_525_UNADJUSTE Full */
    {
        {0x0200, 0x0000, 0x0315},
        {0x0200, 0xFF8F, 0xFF11},
        {0x0200, 0x0392, 0x0000},
    },

    /* 08: CSC_BT_2020_CONSTANT_LUMINANCE -> CSC_BT601 Limited */
    {
        {0x0254, 0x0000, 0x0331},
        {0x0254, 0xFF37, 0xFE60},
        {0x0254, 0x0409, 0x0000},
    },
    /* 09: CSC_BT_2020_CONSTANT_LUMINANCE -> CSC_BT601 Full */
    {
        {0x0200, 0x0000, 0x02BE},
        {0x0200, 0xFF54, 0xFE9B},
        {0x0200, 0x0377, 0x0000},
    },

    /* 10: CSC_BT_470M Limited */
    {
        {0x0254, 0x0000, 0x0331},
        {0x0254, 0xFF37, 0xFE60},
        {0x0254, 0x0409, 0x0000},
    },
    /* 11: CSC_BT_470M Full */
    {
        {0x0200, 0x0000, 0x02BE},
        {0x0200, 0xFF54, 0xFE9B},
        {0x0200, 0x0377, 0x0000},
    },

    /* 12: CSC_FILM Limited */
    {
        {0x0254, 0x0000, 0x0366},
        {0x0254, 0xFF93, 0xFEBA},
        {0x0254, 0x043E, 0x0000},
    },
    /* 13: CSC_FILM Full */
    {
        {0x0200, 0x0000, 0x02EB},
        {0x0200, 0xFFA2, 0xFEE8},
        {0x0200, 0x03A5, 0x0000},
    },

    /* 14: CSC_ADOBE Limited */
    {
        {0x0254, 0x0000, 0x0333},
        {0x0254, 0xFF7F, 0xFE7C},
        {0x0254, 0x0436, 0x0000},
    },
    /* 15: CSC_ADOBE Full */
    {
        {0x0200, 0x0000, 0x02BF},
        {0x0200, 0xFF91, 0xFEB3},
        {0x0200, 0x039E, 0x0000},
    },

    /* Add if necessary */
};

/* 3x3 CSC Coefficient R2Y : 7.9 format */
const uint32_t csc_r2y_3x3_t[16][3][3] = {

    /* 00: CSC_BT601/625/525 line Limited */
    {
        {0x0083, 0x0102, 0x0032},
        {0xFFB4, 0xFF6B, 0x00E1},
        {0x00E1, 0xFF44, 0xFFDB},
    },

    /* 01: CSC_BT601/625/525 line Full */
    {
        {0x0099, 0x012D, 0x003A},
        {0xFFA8, 0xFF53, 0x0106},
        {0x0106, 0xFF25, 0xFFD5},
    },

    /* 02: BT601_625_UNADJUSTED Limited */
    {
        {0x0062, 0x0137, 0x001F},
        {0xFFCA, 0xFF55, 0x00E1},
        {0x00E1, 0xFF34, 0xFFEB},
    },

    /* 03: BT601_625_UNADJUSTED Full */
    {
        {0x0072, 0x016A, 0x0024},
        {0xFFC1, 0xFF39, 0x0106},
        {0x0106, 0xFF12, 0xFFE8},
    },

    /* 04: CSC_BT601/625/525 line Limited */
    {
        {0x0083, 0x0102, 0x0032},
        {0xFFB4, 0xFF6B, 0x00E1},
        {0x00E1, 0xFF44, 0xFFDB},
    },

    /* 05: CSC_BT601/625/525 line Full */
    {
        {0x0099, 0x012D, 0x003A},
        {0xFFA8, 0xFF53, 0x0106},
        {0x0106, 0xFF25, 0xFFD5},
    },

    /* 06: BT601_525_UNADJUSTED Limited */
    {
        {0x005D, 0x0134, 0x0026},
        {0xFFCC, 0xFF53, 0x00E1},
        {0x00E1, 0xFF38, 0xFFE7},
    },

    /* 07: BT601_525_UNADJUSTED Full */
    {
        {0x006D, 0x0167, 0x002D},
        {0xFFC3, 0xFF37, 0x0106},
        {0x0106, 0xFF17, 0xFFE3},
    },

    /* 08: CSC_BT_2020_CONSTANT_LUMINANCE -> CSC_BT601 Limited */
    {
        {0x0083, 0x0102, 0x0032},
        {0xFFB4, 0xFF6B, 0x00E1},
        {0x00E1, 0xFF44, 0xFFDB},
    },

    /* 09: CSC_BT_2020_CONSTANT_LUMINANCE -> CSC_BT601 Full */
    {
        {0x0099, 0x012D, 0x003A},
        {0xFFA8, 0xFF53, 0x0106},
        {0x0106, 0xFF25, 0xFFD5},
    },

    /* 10: CSC_BT_470M Limited */
    {
        {0x0083, 0x0102, 0x0032},
        {0xFFB4, 0xFF6B, 0x00E1},
        {0x00E1, 0xFF44, 0xFFDB},
    },

    /* 11: CSC_BT_470M Full */
    {
        {0x0099, 0x012D, 0x003A},
        {0xFFA8, 0xFF53, 0x0106},
        {0x0106, 0xFF25, 0xFFD5},
    },

    /* 12: CSC_FILM Limited */
    {
        {0x0070, 0x012A, 0x001E},
        {0xFFC3, 0xFF5C, 0x00E1},
        {0x00E1, 0xFF34, 0xFFEC},
    },

    /* 13: CSC_FILM Full */
    {
        {0x0082, 0x015B, 0x0023},
        {0xFFB9, 0xFF42, 0x0106},
        {0x0106, 0xFF12, 0xFFE8},
    },

    /* 14: CSC_ADOBE Limited */
    {
        {0x0083, 0x0114, 0x0021},
        {0xFFB8, 0xFF67, 0x00E1},
        {0x00E1, 0xFF37, 0xFFE8},
    },

    /* 15: CSC_ADOBE Full */
    {
        {0x0098, 0x0141, 0x0027},
        {0xFFAC, 0xFF4E, 0x0106},
        {0x0106, 0xFF16, 0xFFE4},
    },

    /* Add if necessary */
};

#endif /* __DPP_COEF_H__ */
