diff options
24 files changed, 178 insertions, 112 deletions
diff --git a/.qmake.conf b/.qmake.conf index 33a2710f6..aa9ded07b 100644 --- a/.qmake.conf +++ b/.qmake.conf @@ -1,4 +1,4 @@ load(qt_build_config) CONFIG += qt_example_installs -MODULE_VERSION = 5.7.0 +MODULE_VERSION = 5.8.0 diff --git a/config.tests/directshow/directshow.pro b/config.tests/directshow/directshow.pro index 6dfc54a01..6493e54ab 100644 --- a/config.tests/directshow/directshow.pro +++ b/config.tests/directshow/directshow.pro @@ -3,4 +3,4 @@ CONFIG += console SOURCES += main.cpp -!wince: LIBS += -lstrmiids -ldmoguids -luuid -lmsdmo -lole32 -loleaut32 +LIBS += -lstrmiids -ldmoguids -luuid -lmsdmo -lole32 -loleaut32 diff --git a/config.tests/directshow/main.cpp b/config.tests/directshow/main.cpp index bb9a304ec..25e36f966 100644 --- a/config.tests/directshow/main.cpp +++ b/config.tests/directshow/main.cpp @@ -27,10 +27,8 @@ ****************************************************************************/ #include <dshow.h> -#ifndef _WIN32_WCE #include <d3d9.h> #include <vmr9.h> -#endif int main(int, char**) { diff --git a/src/multimedia/playback/qmediaplayer.cpp b/src/multimedia/playback/qmediaplayer.cpp index afea8e147..f52041e5f 100644 --- a/src/multimedia/playback/qmediaplayer.cpp +++ b/src/multimedia/playback/qmediaplayer.cpp @@ -142,7 +142,7 @@ public: QMediaContent rootMedia; QMediaContent pendingPlaylist; QMediaPlaylist *parentPlaylist(QMediaPlaylist *pls); - bool isInChain(QUrl url); + bool isInChain(const QUrl &url); int nestedPlaylists; void setMedia(const QMediaContent &media, QIODevice *stream = 0); @@ -175,7 +175,7 @@ QMediaPlaylist *QMediaPlayerPrivate::parentPlaylist(QMediaPlaylist *pls) return 0; } -bool QMediaPlayerPrivate::isInChain(QUrl url) +bool QMediaPlayerPrivate::isInChain(const QUrl &url) { // Check whether a URL is already in the chain of playlists. // Also see a comment in parentPlaylist(). diff --git a/src/multimedia/qmediaopenglhelper_p.h b/src/multimedia/qmediaopenglhelper_p.h index 602116976..0a65b9f53 100644 --- a/src/multimedia/qmediaopenglhelper_p.h +++ b/src/multimedia/qmediaopenglhelper_p.h @@ -72,7 +72,7 @@ inline bool QMediaOpenGLHelper::isANGLE() #else bool isANGLE = false; -# if defined(Q_OS_WIN) && !defined(Q_OS_WINCE) && (defined(QT_OPENGL_ES_2) || defined(QT_OPENGL_DYNAMIC)) +# if defined(Q_OS_WIN) && (defined(QT_OPENGL_ES_2) || defined(QT_OPENGL_DYNAMIC)) if (QOpenGLContext::openGLModuleType() == QOpenGLContext::LibGLES) { // Although unlikely, technically LibGLES could mean a non-ANGLE EGL/GLES2 implementation too. // Verify that it is indeed ANGLE. @@ -104,7 +104,7 @@ inline bool QMediaOpenGLHelper::isANGLE() # endif // QT_OPENGL_ES_2_ANGLE_STATIC } -# endif // Q_OS_WIN && !Q_OS_WINCE && (QT_OPENGL_ES_2 || QT_OPENGL_DYNAMIC) +# endif // Q_OS_WIN && (QT_OPENGL_ES_2 || QT_OPENGL_DYNAMIC) return isANGLE; #endif // Q_OS_WINRT diff --git a/src/multimedia/qmediastoragelocation.cpp b/src/multimedia/qmediastoragelocation.cpp index 04aa79758..7bd1e84f4 100644 --- a/src/multimedia/qmediastoragelocation.cpp +++ b/src/multimedia/qmediastoragelocation.cpp @@ -131,7 +131,7 @@ QString QMediaStorageLocation::generateFileName(const QString &prefix, .arg(extension); const QString path = dir.absoluteFilePath(name); - if (!QFileInfo(path).exists()) { + if (!QFileInfo::exists(path)) { m_lastUsedIndex[lastMediaKey] = lastMediaIndex + 1; return path; } diff --git a/src/multimedia/qmediatimerange.cpp b/src/multimedia/qmediatimerange.cpp index 7739c704f..700dcd087 100644 --- a/src/multimedia/qmediatimerange.cpp +++ b/src/multimedia/qmediatimerange.cpp @@ -665,16 +665,7 @@ bool QMediaTimeRange::contains(qint64 time) const */ bool operator==(const QMediaTimeRange &a, const QMediaTimeRange &b) { - if (a.intervals().count() != b.intervals().count()) - return false; - - for (int i = 0; i < a.intervals().count(); i++) - { - if(a.intervals()[i] != b.intervals()[i]) - return false; - } - - return true; + return a.intervals() == b.intervals(); } /*! diff --git a/src/plugins/avfoundation/camera/avfcameraviewfindersettingscontrol.mm b/src/plugins/avfoundation/camera/avfcameraviewfindersettingscontrol.mm index d2ae2af05..e1adf44b1 100644 --- a/src/plugins/avfoundation/camera/avfcameraviewfindersettingscontrol.mm +++ b/src/plugins/avfoundation/camera/avfcameraviewfindersettingscontrol.mm @@ -414,6 +414,10 @@ QVideoFrame::PixelFormat AVFCameraViewfinderSettingsControl2::QtPixelFormatFromC case kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange: case kCVPixelFormatType_420YpCbCr8BiPlanarFullRange: return QVideoFrame::Format_NV12; + case kCVPixelFormatType_422YpCbCr8: + return QVideoFrame::Format_UYVY; + case kCVPixelFormatType_422YpCbCr8_yuvs: + return QVideoFrame::Format_YUYV; default: return QVideoFrame::Format_Invalid; } @@ -434,6 +438,12 @@ bool AVFCameraViewfinderSettingsControl2::CVPixelFormatFromQtFormat(QVideoFrame: case QVideoFrame::Format_NV12: conv = kCVPixelFormatType_420YpCbCr8BiPlanarFullRange; break; + case QVideoFrame::Format_UYVY: + conv = kCVPixelFormatType_422YpCbCr8; + break; + case QVideoFrame::Format_YUYV: + conv = kCVPixelFormatType_422YpCbCr8_yuvs; + break; // These two formats below are not supported // by QSGVideoNodeFactory_RGB, so for now I have to // disable them. diff --git a/src/plugins/directshow/directshow.pro b/src/plugins/directshow/directshow.pro index 117b02ade..280b52619 100644 --- a/src/plugins/directshow/directshow.pro +++ b/src/plugins/directshow/directshow.pro @@ -13,7 +13,7 @@ SOURCES += dsserviceplugin.cpp mingw: DEFINES += NO_DSHOW_STRSAFE !config_wmf: include(player/player.pri) -!wince: include(camera/camera.pri) +include(camera/camera.pri) OTHER_FILES += \ directshow.json \ diff --git a/src/plugins/directshow/player/directshowplayerservice.cpp b/src/plugins/directshow/player/directshowplayerservice.cpp index 05ea3e68f..a411715b8 100644 --- a/src/plugins/directshow/player/directshowplayerservice.cpp +++ b/src/plugins/directshow/player/directshowplayerservice.cpp @@ -47,11 +47,9 @@ #include "directshowplayerservice.h" -#ifndef Q_OS_WINCE #include "directshowaudioendpointcontrol.h" #include "directshowmetadatacontrol.h" #include "vmr9videowindowcontrol.h" -#endif #include "directshowiosource.h" #include "directshowplayercontrol.h" #include "directshowvideorenderercontrol.h" @@ -110,14 +108,10 @@ private: DirectShowPlayerService::DirectShowPlayerService(QObject *parent) : QMediaService(parent) , m_playerControl(0) -#ifndef Q_OS_WINCE , m_metaDataControl(0) -#endif , m_videoRendererControl(0) -#ifndef Q_OS_WINCE , m_videoWindowControl(0) , m_audioEndpointControl(0) -#endif , m_taskThread(0) , m_loop(qt_directShowEventLoop()) , m_pendingTasks(0) @@ -141,10 +135,8 @@ DirectShowPlayerService::DirectShowPlayerService(QObject *parent) , m_dontCacheNextSeekResult(false) { m_playerControl = new DirectShowPlayerControl(this); -#ifndef Q_OS_WINCE m_metaDataControl = new DirectShowMetaDataControl(this); m_audioEndpointControl = new DirectShowAudioEndpointControl(this); -#endif m_taskThread = new DirectShowPlayerServiceThread(this); m_taskThread->start(); @@ -175,14 +167,10 @@ DirectShowPlayerService::~DirectShowPlayerService() } delete m_playerControl; -#ifndef Q_OS_WINCE delete m_audioEndpointControl; delete m_metaDataControl; -#endif delete m_videoRendererControl; -#ifndef Q_OS_WINCE delete m_videoWindowControl; -#endif ::CloseHandle(m_taskHandle); } @@ -191,18 +179,12 @@ QMediaControl *DirectShowPlayerService::requestControl(const char *name) { if (qstrcmp(name, QMediaPlayerControl_iid) == 0) { return m_playerControl; -#ifndef Q_OS_WINCE } else if (qstrcmp(name, QAudioOutputSelectorControl_iid) == 0) { return m_audioEndpointControl; } else if (qstrcmp(name, QMetaDataReaderControl_iid) == 0) { return m_metaDataControl; -#endif } else if (qstrcmp(name, QVideoRendererControl_iid) == 0) { - if (!m_videoRendererControl -#ifndef Q_OS_WINCE - && !m_videoWindowControl -#endif - ){ + if (!m_videoRendererControl && !m_videoWindowControl) { m_videoRendererControl = new DirectShowVideoRendererControl(m_loop); connect(m_videoRendererControl, SIGNAL(filterChanged()), @@ -210,7 +192,6 @@ QMediaControl *DirectShowPlayerService::requestControl(const char *name) return m_videoRendererControl; } -#ifndef Q_OS_WINCE } else if (qstrcmp(name, QVideoWindowControl_iid) == 0) { if (!m_videoRendererControl && !m_videoWindowControl) { IBaseFilter *filter; @@ -233,7 +214,6 @@ QMediaControl *DirectShowPlayerService::requestControl(const char *name) return m_videoWindowControl; } -#endif } return 0; } @@ -249,14 +229,12 @@ void DirectShowPlayerService::releaseControl(QMediaControl *control) delete m_videoRendererControl; m_videoRendererControl = 0; -#ifndef Q_OS_WINCE } else if (control == m_videoWindowControl) { setVideoOutput(0); delete m_videoWindowControl; m_videoWindowControl = 0; -#endif } } @@ -282,9 +260,7 @@ void DirectShowPlayerService::load(const QMediaContent &media, QIODevice *stream m_seekable = false; m_atEnd = false; m_dontCacheNextSeekResult = false; -#ifndef Q_OS_WINCE m_metaDataControl->reset(); -#endif if (m_resources.isEmpty() && !stream) { m_pendingTasks = 0; @@ -1187,9 +1163,7 @@ void DirectShowPlayerService::customEvent(QEvent *event) QMutexLocker locker(&m_mutex); m_playerControl->updateMediaInfo(m_duration, m_streamTypes, m_seekable); -#ifndef Q_OS_WINCE m_metaDataControl->updateMetadata(m_graph, m_source, m_url.toString()); -#endif updateStatus(); } else if (event->type() == QEvent::Type(Error)) { diff --git a/src/plugins/directshow/player/directshowplayerservice.h b/src/plugins/directshow/player/directshowplayerservice.h index 9419a8a99..b8d30e79a 100644 --- a/src/plugins/directshow/player/directshowplayerservice.h +++ b/src/plugins/directshow/player/directshowplayerservice.h @@ -176,14 +176,10 @@ private: }; DirectShowPlayerControl *m_playerControl; -#ifndef Q_OS_WINCE DirectShowMetaDataControl *m_metaDataControl; -#endif DirectShowVideoRendererControl *m_videoRendererControl; -#ifndef Q_OS_WINCE QVideoWindowControl *m_videoWindowControl; DirectShowAudioEndpointControl *m_audioEndpointControl; -#endif QThread *m_taskThread; DirectShowEventLoop *m_loop; diff --git a/src/plugins/directshow/player/player.pri b/src/plugins/directshow/player/player.pri index c5fb8442a..0bc9c6d0a 100644 --- a/src/plugins/directshow/player/player.pri +++ b/src/plugins/directshow/player/player.pri @@ -1,7 +1,6 @@ INCLUDEPATH += $$PWD -LIBS += -lstrmiids -ldmoguids -luuid -lole32 -loleaut32 -!wince: LIBS += -lmsdmo -lgdi32 +LIBS += -lstrmiids -ldmoguids -luuid -lole32 -loleaut32 -lmsdmo -lgdi32 qtHaveModule(widgets): QT += widgets @@ -21,7 +20,10 @@ HEADERS += \ $$PWD/directshowsamplescheduler.h \ $$PWD/directshowvideorenderercontrol.h \ $$PWD/mediasamplevideobuffer.h \ - $$PWD/videosurfacefilter.h + $$PWD/videosurfacefilter.h \ + $$PWD/directshowaudioendpointcontrol.h \ + $$PWD/directshowmetadatacontrol.h \ + $$PWD/vmr9videowindowcontrol.h SOURCES += \ $$PWD/directshoweventloop.cpp \ @@ -35,19 +37,10 @@ SOURCES += \ $$PWD/directshowsamplescheduler.cpp \ $$PWD/directshowvideorenderercontrol.cpp \ $$PWD/mediasamplevideobuffer.cpp \ - $$PWD/videosurfacefilter.cpp - -!wince { -HEADERS += \ - $$PWD/directshowaudioendpointcontrol.h \ - $$PWD/directshowmetadatacontrol.h \ - $$PWD/vmr9videowindowcontrol.h - -SOURCES += \ + $$PWD/videosurfacefilter.cpp \ $$PWD/directshowaudioendpointcontrol.cpp \ $$PWD/directshowmetadatacontrol.cpp \ $$PWD/vmr9videowindowcontrol.cpp -} config_evr { DEFINES += HAVE_EVR diff --git a/src/plugins/plugins.pro b/src/plugins/plugins.pro index 67b06a61b..8cc925bc2 100644 --- a/src/plugins/plugins.pro +++ b/src/plugins/plugins.pro @@ -25,7 +25,7 @@ qnx:!blackberry { SUBDIRS += qnx-audio } -win32:!winrt:!wince { +win32:!winrt { SUBDIRS += audiocapture \ windowsaudio diff --git a/src/plugins/windowsaudio/qwindowsaudiodeviceinfo.cpp b/src/plugins/windowsaudio/qwindowsaudiodeviceinfo.cpp index 9aa4487ab..ca79ebbec 100644 --- a/src/plugins/windowsaudio/qwindowsaudiodeviceinfo.cpp +++ b/src/plugins/windowsaudio/qwindowsaudiodeviceinfo.cpp @@ -400,7 +400,6 @@ QList<QByteArray> QWindowsAudioDeviceInfo::availableDevices(QAudio::Mode mode) Q_UNUSED(mode) QList<QByteArray> devices; -#ifndef Q_OS_WINCE //enumerate device fullnames through directshow api CoInitialize(NULL); ICreateDevEnum *pDevEnum = NULL; @@ -454,35 +453,6 @@ QList<QByteArray> QWindowsAudioDeviceInfo::availableDevices(QAudio::Mode mode) pDevEnum->Release(); } CoUninitialize(); -#else // Q_OS_WINCE - if (mode == QAudio::AudioOutput) { - WAVEOUTCAPS woc; - unsigned long iNumDevs,i; - iNumDevs = waveOutGetNumDevs(); - for (i=0;i<iNumDevs;i++) { - if (waveOutGetDevCaps(i, &woc, sizeof(WAVEOUTCAPS)) - == MMSYSERR_NOERROR) { - QByteArray device; - QDataStream ds(&device, QIODevice::WriteOnly); - ds << quint32(i) << QString::fromWCharArray(woc.szPname); - devices.append(device); - } - } - } else { - WAVEINCAPS woc; - unsigned long iNumDevs,i; - iNumDevs = waveInGetNumDevs(); - for (i=0;i<iNumDevs;i++) { - if (waveInGetDevCaps(i, &woc, sizeof(WAVEINCAPS)) - == MMSYSERR_NOERROR) { - QByteArray device; - QDataStream ds(&device, QIODevice::WriteOnly); - ds << quint32(i) << QString::fromWCharArray(woc.szPname); - devices.append(device); - } - } - } -#endif // !Q_OS_WINCE return devices; } diff --git a/src/plugins/windowsaudio/windowsaudio.pro b/src/plugins/windowsaudio/windowsaudio.pro index ce64847dc..6d5fe9495 100644 --- a/src/plugins/windowsaudio/windowsaudio.pro +++ b/src/plugins/windowsaudio/windowsaudio.pro @@ -1,8 +1,7 @@ TARGET = qtaudio_windows QT += multimedia-private -LIBS += -lstrmiids -lole32 -loleaut32 -!wince*:LIBS += -lwinmm +LIBS += -lstrmiids -lole32 -loleaut32 -lwinmm HEADERS += \ qwindowsaudioplugin.h \ diff --git a/src/plugins/winrt/qwinrtcameravideorenderercontrol.cpp b/src/plugins/winrt/qwinrtcameravideorenderercontrol.cpp index fe07581c9..43b3d24e2 100644 --- a/src/plugins/winrt/qwinrtcameravideorenderercontrol.cpp +++ b/src/plugins/winrt/qwinrtcameravideorenderercontrol.cpp @@ -263,6 +263,9 @@ bool QWinRTCameraVideoRendererControlPrivate::getCameraSampleInfo(const ComPtr<I case DXGI_FORMAT_NV12: cameraSampleformat = QVideoFrame::Format_NV12; break; + case DXGI_FORMAT_YUY2: + cameraSampleformat = QVideoFrame::Format_YUYV; + break; default: cameraSampleformat = QVideoFrame::Format_Invalid; qErrnoWarning("Unsupported camera probe format."); diff --git a/src/qtmultimediaquicktools/qsgvideonode_texture.cpp b/src/qtmultimediaquicktools/qsgvideonode_texture.cpp index 599b70021..8080f3ec2 100644 --- a/src/qtmultimediaquicktools/qsgvideonode_texture.cpp +++ b/src/qtmultimediaquicktools/qsgvideonode_texture.cpp @@ -78,7 +78,7 @@ public: QSGVideoMaterialShader_Texture() : QSGMaterialShader() { - setShaderSourceFile(QOpenGLShader::Vertex, QStringLiteral(":/qtmultimediaquicktools/shaders/rgbvideo.vert")); + setShaderSourceFile(QOpenGLShader::Vertex, QStringLiteral(":/qtmultimediaquicktools/shaders/monoplanarvideo.vert")); setShaderSourceFile(QOpenGLShader::Fragment, QStringLiteral(":/qtmultimediaquicktools/shaders/rgbvideo.frag")); } diff --git a/src/qtmultimediaquicktools/qsgvideonode_yuv.cpp b/src/qtmultimediaquicktools/qsgvideonode_yuv.cpp index 314a26264..68e6b456b 100644 --- a/src/qtmultimediaquicktools/qsgvideonode_yuv.cpp +++ b/src/qtmultimediaquicktools/qsgvideonode_yuv.cpp @@ -53,7 +53,8 @@ QList<QVideoFrame::PixelFormat> QSGVideoNodeFactory_YUV::supportedPixelFormats( if (handleType == QAbstractVideoBuffer::NoHandle) { formats << QVideoFrame::Format_YUV420P << QVideoFrame::Format_YV12 - << QVideoFrame::Format_NV12 << QVideoFrame::Format_NV21; + << QVideoFrame::Format_NV12 << QVideoFrame::Format_NV21 + << QVideoFrame::Format_UYVY << QVideoFrame::Format_YUYV; } return formats; @@ -109,6 +110,55 @@ protected: int m_id_opacity; }; +class QSGVideoMaterialShader_UYVY : public QSGMaterialShader +{ +public: + QSGVideoMaterialShader_UYVY() + : QSGMaterialShader() + { + setShaderSourceFile(QOpenGLShader::Vertex, QStringLiteral(":/qtmultimediaquicktools/shaders/monoplanarvideo.vert")); + setShaderSourceFile(QOpenGLShader::Fragment, QStringLiteral(":/qtmultimediaquicktools/shaders/uyvyvideo.frag")); + } + + void updateState(const RenderState &state, QSGMaterial *newMaterial, QSGMaterial *oldMaterial) Q_DECL_OVERRIDE; + + char const *const *attributeNames() const Q_DECL_OVERRIDE { + static const char *names[] = { + "qt_VertexPosition", + "qt_VertexTexCoord", + 0 + }; + return names; + } + +protected: + void initialize() Q_DECL_OVERRIDE { + m_id_matrix = program()->uniformLocation("qt_Matrix"); + m_id_yuvtexture = program()->uniformLocation("yuvTexture"); + m_id_imageWidth = program()->uniformLocation("imageWidth"); + m_id_colorMatrix = program()->uniformLocation("colorMatrix"); + m_id_opacity = program()->uniformLocation("opacity"); + QSGMaterialShader::initialize(); + } + + int m_id_matrix; + int m_id_yuvtexture; + int m_id_imageWidth; + int m_id_colorMatrix; + int m_id_opacity; +}; + + +class QSGVideoMaterialShader_YUYV : public QSGVideoMaterialShader_UYVY +{ +public: + QSGVideoMaterialShader_YUYV() + : QSGVideoMaterialShader_UYVY() + { + setShaderSourceFile(QOpenGLShader::Fragment, QStringLiteral(":/qtmultimediaquicktools/shaders/yuyvvideo.frag")); + } +}; + class QSGVideoMaterialShader_YUV_BiPlanar_swizzle : public QSGVideoMaterialShader_YUV_BiPlanar { @@ -152,13 +202,17 @@ public: ~QSGVideoMaterial_YUV(); virtual QSGMaterialType *type() const { - static QSGMaterialType biPlanarType, biPlanarSwizzleType, triPlanarType; + static QSGMaterialType biPlanarType, biPlanarSwizzleType, triPlanarType, uyvyType, yuyvType; switch (m_format.pixelFormat()) { case QVideoFrame::Format_NV12: return &biPlanarType; case QVideoFrame::Format_NV21: return &biPlanarSwizzleType; + case QVideoFrame::Format_UYVY: + return &uyvyType; + case QVideoFrame::Format_YUYV: + return &yuyvType; default: // Currently: YUV420P and YV12 return &triPlanarType; } @@ -170,6 +224,10 @@ public: return new QSGVideoMaterialShader_YUV_BiPlanar; case QVideoFrame::Format_NV21: return new QSGVideoMaterialShader_YUV_BiPlanar_swizzle; + case QVideoFrame::Format_UYVY: + return new QSGVideoMaterialShader_UYVY; + case QVideoFrame::Format_YUYV: + return new QSGVideoMaterialShader_YUYV; default: // Currently: YUV420P and YV12 return new QSGVideoMaterialShader_YUV_TriPlanar; } @@ -230,6 +288,8 @@ QSGVideoMaterial_YUV::QSGVideoMaterial_YUV(const QVideoSurfaceFormat &format) : case QVideoFrame::Format_YV12: m_planeCount = 3; break; + case QVideoFrame::Format_UYVY: + case QVideoFrame::Format_YUYV: default: m_planeCount = 1; break; @@ -293,7 +353,15 @@ void QSGVideoMaterial_YUV::bind() functions->glGetIntegerv(GL_UNPACK_ALIGNMENT, &previousAlignment); functions->glPixelStorei(GL_UNPACK_ALIGNMENT, 1); - if (m_format.pixelFormat() == QVideoFrame::Format_NV12 + if (m_format.pixelFormat() == QVideoFrame::Format_UYVY + || m_format.pixelFormat() == QVideoFrame::Format_YUYV) { + int fw = m_frame.width() / 2; + m_planeWidth[0] = fw; + + functions->glActiveTexture(GL_TEXTURE0); + bindTexture(m_textureIds[0], fw, m_frame.height(), m_frame.bits(), GL_RGBA); + + } else if (m_format.pixelFormat() == QVideoFrame::Format_NV12 || m_format.pixelFormat() == QVideoFrame::Format_NV21) { const int y = 0; const int uv = 1; @@ -338,7 +406,6 @@ void QSGVideoMaterial_YUV::bind() void QSGVideoMaterial_YUV::bindTexture(int id, int w, int h, const uchar *bits, GLenum format) { QOpenGLFunctions *functions = QOpenGLContext::currentContext()->functions(); - functions->glBindTexture(GL_TEXTURE_2D, id); functions->glTexImage2D(GL_TEXTURE_2D, 0, format, w, h, 0, format, GL_UNSIGNED_BYTE, bits); functions->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); @@ -399,4 +466,28 @@ void QSGVideoMaterialShader_YUV_TriPlanar::updateState(const RenderState &state, program()->setUniformValue(m_id_plane3Width, mat->m_planeWidth[2]); } +void QSGVideoMaterialShader_UYVY::updateState(const RenderState &state, + QSGMaterial *newMaterial, + QSGMaterial *oldMaterial) +{ + Q_UNUSED(oldMaterial); + + QSGVideoMaterial_YUV *mat = static_cast<QSGVideoMaterial_YUV *>(newMaterial); + + program()->setUniformValue(m_id_yuvtexture, 0); + + mat->bind(); + + program()->setUniformValue(m_id_colorMatrix, mat->m_colorMatrix); + program()->setUniformValue(m_id_imageWidth, mat->m_frame.width()); + + if (state.isOpacityDirty()) { + mat->m_opacity = state.opacity(); + program()->setUniformValue(m_id_opacity, GLfloat(mat->m_opacity)); + } + + if (state.isMatrixDirty()) + program()->setUniformValue(m_id_matrix, state.combinedMatrix()); +} + QT_END_NAMESPACE diff --git a/src/qtmultimediaquicktools/qtmultimediaquicktools.pro b/src/qtmultimediaquicktools/qtmultimediaquicktools.pro index e1425c3ec..e4e157a54 100644 --- a/src/qtmultimediaquicktools/qtmultimediaquicktools.pro +++ b/src/qtmultimediaquicktools/qtmultimediaquicktools.pro @@ -35,7 +35,7 @@ RESOURCES += \ qtmultimediaquicktools.qrc OTHER_FILES += \ - shaders/rgbvideo.vert \ + shaders/monoplanarvideo.vert \ shaders/rgbvideo_padded.vert \ shaders/rgbvideo.frag \ shaders/rgbvideo_swizzle.frag \ @@ -43,6 +43,8 @@ OTHER_FILES += \ shaders/biplanaryuvvideo.frag \ shaders/biplanaryuvvideo_swizzle.frag \ shaders/triplanaryuvvideo.vert \ - shaders/triplanaryuvvideo.frag + shaders/triplanaryuvvideo.frag \ + shaders/uyvyvideo.frag \ + shaders/yuyvvideo.frag load(qt_module) diff --git a/src/qtmultimediaquicktools/qtmultimediaquicktools.qrc b/src/qtmultimediaquicktools/qtmultimediaquicktools.qrc index b0a7f0789..d5efb1f3e 100644 --- a/src/qtmultimediaquicktools/qtmultimediaquicktools.qrc +++ b/src/qtmultimediaquicktools/qtmultimediaquicktools.qrc @@ -1,6 +1,6 @@ <RCC> <qresource prefix="/qtmultimediaquicktools"> - <file>shaders/rgbvideo.vert</file> + <file>shaders/monoplanarvideo.vert</file> <file>shaders/rgbvideo.frag</file> <file>shaders/rgbvideo_swizzle.frag</file> <file>shaders/rgbvideo_padded.vert</file> @@ -9,5 +9,7 @@ <file>shaders/biplanaryuvvideo_swizzle.frag</file> <file>shaders/triplanaryuvvideo.frag</file> <file>shaders/triplanaryuvvideo.vert</file> + <file>shaders/uyvyvideo.frag</file> + <file>shaders/yuyvvideo.frag</file> </qresource> </RCC> diff --git a/src/qtmultimediaquicktools/shaders/rgbvideo.vert b/src/qtmultimediaquicktools/shaders/monoplanarvideo.vert index 19915f2ff..19915f2ff 100644 --- a/src/qtmultimediaquicktools/shaders/rgbvideo.vert +++ b/src/qtmultimediaquicktools/shaders/monoplanarvideo.vert diff --git a/src/qtmultimediaquicktools/shaders/uyvyvideo.frag b/src/qtmultimediaquicktools/shaders/uyvyvideo.frag new file mode 100644 index 000000000..905035703 --- /dev/null +++ b/src/qtmultimediaquicktools/shaders/uyvyvideo.frag @@ -0,0 +1,22 @@ +uniform sampler2D yuvTexture; // UYVY macropixel texture passed as RGBA format +uniform mediump float imageWidth; // The UYVY texture appears to the shader with 1/2 the image width since we use the RGBA format to pass UYVY +uniform mediump mat4 colorMatrix; +uniform lowp float opacity; + +varying highp vec2 qt_TexCoord; + +void main() +{ + // For U0 Y0 V0 Y1 macropixel, lookup Y0 or Y1 based on whether + // the original texture x coord is even or odd. + mediump float Y; + if (fract(floor(qt_TexCoord.x * imageWidth + 0.5) / 2.0) > 0.0) + Y = texture2D(yuvTexture, qt_TexCoord).a; // odd so choose Y1 + else + Y = texture2D(yuvTexture, qt_TexCoord).g; // even so choose Y0 + mediump float Cb = texture2D(yuvTexture, qt_TexCoord).r; + mediump float Cr = texture2D(yuvTexture, qt_TexCoord).b; + + mediump vec4 color = vec4(Y, Cb, Cr, 1.0); + gl_FragColor = colorMatrix * color * opacity; +} diff --git a/src/qtmultimediaquicktools/shaders/yuyvvideo.frag b/src/qtmultimediaquicktools/shaders/yuyvvideo.frag new file mode 100644 index 000000000..72732cd66 --- /dev/null +++ b/src/qtmultimediaquicktools/shaders/yuyvvideo.frag @@ -0,0 +1,22 @@ +uniform sampler2D yuvTexture; // YUYV macropixel texture passed as RGBA format +uniform mediump float imageWidth; // The YUYV texture appears to the shader with 1/2 the image width since we use the RGBA format to pass YUYV +uniform mediump mat4 colorMatrix; +uniform lowp float opacity; + +varying highp vec2 qt_TexCoord; + +void main() +{ + // For Y0 U0 Y1 V0 macropixel, lookup Y0 or Y1 based on whether + // the original texture x coord is even or odd. + mediump float Y; + if (fract(floor(qt_TexCoord.x * imageWidth + 0.5) / 2.0) > 0.0) + Y = texture2D(yuvTexture, qt_TexCoord).b; // odd so choose Y1 + else + Y = texture2D(yuvTexture, qt_TexCoord).r; // even so choose Y0 + mediump float Cb = texture2D(yuvTexture, qt_TexCoord).g; + mediump float Cr = texture2D(yuvTexture, qt_TexCoord).a; + + mediump vec4 color = vec4(Y, Cb, Cr, 1.0); + gl_FragColor = colorMatrix * color * opacity; +} diff --git a/tests/auto/unit/qmediapluginloader/qmediapluginloader.pro b/tests/auto/unit/qmediapluginloader/qmediapluginloader.pro index 26f232010..90b02ac59 100644 --- a/tests/auto/unit/qmediapluginloader/qmediapluginloader.pro +++ b/tests/auto/unit/qmediapluginloader/qmediapluginloader.pro @@ -4,10 +4,3 @@ TARGET = tst_qmediapluginloader QT += multimedia-private testlib SOURCES += tst_qmediapluginloader.cpp - -wince* { - PLUGIN_DEPLOY.sources = $$OUTPUT_DIR/plugins/mediaservice/*.dll - PLUGIN_DEPLOY.path = mediaservice - DEPLOYMENT += PLUGIN_DEPLOY -} - |