Support BGR format for OpenGL textures in QPainterVideoSurface.
Also, use the correct shader for RGB formats, we should be using the one that does swizzling in that case. Change-Id: I77b6327501f833fb2f7b30411fbe853e975a59c7 Reviewed-by: Laszlo Agocs <laszlo.agocs@theqtcompany.com>
This commit is contained in:
@@ -38,6 +38,7 @@
|
|||||||
#include <qpainter.h>
|
#include <qpainter.h>
|
||||||
#include <qvariant.h>
|
#include <qvariant.h>
|
||||||
#include <qvideosurfaceformat.h>
|
#include <qvideosurfaceformat.h>
|
||||||
|
#include <private/qmediaopenglhelper_p.h>
|
||||||
|
|
||||||
#if !defined(QT_NO_OPENGL) && !defined(QT_OPENGL_ES_1_CL) && !defined(QT_OPENGL_ES_1)
|
#if !defined(QT_NO_OPENGL) && !defined(QT_OPENGL_ES_1_CL) && !defined(QT_OPENGL_ES_1)
|
||||||
#include <qglshaderprogram.h>
|
#include <qglshaderprogram.h>
|
||||||
@@ -261,6 +262,12 @@ protected:
|
|||||||
void initYuv420PTextureInfo(const QSize &size);
|
void initYuv420PTextureInfo(const QSize &size);
|
||||||
void initYv12TextureInfo(const QSize &size);
|
void initYv12TextureInfo(const QSize &size);
|
||||||
|
|
||||||
|
bool needsSwizzling(const QVideoSurfaceFormat &format) const {
|
||||||
|
return !QMediaOpenGLHelper::isANGLE()
|
||||||
|
&& (format.pixelFormat() == QVideoFrame::Format_RGB32
|
||||||
|
|| format.pixelFormat() == QVideoFrame::Format_ARGB32);
|
||||||
|
}
|
||||||
|
|
||||||
#if !defined(QT_OPENGL_ES) && !defined(QT_OPENGL_DYNAMIC)
|
#if !defined(QT_OPENGL_ES) && !defined(QT_OPENGL_DYNAMIC)
|
||||||
typedef void (APIENTRY *_glActiveTexture) (GLenum);
|
typedef void (APIENTRY *_glActiveTexture) (GLenum);
|
||||||
_glActiveTexture glActiveTexture;
|
_glActiveTexture glActiveTexture;
|
||||||
@@ -702,7 +709,9 @@ QVideoSurfaceArbFpPainter::QVideoSurfaceArbFpPainter(QGLContext *context)
|
|||||||
<< QVideoFrame::Format_YUV420P;
|
<< QVideoFrame::Format_YUV420P;
|
||||||
m_glPixelFormats
|
m_glPixelFormats
|
||||||
<< QVideoFrame::Format_RGB32
|
<< QVideoFrame::Format_RGB32
|
||||||
<< QVideoFrame::Format_ARGB32;
|
<< QVideoFrame::Format_ARGB32
|
||||||
|
<< QVideoFrame::Format_BGR32
|
||||||
|
<< QVideoFrame::Format_BGRA32;
|
||||||
}
|
}
|
||||||
|
|
||||||
QAbstractVideoSurface::Error QVideoSurfaceArbFpPainter::start(const QVideoSurfaceFormat &format)
|
QAbstractVideoSurface::Error QVideoSurfaceArbFpPainter::start(const QVideoSurfaceFormat &format)
|
||||||
@@ -766,9 +775,14 @@ QAbstractVideoSurface::Error QVideoSurfaceArbFpPainter::start(const QVideoSurfac
|
|||||||
switch (format.pixelFormat()) {
|
switch (format.pixelFormat()) {
|
||||||
case QVideoFrame::Format_RGB32:
|
case QVideoFrame::Format_RGB32:
|
||||||
case QVideoFrame::Format_ARGB32:
|
case QVideoFrame::Format_ARGB32:
|
||||||
|
case QVideoFrame::Format_BGR32:
|
||||||
|
case QVideoFrame::Format_BGRA32:
|
||||||
m_yuv = false;
|
m_yuv = false;
|
||||||
m_textureCount = 1;
|
m_textureCount = 1;
|
||||||
program = qt_arbfp_rgbShaderProgram;
|
if (needsSwizzling(format))
|
||||||
|
program = qt_arbfp_xrgbShaderProgram;
|
||||||
|
else
|
||||||
|
program = qt_arbfp_rgbShaderProgram;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
@@ -1070,7 +1084,9 @@ QVideoSurfaceGlslPainter::QVideoSurfaceGlslPainter(QGLContext *context)
|
|||||||
<< QVideoFrame::Format_YUV420P;
|
<< QVideoFrame::Format_YUV420P;
|
||||||
m_glPixelFormats
|
m_glPixelFormats
|
||||||
<< QVideoFrame::Format_RGB32
|
<< QVideoFrame::Format_RGB32
|
||||||
<< QVideoFrame::Format_ARGB32;
|
<< QVideoFrame::Format_ARGB32
|
||||||
|
<< QVideoFrame::Format_BGR32
|
||||||
|
<< QVideoFrame::Format_BGRA32;
|
||||||
}
|
}
|
||||||
|
|
||||||
QAbstractVideoSurface::Error QVideoSurfaceGlslPainter::start(const QVideoSurfaceFormat &format)
|
QAbstractVideoSurface::Error QVideoSurfaceGlslPainter::start(const QVideoSurfaceFormat &format)
|
||||||
@@ -1138,9 +1154,14 @@ QAbstractVideoSurface::Error QVideoSurfaceGlslPainter::start(const QVideoSurface
|
|||||||
switch (format.pixelFormat()) {
|
switch (format.pixelFormat()) {
|
||||||
case QVideoFrame::Format_RGB32:
|
case QVideoFrame::Format_RGB32:
|
||||||
case QVideoFrame::Format_ARGB32:
|
case QVideoFrame::Format_ARGB32:
|
||||||
|
case QVideoFrame::Format_BGR32:
|
||||||
|
case QVideoFrame::Format_BGRA32:
|
||||||
m_yuv = false;
|
m_yuv = false;
|
||||||
m_textureCount = 1;
|
m_textureCount = 1;
|
||||||
fragmentProgram = qt_glsl_rgbShaderProgram;
|
if (needsSwizzling(format))
|
||||||
|
fragmentProgram = qt_glsl_xrgbShaderProgram;
|
||||||
|
else
|
||||||
|
fragmentProgram = qt_glsl_rgbShaderProgram;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
|||||||
Reference in New Issue
Block a user