11 #include "libavutil/pixfmt.h"
12 #include "libavutil/pixdesc.h"
18 #define LOC QString("ColourSpace: ")
123 return found->second;
140 std::vector<float> rgb;
143 case AVCOL_SPC_RGB: rgb = { 1.0000F, 1.0000F, 1.0000F };
break;
144 case AVCOL_SPC_BT709: rgb = { 0.2126F, 0.7152F, 0.0722F };
break;
145 case AVCOL_SPC_FCC: rgb = { 0.30F, 0.59F, 0.11F };
break;
146 case AVCOL_SPC_BT470BG:
147 case AVCOL_SPC_SMPTE170M: rgb = { 0.299F, 0.587F, 0.114F };
break;
148 case AVCOL_SPC_SMPTE240M: rgb = { 0.212F, 0.701F, 0.087F };
break;
149 case AVCOL_SPC_YCOCG: rgb = { 0.25F, 0.5F, 0.25F };
break;
150 case AVCOL_SPC_BT2020_CL:
151 case AVCOL_SPC_BT2020_NCL: rgb = { 0.2627F, 0.6780F, 0.0593F };
break;
152 case AVCOL_SPC_UNSPECIFIED:
153 case AVCOL_SPC_RESERVED:
154 case AVCOL_SPC_SMPTE2085:
155 case AVCOL_SPC_CHROMA_DERIVED_CL:
156 case AVCOL_SPC_CHROMA_DERIVED_NCL:
157 case AVCOL_SPC_ICTCP:
158 default: rgb = { 0.2126F, 0.7152F, 0.0722F };
161 float bs = rgb[2] == 1.0F ? 0.0F : 0.5F / (rgb[2] - 1.0F);
162 float rs = rgb[0] == 1.0F ? 0.0F : 0.5F / (rgb[0] - 1.0F);
163 QMatrix4x4
rgb2yuv( rgb[0], rgb[1], rgb[2], 0.0F,
164 bs * rgb[0], bs * rgb[1], 0.5F, 0.0F,
165 0.5F, rs * rgb[1], rs * rgb[2], 0.0F,
171 rgb2yuv = QMatrix4x4(0.25F, 0.50F, 0.25F, 0.0F,
172 -0.25F, 0.50F, -0.25F, 0.0F,
173 0.50F, 0.00F, -0.50F, 0.0F,
183 yuv2rgb.translate(0.0F, -0.5F, -0.5F);
196 bool noop = !expand && !contract;
201 float luma_scale = noop ? 1.0F : (expand ? depth / (lumapeak - blacklevel) : (lumapeak - blacklevel) / depth);
202 float chroma_scale = noop ? 1.0F : (expand ? depth / (chromapeak - blacklevel) : (chromapeak - blacklevel) / depth);
203 float offset = noop ? 0.0F : (expand ? -blacklevel / depth : blacklevel / depth);
209 scale(luma_scale, chroma_scale, chroma_scale);
210 translate(offset, offset, offset);
226 static_cast<QMatrix4x4*
>(
this)->
operator = (this->transposed());
234 bool primchanged = !qFuzzyCompare(tmpsrcgamma,
m_colourGamma) ||
245 LOG(VB_PLAYBACK, LOG_DEBUG,
LOC +
246 QString(
"Brightness: %1 Contrast: %2 Saturation: %3 Hue: %4 Alpha: %5 Range: %6 Primary: %7")
247 .arg(
static_cast<qreal
>(
m_brightness), 2,
'f', 4, QLatin1Char(
'0'))
248 .arg(
static_cast<qreal
>(
m_contrast) , 2,
'f', 4, QLatin1Char(
'0'))
249 .arg(
static_cast<qreal
>(
m_saturation), 2,
'f', 4, QLatin1Char(
'0'))
250 .arg(
static_cast<qreal
>(
m_hue) , 2,
'f', 4, QLatin1Char(
'0'))
251 .arg(
static_cast<qreal
>(
m_alpha) , 2,
'f', 4, QLatin1Char(
'0'))
258 QDebug
debug(&stream);
262 LOG(VB_PLAYBACK, LOG_DEBUG, stream);
275 int newvalue = Value;
278 newvalue =
current + ((Direction) ? +1 : -1);
280 newvalue = newvalue % 100;
285 newvalue = std::min(std::max(newvalue, 0), 100);
326 int csp =
Frame->m_colorspace;
327 int primary =
Frame->m_colorprimaries;
328 int transfer =
Frame->m_colortransfer;
329 int chroma =
Frame->m_chromalocation;
331 int rawchroma = chroma;
342 csp = AVCOL_SPC_UNSPECIFIED;
344 int range =
Frame->m_colorrange;
345 if (range == AVCOL_RANGE_UNSPECIFIED)
346 range = AVCOL_RANGE_MPEG;
348 if (csp == AVCOL_SPC_UNSPECIFIED)
349 csp = (
Frame->m_width < 1280) ? AVCOL_SPC_BT470BG : AVCOL_SPC_BT709;
350 if (primary == AVCOL_PRI_UNSPECIFIED)
351 primary = (
Frame->m_width < 1280) ? AVCOL_PRI_BT470BG : AVCOL_PRI_BT709;
352 if (transfer == AVCOL_TRC_UNSPECIFIED)
353 transfer = (
Frame->m_width < 1280) ? AVCOL_TRC_GAMMA28 : AVCOL_TRC_BT709;
354 if (chroma == AVCHROMA_LOC_UNSPECIFIED)
355 chroma = AVCHROMA_LOC_LEFT;
373 LOG(VB_GENERAL, LOG_WARNING,
LOC + QString(
"Forcing inconsistent colourspace - frame format %1")
376 LOG(VB_PLAYBACK, LOG_INFO,
LOC + QString(
"Input : %1(%2) Depth:%3 %4Range:%5")
377 .arg(av_color_space_name(
static_cast<AVColorSpace
>(
m_colourSpace)),
381 (AVCOL_RANGE_JPEG ==
m_range) ?
"Full" :
"Limited"));
382 LOG(VB_PLAYBACK, LOG_INFO,
LOC + QString(
"Input : Primaries:%1 Transfer: %2")
384 av_color_transfer_name(
static_cast<AVColorTransferCharacteristic
>(
m_colourTransfer))));
385 LOG(VB_PLAYBACK, LOG_INFO,
LOC + QString(
"Output: Range:%1 Primaries: %2")
389 LOG(VB_PLAYBACK, LOG_INFO,
LOC + QString(
"Chroma location: %1 %2")
390 .arg(av_chroma_location_name(
static_cast<AVChromaLocation
>(
m_chromaLocation)),
397 LOG(VB_GENERAL, LOG_INFO,
LOC + QString(
"Enabled colourspace primaries conversion from %1 to %2")
426 m_hue = Value * -3.6F;
452 result <<
"CHROMALEFT";
456 result <<
"COLOURMAPPING";
501 dbName =
"PlaybackBrightness";
503 dbName =
"PlaybackContrast";
505 dbName =
"PlaybackColour";
507 dbName =
"PlaybackHue";
509 if (!dbName.isEmpty())
524 auto source =
static_cast<AVColorPrimaries
>(
Source);
525 auto dest =
static_cast<AVColorPrimaries
>(Dest);
529 if (!custom && (source ==
dest))
554 auto primary =
static_cast<AVColorPrimaries
>(Primary);
558 case AVCOL_PRI_BT470BG:
560 case AVCOL_PRI_SMPTE170M: