Merge remote-tracking branch 'origin/stable' into dev
Change-Id: Iaadfcd68fec91611b6341860e41a70b9023719de
This commit is contained in:
@@ -1,4 +0,0 @@
|
|||||||
CONFIG += java
|
|
||||||
API_VERSION = android-11
|
|
||||||
JAVASOURCES += main.java
|
|
||||||
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
import android.graphics.SurfaceTexture;
|
|
||||||
|
|
||||||
class BuildTest
|
|
||||||
{
|
|
||||||
public static void main(String [] args) { }
|
|
||||||
}
|
|
||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
57
src/multimedia/doc/src/platform-notes-windows.qdoc
Normal file
57
src/multimedia/doc/src/platform-notes-windows.qdoc
Normal 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.
|
||||||
|
*/
|
||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|||||||
@@ -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.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -79,6 +79,7 @@ private slots:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
void cleanup();
|
void cleanup();
|
||||||
|
void updateFrameSize();
|
||||||
|
|
||||||
QTimer m_timer;
|
QTimer m_timer;
|
||||||
|
|
||||||
|
|||||||
@@ -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());
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user