File indexing completed on 2024-06-16 04:38:29
0001 /* 0002 SPDX-FileCopyrightText: 2020-2022 Mladen Milinkovic <max@smoothware.net> 0003 0004 SPDX-License-Identifier: GPL-2.0-or-later 0005 */ 0006 0007 #include <QMap> 0008 #include <QVector> 0009 #include <QOpenGLFunctions> 0010 0011 namespace SubtitleComposer { 0012 0013 // from ISO IEC 23001-8:2018 (7.1) data 0014 const static QMap<int, QVector<GLfloat>> _csm{ 0015 // 0 - RESERVED - For future use by ISO/IEC 0016 // 1 - ITU-R BT.709-5; ITU-R BT.1361; IEC 61966-2-1 sRGB or sYCC; IEC 61966-2-4; SMPTE-RP-177:1993b 0017 { 1, QVector<GLfloat>{ 1.0f, 1.0f, 1.0f, 0.0f, -0.1872813f, 1.85564f, 1.574726f, -0.4681946f, 0.0f }}, 0018 // 2 - UNSPECIFIED - Image characteristics are unknown or are determined by the application 0019 // 3 - RESERVED - For future use by ISO/IEC 0020 // 4 - ITU-R BT.470-6m; US-NTSC-1953; USFCCT-47:2003-73.682a 0021 { 4, QVector<GLfloat>{ 1.0f, 1.0f, 1.0f, 0.0f, -0.3456142f, 1.771046f, 1.402194f, -0.7144662f, 0.0f }}, 0022 // 5 - ITU-R BT.470-6bg; ITU-R BT.601-6 625; ITU-R BT.1358 625; ITU-R BT.1700 625 PAL/SECAM 0023 { 5, QVector<GLfloat>{ 1.0f, 1.0f, 1.0f, 0.0f, -0.1874739f, 1.857342f, 1.555995f, -0.488821f, 0.0f }}, 0024 // 6 - ITU-R BT.601-6 525; ITU-R BT.1358 525; ITU-R BT.1700 NTSC; SMPTE-170M:2004 0025 { 6, QVector<GLfloat>{ 1.0f, 1.0f, 1.0f, 0.0f, -0.2255347f, 1.826901f, 1.575252f, -0.4771844f, 0.0f }}, 0026 // 7 - SMPTE-240M:1999 0027 { 7, QVector<GLfloat>{ 1.0f, 1.0f, 1.0f, 0.0f, -0.2255347f, 1.826901f, 1.575252f, -0.4771844f, 0.0f }}, 0028 // 8 - Generic film (color filters using CIE SI C) 0029 { 8, QVector<GLfloat>{ 1.0f, 1.0f, 1.0f, 0.0f, -0.1868185f, 1.864001f, 1.492941f, -0.557879f, 0.0f }}, 0030 // 9 - Rec. ITU-R BT.2020 0031 { 9, QVector<GLfloat>{ 1.0f, 1.0f, 1.0f, 0.0f, -0.1645325f, 1.881414f, 1.474603f, -0.5713434f, 0.0f }}, 0032 // 10 - SMPTE-ST-428-1 (CIE 1931 XYZ as in ISO 11664-1) 0033 { 10, QVector<GLfloat>{ 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 2.0f, 2.0f, 0.0f, 0.0f }}, 0034 // 11 - SMPTE-RP-431-2:2011 0035 { 11, QVector<GLfloat>{ 1.0f, 1.0f, 1.0f, 0.0f, -0.1778395f, 1.862174f, 1.581017f, -0.4589967f, 0.0f }}, 0036 // 12 - SMPTE-EG-432-1:2010 0037 { 12, QVector<GLfloat>{ 1.0f, 1.0f, 1.0f, 0.0f, -0.2110306f, 1.84145f, 1.542053f, -0.5104277f, 0.0f }}, 0038 // 13 - RESERVED - For future use by ISO/IEC 0039 // 14 - RESERVED - For future use by ISO/IEC 0040 // 15 - RESERVED - For future use by ISO/IEC 0041 // 16 - RESERVED - For future use by ISO/IEC 0042 // 17 - RESERVED - For future use by ISO/IEC 0043 // 18 - RESERVED - For future use by ISO/IEC 0044 // 19 - RESERVED - For future use by ISO/IEC 0045 // 20 - RESERVED - For future use by ISO/IEC 0046 // 21 - RESERVED - For future use by ISO/IEC 0047 // 22 - EBU-3213-E:1975 0048 { 22, QVector<GLfloat>{ 1.0f, 1.0f, 1.0f, 0.0f, -0.2581406f, 1.808035f, 1.536503f, -0.5296722f, 0.0f }}, 0049 }; 0050 0051 // from ISO IEC 23001-8:2018 (7.2) data 0052 const static QMap<int, QString> _ctf{ 0053 // 0 - RESERVED - For future use by ISO/IEC 0054 // 1 - ITU-R BT.709-5; ITU-R BT.1361 0055 { 1, QStringLiteral("if(vLin < 0.01805397) return 4.5 * vLin;" 0056 "return 1.099297 * pow(vLin, 0.45) - 0.09929683;") }, 0057 // 2 - Unspecified - Image characteristics are unknown or are determined by the application 0058 // 3 - RESERVED - For future use by ISO/IEC 0059 // 4 - ITU-R BT.470-6m; US-NTSC-1953; USFCCT-47:2003-73.682a; ITU-R BT.1700:2007 625 PAL/SECAM 0060 { 4, QStringLiteral("if(vLin < 0.01805397) return 4.5 * vLin;" 0061 "return 1.099297 * pow(vLin, 0.4545455) - 0.09929683;") }, 0062 // 5 - ITU-R BT.1700:2007 625 PAL/SECAM; ITU-R BT.470-6bg 0063 { 5, QStringLiteral("if(vLin < 0.0031308) return 12.92 * vLin;" 0064 "return 1.055 * pow(vLin, 0.3571429) - 0.055;") }, 0065 // 6 - ITU-R BT.601-6 525/625; ITU-R BT.1358 525/625; ITU-R BT.1700 NTSC; SMPTE-170M:2004 0066 { 6, QStringLiteral("if(vLin < 0.01805397) return 4.5 * vLin;" 0067 "return 1.099297 * pow(vLin, 0.45) - 0.09929683;") }, 0068 // 7 - SMPTE-240M:1999 0069 { 7, QStringLiteral("if(vLin < 0.0228) return 4.0 * vLin;" 0070 "return 1.1115 * pow(vLin, 0.45) - 0.1115;") }, 0071 // 8 - Linear transfer characteristics 0072 { 8, QStringLiteral("return vLin;") }, 0073 // 9 - Logarithmic transfer characteristic (100:1 range) 0074 { 9, QStringLiteral("if(vLin < 0.01) return 0.0;" 0075 "return 1.0 + (log(vLin) / log(10.0)) / 2.0;") }, 0076 // 10 - Logarithmic transfer characteristic (100 * Sqrt(10) : 1 range) 0077 { 10, QStringLiteral("if(vLin < 0.003162278) return 0.0;" 0078 "return 1.0 + (log(vLin) / log(10.0)) / 2.5;") }, 0079 // 11 - IEC 61966-2-4 0080 { 11, QStringLiteral("if(vLin < -0.01805397) return -1.099297 * pow(-vLin, 0.45) + 0.09929683;" 0081 "if(vLin < 0.01805397) return 4.5 * vLin;" 0082 "return 1.099297 * pow(vLin, 0.45) - 0.09929683;") }, 0083 // 12 - ITU-R BT.1361 0084 { 12, QStringLiteral("if(vLin < -0.004) return (-(1.099297 * pow(-4.0 * vLin, 0.45) - 0.09929683)) / 4.0;" 0085 "if(vLin < 0.01805397) return 4.5 * vLin;" 0086 "return 1.099297 * pow(vLin, 0.45) - 0.09929683;") }, 0087 // 13 - IEC 61966-2-1 sRGB/sYCC 0088 { 13, QStringLiteral("if(vLin < 0.0031308) return 12.92 * vLin;" 0089 "return 1.055 * pow(vLin, 0.4166667) - 0.055;") }, 0090 // 14 - ITU-R BT.2020 (10-bit system) 0091 { 14, QStringLiteral("if(vLin < 0.01805397) return 4.5 * vLin;" 0092 "return 1.099297 * pow(vLin, 0.45) - 0.09929683;") }, 0093 // 15 - ITU-R BT.2020 (12-bit system) 0094 { 15, QStringLiteral("if(vLin < 0.01805397) return 4.5 * vLin;" 0095 "return 1.099297 * pow(vLin, 0.45) - 0.09929683;") }, 0096 // 16 - SMPTE-ST-2084 (for TV 10, 12, 14, and 16-bit systems) 0097 { 16, QStringLiteral("return pow((-1.164063 + 18.85156 * pow(vLin, 0.1594238)) / (1.0 + 18.6875 * pow(vLin, 0.1594238)), 78.84375);") }, 0098 // 17 - SMPTE-ST-428-1 0099 { 17, QStringLiteral("return pow((48.0 * vLin) / 52.37, 0.3846154);") }, 0100 }; 0101 const static QMap<int, QString> _ctfi{ 0102 // 0 - RESERVED - For future use by ISO/IEC 0103 // 1 - ITU-R BT.709-5; ITU-R BT.1361 0104 { 1, QStringLiteral("if(vExp < 0.08124286) return vExp / 4.5;" 0105 "return pow((vExp + 0.09929683) / 1.099297, 2.222222);") }, 0106 // 2 - Unspecified - Image characteristics are unknown or are determined by the application 0107 // 3 - RESERVED - For future use by ISO/IEC 0108 // 4 - ITU-R BT.470-6m; US-NTSC-1953; USFCCT-47:2003-73.682a; ITU-R BT.1700:2007 625 PAL/SECAM 0109 { 4, QStringLiteral("if(vExp < 0.08124286) return vExp / 4.5;" 0110 "return pow((vExp + 0.09929683) / 1.099297, 2.2);") }, 0111 // 5 - ITU-R BT.1700:2007 625 PAL/SECAM; ITU-R BT.470-6bg 0112 { 5, QStringLiteral("if(vExp < 0.04044994) return vExp / 12.92;" 0113 "return pow((vExp + 0.055) / 1.055, 2.8);") }, 0114 // 6 - ITU-R BT.601-6 525/625; ITU-R BT.1358 525/625; ITU-R BT.1700 NTSC; SMPTE-170M:2004 0115 { 6, QStringLiteral("if(vExp < 0.08124286) return vExp / 4.5;" 0116 "return pow((vExp + 0.09929683) / 1.099297, 2.222222);") }, 0117 // 7 - SMPTE-240M:1999 0118 { 7, QStringLiteral("if(vExp < 0.0912) return vExp / 4.0;" 0119 "return pow((vExp + 0.1115) / 1.1115, 2.222222);") }, 0120 // 8 - Linear transfer characteristics 0121 { 8, QStringLiteral("return vExp;") }, 0122 // 9 - Logarithmic transfer characteristic (100:1 range) 0123 { 9, QStringLiteral("return pow(10.0, (vExp - 1.0) * 2.0);") }, 0124 // 10 - Logarithmic transfer characteristic (100 * Sqrt(10) : 1 range) 0125 { 10, QStringLiteral("return pow(10.0, (vExp - 1.0) * 2.5);") }, 0126 // 11 - IEC 61966-2-4 0127 { 11, QStringLiteral("if(vExp < -0.08124286) return -pow((vExp - 0.09929683) / -1.099297, 2.222222);" 0128 "if(vExp < 0.08124286) return vExp / 4.5;" 0129 "return pow((vExp + 0.09929683) / 1.099297, 2.222222);") }, 0130 // 12 - ITU-R BT.1361 0131 { 12, QStringLiteral("if(vExp < -0.01792312) return pow((-4.0 * vExp + 0.09929683) / 1.099297, 2.222222) / -4.0;" 0132 "if(vExp < 0.08124286) return vExp / 4.5;" 0133 "return pow((vExp + 0.09929683) / 1.099297, 2.222222);") }, 0134 // 13 - IEC 61966-2-1 sRGB/sYCC 0135 { 13, QStringLiteral("if(vExp < 0.04044994) return vExp / 12.92;" 0136 "return pow((vExp + 0.055) / 1.055, 2.4);") }, 0137 // 14 - ITU-R BT.2020 (10-bit system) 0138 { 14, QStringLiteral("if(vExp < 0.08124286) return vExp / 4.5;" 0139 "return pow((vExp + 0.09929683) / 1.099297, 2.222222);") }, 0140 // 15 - ITU-R BT.2020 (12-bit system) 0141 { 15, QStringLiteral("if(vExp < 0.08124286) return vExp / 4.5;" 0142 "return pow((vExp + 0.09929683) / 1.099297, 2.222222);") }, 0143 // 16 - SMPTE-ST-2084 (for TV 10, 12, 14, and 16-bit systems) 0144 { 16, QStringLiteral("return pow((pow(vExp, 0.01268331) * (1.0 + 18.6875 * pow(vLin, 0.1594238)) + 1.164063) / 18.85156, 6.272588);") }, 0145 // 17 - SMPTE-ST-428-1 0146 { 17, QStringLiteral("return pow(vExp, 2.6) * 1.091042;") }, 0147 }; 0148 // from ISO IEC 23001-8:2018 (7.3) data 0149 const static QMap<int, QVector<GLfloat>> _csc{ 0150 // 0 - The identity matrix (RGB/XYZ); IEC 61966-2-1 sRGB; SMPTE-ST-428-1; ITU-R BT.709-5 0151 { 0, QVector<GLfloat>{ 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f }}, 0152 // 1 - ITU-R BT.709-5; ITU-R BT.1361; IEC 61966-2-1/4 sYCC/xvYCC709; SMPTE-RP-177:1993b 0153 { 1, QVector<GLfloat>{ 1.0f, 1.0f, 1.0f, 0.0f, -0.1873243f, 1.8556f, 1.5748f, -0.4681243f, 0.0f }}, 0154 // 2 - UNSPECIFIED - Image characteristics are unknown or are determined by the application 0155 // 3 - RESERVED - For future use by ISO/IEC 0156 // 4 - USFCCT-47:2003-73.682a 0157 { 4, QVector<GLfloat>{ 1.0f, 1.0f, 1.0f, 0.0f, -0.3345051f, 1.778f, 1.4f, -0.7118644f, 0.0f }}, 0158 // 5 - ITU-R BT.470-6bg; ITU-R BT.601-6 625; ITU-R BT.1358 625; ITU-R BT.1700 625 PAL/SECAM; IEC 61966-2-4 xvYCC601 0159 { 5, QVector<GLfloat>{ 1.0f, 1.0f, 1.0f, 0.0f, -0.3441363f, 1.772f, 1.402f, -0.7141363f, 0.0f }}, 0160 // 6 - ITU-R BT.601-6 525; ITU-R BT.1358 525; ITU-R BT.1700 NTSC; SMPTE-170M:2004 0161 { 6, QVector<GLfloat>{ 1.0f, 1.0f, 1.0f, 0.0f, -0.3441363f, 1.772f, 1.402f, -0.7141363f, 0.0f }}, 0162 // 7 - SMPTE-240M:1999 0163 { 7, QVector<GLfloat>{ 1.0f, 1.0f, 1.0f, 0.0f, -0.226622f, 1.826f, 1.576f, -0.476622f, 0.0f }}, 0164 // 8 - ITU-T SG16; Dirac/VC-2 and H.264 FRext 0165 { 8, QVector<GLfloat>{ 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f }}, 0166 // 9 - ITU-R BT.2020 (non-constant luminance) 0167 { 9, QVector<GLfloat>{ 1.0f, 1.0f, 1.0f, 0.0f, -0.1645531f, 1.8814f, 1.4746f, -0.5713531f, 0.0f }}, 0168 // 10 - ITU-R BT.2020 (constant luminance) 0169 { 10, QVector<GLfloat>{ 1.0f, 1.0f, 1.0f, 0.0f, -0.1645531f, 1.8814f, 1.4746f, -0.5713531f, 0.0f }}, 0170 // 11 - SMPTE-ST-2085:2015 0171 { 11, QVector<GLfloat>{ 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f }}, 0172 // 12 - TODO: AVCOL_SPC_CHROMA_DERIVED_NCL defined in FFmpeg? 0173 // 13 - TODO: AVCOL_SPC_CHROMA_DERIVED_CL defined in FFmpeg? 0174 // 14 - TODO: AVCOL_SPC_ICTCP defined in FFmpeg? 0175 }; 0176 0177 0178 }