summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/qtmultimediaquicktools/qsgvideonode_rgb.cpp15
-rw-r--r--src/qtmultimediaquicktools/qsgvideonode_texture.cpp15
-rw-r--r--src/qtmultimediaquicktools/shaders/rgbvideo_swizzle.frag4
3 files changed, 27 insertions, 7 deletions
diff --git a/src/qtmultimediaquicktools/qsgvideonode_rgb.cpp b/src/qtmultimediaquicktools/qsgvideonode_rgb.cpp
index 0dfa11ab9..d039e1e0b 100644
--- a/src/qtmultimediaquicktools/qsgvideonode_rgb.cpp
+++ b/src/qtmultimediaquicktools/qsgvideonode_rgb.cpp
@@ -113,11 +113,19 @@ protected:
class QSGVideoMaterialShader_RGB_swizzle : public QSGVideoMaterialShader_RGB
{
public:
- QSGVideoMaterialShader_RGB_swizzle()
- : QSGVideoMaterialShader_RGB()
+ QSGVideoMaterialShader_RGB_swizzle(bool hasAlpha)
+ : m_hasAlpha(hasAlpha)
{
setShaderSourceFile(QOpenGLShader::Fragment, QStringLiteral(":/qtmultimediaquicktools/shaders/rgbvideo_swizzle.frag"));
}
+
+protected:
+ void initialize() override {
+ QSGVideoMaterialShader_RGB::initialize();
+ program()->setUniformValue(program()->uniformLocation("hasAlpha"), GLboolean(m_hasAlpha));
+ }
+
+ bool m_hasAlpha;
};
@@ -145,7 +153,8 @@ public:
}
QSGMaterialShader *createShader() const override {
- return needsSwizzling() ? new QSGVideoMaterialShader_RGB_swizzle
+ const bool hasAlpha = m_format.pixelFormat() == QVideoFrame::Format_ARGB32;
+ return needsSwizzling() ? new QSGVideoMaterialShader_RGB_swizzle(hasAlpha)
: new QSGVideoMaterialShader_RGB;
}
diff --git a/src/qtmultimediaquicktools/qsgvideonode_texture.cpp b/src/qtmultimediaquicktools/qsgvideonode_texture.cpp
index a26d59532..f5545afc7 100644
--- a/src/qtmultimediaquicktools/qsgvideonode_texture.cpp
+++ b/src/qtmultimediaquicktools/qsgvideonode_texture.cpp
@@ -108,11 +108,19 @@ protected:
class QSGVideoMaterialShader_Texture_swizzle : public QSGVideoMaterialShader_Texture
{
public:
- QSGVideoMaterialShader_Texture_swizzle()
- : QSGVideoMaterialShader_Texture()
+ QSGVideoMaterialShader_Texture_swizzle(bool hasAlpha)
+ : m_hasAlpha(hasAlpha)
{
setShaderSourceFile(QOpenGLShader::Fragment, QStringLiteral(":/qtmultimediaquicktools/shaders/rgbvideo_swizzle.frag"));
}
+
+protected:
+ void initialize() override {
+ QSGVideoMaterialShader_Texture::initialize();
+ program()->setUniformValue(program()->uniformLocation("hasAlpha"), GLboolean(m_hasAlpha));
+ }
+
+ int m_hasAlpha;
};
@@ -138,7 +146,8 @@ public:
}
QSGMaterialShader *createShader() const override {
- return needsSwizzling() ? new QSGVideoMaterialShader_Texture_swizzle
+ const bool hasAlpha = m_format.pixelFormat() == QVideoFrame::Format_ARGB32;
+ return needsSwizzling() ? new QSGVideoMaterialShader_Texture_swizzle(hasAlpha)
: new QSGVideoMaterialShader_Texture;
}
diff --git a/src/qtmultimediaquicktools/shaders/rgbvideo_swizzle.frag b/src/qtmultimediaquicktools/shaders/rgbvideo_swizzle.frag
index f01dc86a0..df66bde63 100644
--- a/src/qtmultimediaquicktools/shaders/rgbvideo_swizzle.frag
+++ b/src/qtmultimediaquicktools/shaders/rgbvideo_swizzle.frag
@@ -1,8 +1,10 @@
uniform sampler2D rgbTexture;
uniform lowp float opacity;
varying highp vec2 qt_TexCoord;
+uniform bool hasAlpha;
void main()
{
- gl_FragColor = vec4(texture2D(rgbTexture, qt_TexCoord).bgr, 1.0) * opacity;
+ vec4 v = texture2D(rgbTexture, qt_TexCoord);
+ gl_FragColor = vec4(v.bgr, hasAlpha ? v.a : 1.0) * opacity;
}