diff --git a/config.tests/android/android.pro b/config.tests/android/android.pro deleted file mode 100644 index dcf5df18..00000000 --- a/config.tests/android/android.pro +++ /dev/null @@ -1,4 +0,0 @@ -CONFIG += java -API_VERSION = android-11 -JAVASOURCES += main.java - diff --git a/config.tests/android/main.java b/config.tests/android/main.java deleted file mode 100644 index 1ab87259..00000000 --- a/config.tests/android/main.java +++ /dev/null @@ -1,6 +0,0 @@ -import android.graphics.SurfaceTexture; - -class BuildTest -{ - public static void main(String [] args) { } -} diff --git a/examples/multimedia/video/doc/src/qmlvideo.qdoc b/examples/multimedia/video/doc/src/qmlvideo.qdoc index 1efed800..6d683349 100644 --- a/examples/multimedia/video/doc/src/qmlvideo.qdoc +++ b/examples/multimedia/video/doc/src/qmlvideo.qdoc @@ -52,15 +52,15 @@ which moves across the \l{VideoOutput} item. \section1 Application structure -The \l{multimedia/video/qmlvideo/qml/qmlvideo/main.qml} file creates a UI which includes +The \l{video/qmlvideo/qml/qmlvideo/main.qml} file creates a UI which includes the following items: \list - \li Two \l{multimedia/video/qmlvideo/qml/qmlvideo/Button.qml}{Button} instances, each + \li Two \l{video/qmlvideo/qml/qmlvideo/Button.qml}{Button} instances, each of which displays a filename, and can be used to launch a - \l{multimedia/video/qmlvideo/qml/qmlvideo/FileBrowser.qml}{FileBrowser} - \li An exit \l{multimedia/video/qmlvideo/qml/qmlvideo/Button.qml}{Button} - \li A \l{multimedia/video/qmlvideo/qml/qmlvideo/SceneSelectionPanel.qml}{SceneSelectionPanel}, + \l{video/qmlvideo/qml/qmlvideo/FileBrowser.qml}{FileBrowser} + \li An exit \l{video/qmlvideo/qml/qmlvideo/Button.qml}{Button} + \li A \l{video/qmlvideo/qml/qmlvideo/SceneSelectionPanel.qml}{SceneSelectionPanel}, which is a flickable list displaying the available scenes \li At the lower left, an item which displays the QML repainting rate - the upper number is the instantaneous frame rate and the lower number is the @@ -72,18 +72,18 @@ the following items: Each scene in the flickable list is implemented in its own QML file - for example the video-basic scene (which just displays a static \l{VideoOutput} in the center of the screen) is implemented in the -\l{multimedia/video/qmlvideo/qml/qmlvideo/VideoBasic.qml}{VideoBasic.qml} file. As you +\l{video/qmlvideo/qml/qmlvideo/VideoBasic.qml}{VideoBasic.qml} file. As you can see from the code, this makes use of a type of inheritance: a -\l{multimedia/video/qmlvideo/qml/qmlvideo/VideoBasic.qml}{VideoBasic} item ... +\l{video/qmlvideo/qml/qmlvideo/VideoBasic.qml}{VideoBasic} item ... -\quotefromfile multimedia/video/qmlvideo/qml/qmlvideo/VideoBasic.qml +\quotefromfile video/qmlvideo/qml/qmlvideo/VideoBasic.qml \skipto import \printuntil /^\}/ ... is-a -\l{multimedia/video/qmlvideo/qml/qmlvideo/SceneBasic.qml}{SceneBasic} ... +\l{video/qmlvideo/qml/qmlvideo/SceneBasic.qml}{SceneBasic} ... -\quotefromfile multimedia/video/qmlvideo/qml/qmlvideo/SceneBasic.qml +\quotefromfile video/qmlvideo/qml/qmlvideo/SceneBasic.qml \skipto import \printuntil contentType \dots @@ -94,9 +94,9 @@ can see from the code, this makes use of a type of inheritance: a \printuntil /^\}/ ... which is-a -\l{multimedia/video/qmlvideo/qml/qmlvideo/Scene.qml}{Scene}: +\l{video/qmlvideo/qml/qmlvideo/Scene.qml}{Scene}: -\quotefromfile multimedia/video/qmlvideo/qml/qmlvideo/Scene.qml +\quotefromfile video/qmlvideo/qml/qmlvideo/Scene.qml \skipto import \printuntil root \dots @@ -106,25 +106,25 @@ can see from the code, this makes use of a type of inheritance: a \skipto Button \printuntil /^\}/ -\l{multimedia/video/qmlvideo/qml/qmlvideo/SceneBasic.qml}{SceneBasic} describes the +\l{video/qmlvideo/qml/qmlvideo/SceneBasic.qml}{SceneBasic} describes the structure and behaviour of the scene, but is agnostic of the type of content which will be displayed - this is abstracted by -\l{multimedia/video/qmlvideo/qml/qmlvideo/Content.qml}{Content}. +\l{video/qmlvideo/qml/qmlvideo/Content.qml}{Content}. This pattern allows us to define a particular use case (in this case, simply display a static piece of content), and then instantiate that use case for both video content -(\l{multimedia/video/qmlvideo/qml/qmlvideo/VideoBasic.qml}{VideoBasic}) and cameracontent -(\l{multimedia/video/qmlvideo/qml/qmlvideo/CameraBasic.qml}{CameraBasic}). This approach +(\l{video/qmlvideo/qml/qmlvideo/VideoBasic.qml}{VideoBasic}) and camera content +(\l{video/qmlvideo/qml/qmlvideo/CameraBasic.qml}{CameraBasic}). This approach is used to implement many of the other scenes - for example, "repeatedly slide the content from left to right and back again" is implemented by -\l{multimedia/video/qmlvideo/qml/qmlvideo/SceneMove.qml}{SceneMove}, on which -\l{multimedia/video/qmlvideo/qml/qmlvideo/VideoMove.qml}{VideoMove} and -\l{multimedia/video/qmlvideo/qml/qmlvideo/CameraMove.qml}{CameraMove} are based. +\l{video/qmlvideo/qml/qmlvideo/SceneMove.qml}{SceneMove}, on which +\l{video/qmlvideo/qml/qmlvideo/VideoMove.qml}{VideoMove} and +\l{video/qmlvideo/qml/qmlvideo/CameraMove.qml}{CameraMove} are based. Depending on the value of the contentType property in the top-level scene instance, the embedded -\l{multimedia/video/qmlvideo/qml/qmlvideo/Content.qml}{Content} item creates either a +\l{video/qmlvideo/qml/qmlvideo/Content.qml}{Content} item creates either a \l{MediaPlayer} or a \l{Camera} item. \section1 Calculating and displaying QML painting rate @@ -134,7 +134,7 @@ instance, the embedded 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 +\quotefromfile video/qmlvideo/main.cpp \skipto QGuiApplication \printuntil ; \dots diff --git a/examples/multimedia/video/doc/src/qmlvideofx.qdoc b/examples/multimedia/video/doc/src/qmlvideofx.qdoc index f4abbc57..b7bd78ac 100644 --- a/examples/multimedia/video/doc/src/qmlvideofx.qdoc +++ b/examples/multimedia/video/doc/src/qmlvideofx.qdoc @@ -134,10 +134,10 @@ types is a bit more complicated, for the following reasons: \endlist The abstraction of source item type is achieved by the -\l{multimedia/video/qmlvideofx/qml/qmlvideofx/Content.qml}{Content}, which uses a +\l{video/qmlvideofx/qml/qmlvideofx/Content.qml}{Content}, which uses a \l{Loader} to create either a \l{MediaPlayer}, \l{Camera} or \l{Image}: -\quotefromfile multimedia/video/qmlvideofx/qml/qmlvideofx/Content.qml +\quotefromfile video/qmlvideofx/qml/qmlvideofx/Content.qml \skipto import \printuntil { \dots @@ -164,10 +164,10 @@ The abstraction of source item type is achieved by the \printuntil } Each effect is implemented as a QML item which is based on the -\l{multimedia/video/qmlvideofx/qml/qmlvideofx/Effect.qml}{Effect}, which in turn +\l{video/qmlvideofx/qml/qmlvideofx/Effect.qml}{Effect}, which in turn is based on the \l{ShaderEffect}: -\quotefromfile multimedia/video/qmlvideofx/qml/qmlvideofx/Effect.qml +\quotefromfile video/qmlvideofx/qml/qmlvideofx/Effect.qml \skipto import \printuntil /^\}/ @@ -179,20 +179,20 @@ implementation of the pixelation effect. As you can see, the pixelation effect supports one parameter (which controls the pixelation granularity), and states that the divider should be displayed. -\quotefromfile multimedia/video/qmlvideofx/qml/qmlvideofx/EffectPixelate.qml +\quotefromfile video/qmlvideofx/qml/qmlvideofx/EffectPixelate.qml \skipto import \printuntil /^\}/ The main.qml file shows a -\l{multimedia/video/qmlvideofx/qml/qmlvideofx/FileOpen.qml}{FileOpen}, which allows +\l{video/qmlvideofx/qml/qmlvideofx/FileOpen.qml}{FileOpen}, which allows the user to select the input source and an -\l{multimedia/video/qmlvideofx/qml/qmlvideofx/EffectSelectionPanel.qml}{EffectSelectionPanel} +\l{video/qmlvideofx/qml/qmlvideofx/EffectSelectionPanel.qml}{EffectSelectionPanel} item, which lists each of the available shader effects. As described above, a -\l{multimedia/video/qmlvideofx/qml/qmlvideofx/Content.qml}{Content} item is used to load the +\l{video/qmlvideofx/qml/qmlvideofx/Content.qml}{Content} item is used to load the appropriate input and effect type. A -\l{multimedia/video/qmlvideofx/qml/qmlvideofx/Divider.qml}{Divider} item draws the +\l{video/qmlvideofx/qml/qmlvideofx/Divider.qml}{Divider} item draws the vertical dividing line, which can be dragged left / right by the user. Finally, -a \l{multimedia/video/qmlvideofx/qml/qmlvideofx/ParameterPanel.qml}{ParameterPanel} item +a \l{video/qmlvideofx/qml/qmlvideofx/ParameterPanel.qml}{ParameterPanel} item renders the sliders corresponding to each effect parameter. Here is the source selection menu: @@ -208,7 +208,7 @@ And here is the effect selection menu: 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 +\quotefromfile video/qmlvideofx/main.cpp \skipto QGuiApplication \printuntil ; \dots diff --git a/qtmultimedia.pro b/qtmultimedia.pro index 53f6b988..ed4a1bfc 100644 --- a/qtmultimedia.pro +++ b/qtmultimedia.pro @@ -1,3 +1,5 @@ +requires(qtHaveModule(gui)) + load(configure) qtCompileTest(openal) win32 { @@ -9,7 +11,9 @@ win32 { } else:mac { qtCompileTest(avfoundation) } else:android { - !qtCompileTest(android):error("QtMultimedia for Android requires API level 11") + SDK_ROOT = $$(ANDROID_SDK_ROOT) + isEmpty(SDK_ROOT): SDK_ROOT = $$DEFAULT_ANDROID_SDK_ROOT + !exists($$SDK_ROOT/platforms/android-11/android.jar): error("QtMultimedia for Android requires API level 11") } else { qtCompileTest(alsa) qtCompileTest(pulseaudio) diff --git a/src/multimedia/doc/src/examples/video-qml-paint-rate.qdocinc b/src/multimedia/doc/src/examples/video-qml-paint-rate.qdocinc index 860f1427..84098e24 100644 --- a/src/multimedia/doc/src/examples/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 multimedia/video/snippets/frequencymonitor/frequencymonitor.h +\quotefromfile 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 multimedia/video/snippets/frequencymonitor/frequencymonitordeclarative.cpp +\quotefromfile video/snippets/frequencymonitor/frequencymonitordeclarative.cpp \skipto FrequencyMonitor::qmlRegisterType \printuntil } and its data is displayed by defining a QML item called FrequencyItem, like this: -\quotefromfile multimedia/video/snippets/frequencymonitor/qml/frequencymonitor/FrequencyItem.qml +\quotefromfile video/snippets/frequencymonitor/qml/frequencymonitor/FrequencyItem.qml \skipto import FrequencyMonitor \printuntil id: root \dots diff --git a/src/multimedia/doc/src/platform-notes-windows.qdoc b/src/multimedia/doc/src/platform-notes-windows.qdoc new file mode 100644 index 00000000..2f72ea1e --- /dev/null +++ b/src/multimedia/doc/src/platform-notes-windows.qdoc @@ -0,0 +1,57 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the documentation of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:FDL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Free Documentation License Usage +** Alternatively, this file may be used under the terms of the GNU Free +** Documentation License version 1.3 as published by the Free Software +** Foundation and appearing in the file included in the packaging of +** this file. Please review the following information to ensure +** the GNU Free Documentation License version 1.3 requirements +** will be met: http://www.gnu.org/copyleft/fdl.html. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +/*! +\page platform-notes-windows.html +\title Qt Multimedia on Windows +\brief Platform notes for Windows + +This page covers the availability of Qt Multimedia features on Windows. + +\section1 Implementation + +Qt Multimedia features for Windows are implemented in two plugins; one +using the Microsoft DirectShow API, and another using WMF (Windows Media +Foundation) framework. DirectShow API was introduced in Windows 98, and +gradually deprecated from Windows XP onwards. Media Foundation framework +was introduced in Windows Vista as a replacement for DirectShow and other +multimedia APIs. Consequently, WMF plugin in Qt is supported only for +Windows Vista and later versions of the operating system. + +\section1 Limitations + +The WMF plugin in Qt does not currently provide a camera backend. Instead, +limited support for camera features is provided by the DirectShow +plugin. Basic features such as displaying a viewfinder and capturing a +still image are supported, however, majority of camera controls are not +implemented. + +Video recording is currently not supported. Additionally, the DirectShow +plugin does not support any low-level video functionality such as +monitoring video frames being played or recorded using \l QVideoProbe or +related classes. +*/ diff --git a/src/multimedia/doc/src/qtmultimedia-index.qdoc b/src/multimedia/doc/src/qtmultimedia-index.qdoc index 417c0c49..4cd59fd5 100644 --- a/src/multimedia/doc/src/qtmultimedia-index.qdoc +++ b/src/multimedia/doc/src/qtmultimedia-index.qdoc @@ -131,6 +131,7 @@ \section2 Platform Notes \list \li \l{BlackBerry} + \li \l{Qt Multimedia on Windows}{Windows} \endlist \section2 Reference diff --git a/src/multimedia/doc/src/qtmultimedia5.qdoc b/src/multimedia/doc/src/qtmultimedia5.qdoc index bbf9907f..c1267f09 100644 --- a/src/multimedia/doc/src/qtmultimedia5.qdoc +++ b/src/multimedia/doc/src/qtmultimedia5.qdoc @@ -31,9 +31,7 @@ \ingroup qmlmodules \brief Provides QML types for multimedia support. -\section1 Overview - -The QML types for Qt Multimedia support the basic use cases such as: +The QML types for \l{Qt Multimedia} support the basic use cases such as: \list \li audio and video playback, \li access camera and radio functionality, @@ -41,6 +39,11 @@ The QML types for Qt Multimedia support the basic use cases such as: \li and access camera settings. \endlist +The QML types can be imported into your application using the following import +statement in your .qml file: +\code +import QtMultimedia 5.0 +\endcode + \section1 QML types */ - diff --git a/src/multimedia/playback/qmediaplayer.cpp b/src/multimedia/playback/qmediaplayer.cpp index c3eb09eb..eaac8282 100644 --- a/src/multimedia/playback/qmediaplayer.cpp +++ b/src/multimedia/playback/qmediaplayer.cpp @@ -1220,7 +1220,7 @@ QMultimedia::AvailabilityStatus QMediaPlayer::availability() const \property QMediaPlayer::volume \brief the current playback volume. - The playback volume is a linear in effect and the value can range from 0 - + The playback volume is linear in effect and the value can range from 0 - 100, values outside this range will be clamped. */ diff --git a/src/plugins/blackberry/common/windowgrabber.cpp b/src/plugins/blackberry/common/windowgrabber.cpp index db070d8e..144b5a69 100644 --- a/src/plugins/blackberry/common/windowgrabber.cpp +++ b/src/plugins/blackberry/common/windowgrabber.cpp @@ -55,6 +55,8 @@ QT_BEGIN_NAMESPACE WindowGrabber::WindowGrabber(QObject *parent) : QObject(parent), m_screenBuffer(0), + m_screenBufferWidth(-1), + m_screenBufferHeight(-1), m_active(false), m_screenContextInitialized(false), m_screenPixmapInitialized(false), @@ -145,7 +147,8 @@ void WindowGrabber::start() } int size[2] = { 0, 0 }; - result = screen_get_window_property_iv(m_window, SCREEN_PROPERTY_SIZE, size); + + result = screen_get_window_property_iv(m_window, SCREEN_PROPERTY_SOURCE_SIZE, size); if (result != 0) { cleanup(); qWarning() << "WindowGrabber: cannot get window size:" << strerror(errno); @@ -155,7 +158,18 @@ void WindowGrabber::start() m_screenBufferWidth = size[0]; m_screenBufferHeight = size[1]; - result = screen_set_pixmap_property_iv(m_screenPixmap, SCREEN_PROPERTY_BUFFER_SIZE, size); + updateFrameSize(); + + m_timer.start(); + + m_active = true; +} + +void WindowGrabber::updateFrameSize() +{ + int size[2] = { m_screenBufferWidth, m_screenBufferHeight }; + + int result = screen_set_pixmap_property_iv(m_screenPixmap, SCREEN_PROPERTY_BUFFER_SIZE, size); if (result != 0) { cleanup(); qWarning() << "WindowGrabber: cannot set pixmap size:" << strerror(errno); @@ -191,10 +205,6 @@ void WindowGrabber::start() qWarning() << "WindowGrabber: cannot get pixmap buffer stride:" << strerror(errno); return; } - - m_timer.start(); - - m_active = true; } void WindowGrabber::stop() @@ -284,7 +294,31 @@ QByteArray WindowGrabber::windowGroupId() const void WindowGrabber::grab() { - const int result = screen_read_window(m_window, m_screenPixmapBuffer, 0, 0, 0); + int size[2] = { 0, 0 }; + + int result = screen_get_window_property_iv(m_window, SCREEN_PROPERTY_SOURCE_SIZE, size); + if (result != 0) { + cleanup(); + qWarning() << "WindowGrabber: cannot get window size:" << strerror(errno); + return; + } + + if (m_screenBufferWidth != size[0] || m_screenBufferHeight != size[1]) { + // The source viewport size changed, so we have to adapt our buffers + + if (m_screenPixmapBufferInitialized) { + screen_destroy_pixmap_buffer(m_screenPixmap); + m_screenPixmapBufferInitialized = false; + } + + m_screenBufferWidth = size[0]; + m_screenBufferHeight = size[1]; + + updateFrameSize(); + } + + const int rect[] = { 0, 0, m_screenBufferWidth, m_screenBufferHeight }; + result = screen_read_window(m_window, m_screenPixmapBuffer, 1, rect, 0); if (result != 0) return; diff --git a/src/plugins/blackberry/common/windowgrabber.h b/src/plugins/blackberry/common/windowgrabber.h index 547742da..f8e3686a 100644 --- a/src/plugins/blackberry/common/windowgrabber.h +++ b/src/plugins/blackberry/common/windowgrabber.h @@ -79,6 +79,7 @@ private slots: private: void cleanup(); + void updateFrameSize(); QTimer m_timer; diff --git a/src/plugins/blackberry/mediaplayer/bbplayervideorenderercontrol.cpp b/src/plugins/blackberry/mediaplayer/bbplayervideorenderercontrol.cpp index 096ae55e..d9226d91 100644 --- a/src/plugins/blackberry/mediaplayer/bbplayervideorenderercontrol.cpp +++ b/src/plugins/blackberry/mediaplayer/bbplayervideorenderercontrol.cpp @@ -142,8 +142,14 @@ void BbPlayerVideoRendererControl::resume() void BbPlayerVideoRendererControl::frameGrabbed(const QImage &frame) { if (m_surface) { - if (!m_surface->isActive()) + if (!m_surface->isActive()) { m_surface->start(QVideoSurfaceFormat(frame.size(), QVideoFrame::Format_ARGB32)); + } else { + if (m_surface->surfaceFormat().frameSize() != frame.size()) { + m_surface->stop(); + m_surface->start(QVideoSurfaceFormat(frame.size(), QVideoFrame::Format_ARGB32)); + } + } m_surface->present(frame.copy()); }