blob: b928e419def4bc5e5ecd7beec80021b265c142db [file] [log] [blame]
/* SPDX-License-Identifier: GPL-2.0-only
*
* Copyright (c) 2016 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.
*/
#include <linux/types.h>
/* 8-tap Filter Coefficient */
const s16 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 s16 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 for BT2020 : 3.9 format */
const u16 csc_3x3_t[4][3][3] = {
/* CSC_ID = 0 : BT_2020_LIMITTED */
{
{0x254, 0x000, 0x36F},
{0x254, 0xF9E, 0xEAC},
{0x254, 0x461, 0x000},
},
/* CSC_ID = 0 : BT_2020_FULL */
{
{0x200, 0x000, 0x2F3},
{0x200, 0xFAC, 0xEDB},
{0x200, 0x3C3, 0x000},
},
/* CSC_ID = 1 : DCI_P3_LIMITTED */
{
{0x254, 0x000, 0x3AE},
{0x254, 0xF96, 0xEEE},
{0x254, 0x456, 0x000},
},
/* CSC_ID = 1 : DCI_P3_FULL */
{
{0x200, 0x000, 0x329},
{0x200, 0xFA5, 0xF15},
{0x200, 0x3B9, 0x000},
},
/* CSC_ID = 2 : Add if necessary */
};
/* 3x3 CSC Coefficient Y2R : 7.9 format */
const u16 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 u16 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 */
};