2 * Copyright (c) 2015 Kevin Wheatley <kevin.j.wheatley@gmail.com>
4 * This file is part of FFmpeg.
6 * FFmpeg is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * FFmpeg is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with FFmpeg; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
24 #include "libavutil/color_utils.h"
25 #include "libavutil/pixfmt.h"
27 double avpriv_get_gamma_from_trc(enum AVColorTransferCharacteristic trc)
32 case AVCOL_TRC_SMPTE170M:
33 case AVCOL_TRC_SMPTE240M:
34 case AVCOL_TRC_BT1361_ECG:
35 case AVCOL_TRC_BT2020_10:
36 case AVCOL_TRC_BT2020_12:
37 /* these share a segmented TRC, but gamma 1.961 is a close
38 approximation, and also more correct for decoding content */
41 case AVCOL_TRC_GAMMA22:
42 case AVCOL_TRC_IEC61966_2_1:
45 case AVCOL_TRC_GAMMA28:
48 case AVCOL_TRC_LINEAR:
52 gamma = 0.0; // Unknown value representation
57 #define BT709_alpha 1.099296826809442
58 #define BT709_beta 0.018053968510807
60 static double avpriv_trc_bt709(double Lc)
62 const double a = BT709_alpha;
63 const double b = BT709_beta;
65 return (0.0 > Lc) ? 0.0
66 : ( b > Lc) ? 4.500 * Lc
67 : a * pow(Lc, 0.45) - (a - 1.0);
70 static double avpriv_trc_gamma22(double Lc)
72 return (0.0 > Lc) ? 0.0 : pow(Lc, 1.0/ 2.2);
75 static double avpriv_trc_gamma28(double Lc)
77 return (0.0 > Lc) ? 0.0 : pow(Lc, 1.0/ 2.8);
80 static double avpriv_trc_smpte240M(double Lc)
82 const double a = 1.1115;
83 const double b = 0.0228;
85 return (0.0 > Lc) ? 0.0
86 : ( b > Lc) ? 4.000 * Lc
87 : a * pow(Lc, 0.45) - (a - 1.0);
90 static double avpriv_trc_linear(double Lc)
95 static double avpriv_trc_log(double Lc)
97 return (0.01 > Lc) ? 0.0 : 1.0 + log10(Lc) / 2.0;
100 static double avpriv_trc_log_sqrt(double Lc)
103 return (0.00316227766 > Lc) ? 0.0 : 1.0 + log10(Lc) / 2.5;
106 static double avpriv_trc_iec61966_2_4(double Lc)
108 const double a = BT709_alpha;
109 const double b = BT709_beta;
111 return (-b >= Lc) ? -a * pow(-Lc, 0.45) + (a - 1.0)
112 : ( b > Lc) ? 4.500 * Lc
113 : a * pow( Lc, 0.45) - (a - 1.0);
116 static double avpriv_trc_bt1361(double Lc)
118 const double a = BT709_alpha;
119 const double b = BT709_beta;
121 return (-0.0045 >= Lc) ? -(a * pow(-4.0 * Lc, 0.45) + (a - 1.0)) / 4.0
122 : ( b > Lc) ? 4.500 * Lc
123 : a * pow( Lc, 0.45) - (a - 1.0);
126 static double avpriv_trc_iec61966_2_1(double Lc)
128 const double a = 1.055;
129 const double b = 0.0031308;
131 return (0.0 > Lc) ? 0.0
132 : ( b > Lc) ? 12.92 * Lc
133 : a * pow(Lc, 1.0 / 2.4) - (a - 1.0);
136 static double avpriv_trc_smpte_st2084(double Lc)
138 const double c1 = 3424.0 / 4096.0; // c3-c2 + 1
139 const double c2 = 32.0 * 2413.0 / 4096.0;
140 const double c3 = 32.0 * 2392.0 / 4096.0;
141 const double m = 128.0 * 2523.0 / 4096.0;
142 const double n = 0.25 * 2610.0 / 4096.0;
143 const double L = Lc / 10000.0;
144 const double Ln = pow(L, n);
146 return (0.0 > Lc) ? 0.0
147 : pow((c1 + c2 * Ln) / (1.0 + c3 * Ln), m);
151 static double avpriv_trc_smpte_st428_1(double Lc)
153 return (0.0 > Lc) ? 0.0
154 : pow(48.0 * Lc / 52.37, 1.0 / 2.6);
157 avpriv_trc_function avpriv_get_trc_function_from_trc(enum AVColorTransferCharacteristic trc)
159 avpriv_trc_function func = NULL;
161 case AVCOL_TRC_BT709:
162 case AVCOL_TRC_SMPTE170M:
163 case AVCOL_TRC_BT2020_10:
164 case AVCOL_TRC_BT2020_12:
165 func = avpriv_trc_bt709;
168 case AVCOL_TRC_GAMMA22:
169 func = avpriv_trc_gamma22;
171 case AVCOL_TRC_GAMMA28:
172 func = avpriv_trc_gamma28;
175 case AVCOL_TRC_SMPTE240M:
176 func = avpriv_trc_smpte240M;
179 case AVCOL_TRC_LINEAR:
180 func = avpriv_trc_linear;
184 func = avpriv_trc_log;
187 case AVCOL_TRC_LOG_SQRT:
188 func = avpriv_trc_log_sqrt;
191 case AVCOL_TRC_IEC61966_2_4:
192 func = avpriv_trc_iec61966_2_4;
195 case AVCOL_TRC_BT1361_ECG:
196 func = avpriv_trc_bt1361;
199 case AVCOL_TRC_IEC61966_2_1:
200 func = avpriv_trc_iec61966_2_1;
203 case AVCOL_TRC_SMPTEST2084:
204 func = avpriv_trc_smpte_st2084;
207 case AVCOL_TRC_SMPTEST428_1:
208 func = avpriv_trc_smpte_st428_1;
211 case AVCOL_TRC_RESERVED0:
212 case AVCOL_TRC_UNSPECIFIED:
213 case AVCOL_TRC_RESERVED: