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 }