Merge remote-tracking branch 'origin/stable' into dev

Change-Id: Iaadfcd68fec91611b6341860e41a70b9023719de
This commit is contained in:
Frederik Gladhorn
2013-06-20 16:29:21 +02:00
13 changed files with 155 additions and 59 deletions

View File

@@ -1,4 +0,0 @@
CONFIG += java
API_VERSION = android-11
JAVASOURCES += main.java

View File

@@ -1,6 +0,0 @@
import android.graphics.SurfaceTexture;
class BuildTest
{
public static void main(String [] args) { }
}

View File

@@ -52,15 +52,15 @@ which moves across the \l{VideoOutput} item.
\section1 Application structure \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: the following items:
\list \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 of which displays a filename, and can be used to launch a
\l{multimedia/video/qmlvideo/qml/qmlvideo/FileBrowser.qml}{FileBrowser} \l{video/qmlvideo/qml/qmlvideo/FileBrowser.qml}{FileBrowser}
\li An exit \l{multimedia/video/qmlvideo/qml/qmlvideo/Button.qml}{Button} \li An exit \l{video/qmlvideo/qml/qmlvideo/Button.qml}{Button}
\li A \l{multimedia/video/qmlvideo/qml/qmlvideo/SceneSelectionPanel.qml}{SceneSelectionPanel}, \li A \l{video/qmlvideo/qml/qmlvideo/SceneSelectionPanel.qml}{SceneSelectionPanel},
which is a flickable list displaying the available scenes which is a flickable list displaying the available scenes
\li At the lower left, an item which displays the QML repainting rate - the \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 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 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} example the video-basic scene (which just displays a static \l{VideoOutput}
in the center of the screen) is implemented in the 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 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 \skipto import
\printuntil /^\}/ \printuntil /^\}/
... is-a ... 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 \skipto import
\printuntil contentType \printuntil contentType
\dots \dots
@@ -94,9 +94,9 @@ can see from the code, this makes use of a type of inheritance: a
\printuntil /^\}/ \printuntil /^\}/
... which is-a ... 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 \skipto import
\printuntil root \printuntil root
\dots \dots
@@ -106,25 +106,25 @@ can see from the code, this makes use of a type of inheritance: a
\skipto Button \skipto Button
\printuntil /^\}/ \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 structure and behaviour of the scene, but is agnostic of the type of content
which will be displayed - this is abstracted by 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 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 display a static piece of content), and then instantiate that use case for
both video content both video content
(\l{multimedia/video/qmlvideo/qml/qmlvideo/VideoBasic.qml}{VideoBasic}) and cameracontent (\l{video/qmlvideo/qml/qmlvideo/VideoBasic.qml}{VideoBasic}) and camera content
(\l{multimedia/video/qmlvideo/qml/qmlvideo/CameraBasic.qml}{CameraBasic}). This approach (\l{video/qmlvideo/qml/qmlvideo/CameraBasic.qml}{CameraBasic}). This approach
is used to implement many of the other scenes - for example, "repeatedly slide 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 the content from left to right and back again" is implemented by
\l{multimedia/video/qmlvideo/qml/qmlvideo/SceneMove.qml}{SceneMove}, on which \l{video/qmlvideo/qml/qmlvideo/SceneMove.qml}{SceneMove}, on which
\l{multimedia/video/qmlvideo/qml/qmlvideo/VideoMove.qml}{VideoMove} and \l{video/qmlvideo/qml/qmlvideo/VideoMove.qml}{VideoMove} and
\l{multimedia/video/qmlvideo/qml/qmlvideo/CameraMove.qml}{CameraMove} are based. \l{video/qmlvideo/qml/qmlvideo/CameraMove.qml}{CameraMove} are based.
Depending on the value of the contentType property in the top-level scene Depending on the value of the contentType property in the top-level scene
instance, the embedded 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. \l{MediaPlayer} or a \l{Camera} item.
\section1 Calculating and displaying QML painting rate \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 All that remains is to connect the afterRendering() signal of the QQuickView
object to a JavaScript function, which will eventually call frequencyItem.notify(): object to a JavaScript function, which will eventually call frequencyItem.notify():
\quotefromfile multimedia/video/qmlvideo/main.cpp \quotefromfile video/qmlvideo/main.cpp
\skipto QGuiApplication \skipto QGuiApplication
\printuntil ; \printuntil ;
\dots \dots

View File

@@ -134,10 +134,10 @@ types is a bit more complicated, for the following reasons:
\endlist \endlist
The abstraction of source item type is achieved by the 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}: \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 \skipto import
\printuntil { \printuntil {
\dots \dots
@@ -164,10 +164,10 @@ The abstraction of source item type is achieved by the
\printuntil } \printuntil }
Each effect is implemented as a QML item which is based on the 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}: is based on the \l{ShaderEffect}:
\quotefromfile multimedia/video/qmlvideofx/qml/qmlvideofx/Effect.qml \quotefromfile video/qmlvideofx/qml/qmlvideofx/Effect.qml
\skipto import \skipto import
\printuntil /^\}/ \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 supports one parameter (which controls the pixelation granularity), and states
that the divider should be displayed. that the divider should be displayed.
\quotefromfile multimedia/video/qmlvideofx/qml/qmlvideofx/EffectPixelate.qml \quotefromfile video/qmlvideofx/qml/qmlvideofx/EffectPixelate.qml
\skipto import \skipto import
\printuntil /^\}/ \printuntil /^\}/
The main.qml file shows a 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 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 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 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, 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. renders the sliders corresponding to each effect parameter.
Here is the source selection menu: 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 All that remains is to connect the afterRendering() signal of the QQuickView
object to a JavaScript function, which will eventually call frequencyItem.notify(): object to a JavaScript function, which will eventually call frequencyItem.notify():
\quotefromfile multimedia/video/qmlvideofx/main.cpp \quotefromfile video/qmlvideofx/main.cpp
\skipto QGuiApplication \skipto QGuiApplication
\printuntil ; \printuntil ;
\dots \dots

View File

@@ -1,3 +1,5 @@
requires(qtHaveModule(gui))
load(configure) load(configure)
qtCompileTest(openal) qtCompileTest(openal)
win32 { win32 {
@@ -9,7 +11,9 @@ win32 {
} else:mac { } else:mac {
qtCompileTest(avfoundation) qtCompileTest(avfoundation)
} else:android { } 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 { } else {
qtCompileTest(alsa) qtCompileTest(alsa)
qtCompileTest(pulseaudio) qtCompileTest(pulseaudio)

View File

@@ -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 turns a stream of events (received via the notify() slot), into an
instantaneous and an averaged frequency: instantaneous and an averaged frequency:
\quotefromfile multimedia/video/snippets/frequencymonitor/frequencymonitor.h \quotefromfile video/snippets/frequencymonitor/frequencymonitor.h
\skipto class FrequencyMonitor : public QObject \skipto class FrequencyMonitor : public QObject
\printuntil Q_OBJECT \printuntil Q_OBJECT
\skipto Q_PROPERTY(qreal instantaneousFrequency \skipto Q_PROPERTY(qreal instantaneousFrequency
@@ -19,13 +19,13 @@ instantaneous and an averaged frequency:
The FrequencyMonitor class is exposed to QML like this 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 \skipto FrequencyMonitor::qmlRegisterType
\printuntil } \printuntil }
and its data is displayed by defining a QML item called FrequencyItem, like this: 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 \skipto import FrequencyMonitor
\printuntil id: root \printuntil id: root
\dots \dots

View File

@@ -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.
*/

View File

@@ -131,6 +131,7 @@
\section2 Platform Notes \section2 Platform Notes
\list \list
\li \l{BlackBerry} \li \l{BlackBerry}
\li \l{Qt Multimedia on Windows}{Windows}
\endlist \endlist
\section2 Reference \section2 Reference

View File

@@ -31,9 +31,7 @@
\ingroup qmlmodules \ingroup qmlmodules
\brief Provides QML types for multimedia support. \brief Provides QML types for multimedia support.
\section1 Overview The QML types for \l{Qt Multimedia} support the basic use cases such as:
The QML types for Qt Multimedia support the basic use cases such as:
\list \list
\li audio and video playback, \li audio and video playback,
\li access camera and radio functionality, \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. \li and access camera settings.
\endlist \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 \section1 QML types
*/ */

View File

@@ -1220,7 +1220,7 @@ QMultimedia::AvailabilityStatus QMediaPlayer::availability() const
\property QMediaPlayer::volume \property QMediaPlayer::volume
\brief the current playback 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. 100, values outside this range will be clamped.
*/ */

View File

@@ -55,6 +55,8 @@ QT_BEGIN_NAMESPACE
WindowGrabber::WindowGrabber(QObject *parent) WindowGrabber::WindowGrabber(QObject *parent)
: QObject(parent), : QObject(parent),
m_screenBuffer(0), m_screenBuffer(0),
m_screenBufferWidth(-1),
m_screenBufferHeight(-1),
m_active(false), m_active(false),
m_screenContextInitialized(false), m_screenContextInitialized(false),
m_screenPixmapInitialized(false), m_screenPixmapInitialized(false),
@@ -145,7 +147,8 @@ void WindowGrabber::start()
} }
int size[2] = { 0, 0 }; 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) { if (result != 0) {
cleanup(); cleanup();
qWarning() << "WindowGrabber: cannot get window size:" << strerror(errno); qWarning() << "WindowGrabber: cannot get window size:" << strerror(errno);
@@ -155,7 +158,18 @@ void WindowGrabber::start()
m_screenBufferWidth = size[0]; m_screenBufferWidth = size[0];
m_screenBufferHeight = size[1]; 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) { if (result != 0) {
cleanup(); cleanup();
qWarning() << "WindowGrabber: cannot set pixmap size:" << strerror(errno); qWarning() << "WindowGrabber: cannot set pixmap size:" << strerror(errno);
@@ -191,10 +205,6 @@ void WindowGrabber::start()
qWarning() << "WindowGrabber: cannot get pixmap buffer stride:" << strerror(errno); qWarning() << "WindowGrabber: cannot get pixmap buffer stride:" << strerror(errno);
return; return;
} }
m_timer.start();
m_active = true;
} }
void WindowGrabber::stop() void WindowGrabber::stop()
@@ -284,7 +294,31 @@ QByteArray WindowGrabber::windowGroupId() const
void WindowGrabber::grab() 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) if (result != 0)
return; return;

View File

@@ -79,6 +79,7 @@ private slots:
private: private:
void cleanup(); void cleanup();
void updateFrameSize();
QTimer m_timer; QTimer m_timer;

View File

@@ -142,8 +142,14 @@ void BbPlayerVideoRendererControl::resume()
void BbPlayerVideoRendererControl::frameGrabbed(const QImage &frame) void BbPlayerVideoRendererControl::frameGrabbed(const QImage &frame)
{ {
if (m_surface) { if (m_surface) {
if (!m_surface->isActive()) if (!m_surface->isActive()) {
m_surface->start(QVideoSurfaceFormat(frame.size(), QVideoFrame::Format_ARGB32)); 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()); m_surface->present(frame.copy());
} }