diff options
-rw-r--r-- | .qmake.conf | 2 | ||||
-rw-r--r-- | examples/multimedia/video/doc/src/qmlvideo.qdoc | 42 | ||||
-rw-r--r-- | examples/multimedia/video/doc/src/qmlvideofx.qdoc | 22 | ||||
-rw-r--r-- | qtmultimedia.pro | 2 | ||||
-rw-r--r-- | src/multimedia/audio/qaudiodeviceinfo_win32_p.cpp | 22 | ||||
-rw-r--r-- | src/multimedia/doc/src/examples/video-qml-paint-rate.qdocinc | 6 | ||||
-rw-r--r-- | src/plugins/blackberry/common/windowgrabber.cpp | 48 | ||||
-rw-r--r-- | src/plugins/blackberry/common/windowgrabber.h | 1 | ||||
-rw-r--r-- | src/plugins/blackberry/mediaplayer/bbplayervideorenderercontrol.cpp | 8 |
9 files changed, 99 insertions, 54 deletions
diff --git a/.qmake.conf b/.qmake.conf index 6aa780ca2..a7e09bffc 100644 --- a/.qmake.conf +++ b/.qmake.conf @@ -1,4 +1,4 @@ load(qt_build_config) CONFIG += qt_example_installs -MODULE_VERSION = 5.1.0 +MODULE_VERSION = 5.1.1 diff --git a/examples/multimedia/video/doc/src/qmlvideo.qdoc b/examples/multimedia/video/doc/src/qmlvideo.qdoc index 1efed8005..6d6833497 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 f4abbc571..b7bd78ac7 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 672cbc942..ed4a1bfc9 100644 --- a/qtmultimedia.pro +++ b/qtmultimedia.pro @@ -1,3 +1,5 @@ +requires(qtHaveModule(gui)) + load(configure) qtCompileTest(openal) win32 { diff --git a/src/multimedia/audio/qaudiodeviceinfo_win32_p.cpp b/src/multimedia/audio/qaudiodeviceinfo_win32_p.cpp index f3af7e0d2..e9503d4c3 100644 --- a/src/multimedia/audio/qaudiodeviceinfo_win32_p.cpp +++ b/src/multimedia/audio/qaudiodeviceinfo_win32_p.cpp @@ -469,20 +469,22 @@ QList<QByteArray> QAudioDeviceInfoInternal::availableDevices(QAudio::Mode mode) QByteArray QAudioDeviceInfoInternal::defaultOutputDevice() { - QList<QByteArray> list = availableDevices(QAudio::AudioOutput); - if (list.size() > 0) - return list.at(0); - else - return QByteArray(); + QByteArray defaultDevice; + QDataStream ds(&defaultDevice, QIODevice::WriteOnly); + ds << quint32(WAVE_MAPPER) // device ID for default device + << QStringLiteral("Default Output Device"); + + return defaultDevice; } QByteArray QAudioDeviceInfoInternal::defaultInputDevice() { - QList<QByteArray> list = availableDevices(QAudio::AudioInput); - if (list.size() > 0) - return list.at(0); - else - return QByteArray(); + QByteArray defaultDevice; + QDataStream ds(&defaultDevice, QIODevice::WriteOnly); + ds << quint32(WAVE_MAPPER) // device ID for default device + << QStringLiteral("Default Input Device"); + + return defaultDevice; } QT_END_NAMESPACE 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 860f14270..84098e241 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/plugins/blackberry/common/windowgrabber.cpp b/src/plugins/blackberry/common/windowgrabber.cpp index db070d8e5..144b5a693 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 547742da1..f8e3686a2 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 096ae55ec..d9226d91f 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()); } |