summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.gitignore3
-rw-r--r--dist/changes-5.0.151
-rw-r--r--examples/multimedia/video/doc/src/qmlvideo.qdoc4
-rw-r--r--examples/multimedia/video/doc/src/qmlvideofx.qdoc4
-rw-r--r--examples/multimedia/video/qmlvideo/main.cpp6
-rw-r--r--examples/multimedia/video/qmlvideofx/filereader.cpp30
-rw-r--r--examples/multimedia/video/qmlvideofx/filereader.h2
-rw-r--r--examples/multimedia/video/qmlvideofx/main.cpp8
-rw-r--r--examples/multimedia/video/qmlvideofx/qml/qmlvideofx/Effect.qml2
-rw-r--r--examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectBillboard.qml2
-rw-r--r--examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectBlackAndWhite.qml2
-rw-r--r--examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectEmboss.qml2
-rw-r--r--examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectGaussianBlur.qml4
-rw-r--r--examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectGlow.qml2
-rw-r--r--examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectIsolate.qml2
-rw-r--r--examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectMagnify.qml2
-rw-r--r--examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectPageCurl.qml2
-rw-r--r--examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectPixelate.qml2
-rw-r--r--examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectPosterize.qml2
-rw-r--r--examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectRipple.qml2
-rw-r--r--examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectSepia.qml2
-rw-r--r--examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectSharpen.qml2
-rw-r--r--examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectShockwave.qml2
-rw-r--r--examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectSobelEdgeDetection1.qml2
-rw-r--r--examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectSobelEdgeDetection2.qml2
-rw-r--r--examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectTiltShift.qml2
-rw-r--r--examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectToon.qml2
-rw-r--r--examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectVignette.qml2
-rw-r--r--examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectWarhol.qml2
-rw-r--r--examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectWobble.qml2
-rw-r--r--examples/multimedia/video/qmlvideofx/qmlvideofx.pro10
-rw-r--r--examples/multimedia/video/qmlvideofx/qmlvideofx.qrc23
-rw-r--r--examples/multimedia/video/qmlvideofx/trace.h12
-rw-r--r--examples/multimedia/video/snippets/frequencymonitor/frequencymonitor.cpp26
-rw-r--r--examples/multimedia/video/snippets/frequencymonitor/frequencymonitor.h7
-rw-r--r--examples/multimedia/video/snippets/performancemonitor/performancemonitor.cpp44
-rw-r--r--examples/multimedia/video/snippets/performancemonitor/performancemonitor.h31
-rw-r--r--examples/multimediawidgets/declarative-camera/declarative-camera.pro1
-rw-r--r--examples/multimediawidgets/declarative-camera/declarative-camera.qrc26
-rw-r--r--examples/multimediawidgets/declarative-camera/qmlcamera.cpp3
-rw-r--r--examples/multimediawidgets/videowidget/videoplayer.cpp15
-rw-r--r--examples/multimediawidgets/videowidget/videoplayer.h3
-rw-r--r--src/imports/multimedia/qmldir1
-rw-r--r--src/multimedia/audio/qsound.h2
-rw-r--r--src/multimedia/doc/qtmultimedia.qdocconf2
-rw-r--r--src/multimedia/doc/src/examples/video-qml-paint-rate.qdocinc (renamed from examples/multimedia/video/doc/src/video-qml-paint-rate.qdocinc)6
-rw-r--r--src/multimedia/doc/src/images/video-qml-paint-rate.png (renamed from examples/multimedia/video/doc/images/video-qml-paint-rate.png)bin6350 -> 6350 bytes
-rw-r--r--src/multimedia/multimedia.pro5
-rw-r--r--src/plugins/avfoundation/mediaplayer/avfmediaplayersession.mm8
-rw-r--r--src/plugins/avfoundation/mediaplayer/avfvideowidgetcontrol.mm2
-rw-r--r--src/plugins/directshow/camera/dscameraservice.cpp2
-rw-r--r--src/plugins/directshow/camera/dsvideodevicecontrol.cpp2
-rw-r--r--src/plugins/directshow/camera/dsvideowidgetcontrol.cpp2
-rw-r--r--src/plugins/directshow/camera/dsvideowidgetcontrol.h2
-rw-r--r--src/plugins/qt7/qt7.pro2
-rw-r--r--src/plugins/wmf/mftvideo.cpp66
-rw-r--r--src/plugins/wmf/mftvideo.h5
-rw-r--r--src/plugins/wmf/player/evr9videowindowcontrol.cpp5
-rw-r--r--src/plugins/wmf/player/evr9videowindowcontrol.h1
-rw-r--r--src/plugins/wmf/player/mfmetadatacontrol.cpp221
-rw-r--r--src/plugins/wmf/player/mfplayerservice.cpp11
-rw-r--r--src/plugins/wmf/player/mfplayersession.cpp165
-rw-r--r--src/plugins/wmf/player/mfplayersession.h1
-rw-r--r--src/plugins/wmf/player/mfvideorenderercontrol.cpp14
-rw-r--r--src/plugins/wmf/player/mfvideorenderercontrol.h1
65 files changed, 651 insertions, 230 deletions
diff --git a/.gitignore b/.gitignore
index 3c1e1d309..464f18145 100644
--- a/.gitignore
+++ b/.gitignore
@@ -41,3 +41,6 @@ src/multimediawidgets/qtmultimediawidgetsversion.h
tst_*
!tst_*.cpp
tests/auto/cmake/build
+
+# Generated static plugin import sources
+*_plugin_import.cpp
diff --git a/dist/changes-5.0.1 b/dist/changes-5.0.1
new file mode 100644
index 000000000..cc5a6704b
--- /dev/null
+++ b/dist/changes-5.0.1
@@ -0,0 +1,51 @@
+Qt 5.0.1 is a bug-fix release. It maintains both forward and backward
+compatibility (source and binary) with Qt 5.0.0.
+
+For more details, refer to the online documentation included in this
+distribution. The documentation is also available online:
+
+ http://qt-project.org/doc/qt-5.0/
+
+Some of the changes listed in this file include issue tracking numbers
+corresponding to tasks in the Qt Bug Tracker:
+
+ http://bugreports.qt-project.org/
+
+Each of these identifiers can be entered in the bug tracker to obtain more
+information about a particular change.
+
+
+****************************************************************************
+* General *
+****************************************************************************
+
+General Improvements
+--------------------
+
+Third party components
+----------------------
+
+****************************************************************************
+* Library *
+****************************************************************************
+
+
+****************************************************************************
+* Platform Specific Changes *
+****************************************************************************
+
+
+****************************************************************************
+* Compiler Specific Changes *
+****************************************************************************
+
+
+****************************************************************************
+* Tools *
+****************************************************************************
+
+
+****************************************************************************
+* Plugins *
+****************************************************************************
+
diff --git a/examples/multimedia/video/doc/src/qmlvideo.qdoc b/examples/multimedia/video/doc/src/qmlvideo.qdoc
index 359d07156..0f4de6ce5 100644
--- a/examples/multimedia/video/doc/src/qmlvideo.qdoc
+++ b/examples/multimedia/video/doc/src/qmlvideo.qdoc
@@ -129,13 +129,13 @@ instance, the embedded
\section1 Calculating and displaying QML painting rate
-\input video-qml-paint-rate.qdocinc
+\input multimedia/doc/src/examples/video-qml-paint-rate.qdocinc
All that remains is to connect the afterRendering() signal of the QQuickView
object to a JavaScript function, which will eventually call frequencyItem.notify():
\quotefromfile multimedia/video/qmlvideo/main.cpp
-\skipto QmlApplicationViewer
+\skipto QGuiApplication
\printuntil ;
\dots
\skipto QQuickItem
diff --git a/examples/multimedia/video/doc/src/qmlvideofx.qdoc b/examples/multimedia/video/doc/src/qmlvideofx.qdoc
index b6535a952..a3b7c01a2 100644
--- a/examples/multimedia/video/doc/src/qmlvideofx.qdoc
+++ b/examples/multimedia/video/doc/src/qmlvideofx.qdoc
@@ -203,13 +203,13 @@ And here is the effect selection menu:
\section1 Calculating and displaying QML painting rate
-\input video-qml-paint-rate.qdocinc
+\input multimedia/doc/src/examples/video-qml-paint-rate.qdocinc
All that remains is to connect the afterRendering() signal of the QQuickView
object to a JavaScript function, which will eventually call frequencyItem.notify():
\quotefromfile multimedia/video/qmlvideofx/main.cpp
-\skipto QmlApplicationViewer
+\skipto QGuiApplication
\printuntil ;
\dots
\skipto QQuickItem
diff --git a/examples/multimedia/video/qmlvideo/main.cpp b/examples/multimedia/video/qmlvideo/main.cpp
index 8230e9441..ac26c983a 100644
--- a/examples/multimedia/video/qmlvideo/main.cpp
+++ b/examples/multimedia/video/qmlvideo/main.cpp
@@ -69,8 +69,8 @@ int main(int argc, char *argv[])
QStringList args = app.arguments();
PerformanceMonitor::State performanceMonitorState;
bool sourceIsUrl = false;
- for (int i=1; i<args.count(); ++i) {
- const QString &arg = args.at(i);
+ for (int i = 1; i < args.size(); ++i) {
+ const QByteArray arg = args.at(i).toUtf8();
if (arg.startsWith('-')) {
if ("-volume" == arg) {
if (i+1 < args.count())
@@ -79,7 +79,7 @@ int main(int argc, char *argv[])
qtTrace() << "Option \"-volume\" takes a value";
}
#ifdef PERFORMANCEMONITOR_SUPPORT
- else if (PerformanceMonitor::parseArgument(arg, performanceMonitorState)) {
+ else if (performanceMonitorState.parseArgument(arg)) {
// Do nothing
}
#endif
diff --git a/examples/multimedia/video/qmlvideofx/filereader.cpp b/examples/multimedia/video/qmlvideofx/filereader.cpp
index 065766323..6c9773337 100644
--- a/examples/multimedia/video/qmlvideofx/filereader.cpp
+++ b/examples/multimedia/video/qmlvideofx/filereader.cpp
@@ -41,36 +41,18 @@
#include "filereader.h"
#include "trace.h"
-#include <QtCore/QCoreApplication>
-#include <QtCore/QDir>
-#include <QtCore/QFile>
-#include <QtCore/QFileInfo>
-#include <QtCore/QTextStream>
-QString adjustPath(const QString &path)
-{
-#ifdef Q_OS_UNIX
-#ifdef Q_OS_MAC
- if (!QDir::isAbsolutePath(path))
- return QCoreApplication::applicationDirPath()
- + QLatin1String("/../Resources/") + path;
-#else
- QString pathInInstallDir;
- const QString applicationDirPath = QCoreApplication::applicationDirPath();
- pathInInstallDir = QString::fromLatin1("%1/../%2").arg(applicationDirPath, path);
-
- if (QFileInfo(pathInInstallDir).exists())
- return pathInInstallDir;
-#endif
-#endif
- return path;
-}
+#include <QCoreApplication>
+#include <QDir>
+#include <QFile>
+#include <QFileInfo>
+#include <QTextStream>
QString FileReader::readFile(const QString &fileName)
{
qtTrace() << "FileReader::readFile" << "fileName" << fileName;
QString content;
- QFile file(adjustPath(fileName));
+ QFile file(fileName);
if (file.open(QIODevice::ReadOnly)) {
QTextStream stream(&file);
content = stream.readAll();
diff --git a/examples/multimedia/video/qmlvideofx/filereader.h b/examples/multimedia/video/qmlvideofx/filereader.h
index 44393b1c7..443a2a2fe 100644
--- a/examples/multimedia/video/qmlvideofx/filereader.h
+++ b/examples/multimedia/video/qmlvideofx/filereader.h
@@ -39,7 +39,7 @@
**
****************************************************************************/
-#include <QtCore/QObject>
+#include <QObject>
class FileReader : public QObject
{
diff --git a/examples/multimedia/video/qmlvideofx/main.cpp b/examples/multimedia/video/qmlvideofx/main.cpp
index 9f47a9c17..056c274e9 100644
--- a/examples/multimedia/video/qmlvideofx/main.cpp
+++ b/examples/multimedia/video/qmlvideofx/main.cpp
@@ -72,17 +72,17 @@ int main(int argc, char *argv[])
#ifdef PERFORMANCEMONITOR_SUPPORT
PerformanceMonitor::State performanceMonitorState;
#endif
- for (int i=1; i<args.count(); ++i) {
- const QString &arg = args.at(i);
+ for (int i = 1; i < args.size(); ++i) {
+ const QByteArray arg = args.at(i).toUtf8();
if (arg.startsWith('-')) {
if ("-volume" == arg) {
- if (i+1 < args.count())
+ if (i + 1 < args.size())
volume = 0.01 * args.at(++i).toInt();
else
qtTrace() << "Option \"-volume\" takes a value";
}
#ifdef PERFORMANCEMONITOR_SUPPORT
- else if (PerformanceMonitor::parseArgument(arg, performanceMonitorState)) {
+ else if (performanceMonitorState.parseArgument(arg)) {
// Do nothing
}
#endif
diff --git a/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/Effect.qml b/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/Effect.qml
index 535ab106b..0010673e3 100644
--- a/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/Effect.qml
+++ b/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/Effect.qml
@@ -69,7 +69,7 @@ ShaderEffect {
// rather than being inline in the QML file
onFragmentShaderFilenameChanged:
- fragmentShader = d.fragmentShaderCommon + fileReader.readFile(fragmentShaderFilename)
+ fragmentShader = d.fragmentShaderCommon + fileReader.readFile(":shaders/" + fragmentShaderFilename)
onVertexShaderFilenameChanged:
vertexShader = fileReader.readFile(vertexShaderFilename)
}
diff --git a/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectBillboard.qml b/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectBillboard.qml
index 124a2a17e..4a458b735 100644
--- a/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectBillboard.qml
+++ b/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectBillboard.qml
@@ -55,5 +55,5 @@ Effect {
property real step_x: 0.0015625
property real step_y: targetHeight ? (step_x * targetWidth / targetHeight) : 0.0
- fragmentShaderFilename: "shaders/billboard.fsh"
+ fragmentShaderFilename: "billboard.fsh"
}
diff --git a/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectBlackAndWhite.qml b/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectBlackAndWhite.qml
index 37a3b6e0d..0660e9185 100644
--- a/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectBlackAndWhite.qml
+++ b/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectBlackAndWhite.qml
@@ -52,5 +52,5 @@ Effect {
// Transform slider values, and bind result to shader uniforms
property real threshold: parameters.get(0).value
- fragmentShaderFilename: "shaders/blackandwhite.fsh"
+ fragmentShaderFilename: "blackandwhite.fsh"
}
diff --git a/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectEmboss.qml b/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectEmboss.qml
index 4bf57718d..a71b30ec5 100644
--- a/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectEmboss.qml
+++ b/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectEmboss.qml
@@ -42,5 +42,5 @@
import QtQuick 2.0
Effect {
- fragmentShaderFilename: "shaders/emboss.fsh"
+ fragmentShaderFilename: "emboss.fsh"
}
diff --git a/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectGaussianBlur.qml b/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectGaussianBlur.qml
index b804e903b..a3ef8749a 100644
--- a/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectGaussianBlur.qml
+++ b/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectGaussianBlur.qml
@@ -63,7 +63,7 @@ Item {
anchors.fill: parent
dividerValue: parent.dividerValue
property real blurSize: 4.0 * parent.parameters.get(0).value / targetHeight
- fragmentShaderFilename: "shaders/gaussianblur_v.fsh"
+ fragmentShaderFilename: "gaussianblur_v.fsh"
}
Effect {
@@ -71,7 +71,7 @@ Item {
anchors.fill: parent
dividerValue: parent.dividerValue
property real blurSize: 4.0 * parent.parameters.get(0).value / parent.targetWidth
- fragmentShaderFilename: "shaders/gaussianblur_h.fsh"
+ fragmentShaderFilename: "gaussianblur_h.fsh"
source: horizontalShaderSource
ShaderEffectSource {
diff --git a/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectGlow.qml b/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectGlow.qml
index d6e987db2..5b3ae41b0 100644
--- a/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectGlow.qml
+++ b/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectGlow.qml
@@ -42,5 +42,5 @@
import QtQuick 2.0
Effect {
- fragmentShaderFilename: "shaders/glow.fsh"
+ fragmentShaderFilename: "glow.fsh"
}
diff --git a/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectIsolate.qml b/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectIsolate.qml
index 2425a2580..d81c7930c 100644
--- a/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectIsolate.qml
+++ b/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectIsolate.qml
@@ -57,5 +57,5 @@ Effect {
property real targetHue: parameters.get(0).value * 360
property real windowWidth: parameters.get(1).value * 60
- fragmentShaderFilename: "shaders/isolate.fsh"
+ fragmentShaderFilename: "isolate.fsh"
}
diff --git a/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectMagnify.qml b/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectMagnify.qml
index 5a207f95e..4a37a0ad1 100644
--- a/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectMagnify.qml
+++ b/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectMagnify.qml
@@ -84,7 +84,7 @@ Effect {
d.oldTargetHeight = targetHeight
}
- fragmentShaderFilename: "shaders/magnify.fsh"
+ fragmentShaderFilename: "magnify.fsh"
MouseArea {
anchors.fill: parent
diff --git a/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectPageCurl.qml b/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectPageCurl.qml
index 7724bfa9b..862c2673c 100644
--- a/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectPageCurl.qml
+++ b/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectPageCurl.qml
@@ -53,5 +53,5 @@ Effect {
// Transform slider values, and bind result to shader uniforms
property real curlExtent: 1.0 - parameters.get(0).value
- fragmentShaderFilename: "shaders/pagecurl.fsh"
+ fragmentShaderFilename: "pagecurl.fsh"
}
diff --git a/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectPixelate.qml b/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectPixelate.qml
index 71f7da965..11281f777 100644
--- a/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectPixelate.qml
+++ b/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectPixelate.qml
@@ -52,5 +52,5 @@ Effect {
// Transform slider values, and bind result to shader uniforms
property real granularity: parameters.get(0).value * 20
- fragmentShaderFilename: "shaders/pixelate.fsh"
+ fragmentShaderFilename: "pixelate.fsh"
}
diff --git a/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectPosterize.qml b/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectPosterize.qml
index 0cf16a0dc..c70a0c10f 100644
--- a/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectPosterize.qml
+++ b/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectPosterize.qml
@@ -54,5 +54,5 @@ Effect {
property real numColors: 8.0
- fragmentShaderFilename: "shaders/posterize.fsh"
+ fragmentShaderFilename: "posterize.fsh"
}
diff --git a/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectRipple.qml b/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectRipple.qml
index 0b7c48cbc..0ec0d13a3 100644
--- a/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectRipple.qml
+++ b/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectRipple.qml
@@ -60,5 +60,5 @@ Effect {
property real time: 0
NumberAnimation on time { loops: Animation.Infinite; from: 0; to: Math.PI * 2; duration: 600 }
- fragmentShaderFilename: "shaders/ripple.fsh"
+ fragmentShaderFilename: "ripple.fsh"
}
diff --git a/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectSepia.qml b/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectSepia.qml
index 446e7790b..2b42e68c6 100644
--- a/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectSepia.qml
+++ b/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectSepia.qml
@@ -42,5 +42,5 @@
import QtQuick 2.0
Effect {
- fragmentShaderFilename: "shaders/sepia.fsh"
+ fragmentShaderFilename: "sepia.fsh"
}
diff --git a/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectSharpen.qml b/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectSharpen.qml
index 99ece3cd8..2c69378d7 100644
--- a/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectSharpen.qml
+++ b/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectSharpen.qml
@@ -52,5 +52,5 @@ Effect {
// Transform slider values, and bind result to shader uniforms
property real amount: parameters.get(0).value * 18
- fragmentShaderFilename: "shaders/sharpen.fsh"
+ fragmentShaderFilename: "sharpen.fsh"
}
diff --git a/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectShockwave.qml b/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectShockwave.qml
index fe91781ba..7716bf672 100644
--- a/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectShockwave.qml
+++ b/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectShockwave.qml
@@ -76,5 +76,5 @@ Effect {
}
}
- fragmentShaderFilename: "shaders/shockwave.fsh"
+ fragmentShaderFilename: "shockwave.fsh"
}
diff --git a/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectSobelEdgeDetection1.qml b/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectSobelEdgeDetection1.qml
index 189d5d385..78b908549 100644
--- a/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectSobelEdgeDetection1.qml
+++ b/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectSobelEdgeDetection1.qml
@@ -55,5 +55,5 @@ Effect {
property real resS: targetSize
property real resT: targetSize
- fragmentShaderFilename: "shaders/sobeledgedetection1.fsh"
+ fragmentShaderFilename: "sobeledgedetection1.fsh"
}
diff --git a/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectSobelEdgeDetection2.qml b/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectSobelEdgeDetection2.qml
index 4bcc6efaa..94d87b43e 100644
--- a/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectSobelEdgeDetection2.qml
+++ b/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectSobelEdgeDetection2.qml
@@ -52,5 +52,5 @@ Effect {
// Transform slider values, and bind result to shader uniforms
property real weight: parameters.get(0).value
- fragmentShaderFilename: "shaders/sobeledgedetection2.fsh"
+ fragmentShaderFilename: "sobeledgedetection2.fsh"
}
diff --git a/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectTiltShift.qml b/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectTiltShift.qml
index b1f214b07..b8097a6c2 100644
--- a/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectTiltShift.qml
+++ b/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectTiltShift.qml
@@ -42,5 +42,5 @@
import QtQuick 2.0
Effect {
- fragmentShaderFilename: "shaders/tiltshift.fsh"
+ fragmentShaderFilename: "tiltshift.fsh"
}
diff --git a/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectToon.qml b/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectToon.qml
index 08f184997..31d8869b8 100644
--- a/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectToon.qml
+++ b/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectToon.qml
@@ -59,5 +59,5 @@ Effect {
property real magTol: 0.3
property real quantize: 8.0
- fragmentShaderFilename: "shaders/toon.fsh"
+ fragmentShaderFilename: "toon.fsh"
}
diff --git a/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectVignette.qml b/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectVignette.qml
index 11201616c..be868e285 100644
--- a/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectVignette.qml
+++ b/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectVignette.qml
@@ -42,5 +42,5 @@
import QtQuick 2.0
Effect {
- fragmentShaderFilename: "shaders/vignette.fsh"
+ fragmentShaderFilename: "vignette.fsh"
}
diff --git a/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectWarhol.qml b/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectWarhol.qml
index e96d0524d..0592507e5 100644
--- a/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectWarhol.qml
+++ b/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectWarhol.qml
@@ -42,5 +42,5 @@
import QtQuick 2.0
Effect {
- fragmentShaderFilename: "shaders/warhol.fsh"
+ fragmentShaderFilename: "warhol.fsh"
}
diff --git a/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectWobble.qml b/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectWobble.qml
index 4cccf48b8..191eb9386 100644
--- a/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectWobble.qml
+++ b/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/EffectWobble.qml
@@ -57,5 +57,5 @@ Effect {
NumberAnimation on time { loops: Animation.Infinite; from: 0; to: Math.PI * 2; duration: 600 }
- fragmentShaderFilename: "shaders/wobble.fsh"
+ fragmentShaderFilename: "wobble.fsh"
}
diff --git a/examples/multimedia/video/qmlvideofx/qmlvideofx.pro b/examples/multimedia/video/qmlvideofx/qmlvideofx.pro
index 629c0bdce..d62ade86d 100644
--- a/examples/multimedia/video/qmlvideofx/qmlvideofx.pro
+++ b/examples/multimedia/video/qmlvideofx/qmlvideofx.pro
@@ -3,16 +3,12 @@ TARGET = qmlvideofx
QT += quick
-LOCAL_SOURCES = filereader.cpp main.cpp
-LOCAL_HEADERS = filereader.h trace.h
-
-SOURCES += $$LOCAL_SOURCES
-HEADERS += $$LOCAL_HEADERS
+SOURCES += filereader.cpp main.cpp
+HEADERS += filereader.h trace.h
RESOURCES += qmlvideofx.qrc
-SNIPPETS_PATH = ../snippets
-include($$SNIPPETS_PATH/performancemonitor/performancemonitordeclarative.pri)
+include($$PWD/../snippets/performancemonitor/performancemonitordeclarative.pri)
maemo6: {
DEFINES += SMALL_SCREEN_LAYOUT
diff --git a/examples/multimedia/video/qmlvideofx/qmlvideofx.qrc b/examples/multimedia/video/qmlvideofx/qmlvideofx.qrc
index 0b39099a1..93cb4f1f5 100644
--- a/examples/multimedia/video/qmlvideofx/qmlvideofx.qrc
+++ b/examples/multimedia/video/qmlvideofx/qmlvideofx.qrc
@@ -44,5 +44,28 @@
<file>qml/qmlvideofx/main-smallscreen.qml</file>
<file>qml/qmlvideofx/ParameterPanel.qml</file>
<file>qml/qmlvideofx/Slider.qml</file>
+ <file>shaders/billboard.fsh</file>
+ <file>shaders/blackandwhite.fsh</file>
+ <file>shaders/emboss.fsh</file>
+ <file>shaders/gaussianblur_h.fsh</file>
+ <file>shaders/gaussianblur_v.fsh</file>
+ <file>shaders/glow.fsh</file>
+ <file>shaders/isolate.fsh</file>
+ <file>shaders/magnify.fsh</file>
+ <file>shaders/pagecurl.fsh</file>
+ <file>shaders/pixelate.fsh</file>
+ <file>shaders/posterize.fsh</file>
+ <file>shaders/ripple.fsh</file>
+ <file>shaders/selectionpanel.fsh</file>
+ <file>shaders/sepia.fsh</file>
+ <file>shaders/sharpen.fsh</file>
+ <file>shaders/shockwave.fsh</file>
+ <file>shaders/sobeledgedetection1.fsh</file>
+ <file>shaders/sobeledgedetection2.fsh</file>
+ <file>shaders/tiltshift.fsh</file>
+ <file>shaders/toon.fsh</file>
+ <file>shaders/vignette.fsh</file>
+ <file>shaders/warhol.fsh</file>
+ <file>shaders/wobble.fsh</file>
</qresource>
</RCC>
diff --git a/examples/multimedia/video/qmlvideofx/trace.h b/examples/multimedia/video/qmlvideofx/trace.h
index 73095f595..c5332d5da 100644
--- a/examples/multimedia/video/qmlvideofx/trace.h
+++ b/examples/multimedia/video/qmlvideofx/trace.h
@@ -42,7 +42,7 @@
#ifndef TRACE_H
#define TRACE_H
-#include <QtCore/QDebug>
+#include <QDebug>
#define ENABLE_TRACE
//#define VERBOSE_TRACE
@@ -53,7 +53,7 @@ class NullDebug
{
public:
template <typename T>
- NullDebug& operator<<(const T&) { return *this; }
+ NullDebug &operator<<(const T &) { return *this; }
};
inline NullDebug nullDebug() { return NullDebug(); }
@@ -68,18 +68,12 @@ struct PtrWrapper
} // namespace Trace
template <typename T>
-inline QDebug& operator<<(QDebug &debug, const Trace::PtrWrapper<T> &wrapper)
+inline QDebug &operator<<(QDebug &debug, const Trace::PtrWrapper<T> &wrapper)
{
debug.nospace() << "[" << (void*)wrapper.m_ptr << "]";
return debug.space();
}
-template<typename T>
-inline const void *qtVoidPtr(const T *ptr)
-{ return static_cast<const void *>(ptr); }
-
-#define qtThisPtr() qtVoidPtr(this)
-
#ifdef ENABLE_TRACE
inline QDebug qtTrace() { return qDebug() << "[qmlvideofx]"; }
# ifdef VERBOSE_TRACE
diff --git a/examples/multimedia/video/snippets/frequencymonitor/frequencymonitor.cpp b/examples/multimedia/video/snippets/frequencymonitor/frequencymonitor.cpp
index 1d44f1297..568bbc79f 100644
--- a/examples/multimedia/video/snippets/frequencymonitor/frequencymonitor.cpp
+++ b/examples/multimedia/video/snippets/frequencymonitor/frequencymonitor.cpp
@@ -40,11 +40,11 @@
****************************************************************************/
#include "frequencymonitor.h"
-#include <QtCore/QDebug>
-#include <QtCore/QElapsedTimer>
-#include <QtCore/QString>
-#include <QtCore/QTime>
-#include <QtCore/QTimer>
+#include <QDebug>
+#include <QElapsedTimer>
+#include <QString>
+#include <QTime>
+#include <QTimer>
//#define VERBOSE_TRACE
@@ -61,6 +61,7 @@ static const int DefaultTraceInterval = 0;
class FrequencyMonitorPrivate : public QObject
{
Q_OBJECT
+
public:
FrequencyMonitorPrivate(FrequencyMonitor *parent);
void calculateInstantaneousFrequency();
@@ -116,16 +117,16 @@ void FrequencyMonitorPrivate::calculateInstantaneousFrequency()
m_stalledTimer->start(3 * ms);
if (m_instantaneousFrequency)
q_ptr->setActive(true);
- q_ptr->emit instantaneousFrequencyChanged(m_instantaneousFrequency);
- q_ptr->emit frequencyChanged();
+ emit q_ptr->instantaneousFrequencyChanged(m_instantaneousFrequency);
+ emit q_ptr->frequencyChanged();
}
void FrequencyMonitorPrivate::calculateAverageFrequency()
{
const qint64 ms = m_averageElapsed.restart();
m_averageFrequency = qreal(m_count * 1000) / ms;
- q_ptr->emit averageFrequencyChanged(m_averageFrequency);
- q_ptr->emit frequencyChanged();
+ emit q_ptr->averageFrequencyChanged(m_averageFrequency);
+ emit q_ptr->frequencyChanged();
m_count = 0;
}
@@ -134,14 +135,13 @@ void FrequencyMonitorPrivate::stalled()
if (m_instantaneousFrequency) {
qtVerboseTrace() << "FrequencyMonitor::stalled";
m_instantaneousFrequency = 0;
- q_ptr->emit instantaneousFrequencyChanged(m_instantaneousFrequency);
- q_ptr->emit frequencyChanged();
+ emit q_ptr->instantaneousFrequencyChanged(m_instantaneousFrequency);
+ emit q_ptr->frequencyChanged();
}
}
FrequencyMonitor::FrequencyMonitor(QObject *parent)
: QObject(parent)
-, d_ptr(0)
{
d_ptr = new FrequencyMonitorPrivate(this);
qtTrace() << "FrequencyMonitor::FrequencyMonitor";
@@ -152,7 +152,7 @@ FrequencyMonitor::~FrequencyMonitor()
}
-const QString &FrequencyMonitor::label() const
+QString FrequencyMonitor::label() const
{
return d_func()->m_label;
}
diff --git a/examples/multimedia/video/snippets/frequencymonitor/frequencymonitor.h b/examples/multimedia/video/snippets/frequencymonitor/frequencymonitor.h
index 1efd8b3ad..f34646f9e 100644
--- a/examples/multimedia/video/snippets/frequencymonitor/frequencymonitor.h
+++ b/examples/multimedia/video/snippets/frequencymonitor/frequencymonitor.h
@@ -42,8 +42,8 @@
#ifndef FREQUENCYMONITOR_H
#define FREQUENCYMONITOR_H
-#include <QtCore/QObject>
-#include <QtCore/QTimer>
+#include <QObject>
+#include <QTimer>
class FrequencyMonitorPrivate;
@@ -64,13 +64,14 @@ class FrequencyMonitor : public QObject
Q_PROPERTY(int traceInterval READ traceInterval WRITE setTraceInterval NOTIFY traceIntervalChanged)
Q_PROPERTY(qreal instantaneousFrequency READ instantaneousFrequency NOTIFY instantaneousFrequencyChanged)
Q_PROPERTY(qreal averageFrequency READ averageFrequency NOTIFY averageFrequencyChanged)
+
public:
FrequencyMonitor(QObject *parent = 0);
~FrequencyMonitor();
static void qmlRegisterType();
- const QString &label() const;
+ QString label() const;
bool active() const;
int samplingInterval() const;
int traceInterval() const;
diff --git a/examples/multimedia/video/snippets/performancemonitor/performancemonitor.cpp b/examples/multimedia/video/snippets/performancemonitor/performancemonitor.cpp
index 9a7e060b7..07c83485b 100644
--- a/examples/multimedia/video/snippets/performancemonitor/performancemonitor.cpp
+++ b/examples/multimedia/video/snippets/performancemonitor/performancemonitor.cpp
@@ -43,27 +43,27 @@
namespace PerformanceMonitor {
- bool parseArgument(const QString &arg, State &state)
- {
- bool result = false;
- if ("-log-perf" == arg) {
- state.logging = true;
- state.valid = true;
- result = true;
- } else if ("-no-log-perf" == arg) {
- state.logging = false;
- state.valid = true;
- result = true;
- } else if ("-show-perf" == arg) {
- state.visible = true;
- state.valid = true;
- result = true;
- } else if ("-hide-perf" == arg) {
- state.visible = false;
- state.valid = true;
- result = true;
- }
- return result;
+bool State::parseArgument(const QByteArray &arg)
+{
+ bool result = false;
+ if (arg == "-log-perf") {
+ logging = true;
+ valid = true;
+ result = true;
+ } else if (arg == "-no-log-perf") {
+ logging = false;
+ valid = true;
+ result = true;
+ } else if (arg == "-show-perf") {
+ visible = true;
+ valid = true;
+ result = true;
+ } else if (arg == "-hide-perf") {
+ visible = false;
+ valid = true;
+ result = true;
}
-
+ return result;
}
+
+} // namespace PerformanceMonitor
diff --git a/examples/multimedia/video/snippets/performancemonitor/performancemonitor.h b/examples/multimedia/video/snippets/performancemonitor/performancemonitor.h
index d87d71eac..f1a443e0b 100644
--- a/examples/multimedia/video/snippets/performancemonitor/performancemonitor.h
+++ b/examples/multimedia/video/snippets/performancemonitor/performancemonitor.h
@@ -42,24 +42,27 @@
#ifndef PERFORMANCEMONITOR_H
#define PERFORMANCEMONITOR_H
-#include <QtCore/QString>
+#include <QByteArray>
namespace PerformanceMonitor {
- struct State {
- bool valid;
- bool logging;
- bool visible;
- State() : valid(true), logging(false), visible(true) { }
- State(bool l, bool v) : valid(true), logging(l), visible(v) { }
- bool operator==(const State &other) const
- { return logging == other.logging && visible == other.visible; }
- bool operator!=(const State &other) const
- { return logging != other.logging || visible != other.visible; }
- };
+struct State
+{
+ State() : valid(true), logging(false), visible(true) { }
+ State(bool l, bool v) : valid(true), logging(l), visible(v) { }
+ bool operator==(const State &other) const
+ { return logging == other.logging && visible == other.visible; }
+ bool operator!=(const State &other) const
+ { return logging != other.logging || visible != other.visible; }
- bool parseArgument(const QString &arg, State &state);
-}
+ bool parseArgument(const QByteArray &arg);
+
+ bool valid;
+ bool logging;
+ bool visible;
+};
+
+} // namespace PerformanceMonitor
#endif // PERFORMANCEMONITOR_H
diff --git a/examples/multimediawidgets/declarative-camera/declarative-camera.pro b/examples/multimediawidgets/declarative-camera/declarative-camera.pro
index c52a1d1e6..5fb0a1b51 100644
--- a/examples/multimediawidgets/declarative-camera/declarative-camera.pro
+++ b/examples/multimediawidgets/declarative-camera/declarative-camera.pro
@@ -4,6 +4,7 @@ TARGET=declarative-camera
QT += quick qml multimedia
SOURCES += qmlcamera.cpp
+RESOURCES += declarative-camera.qrc
target.path = $$[QT_INSTALL_EXAMPLES]/multimediawidgets/declarative-camera
INSTALLS += target
diff --git a/examples/multimediawidgets/declarative-camera/declarative-camera.qrc b/examples/multimediawidgets/declarative-camera/declarative-camera.qrc
new file mode 100644
index 000000000..d99b86c0c
--- /dev/null
+++ b/examples/multimediawidgets/declarative-camera/declarative-camera.qrc
@@ -0,0 +1,26 @@
+<RCC>
+ <qresource prefix="/">
+ <file>PhotoPreview.qml</file>
+ <file>ZoomControl.qml</file>
+ <file>VideoCaptureControls.qml</file>
+ <file>VideoPreview.qml</file>
+ <file>FocusButton.qml</file>
+ <file>PhotoCaptureControls.qml</file>
+ <file>declarative-camera.qml</file>
+ <file>CameraPropertyPopup.qml</file>
+ <file>CameraPropertyButton.qml</file>
+ <file>CameraButton.qml</file>
+ <file>images/camera_auto_mode.png</file>
+ <file>images/camera_camera_setting.png</file>
+ <file>images/camera_flash_auto.png</file>
+ <file>images/camera_flash_fill.png</file>
+ <file>images/camera_flash_off.png</file>
+ <file>images/camera_flash_redeye.png</file>
+ <file>images/camera_white_balance_cloudy.png</file>
+ <file>images/camera_white_balance_flourescent.png</file>
+ <file>images/camera_white_balance_incandescent.png</file>
+ <file>images/camera_white_balance_sunny.png</file>
+ <file>images/toolbutton.png</file>
+ <file>images/toolbutton.sci</file>
+ </qresource>
+</RCC>
diff --git a/examples/multimediawidgets/declarative-camera/qmlcamera.cpp b/examples/multimediawidgets/declarative-camera/qmlcamera.cpp
index 0d8dbc462..3da615650 100644
--- a/examples/multimediawidgets/declarative-camera/qmlcamera.cpp
+++ b/examples/multimediawidgets/declarative-camera/qmlcamera.cpp
@@ -50,8 +50,7 @@ int main(int argc, char* argv[])
// Qt.quit() called in embedded .qml by default only emits
// quit() signal, so do this (optionally use Qt.exit()).
QObject::connect(view.engine(), SIGNAL(quit()), qApp, SLOT(quit()));
- view.setSource(QUrl::fromLocalFile(QCoreApplication::applicationDirPath() +
- QLatin1String("/declarative-camera.qml")));
+ view.setSource(QUrl("qrc:///declarative-camera.qml"));
view.resize(800, 480);
view.show();
return app.exec();
diff --git a/examples/multimediawidgets/videowidget/videoplayer.cpp b/examples/multimediawidgets/videowidget/videoplayer.cpp
index d961a63ff..4083543e5 100644
--- a/examples/multimediawidgets/videowidget/videoplayer.cpp
+++ b/examples/multimediawidgets/videowidget/videoplayer.cpp
@@ -49,6 +49,7 @@ VideoPlayer::VideoPlayer(QWidget *parent)
, mediaPlayer(0, QMediaPlayer::VideoSurface)
, playButton(0)
, positionSlider(0)
+ , errorLabel(0)
{
QVideoWidget *videoWidget = new QVideoWidget;
@@ -68,6 +69,9 @@ VideoPlayer::VideoPlayer(QWidget *parent)
connect(positionSlider, SIGNAL(sliderMoved(int)),
this, SLOT(setPosition(int)));
+ errorLabel = new QLabel;
+ errorLabel->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Maximum);
+
QBoxLayout *controlLayout = new QHBoxLayout;
controlLayout->setMargin(0);
controlLayout->addWidget(openButton);
@@ -77,6 +81,7 @@ VideoPlayer::VideoPlayer(QWidget *parent)
QBoxLayout *layout = new QVBoxLayout;
layout->addWidget(videoWidget);
layout->addLayout(controlLayout);
+ layout->addWidget(errorLabel);
setLayout(layout);
@@ -85,6 +90,7 @@ VideoPlayer::VideoPlayer(QWidget *parent)
this, SLOT(mediaStateChanged(QMediaPlayer::State)));
connect(&mediaPlayer, SIGNAL(positionChanged(qint64)), this, SLOT(positionChanged(qint64)));
connect(&mediaPlayer, SIGNAL(durationChanged(qint64)), this, SLOT(durationChanged(qint64)));
+ connect(&mediaPlayer, SIGNAL(error(QMediaPlayer::Error)), this, SLOT(handleError()));
}
VideoPlayer::~VideoPlayer()
@@ -93,11 +99,12 @@ VideoPlayer::~VideoPlayer()
void VideoPlayer::openFile()
{
+ errorLabel->setText("");
+
QString fileName = QFileDialog::getOpenFileName(this, tr("Open Movie"),QDir::homePath());
if (!fileName.isEmpty()) {
mediaPlayer.setMedia(QUrl::fromLocalFile(fileName));
-
playButton->setEnabled(true);
}
}
@@ -140,3 +147,9 @@ void VideoPlayer::setPosition(int position)
{
mediaPlayer.setPosition(position);
}
+
+void VideoPlayer::handleError()
+{
+ playButton->setEnabled(false);
+ errorLabel->setText("Error: " + mediaPlayer.errorString());
+}
diff --git a/examples/multimediawidgets/videowidget/videoplayer.h b/examples/multimediawidgets/videowidget/videoplayer.h
index ddad18724..0bd720bfc 100644
--- a/examples/multimediawidgets/videowidget/videoplayer.h
+++ b/examples/multimediawidgets/videowidget/videoplayer.h
@@ -49,6 +49,7 @@
QT_BEGIN_NAMESPACE
class QAbstractButton;
class QSlider;
+class QLabel;
QT_END_NAMESPACE
class VideoPlayer : public QWidget
@@ -67,11 +68,13 @@ private slots:
void positionChanged(qint64 position);
void durationChanged(qint64 duration);
void setPosition(int position);
+ void handleError();
private:
QMediaPlayer mediaPlayer;
QAbstractButton *playButton;
QSlider *positionSlider;
+ QLabel *errorLabel;
};
#endif
diff --git a/src/imports/multimedia/qmldir b/src/imports/multimedia/qmldir
index d5bc20d46..673f7ffd2 100644
--- a/src/imports/multimedia/qmldir
+++ b/src/imports/multimedia/qmldir
@@ -1,3 +1,4 @@
+module QtMultimedia
plugin declarative_multimedia
typeinfo plugins.qmltypes
Video 5.0 Video.qml
diff --git a/src/multimedia/audio/qsound.h b/src/multimedia/audio/qsound.h
index cf799e5df..a4d5327e0 100644
--- a/src/multimedia/audio/qsound.h
+++ b/src/multimedia/audio/qsound.h
@@ -57,7 +57,7 @@ class Q_MULTIMEDIA_EXPORT QSound : public QObject
public:
enum Loop
{
- Infinite = -1,
+ Infinite = -1
};
static void play(const QString& filename);
diff --git a/src/multimedia/doc/qtmultimedia.qdocconf b/src/multimedia/doc/qtmultimedia.qdocconf
index 08a628902..3873bd25c 100644
--- a/src/multimedia/doc/qtmultimedia.qdocconf
+++ b/src/multimedia/doc/qtmultimedia.qdocconf
@@ -3,7 +3,7 @@ include($QT_INSTALL_DOCS/global/qt-module-defaults.qdocconf)
project = qtmultimedia
description = Qt Multimedia Documentation
url = http://qt-project.org/doc/qtmultimedia
-version = 5.0.0
+version = 5.0.1
# The following parameters are for creating a qhp file, the qhelpgenerator
# program can convert the qhp file into a qch file which can be opened in
diff --git a/examples/multimedia/video/doc/src/video-qml-paint-rate.qdocinc b/src/multimedia/doc/src/examples/video-qml-paint-rate.qdocinc
index 84098e241..860f14270 100644
--- a/examples/multimedia/video/doc/src/video-qml-paint-rate.qdocinc
+++ b/src/multimedia/doc/src/examples/video-qml-paint-rate.qdocinc
@@ -2,7 +2,7 @@ The QML painting rate is calculated by the FrequencyMonitor class, which
turns a stream of events (received via the notify() slot), into an
instantaneous and an averaged frequency:
-\quotefromfile video/snippets/frequencymonitor/frequencymonitor.h
+\quotefromfile multimedia/video/snippets/frequencymonitor/frequencymonitor.h
\skipto class FrequencyMonitor : public QObject
\printuntil Q_OBJECT
\skipto Q_PROPERTY(qreal instantaneousFrequency
@@ -19,13 +19,13 @@ instantaneous and an averaged frequency:
The FrequencyMonitor class is exposed to QML like this
-\quotefromfile video/snippets/frequencymonitor/frequencymonitordeclarative.cpp
+\quotefromfile multimedia/video/snippets/frequencymonitor/frequencymonitordeclarative.cpp
\skipto FrequencyMonitor::qmlRegisterType
\printuntil }
and its data is displayed by defining a QML item called FrequencyItem, like this:
-\quotefromfile video/snippets/frequencymonitor/qml/frequencymonitor/FrequencyItem.qml
+\quotefromfile multimedia/video/snippets/frequencymonitor/qml/frequencymonitor/FrequencyItem.qml
\skipto import FrequencyMonitor
\printuntil id: root
\dots
diff --git a/examples/multimedia/video/doc/images/video-qml-paint-rate.png b/src/multimedia/doc/src/images/video-qml-paint-rate.png
index 1519ff64e..1519ff64e 100644
--- a/examples/multimedia/video/doc/images/video-qml-paint-rate.png
+++ b/src/multimedia/doc/src/images/video-qml-paint-rate.png
Binary files differ
diff --git a/src/multimedia/multimedia.pro b/src/multimedia/multimedia.pro
index e8ced991c..9dbea399b 100644
--- a/src/multimedia/multimedia.pro
+++ b/src/multimedia/multimedia.pro
@@ -1,11 +1,6 @@
TARGET = QtMultimedia
QT = core-private network gui
-contains(QT_CONFIG, opengl) | contains(QT_CONFIG, opengles2) {
-} else {
- DEFINES += QT_NO_OPENGL
-}
-
QMAKE_DOCS = $$PWD/doc/qtmultimedia.qdocconf
load(qt_module)
diff --git a/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.mm b/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.mm
index 3fb935457..f9310604b 100644
--- a/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.mm
+++ b/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.mm
@@ -257,8 +257,8 @@ static void *AVFMediaPlayerSessionObserverCurrentItemObservationContext = &AVFMe
NSArray *tracks = [asset tracksWithMediaType:AVMediaTypeVideo];
if ([tracks count]) {
AVAssetTrack *videoTrack = [tracks objectAtIndex:0];
- m_playerLayer.anchorPoint = NSMakePoint(0.0f, 0.0f);
- m_playerLayer.bounds = NSMakeRect(0.0f, 0.0f, videoTrack.naturalSize.width, videoTrack.naturalSize.height);
+ m_playerLayer.anchorPoint = CGPointMake(0.0f, 0.0f);
+ m_playerLayer.bounds = CGRectMake(0.0f, 0.0f, videoTrack.naturalSize.width, videoTrack.naturalSize.height);
}
}
@@ -368,8 +368,8 @@ static void *AVFMediaPlayerSessionObserverCurrentItemObservationContext = &AVFMe
NSArray *tracks = [asset tracksWithMediaType:AVMediaTypeVideo];
if ([tracks count]) {
AVAssetTrack *videoTrack = [tracks objectAtIndex:0];
- m_playerLayer.anchorPoint = NSMakePoint(0.0f, 0.0f);
- m_playerLayer.bounds = NSMakeRect(0.0f, 0.0f, videoTrack.naturalSize.width, videoTrack.naturalSize.height);
+ m_playerLayer.anchorPoint = CGPointMake(0.0f, 0.0f);
+ m_playerLayer.bounds = CGRectMake(0.0f, 0.0f, videoTrack.naturalSize.width, videoTrack.naturalSize.height);
}
}
diff --git a/src/plugins/avfoundation/mediaplayer/avfvideowidgetcontrol.mm b/src/plugins/avfoundation/mediaplayer/avfvideowidgetcontrol.mm
index b8cd7821a..c995d92f3 100644
--- a/src/plugins/avfoundation/mediaplayer/avfvideowidgetcontrol.mm
+++ b/src/plugins/avfoundation/mediaplayer/avfvideowidgetcontrol.mm
@@ -207,7 +207,7 @@ void AVFVideoWidgetControl::updateVideoFrame(const CVTimeStamp &ts)
void AVFVideoWidgetControl::setupVideoOutput()
{
- NSRect layerBounds = [(AVPlayerLayer*)m_playerLayer bounds];
+ CGRect layerBounds = [(AVPlayerLayer*)m_playerLayer bounds];
m_nativeSize = QSize(layerBounds.size.width, layerBounds.size.height);
m_videoWidget->setNativeSize(m_nativeSize);
diff --git a/src/plugins/directshow/camera/dscameraservice.cpp b/src/plugins/directshow/camera/dscameraservice.cpp
index 6d2974160..fcbd1ef58 100644
--- a/src/plugins/directshow/camera/dscameraservice.cpp
+++ b/src/plugins/directshow/camera/dscameraservice.cpp
@@ -44,7 +44,7 @@
#if defined(HAVE_WIDGETS)
#include <QtWidgets/qwidget.h>
-#include <QVideoWidgetControl.h>
+#include <QVideoWidgetControl>
#endif
#include "dscameraservice.h"
diff --git a/src/plugins/directshow/camera/dsvideodevicecontrol.cpp b/src/plugins/directshow/camera/dsvideodevicecontrol.cpp
index 46865690f..7c33d130d 100644
--- a/src/plugins/directshow/camera/dsvideodevicecontrol.cpp
+++ b/src/plugins/directshow/camera/dsvideodevicecontrol.cpp
@@ -49,7 +49,7 @@
#include <dshow.h>
#include <objbase.h>
#include <initguid.h>
-#include <Ocidl.h>
+#include <ocidl.h>
#include <string.h>
extern const CLSID CLSID_VideoInputDeviceCategory;
diff --git a/src/plugins/directshow/camera/dsvideowidgetcontrol.cpp b/src/plugins/directshow/camera/dsvideowidgetcontrol.cpp
index 843719b8e..d7a913d7b 100644
--- a/src/plugins/directshow/camera/dsvideowidgetcontrol.cpp
+++ b/src/plugins/directshow/camera/dsvideowidgetcontrol.cpp
@@ -42,7 +42,7 @@
#include <QtCore/qcoreevent.h>
#include <QtCore/qtimer.h>
-#include "DSVideoWidgetControl.h"
+#include "dsvideowidgetcontrol.h"
#include "dscamerasession.h"
QT_BEGIN_NAMESPACE
diff --git a/src/plugins/directshow/camera/dsvideowidgetcontrol.h b/src/plugins/directshow/camera/dsvideowidgetcontrol.h
index ac390c82b..9249c3178 100644
--- a/src/plugins/directshow/camera/dsvideowidgetcontrol.h
+++ b/src/plugins/directshow/camera/dsvideowidgetcontrol.h
@@ -49,7 +49,7 @@
#include <QtMultimedia/qvideosurfaceformat.h>
#include <qvideowidgetcontrol.h>
-#include "DsCameraControl.h"
+#include "dscameracontrol.h"
QT_BEGIN_HEADER
diff --git a/src/plugins/qt7/qt7.pro b/src/plugins/qt7/qt7.pro
index ae87bd44a..f5d8bae32 100644
--- a/src/plugins/qt7/qt7.pro
+++ b/src/plugins/qt7/qt7.pro
@@ -23,7 +23,7 @@ LIBS += -framework AppKit -framework AudioUnit \
# QUICKTIME_C_API_AVAILABLE is true only on i386
# so make sure to link QuickTime
-contains(QMAKE_HOST.arch, i386) {
+contains(QT_ARCH, i386) {
LIBS += -framework QuickTime
}
diff --git a/src/plugins/wmf/mftvideo.cpp b/src/plugins/wmf/mftvideo.cpp
index f13ae3e2e..12e80198e 100644
--- a/src/plugins/wmf/mftvideo.cpp
+++ b/src/plugins/wmf/mftvideo.cpp
@@ -47,6 +47,7 @@
#include <uuids.h>
#include <InitGuid.h>
#include <d3d9.h>
+#include <qdebug.h>
// This MFT sends all samples it processes to connected video probes.
// Sample is sent to probes in ProcessInput.
@@ -70,6 +71,9 @@ MFTransform::~MFTransform()
if (m_outputType)
m_outputType->Release();
+
+ for (int i = 0; i < m_mediaTypes.size(); ++i)
+ m_mediaTypes[i]->Release();
}
void MFTransform::addProbe(MFVideoProbeControl *probe)
@@ -88,6 +92,14 @@ void MFTransform::removeProbe(MFVideoProbeControl *probe)
m_videoProbes.removeOne(probe);
}
+void MFTransform::addSupportedMediaType(IMFMediaType *type)
+{
+ if (!type)
+ return;
+ QMutexLocker locker(&m_mutex);
+ m_mediaTypes.append(type);
+}
+
STDMETHODIMP MFTransform::QueryInterface(REFIID riid, void** ppv)
{
if (!ppv)
@@ -151,6 +163,8 @@ STDMETHODIMP MFTransform::GetStreamIDs(DWORD dwInputIDArraySize, DWORD *pdwInput
STDMETHODIMP MFTransform::GetInputStreamInfo(DWORD dwInputStreamID, MFT_INPUT_STREAM_INFO *pStreamInfo)
{
+ QMutexLocker locker(&m_mutex);
+
if (dwInputStreamID > 0)
return MF_E_INVALIDSTREAMNUMBER;
@@ -167,6 +181,8 @@ STDMETHODIMP MFTransform::GetInputStreamInfo(DWORD dwInputStreamID, MFT_INPUT_ST
STDMETHODIMP MFTransform::GetOutputStreamInfo(DWORD dwOutputStreamID, MFT_OUTPUT_STREAM_INFO *pStreamInfo)
{
+ QMutexLocker locker(&m_mutex);
+
if (dwOutputStreamID > 0)
return MF_E_INVALIDSTREAMNUMBER;
@@ -243,16 +259,27 @@ STDMETHODIMP MFTransform::SetInputType(DWORD dwInputStreamID, IMFMediaType *pTyp
QMutexLocker locker(&m_mutex);
+ if (m_sample)
+ return MF_E_TRANSFORM_CANNOT_CHANGE_MEDIATYPE_WHILE_PROCESSING;
+
+ if (!isMediaTypeSupported(pType))
+ return MF_E_INVALIDMEDIATYPE;
+
DWORD flags = 0;
- if (m_outputType && m_outputType->IsEqual(pType, &flags) != S_OK) {
+ if (pType && !m_inputType && m_outputType && m_outputType->IsEqual(pType, &flags) != S_OK)
return MF_E_INVALIDMEDIATYPE;
- }
if (dwFlags == MFT_SET_TYPE_TEST_ONLY)
return pType ? S_OK : E_POINTER;
- if (m_inputType)
+ if (m_inputType) {
m_inputType->Release();
+ // Input type has changed, discard output type (if it's set) so it's reset later on
+ if (m_outputType && m_outputType->IsEqual(pType, &flags) != S_OK) {
+ m_outputType->Release();
+ m_outputType = 0;
+ }
+ }
m_inputType = pType;
@@ -269,16 +296,27 @@ STDMETHODIMP MFTransform::SetOutputType(DWORD dwOutputStreamID, IMFMediaType *pT
QMutexLocker locker(&m_mutex);
+ if (m_sample)
+ return MF_E_TRANSFORM_CANNOT_CHANGE_MEDIATYPE_WHILE_PROCESSING;
+
+ if (!isMediaTypeSupported(pType))
+ return MF_E_INVALIDMEDIATYPE;
+
DWORD flags = 0;
- if (m_inputType && m_inputType->IsEqual(pType, &flags) != S_OK) {
+ if (pType && !m_outputType && m_inputType && m_inputType->IsEqual(pType, &flags) != S_OK)
return MF_E_INVALIDMEDIATYPE;
- }
if (dwFlags == MFT_SET_TYPE_TEST_ONLY)
return pType ? S_OK : E_POINTER;
- if (m_outputType)
+ if (m_outputType) {
m_outputType->Release();
+ // Output type has changed, discard input type (if it's set) so it's reset later on
+ if (m_inputType && m_inputType->IsEqual(pType, &flags) != S_OK) {
+ m_inputType->Release();
+ m_inputType = 0;
+ }
+ }
m_outputType = pType;
@@ -645,3 +683,19 @@ QByteArray MFTransform::dataFromBuffer(IMFMediaBuffer *buffer, int height, int *
return array;
}
+
+bool MFTransform::isMediaTypeSupported(IMFMediaType *type)
+{
+ // if the list is empty, it supports all formats
+ if (!type || m_mediaTypes.isEmpty())
+ return true;
+
+ for (int i = 0; i < m_mediaTypes.size(); ++i) {
+ DWORD flags = 0;
+ m_mediaTypes.at(i)->IsEqual(type, &flags);
+ if (flags & MF_MEDIATYPE_EQUAL_FORMAT_TYPES)
+ return true;
+ }
+
+ return false;
+}
diff --git a/src/plugins/wmf/mftvideo.h b/src/plugins/wmf/mftvideo.h
index 45520c819..3a3823c92 100644
--- a/src/plugins/wmf/mftvideo.h
+++ b/src/plugins/wmf/mftvideo.h
@@ -61,6 +61,8 @@ public:
void addProbe(MFVideoProbeControl* probe);
void removeProbe(MFVideoProbeControl* probe);
+ void addSupportedMediaType(IMFMediaType *type);
+
// IUnknown methods
STDMETHODIMP QueryInterface(REFIID iid, void** ppv);
STDMETHODIMP_(ULONG) AddRef();
@@ -97,6 +99,7 @@ private:
static QVideoSurfaceFormat videoFormatForMFMediaType(IMFMediaType *mediaType, int *bytesPerLine);
QVideoFrame makeVideoFrame();
QByteArray dataFromBuffer(IMFMediaBuffer *buffer, int height, int *bytesPerLine);
+ bool isMediaTypeSupported(IMFMediaType *type);
long m_cRef;
IMFMediaType *m_inputType;
@@ -104,6 +107,8 @@ private:
IMFSample *m_sample;
QMutex m_mutex;
+ QList<IMFMediaType*> m_mediaTypes;
+
QList<MFVideoProbeControl*> m_videoProbes;
QMutex m_videoProbeMutex;
diff --git a/src/plugins/wmf/player/evr9videowindowcontrol.cpp b/src/plugins/wmf/player/evr9videowindowcontrol.cpp
index 7f1c71332..b15eef15e 100644
--- a/src/plugins/wmf/player/evr9videowindowcontrol.cpp
+++ b/src/plugins/wmf/player/evr9videowindowcontrol.cpp
@@ -85,6 +85,11 @@ void Evr9VideoWindowControl::clear()
m_currentActivate = NULL;
}
+void Evr9VideoWindowControl::releaseActivate()
+{
+ clear();
+}
+
WId Evr9VideoWindowControl::winId() const
{
return m_windowId;
diff --git a/src/plugins/wmf/player/evr9videowindowcontrol.h b/src/plugins/wmf/player/evr9videowindowcontrol.h
index ea4bae56d..01a9c42fa 100644
--- a/src/plugins/wmf/player/evr9videowindowcontrol.h
+++ b/src/plugins/wmf/player/evr9videowindowcontrol.h
@@ -86,6 +86,7 @@ public:
void setSaturation(int saturation);
IMFActivate* createActivate();
+ void releaseActivate();
void setProcAmpValues();
diff --git a/src/plugins/wmf/player/mfmetadatacontrol.cpp b/src/plugins/wmf/player/mfmetadatacontrol.cpp
index 18c6a4204..142b8650b 100644
--- a/src/plugins/wmf/player/mfmetadatacontrol.cpp
+++ b/src/plugins/wmf/player/mfmetadatacontrol.cpp
@@ -39,12 +39,95 @@
**
****************************************************************************/
+#include <qdatetime.h>
+#include <qimage.h>
+
#include "mfmetadatacontrol.h"
#include "mfplayerservice.h"
#include "Propkey.h"
//#define DEBUG_MEDIAFOUNDATION
+static QString nameForGUID(GUID guid)
+{
+ // Audio formats
+ if (guid == MFAudioFormat_AAC)
+ return QStringLiteral("MPEG AAC Audio");
+ else if (guid == MFAudioFormat_ADTS)
+ return QStringLiteral("MPEG ADTS AAC Audio");
+ else if (guid == MFAudioFormat_Dolby_AC3_SPDIF)
+ return QStringLiteral("Dolby AC-3 SPDIF");
+ else if (guid == MFAudioFormat_DRM)
+ return QStringLiteral("DRM");
+ else if (guid == MFAudioFormat_DTS)
+ return QStringLiteral("Digital Theater Systems Audio (DTS)");
+ else if (guid == MFAudioFormat_Float)
+ return QStringLiteral("IEEE Float Audio");
+ else if (guid == MFAudioFormat_MP3)
+ return QStringLiteral("MPEG Audio Layer-3 (MP3)");
+ else if (guid == MFAudioFormat_MPEG)
+ return QStringLiteral("MPEG-1 Audio");
+ else if (guid == MFAudioFormat_MSP1)
+ return QStringLiteral("Windows Media Audio Voice");
+ else if (guid == MFAudioFormat_PCM)
+ return QStringLiteral("Uncompressed PCM Audio");
+ else if (guid == MFAudioFormat_WMASPDIF)
+ return QStringLiteral("Windows Media Audio 9 SPDIF");
+ else if (guid == MFAudioFormat_WMAudioV8)
+ return QStringLiteral("Windows Media Audio 8 (WMA2)");
+ else if (guid == MFAudioFormat_WMAudioV9)
+ return QStringLiteral("Windows Media Audio 9 (WMA3");
+ else if (guid == MFAudioFormat_WMAudio_Lossless)
+ return QStringLiteral("Windows Media Audio 9 Lossless");
+
+ // Video formats
+ if (guid == MFVideoFormat_DV25)
+ return QStringLiteral("DVCPRO 25 (DV25)");
+ else if (guid == MFVideoFormat_DV50)
+ return QStringLiteral("DVCPRO 50 (DV50)");
+ else if (guid == MFVideoFormat_DVC)
+ return QStringLiteral("DVC/DV Video");
+ else if (guid == MFVideoFormat_DVH1)
+ return QStringLiteral("DVCPRO 100 (DVH1)");
+ else if (guid == MFVideoFormat_DVHD)
+ return QStringLiteral("HD-DVCR (DVHD)");
+ else if (guid == MFVideoFormat_DVSD)
+ return QStringLiteral("SDL-DVCR (DVSD)");
+ else if (guid == MFVideoFormat_DVSL)
+ return QStringLiteral("SD-DVCR (DVSL)");
+ else if (guid == MFVideoFormat_H264)
+ return QStringLiteral("H.264 Video");
+ else if (guid == MFVideoFormat_M4S2)
+ return QStringLiteral("MPEG-4 part 2 Video (M4S2)");
+ else if (guid == MFVideoFormat_MJPG)
+ return QStringLiteral("Motion JPEG (MJPG)");
+ else if (guid == MFVideoFormat_MP43)
+ return QStringLiteral("Microsoft MPEG 4 version 3 (MP43)");
+ else if (guid == MFVideoFormat_MP4S)
+ return QStringLiteral("ISO MPEG 4 version 1 (MP4S)");
+ else if (guid == MFVideoFormat_MP4V)
+ return QStringLiteral("MPEG-4 part 2 Video (MP4V)");
+ else if (guid == MFVideoFormat_MPEG2)
+ return QStringLiteral("MPEG-2 Video");
+ else if (guid == MFVideoFormat_MPG1)
+ return QStringLiteral("MPEG-1 Video");
+ else if (guid == MFVideoFormat_MSS1)
+ return QStringLiteral("Windows Media Screen 1 (MSS1)");
+ else if (guid == MFVideoFormat_MSS2)
+ return QStringLiteral("Windows Media Video 9 Screen (MSS2)");
+ else if (guid == MFVideoFormat_WMV1)
+ return QStringLiteral("Windows Media Video 7 (WMV1)");
+ else if (guid == MFVideoFormat_WMV2)
+ return QStringLiteral("Windows Media Video 8 (WMV2)");
+ else if (guid == MFVideoFormat_WMV3)
+ return QStringLiteral("Windows Media Video 9 (WMV3)");
+ else if (guid == MFVideoFormat_WVC1)
+ return QStringLiteral("Windows Media Video VC1 (WVC1)");
+
+ else
+ return QStringLiteral("Unknown codec");
+}
+
MFMetaDataControl::MFMetaDataControl(QObject *parent)
: QMetaDataReaderControl(parent)
, m_metaData(0)
@@ -83,9 +166,46 @@ QVariant MFMetaDataControl::metaData(const QString &key) const
else if (m_metaData)
hr = m_metaData->GetProperty(reinterpret_cast<LPCWSTR>(m_commonNames[index].utf16()), &var);
- if (SUCCEEDED(hr))
+ if (SUCCEEDED(hr)) {
value = convertValue(var);
+ // some metadata needs to be reformatted
+ if (value.isValid() && m_content) {
+ if (key == QMediaMetaData::MediaType) {
+ QString v = value.toString();
+ if (v == QLatin1String("{D1607DBC-E323-4BE2-86A1-48A42A28441E}"))
+ value = QStringLiteral("Music");
+ else if (v == QLatin1String("{DB9830BD-3AB3-4FAB-8A37-1A995F7FF74B}"))
+ value = QStringLiteral("Video");
+ else if (v == QLatin1String("{01CD0F29-DA4E-4157-897B-6275D50C4F11}"))
+ value = QStringLiteral("Audio");
+ else if (v == QLatin1String("{FCF24A76-9A57-4036-990D-E35DD8B244E1}"))
+ value = QStringLiteral("Other");
+ } else if (key == QMediaMetaData::Duration) {
+ // duration is provided in 100-nanosecond units, convert to milliseconds
+ value = (value.toLongLong() + 10000) / 10000;
+ } else if (key == QMediaMetaData::AudioCodec || key == QMediaMetaData::VideoCodec) {
+ GUID guid;
+ if (SUCCEEDED(CLSIDFromString((const WCHAR*)value.toString().utf16(), &guid)))
+ value = nameForGUID(guid);
+ } else if (key == QMediaMetaData::Resolution) {
+ QSize res;
+ res.setHeight(value.toUInt());
+ if (m_content && SUCCEEDED(m_content->GetValue(PKEY_Video_FrameWidth, &var)))
+ res.setWidth(convertValue(var).toUInt());
+ value = res;
+ } else if (key == QMediaMetaData::PixelAspectRatio) {
+ QSize aspectRatio;
+ aspectRatio.setWidth(value.toUInt());
+ if (m_content && SUCCEEDED(m_content->GetValue(PKEY_Video_VerticalAspectRatio, &var)))
+ aspectRatio.setHeight(convertValue(var).toUInt());
+ value = aspectRatio;
+ } else if (key == QMediaMetaData::VideoFrameRate) {
+ value = value.toReal() / 1000.f;
+ }
+ }
+ }
+
PropVariantClear(&var);
return value;
}
@@ -93,9 +213,6 @@ QVariant MFMetaDataControl::metaData(const QString &key) const
QVariant MFMetaDataControl::convertValue(const PROPVARIANT& var) const
{
QVariant value;
- //form MSDN: http://msdn.microsoft.com/en-us/library/ff384862%28v=VS.85%29.aspx
- //it seems that those 4 types are enough for media foundation metadata
- //add more later if necessary
switch (var.vt) {
case VT_LPWSTR:
value = QString::fromUtf16(reinterpret_cast<const ushort*>(var.pwszVal));
@@ -109,6 +226,33 @@ QVariant MFMetaDataControl::convertValue(const PROPVARIANT& var) const
case VT_BOOL:
value = bool(var.boolVal);
break;
+ case VT_FILETIME:
+ SYSTEMTIME sysDate;
+ if (!FileTimeToSystemTime(&var.filetime, &sysDate))
+ break;
+ value = QDate(sysDate.wYear, sysDate.wMonth, sysDate.wDay);
+ break;
+ case VT_STREAM:
+ {
+ STATSTG stat;
+ if (FAILED(var.pStream->Stat(&stat, STATFLAG_NONAME)))
+ break;
+ void *data = malloc(stat.cbSize.QuadPart);
+ ULONG read = 0;
+ if (FAILED(var.pStream->Read(data, stat.cbSize.QuadPart, &read))) {
+ free(data);
+ break;
+ }
+ value = QImage::fromData((const uchar*)data, read);
+ free(data);
+ }
+ break;
+ case VT_VECTOR | VT_LPWSTR:
+ QStringList vList;
+ for (ULONG i = 0; i < var.calpwstr.cElems; ++i)
+ vList.append(QString::fromUtf16(reinterpret_cast<const ushort*>(var.calpwstr.pElems[i])));
+ value = vList;
+ break;
}
return value;
}
@@ -147,13 +291,80 @@ void MFMetaDataControl::updateSource(IMFPresentationDescriptor* sourcePD, IMFMed
m_availableMetaDatas.push_back(QMediaMetaData::Author);
} else if (key == PKEY_Title) {
m_availableMetaDatas.push_back(QMediaMetaData::Title);
+ } else if (key == PKEY_Media_SubTitle) {
+ m_availableMetaDatas.push_back(QMediaMetaData::SubTitle);
} else if (key == PKEY_ParentalRating) {
m_availableMetaDatas.push_back(QMediaMetaData::ParentalRating);
} else if (key == PKEY_Comment) {
m_availableMetaDatas.push_back(QMediaMetaData::Description);
} else if (key == PKEY_Copyright) {
m_availableMetaDatas.push_back(QMediaMetaData::Copyright);
- //TODO: add more common keys
+ } else if (key == PKEY_Comment) {
+ m_availableMetaDatas.push_back(QMediaMetaData::Comment);
+ } else if (key == PKEY_Media_ProviderStyle) {
+ m_availableMetaDatas.push_back(QMediaMetaData::Genre);
+ } else if (key == PKEY_Media_Year) {
+ m_availableMetaDatas.push_back(QMediaMetaData::Year);
+ } else if (key == PKEY_Media_DateEncoded) {
+ m_availableMetaDatas.push_back(QMediaMetaData::Date);
+ } else if (key == PKEY_Rating) {
+ m_availableMetaDatas.push_back(QMediaMetaData::UserRating);
+ } else if (key == PKEY_Keywords) {
+ m_availableMetaDatas.push_back(QMediaMetaData::Keywords);
+ } else if (key == PKEY_Language) {
+ m_availableMetaDatas.push_back(QMediaMetaData::Language);
+ } else if (key == PKEY_Media_Publisher) {
+ m_availableMetaDatas.push_back(QMediaMetaData::Publisher);
+ } else if (key == PKEY_Media_ClassPrimaryID) {
+ m_availableMetaDatas.push_back(QMediaMetaData::MediaType);
+ } else if (key == PKEY_Media_Duration) {
+ m_availableMetaDatas.push_back(QMediaMetaData::Duration);
+ } else if (key == PKEY_Audio_EncodingBitrate) {
+ m_availableMetaDatas.push_back(QMediaMetaData::AudioBitRate);
+ } else if (key == PKEY_Audio_Format) {
+ m_availableMetaDatas.push_back(QMediaMetaData::AudioCodec);
+ } else if (key == PKEY_Media_AverageLevel) {
+ m_availableMetaDatas.push_back(QMediaMetaData::AverageLevel);
+ } else if (key == PKEY_Audio_ChannelCount) {
+ m_availableMetaDatas.push_back(QMediaMetaData::ChannelCount);
+ } else if (key == PKEY_Audio_PeakValue) {
+ m_availableMetaDatas.push_back(QMediaMetaData::PeakValue);
+ } else if (key == PKEY_Audio_SampleRate) {
+ m_availableMetaDatas.push_back(QMediaMetaData::SampleRate);
+ } else if (key == PKEY_Music_AlbumTitle) {
+ m_availableMetaDatas.push_back(QMediaMetaData::AlbumTitle);
+ } else if (key == PKEY_Music_AlbumArtist) {
+ m_availableMetaDatas.push_back(QMediaMetaData::AlbumArtist);
+ } else if (key == PKEY_Music_Artist) {
+ m_availableMetaDatas.push_back(QMediaMetaData::ContributingArtist);
+ } else if (key == PKEY_Music_Composer) {
+ m_availableMetaDatas.push_back(QMediaMetaData::Composer);
+ } else if (key == PKEY_Music_Conductor) {
+ m_availableMetaDatas.push_back(QMediaMetaData::Conductor);
+ } else if (key == PKEY_Music_Lyrics) {
+ m_availableMetaDatas.push_back(QMediaMetaData::Lyrics);
+ } else if (key == PKEY_Music_Mood) {
+ m_availableMetaDatas.push_back(QMediaMetaData::Mood);
+ } else if (key == PKEY_Music_TrackNumber) {
+ m_availableMetaDatas.push_back(QMediaMetaData::TrackNumber);
+ } else if (key == PKEY_Music_Genre) {
+ m_availableMetaDatas.push_back(QMediaMetaData::Genre);
+ } else if (key == PKEY_ThumbnailStream) {
+ m_availableMetaDatas.push_back(QMediaMetaData::ThumbnailImage);
+ } else if (key == PKEY_Video_FrameHeight) {
+ m_availableMetaDatas.push_back(QMediaMetaData::Resolution);
+ } else if (key == PKEY_Video_HorizontalAspectRatio) {
+ m_availableMetaDatas.push_back(QMediaMetaData::PixelAspectRatio);
+ } else if (key == PKEY_Video_FrameRate) {
+ m_availableMetaDatas.push_back(QMediaMetaData::VideoFrameRate);
+ } else if (key == PKEY_Video_EncodingBitrate) {
+ m_availableMetaDatas.push_back(QMediaMetaData::VideoBitRate);
+ } else if (key == PKEY_Video_Compression) {
+ m_availableMetaDatas.push_back(QMediaMetaData::VideoCodec);
+ } else if (key == PKEY_Video_Director) {
+ m_availableMetaDatas.push_back(QMediaMetaData::Director);
+ } else if (key == PKEY_Media_Writer) {
+ m_availableMetaDatas.push_back(QMediaMetaData::Writer);
} else {
common = false;
//TODO: add more extended keys
diff --git a/src/plugins/wmf/player/mfplayerservice.cpp b/src/plugins/wmf/player/mfplayerservice.cpp
index 5bda9f983..ea06031ff 100644
--- a/src/plugins/wmf/player/mfplayerservice.cpp
+++ b/src/plugins/wmf/player/mfplayerservice.cpp
@@ -116,12 +116,11 @@ QMediaControl* MFPlayerService::requestControl(const char *name)
}
return 0;
} else if (qstrcmp(name,QMediaVideoProbeControl_iid) == 0) {
- // FIXME!! Disabled in Qt 5.0 because it is unstable
-// if (m_session) {
-// MFVideoProbeControl *probe = new MFVideoProbeControl(this);
-// m_session->addProbe(probe);
-// return probe;
-// }
+ if (m_session) {
+ MFVideoProbeControl *probe = new MFVideoProbeControl(this);
+ m_session->addProbe(probe);
+ return probe;
+ }
return 0;
}
diff --git a/src/plugins/wmf/player/mfplayersession.cpp b/src/plugins/wmf/player/mfplayersession.cpp
index 1eb91c203..7c7320228 100644
--- a/src/plugins/wmf/player/mfplayersession.cpp
+++ b/src/plugins/wmf/player/mfplayersession.cpp
@@ -413,7 +413,7 @@ MFPlayerSession::MFPlayerSession(MFPlayerService *playerService)
, m_hCloseEvent(0)
, m_closing(false)
, m_pendingRate(1)
- , m_volume(1)
+ , m_volume(100)
, m_muted(false)
, m_status(QMediaPlayer::NoMedia)
, m_scrubbing(false)
@@ -436,7 +436,6 @@ MFPlayerSession::MFPlayerSession(MFPlayerService *playerService)
m_request.rate = 1.0f;
m_audioSampleGrabber = new AudioSampleGrabberCallback;
- m_videoProbeMFT = new MFTransform;
}
void MFPlayerSession::close()
@@ -472,6 +471,18 @@ void MFPlayerSession::close()
m_sourceResolver->Release();
m_sourceResolver = 0;
}
+ if (m_videoProbeMFT) {
+ m_videoProbeMFT->Release();
+ m_videoProbeMFT = 0;
+ }
+
+ if (m_playerService->videoRendererControl()) {
+ m_playerService->videoRendererControl()->releaseActivate();
+#ifndef Q_WS_SIMULATOR
+ } else if (m_playerService->videoWindowControl()) {
+ m_playerService->videoWindowControl()->releaseActivate();
+#endif
+ }
if (m_session)
m_session->Release();
@@ -493,18 +504,26 @@ void MFPlayerSession::removeProbe(MFAudioProbeControl *probe)
void MFPlayerSession::addProbe(MFVideoProbeControl* probe)
{
- m_videoProbeMFT->addProbe(probe);
+ if (m_videoProbes.contains(probe))
+ return;
+
+ m_videoProbes.append(probe);
+
+ if (m_videoProbeMFT)
+ m_videoProbeMFT->addProbe(probe);
}
void MFPlayerSession::removeProbe(MFVideoProbeControl* probe)
{
- m_videoProbeMFT->removeProbe(probe);
+ m_videoProbes.removeOne(probe);
+
+ if (m_videoProbeMFT)
+ m_videoProbeMFT->removeProbe(probe);
}
MFPlayerSession::~MFPlayerSession()
{
m_audioSampleGrabber->Release();
- m_videoProbeMFT->Release();
}
@@ -988,73 +1007,92 @@ IMFTopology *MFPlayerSession::insertMFT(IMFTopology *topology, TOPOID outputNode
if (FAILED(topoLoader->Load(topology, &resolvedTopology, NULL)))
break;
-// FIXME!! VideoProbe disabled in Qt 5.0 because it is unstable.
-// Commented out the following code to skip inserting the transform node
-// getting the video frames.
-
// Get all output nodes and search for video output node.
-// if (FAILED(resolvedTopology->GetOutputNodeCollection(&outputNodes)))
-// break;
+ if (FAILED(resolvedTopology->GetOutputNodeCollection(&outputNodes)))
+ break;
-// DWORD elementCount = 0;
-// if (FAILED(outputNodes->GetElementCount(&elementCount)))
-// break;
+ DWORD elementCount = 0;
+ if (FAILED(outputNodes->GetElementCount(&elementCount)))
+ break;
+
+ for (DWORD n = 0; n < elementCount; n++) {
+ IUnknown *element = 0;
+ IMFTopologyNode *node = 0;
+ IUnknown *outputObject = 0;
+ IMFMediaTypeHandler *videoSink = 0;
+ IMFTopologyNode *inputNode = 0;
+ IMFTopologyNode *mftNode = 0;
+
+ do {
+ if (FAILED(outputNodes->GetElement(n, &element)))
+ break;
-// for (DWORD n = 0; n < elementCount; n++) {
-// IUnknown *element = 0;
-// IMFTopologyNode *node = 0;
-// IMFTopologyNode *inputNode = 0;
-// IMFTopologyNode *mftNode = 0;
+ if (FAILED(element->QueryInterface(IID_IMFTopologyNode, (void**)&node)))
+ break;
-// do {
-// if (FAILED(outputNodes->GetElement(n, &element)))
-// break;
+ TOPOID id;
+ if (FAILED(node->GetTopoNodeID(&id)))
+ break;
-// if (FAILED(element->QueryInterface(IID_IMFTopologyNode, (void**)&node)))
-// break;
+ if (id != outputNodeId)
+ break;
-// TOPOID id;
-// if (FAILED(node->GetTopoNodeID(&id)))
-// break;
+ // Use output supported media types for the MFT
+ if (FAILED(node->GetObject(&outputObject)))
+ break;
-// if (id != outputNodeId)
-// break;
+ if (FAILED(outputObject->QueryInterface(IID_IMFMediaTypeHandler, (void**)&videoSink)))
+ break;
+
+ DWORD mtCount;
+ if (FAILED(videoSink->GetMediaTypeCount(&mtCount)))
+ break;
+
+ for (DWORD i = 0; i < mtCount; ++i) {
+ IMFMediaType *type = 0;
+ if (SUCCEEDED(videoSink->GetMediaTypeByIndex(i, &type)))
+ m_videoProbeMFT->addSupportedMediaType(type);
+ }
-// // Insert MFT between the output node and the node connected to it.
-// DWORD outputIndex = 0;
-// if (FAILED(node->GetInput(0, &inputNode, &outputIndex)))
-// break;
+ // Insert MFT between the output node and the node connected to it.
+ DWORD outputIndex = 0;
+ if (FAILED(node->GetInput(0, &inputNode, &outputIndex)))
+ break;
-// if (FAILED(MFCreateTopologyNode(MF_TOPOLOGY_TRANSFORM_NODE, &mftNode)))
-// break;
+ if (FAILED(MFCreateTopologyNode(MF_TOPOLOGY_TRANSFORM_NODE, &mftNode)))
+ break;
-// if (FAILED(mftNode->SetObject(m_videoProbeMFT)))
-// break;
+ if (FAILED(mftNode->SetObject(m_videoProbeMFT)))
+ break;
-// if (FAILED(resolvedTopology->AddNode(mftNode)))
-// break;
+ if (FAILED(resolvedTopology->AddNode(mftNode)))
+ break;
-// if (FAILED(inputNode->ConnectOutput(0, mftNode, 0)))
-// break;
+ if (FAILED(inputNode->ConnectOutput(0, mftNode, 0)))
+ break;
-// if (FAILED(mftNode->ConnectOutput(0, node, 0)))
-// break;
+ if (FAILED(mftNode->ConnectOutput(0, node, 0)))
+ break;
-// isNewTopology = true;
-// } while (false);
+ isNewTopology = true;
+ } while (false);
-// if (mftNode)
-// mftNode->Release();
-// if (inputNode)
-// inputNode->Release();
-// if (node)
-// node->Release();
-// if (element)
-// element->Release();
+ if (mftNode)
+ mftNode->Release();
+ if (inputNode)
+ inputNode->Release();
+ if (node)
+ node->Release();
+ if (element)
+ element->Release();
+ if (videoSink)
+ videoSink->Release();
+ if (outputObject)
+ outputObject->Release();
-// if (isNewTopology)
-// break;
-// }
+ if (isNewTopology)
+ break;
+ }
} while (false);
if (outputNodes)
@@ -1181,6 +1219,10 @@ void MFPlayerSession::createSession()
QObject::connect(m_sourceResolver, SIGNAL(mediaSourceReady()), this, SLOT(handleMediaSourceReady()));
QObject::connect(m_sourceResolver, SIGNAL(error(long)), this, SLOT(handleSourceError(long)));
+ m_videoProbeMFT = new MFTransform;
+ for (int i = 0; i < m_videoProbes.size(); ++i)
+ m_videoProbeMFT->addProbe(m_videoProbes.at(i));
+
Q_ASSERT(m_session == NULL);
HRESULT hr = MFCreateMediaSession(NULL, &m_session);
if (FAILED(hr)) {
@@ -1569,7 +1611,9 @@ void MFPlayerSession::handleSessionEvent(IMFMediaEvent *sessionEvent)
break;
case MESourceUnknown:
changeStatus(QMediaPlayer::InvalidMedia);
+ break;
case MEError:
+ changeStatus(QMediaPlayer::UnknownMediaStatus);
qWarning() << "handleSessionEvent: serious error = " << hrStatus;
emit error(QMediaPlayer::ResourceError, tr("Media session serious error."), true);
break;
@@ -1640,7 +1684,7 @@ void MFPlayerSession::handleSessionEvent(IMFMediaEvent *sessionEvent)
}
if (SUCCEEDED(MFGetService(m_session, MR_POLICY_VOLUME_SERVICE, IID_PPV_ARGS(&m_volumeControl)))) {
- m_volumeControl->SetMasterVolume(m_volume);
+ m_volumeControl->SetMasterVolume(m_volume * 0.01f);
m_volumeControl->SetMute(m_muted);
}
@@ -1692,9 +1736,10 @@ void MFPlayerSession::handleSessionEvent(IMFMediaEvent *sessionEvent)
if (m_volumeControl) {
float currentVolume = 1;
if (SUCCEEDED(m_volumeControl->GetMasterVolume(&currentVolume))) {
- if (currentVolume != m_volume) {
- m_volume = currentVolume;
- emit volumeChanged(int(m_volume * 100));
+ int scaledVolume = currentVolume * 100;
+ if (scaledVolume != m_volume) {
+ m_volume = scaledVolume;
+ emit volumeChanged(scaledVolume);
}
}
BOOL currentMuted = FALSE;
diff --git a/src/plugins/wmf/player/mfplayersession.h b/src/plugins/wmf/player/mfplayersession.h
index b8b6f085e..21efbf6a7 100644
--- a/src/plugins/wmf/player/mfplayersession.h
+++ b/src/plugins/wmf/player/mfplayersession.h
@@ -232,6 +232,7 @@ private:
IMFTopology *insertMFT(IMFTopology *topology, TOPOID outputNodeId);
MFTransform *m_videoProbeMFT;
+ QList<MFVideoProbeControl*> m_videoProbes;
};
diff --git a/src/plugins/wmf/player/mfvideorenderercontrol.cpp b/src/plugins/wmf/player/mfvideorenderercontrol.cpp
index c3c5c1ae4..28fcb5b19 100644
--- a/src/plugins/wmf/player/mfvideorenderercontrol.cpp
+++ b/src/plugins/wmf/player/mfvideorenderercontrol.cpp
@@ -318,6 +318,7 @@ namespace
, m_prerollTargetTime(0)
, m_startTime(0)
, m_rendererControl(rendererControl)
+ , m_rate(1.f)
{
m_sink = parent;
@@ -1780,6 +1781,7 @@ namespace
, m_sink(0)
, m_rendererControl(rendererControl)
, m_attributes(0)
+ , m_surface(0)
{
MFCreateAttributes(&m_attributes, 0);
m_sink = new MediaSink(rendererControl);
@@ -2142,6 +2144,9 @@ MFVideoRendererControl::~MFVideoRendererControl()
void MFVideoRendererControl::clear()
{
+ if (m_surface)
+ m_surface->stop();
+
if (m_currentActivate) {
m_currentActivate->ShutdownObject();
m_currentActivate->Release();
@@ -2149,6 +2154,11 @@ void MFVideoRendererControl::clear()
m_currentActivate = NULL;
}
+void MFVideoRendererControl::releaseActivate()
+{
+ clear();
+}
+
QAbstractVideoSurface *MFVideoRendererControl::surface() const
{
return m_surface;
@@ -2208,10 +2218,8 @@ IMFActivate* MFVideoRendererControl::createActivate()
clear();
m_currentActivate = new VideoRendererActivate(this);
- if (m_surface) {
+ if (m_surface)
setSurface(m_surface);
- supportedFormatsChanged();
- }
return m_currentActivate;
}
diff --git a/src/plugins/wmf/player/mfvideorenderercontrol.h b/src/plugins/wmf/player/mfvideorenderercontrol.h
index ba04e73b7..0829e732d 100644
--- a/src/plugins/wmf/player/mfvideorenderercontrol.h
+++ b/src/plugins/wmf/player/mfvideorenderercontrol.h
@@ -59,6 +59,7 @@ public:
void setSurface(QAbstractVideoSurface *surface);
IMFActivate* createActivate();
+ void releaseActivate();
protected:
void customEvent(QEvent *event);