From 5fe6faf15ad95dfc515726bbde2cc667dd154849 Mon Sep 17 00:00:00 2001 From: itsmattkc <34096995+itsmattkc@users.noreply.github.com> Date: Sat, 29 Oct 2022 09:59:45 -0700 Subject: [PATCH] ffmpeg: slightly improve performance of yuv2rgb --- app/codec/ffmpeg/ffmpegdecoder.cpp | 8 ++++---- app/shaders/yuv2rgb.frag | 19 +++++++------------ 2 files changed, 11 insertions(+), 16 deletions(-) diff --git a/app/codec/ffmpeg/ffmpegdecoder.cpp b/app/codec/ffmpeg/ffmpegdecoder.cpp index edb37d273..377fb5912 100644 --- a/app/codec/ffmpeg/ffmpegdecoder.cpp +++ b/app/codec/ffmpeg/ffmpegdecoder.cpp @@ -235,10 +235,10 @@ TexturePtr FFmpegDecoder::RetrieveVideoInternal(const RetrieveVideoParams &p) job.Insert(QStringLiteral("full_range"), NodeValue(NodeValue::kBoolean, hw_in->color_range == AVCOL_RANGE_JPEG)); const int *yuv_coeffs = sws_getCoefficients(FFmpegUtils::GetSwsColorspaceFromAVColorSpace(hw_in->colorspace)); - job.Insert(QStringLiteral("yuv_crv"), NodeValue(NodeValue::kInt, yuv_coeffs[0])); - job.Insert(QStringLiteral("yuv_cgu"), NodeValue(NodeValue::kInt, yuv_coeffs[2])); - job.Insert(QStringLiteral("yuv_cgv"), NodeValue(NodeValue::kInt, yuv_coeffs[3])); - job.Insert(QStringLiteral("yuv_cbu"), NodeValue(NodeValue::kInt, yuv_coeffs[1])); + job.Insert(QStringLiteral("yuv_crv"), NodeValue(NodeValue::kFloat, yuv_coeffs[0]/65536.0)); + job.Insert(QStringLiteral("yuv_cgu"), NodeValue(NodeValue::kFloat, yuv_coeffs[2]/65536.0)); + job.Insert(QStringLiteral("yuv_cgv"), NodeValue(NodeValue::kFloat, yuv_coeffs[3]/65536.0)); + job.Insert(QStringLiteral("yuv_cbu"), NodeValue(NodeValue::kFloat, yuv_coeffs[1]/65536.0)); int interlacing = 0; if (p.src_interlacing != VideoParams::kInterlaceNone) { diff --git a/app/shaders/yuv2rgb.frag b/app/shaders/yuv2rgb.frag index 8c40b5918..623badc4f 100644 --- a/app/shaders/yuv2rgb.frag +++ b/app/shaders/yuv2rgb.frag @@ -5,10 +5,10 @@ uniform sampler2D v_channel; uniform int bits_per_pixel; uniform bool full_range; -uniform int yuv_crv; -uniform int yuv_cgu; -uniform int yuv_cgv; -uniform int yuv_cbu; +uniform float yuv_crv; +uniform float yuv_cgu; +uniform float yuv_cgv; +uniform float yuv_cbu; uniform int interlacing; uniform int pixel_height; @@ -51,15 +51,10 @@ void main() yuv.b = yuv.b - 0.5; // Use coefficients to weigh YUV into RGB - float crv = float(yuv_crv) / 65536.0; - float cgu = float(yuv_cgu) / 65536.0; - float cgv = float(yuv_cgv) / 65536.0; - float cbu = float(yuv_cbu) / 65536.0; - vec4 rgba; - rgba.r = yuv.r + crv * yuv.b; - rgba.g = yuv.r - cgu * yuv.g - cgv * yuv.b; - rgba.b = yuv.r + cbu * yuv.g; + rgba.r = yuv.r + yuv_crv * yuv.b; + rgba.g = yuv.r - yuv_cgu * yuv.g - yuv_cgv * yuv.b; + rgba.b = yuv.r + yuv_cbu * yuv.g; // If the expected value is full range, transform to full range here if (full_range) {