Add autoOrientation property to QDeclarativeVideoOutput

The autoOrientation property is a flag to switch on/off
automatic rotation of the video output, depending on the
current screen orientation, to always show the output
upright. This is useful when the VideoOutput is used as
viewfinder for a Camera.

Change-Id: I72753888592dc59c9adaa3343bfec8b168343229
Reviewed-by: Thomas McGuire <thomas.mcguire@kdab.com>
Reviewed-by: Andy Nichols <andy.nichols@digia.com>
This commit is contained in:
Tobias Koenig
2013-02-26 12:00:43 +01:00
committed by The Qt Project
parent 954bb7b960
commit 18dbfc2538
7 changed files with 219 additions and 2 deletions

View File

@@ -76,6 +76,7 @@ public:
qmlRegisterType<QDeclarativeAudio>(uri, 5, 0, "Audio"); qmlRegisterType<QDeclarativeAudio>(uri, 5, 0, "Audio");
qmlRegisterType<QDeclarativeAudio>(uri, 5, 0, "MediaPlayer"); qmlRegisterType<QDeclarativeAudio>(uri, 5, 0, "MediaPlayer");
qmlRegisterType<QDeclarativeVideoOutput>(uri, 5, 0, "VideoOutput"); qmlRegisterType<QDeclarativeVideoOutput>(uri, 5, 0, "VideoOutput");
qmlRegisterType<QDeclarativeVideoOutput, 1>(uri, 5, 1, "VideoOutput");
qmlRegisterType<QDeclarativeRadio>(uri, 5, 0, "Radio"); qmlRegisterType<QDeclarativeRadio>(uri, 5, 0, "Radio");
qmlRegisterType<QDeclarativeRadioData>(uri, 5, 0, "RadioData"); qmlRegisterType<QDeclarativeRadioData>(uri, 5, 0, "RadioData");
qmlRegisterType<QDeclarativeCamera>(uri, 5, 0, "Camera"); qmlRegisterType<QDeclarativeCamera>(uri, 5, 0, "Camera");

View File

@@ -43,6 +43,7 @@
#include "qdeclarativevideooutput_render_p.h" #include "qdeclarativevideooutput_render_p.h"
#include "qdeclarativevideooutput_window_p.h" #include "qdeclarativevideooutput_window_p.h"
#include <private/qvideooutputorientationhandler_p.h>
#include <QtMultimedia/qmediaobject.h> #include <QtMultimedia/qmediaobject.h>
#include <QtMultimedia/qmediaservice.h> #include <QtMultimedia/qmediaservice.h>
@@ -127,7 +128,9 @@ QDeclarativeVideoOutput::QDeclarativeVideoOutput(QQuickItem *parent) :
m_sourceType(NoSource), m_sourceType(NoSource),
m_fillMode(PreserveAspectFit), m_fillMode(PreserveAspectFit),
m_geometryDirty(true), m_geometryDirty(true),
m_orientation(0) m_orientation(0),
m_autoOrientation(false),
m_screenOrientationHandler(0)
{ {
setFlag(ItemHasContents, true); setFlag(ItemHasContents, true);
} }
@@ -349,6 +352,12 @@ void QDeclarativeVideoOutput::_q_updateGeometry()
if (m_contentRect != oldContentRect) if (m_contentRect != oldContentRect)
emit contentRectChanged(); emit contentRectChanged();
} }
void QDeclarativeVideoOutput::_q_screenOrientationChanged(int orientation)
{
setOrientation(orientation);
}
/*! /*!
\qmlproperty int QtMultimedia5::VideoOutput::orientation \qmlproperty int QtMultimedia5::VideoOutput::orientation
@@ -410,6 +419,45 @@ void QDeclarativeVideoOutput::setOrientation(int orientation)
emit orientationChanged(); emit orientationChanged();
} }
/*!
\qmlproperty int QtMultimedia5::VideoOutput::autoOrientation
This property allows you to enable and disable auto orientation
of the video stream, so that its orientation always matches
the orientation of the screen. If \c autoOrientation is enabled,
the \c orientation property is overwritten.
By default \c autoOrientation is disabled.
\since QtMultimedia 5.1
*/
bool QDeclarativeVideoOutput::autoOrientation() const
{
return m_autoOrientation;
}
void QDeclarativeVideoOutput::setAutoOrientation(bool autoOrientation)
{
if (autoOrientation == m_autoOrientation)
return;
m_autoOrientation = autoOrientation;
if (m_autoOrientation) {
m_screenOrientationHandler = new QVideoOutputOrientationHandler(this);
connect(m_screenOrientationHandler, SIGNAL(orientationChanged(int)),
this, SLOT(_q_screenOrientationChanged(int)));
_q_screenOrientationChanged(m_screenOrientationHandler->currentOrientation());
} else {
disconnect(m_screenOrientationHandler, SIGNAL(orientationChanged(int)),
this, SLOT(_q_screenOrientationChanged(int)));
m_screenOrientationHandler->deleteLater();
m_screenOrientationHandler = 0;
}
emit autoOrientationChanged();
}
/*! /*!
\qmlproperty rectangle QtMultimedia5::VideoOutput::contentRect \qmlproperty rectangle QtMultimedia5::VideoOutput::contentRect

View File

@@ -53,6 +53,7 @@ QT_BEGIN_NAMESPACE
class QMediaObject; class QMediaObject;
class QMediaService; class QMediaService;
class QDeclarativeVideoBackend; class QDeclarativeVideoBackend;
class QVideoOutputOrientationHandler;
class QDeclarativeVideoOutput : public QQuickItem class QDeclarativeVideoOutput : public QQuickItem
{ {
@@ -61,6 +62,7 @@ class QDeclarativeVideoOutput : public QQuickItem
Q_PROPERTY(QObject* source READ source WRITE setSource NOTIFY sourceChanged) Q_PROPERTY(QObject* source READ source WRITE setSource NOTIFY sourceChanged)
Q_PROPERTY(FillMode fillMode READ fillMode WRITE setFillMode NOTIFY fillModeChanged) Q_PROPERTY(FillMode fillMode READ fillMode WRITE setFillMode NOTIFY fillModeChanged)
Q_PROPERTY(int orientation READ orientation WRITE setOrientation NOTIFY orientationChanged) Q_PROPERTY(int orientation READ orientation WRITE setOrientation NOTIFY orientationChanged)
Q_PROPERTY(bool autoOrientation READ autoOrientation WRITE setAutoOrientation NOTIFY autoOrientationChanged REVISION 1)
Q_PROPERTY(QRectF sourceRect READ sourceRect NOTIFY sourceRectChanged) Q_PROPERTY(QRectF sourceRect READ sourceRect NOTIFY sourceRectChanged)
Q_PROPERTY(QRectF contentRect READ contentRect NOTIFY contentRectChanged) Q_PROPERTY(QRectF contentRect READ contentRect NOTIFY contentRectChanged)
Q_ENUMS(FillMode) Q_ENUMS(FillMode)
@@ -85,6 +87,9 @@ public:
int orientation() const; int orientation() const;
void setOrientation(int); void setOrientation(int);
bool autoOrientation() const;
void setAutoOrientation(bool);
QRectF sourceRect() const; QRectF sourceRect() const;
QRectF contentRect() const; QRectF contentRect() const;
@@ -108,6 +113,7 @@ Q_SIGNALS:
void sourceChanged(); void sourceChanged();
void fillModeChanged(QDeclarativeVideoOutput::FillMode); void fillModeChanged(QDeclarativeVideoOutput::FillMode);
void orientationChanged(); void orientationChanged();
void autoOrientationChanged();
void sourceRectChanged(); void sourceRectChanged();
void contentRectChanged(); void contentRectChanged();
@@ -120,6 +126,7 @@ private Q_SLOTS:
void _q_updateMediaObject(); void _q_updateMediaObject();
void _q_updateNativeSize(); void _q_updateNativeSize();
void _q_updateGeometry(); void _q_updateGeometry();
void _q_screenOrientationChanged(int);
private: private:
bool createBackend(QMediaService *service); bool createBackend(QMediaService *service);
@@ -137,6 +144,8 @@ private:
QRectF m_lastRect; // Cache of last rect to avoid recalculating geometry QRectF m_lastRect; // Cache of last rect to avoid recalculating geometry
QRectF m_contentRect; // Destination pixel coordinates, unclipped QRectF m_contentRect; // Destination pixel coordinates, unclipped
int m_orientation; int m_orientation;
bool m_autoOrientation;
QVideoOutputOrientationHandler *m_screenOrientationHandler;
QScopedPointer<QDeclarativeVideoBackend> m_backend; QScopedPointer<QDeclarativeVideoBackend> m_backend;
}; };

View File

@@ -1,5 +1,5 @@
TARGET = QtMultimedia TARGET = QtMultimedia
QT = core-private network gui QT = core-private network gui-private
QMAKE_DOCS = $$PWD/doc/qtmultimedia.qdocconf QMAKE_DOCS = $$PWD/doc/qtmultimedia.qdocconf

View File

@@ -0,0 +1,85 @@
/****************************************************************************
**
** Copyright (C) 2013 Research In Motion
** Contact: http://www.qt-project.org/legal
**
** This file is part of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** 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 Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 2.1 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPL included in the
** packaging of this file. Please review the following information to
** ensure the GNU Lesser General Public License version 2.1 requirements
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Digia gives you certain additional
** rights. These rights are described in the Digia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3.0 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file. Please review the following information to
** ensure the GNU General Public License version 3.0 requirements will be
** met: http://www.gnu.org/copyleft/gpl.html.
**
**
** $QT_END_LICENSE$
**
****************************************************************************/
#include "qvideooutputorientationhandler_p.h"
#include <QGuiApplication>
#include <QScreen>
#include <qpa/qplatformscreen.h>
QT_BEGIN_NAMESPACE
QVideoOutputOrientationHandler::QVideoOutputOrientationHandler(QObject *parent)
: QObject(parent)
, m_currentOrientation(0)
{
QScreen *screen = QGuiApplication::primaryScreen();
// we want to be informed about all orientation changes
screen->setOrientationUpdateMask(Qt::PortraitOrientation|Qt::LandscapeOrientation
|Qt::InvertedPortraitOrientation|Qt::InvertedLandscapeOrientation);
connect(screen, SIGNAL(orientationChanged(Qt::ScreenOrientation)),
this, SLOT(screenOrientationChanged(Qt::ScreenOrientation)));
screenOrientationChanged(screen->orientation());
}
int QVideoOutputOrientationHandler::currentOrientation() const
{
return m_currentOrientation;
}
void QVideoOutputOrientationHandler::screenOrientationChanged(Qt::ScreenOrientation orientation)
{
const QScreen *screen = QGuiApplication::primaryScreen();
const QPlatformScreen *platformScreen = screen->handle();
const int angle = (360 - screen->angleBetween(platformScreen->nativeOrientation(), orientation));
if (angle == m_currentOrientation)
return;
m_currentOrientation = angle;
emit orientationChanged(m_currentOrientation);
}
QT_END_NAMESPACE

View File

@@ -0,0 +1,72 @@
/****************************************************************************
**
** Copyright (C) 2013 Research In Motion
** Contact: http://www.qt-project.org/legal
**
** This file is part of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** 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 Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 2.1 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPL included in the
** packaging of this file. Please review the following information to
** ensure the GNU Lesser General Public License version 2.1 requirements
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Digia gives you certain additional
** rights. These rights are described in the Digia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3.0 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file. Please review the following information to
** ensure the GNU General Public License version 3.0 requirements will be
** met: http://www.gnu.org/copyleft/gpl.html.
**
**
** $QT_END_LICENSE$
**
****************************************************************************/
#ifndef QVIDEOOUTPUTORIENTATIONHANDLER_P_H
#define QVIDEOOUTPUTORIENTATIONHANDLER_P_H
#include <qtmultimediadefs.h>
#include <QObject>
QT_BEGIN_NAMESPACE
class Q_MULTIMEDIA_EXPORT QVideoOutputOrientationHandler : public QObject
{
Q_OBJECT
public:
explicit QVideoOutputOrientationHandler(QObject *parent = 0);
int currentOrientation() const;
signals:
void orientationChanged(int angle);
private slots:
void screenOrientationChanged(Qt::ScreenOrientation orientation);
private:
int m_currentOrientation;
};
QT_END_NAMESPACE
#endif

View File

@@ -12,6 +12,7 @@ PRIVATE_HEADERS += \
video/qabstractvideobuffer_p.h \ video/qabstractvideobuffer_p.h \
video/qimagevideobuffer_p.h \ video/qimagevideobuffer_p.h \
video/qmemoryvideobuffer_p.h \ video/qmemoryvideobuffer_p.h \
video/qvideooutputorientationhandler_p.h \
video/qvideosurfaceoutput_p.h video/qvideosurfaceoutput_p.h
SOURCES += \ SOURCES += \
@@ -20,6 +21,7 @@ SOURCES += \
video/qimagevideobuffer.cpp \ video/qimagevideobuffer.cpp \
video/qmemoryvideobuffer.cpp \ video/qmemoryvideobuffer.cpp \
video/qvideoframe.cpp \ video/qvideoframe.cpp \
video/qvideooutputorientationhandler.cpp \
video/qvideosurfaceformat.cpp \ video/qvideosurfaceformat.cpp \
video/qvideosurfaceoutput.cpp \ video/qvideosurfaceoutput.cpp \
video/qvideoprobe.cpp video/qvideoprobe.cpp