From 18dbfc2538cb88164894cbc413740c3831f93e1d Mon Sep 17 00:00:00 2001 From: Tobias Koenig Date: Tue, 26 Feb 2013 12:00:43 +0100 Subject: 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 Reviewed-by: Andy Nichols --- src/imports/multimedia/multimedia.cpp | 1 + src/imports/multimedia/qdeclarativevideooutput.cpp | 50 ++++++++++++- src/imports/multimedia/qdeclarativevideooutput_p.h | 9 +++ src/multimedia/multimedia.pro | 2 +- .../video/qvideooutputorientationhandler.cpp | 85 ++++++++++++++++++++++ .../video/qvideooutputorientationhandler_p.h | 72 ++++++++++++++++++ src/multimedia/video/video.pri | 2 + 7 files changed, 219 insertions(+), 2 deletions(-) create mode 100644 src/multimedia/video/qvideooutputorientationhandler.cpp create mode 100644 src/multimedia/video/qvideooutputorientationhandler_p.h diff --git a/src/imports/multimedia/multimedia.cpp b/src/imports/multimedia/multimedia.cpp index 92c9b257d..d2bc829db 100644 --- a/src/imports/multimedia/multimedia.cpp +++ b/src/imports/multimedia/multimedia.cpp @@ -76,6 +76,7 @@ public: qmlRegisterType(uri, 5, 0, "Audio"); qmlRegisterType(uri, 5, 0, "MediaPlayer"); qmlRegisterType(uri, 5, 0, "VideoOutput"); + qmlRegisterType(uri, 5, 1, "VideoOutput"); qmlRegisterType(uri, 5, 0, "Radio"); qmlRegisterType(uri, 5, 0, "RadioData"); qmlRegisterType(uri, 5, 0, "Camera"); diff --git a/src/imports/multimedia/qdeclarativevideooutput.cpp b/src/imports/multimedia/qdeclarativevideooutput.cpp index 1b4b9cd5b..fc17a20fa 100644 --- a/src/imports/multimedia/qdeclarativevideooutput.cpp +++ b/src/imports/multimedia/qdeclarativevideooutput.cpp @@ -43,6 +43,7 @@ #include "qdeclarativevideooutput_render_p.h" #include "qdeclarativevideooutput_window_p.h" +#include #include #include @@ -127,7 +128,9 @@ QDeclarativeVideoOutput::QDeclarativeVideoOutput(QQuickItem *parent) : m_sourceType(NoSource), m_fillMode(PreserveAspectFit), m_geometryDirty(true), - m_orientation(0) + m_orientation(0), + m_autoOrientation(false), + m_screenOrientationHandler(0) { setFlag(ItemHasContents, true); } @@ -349,6 +352,12 @@ void QDeclarativeVideoOutput::_q_updateGeometry() if (m_contentRect != oldContentRect) emit contentRectChanged(); } + +void QDeclarativeVideoOutput::_q_screenOrientationChanged(int orientation) +{ + setOrientation(orientation); +} + /*! \qmlproperty int QtMultimedia5::VideoOutput::orientation @@ -410,6 +419,45 @@ void QDeclarativeVideoOutput::setOrientation(int orientation) 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 diff --git a/src/imports/multimedia/qdeclarativevideooutput_p.h b/src/imports/multimedia/qdeclarativevideooutput_p.h index 51ceff9eb..1de1fccbc 100644 --- a/src/imports/multimedia/qdeclarativevideooutput_p.h +++ b/src/imports/multimedia/qdeclarativevideooutput_p.h @@ -53,6 +53,7 @@ QT_BEGIN_NAMESPACE class QMediaObject; class QMediaService; class QDeclarativeVideoBackend; +class QVideoOutputOrientationHandler; class QDeclarativeVideoOutput : public QQuickItem { @@ -61,6 +62,7 @@ class QDeclarativeVideoOutput : public QQuickItem Q_PROPERTY(QObject* source READ source WRITE setSource NOTIFY sourceChanged) Q_PROPERTY(FillMode fillMode READ fillMode WRITE setFillMode NOTIFY fillModeChanged) 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 contentRect READ contentRect NOTIFY contentRectChanged) Q_ENUMS(FillMode) @@ -85,6 +87,9 @@ public: int orientation() const; void setOrientation(int); + bool autoOrientation() const; + void setAutoOrientation(bool); + QRectF sourceRect() const; QRectF contentRect() const; @@ -108,6 +113,7 @@ Q_SIGNALS: void sourceChanged(); void fillModeChanged(QDeclarativeVideoOutput::FillMode); void orientationChanged(); + void autoOrientationChanged(); void sourceRectChanged(); void contentRectChanged(); @@ -120,6 +126,7 @@ private Q_SLOTS: void _q_updateMediaObject(); void _q_updateNativeSize(); void _q_updateGeometry(); + void _q_screenOrientationChanged(int); private: bool createBackend(QMediaService *service); @@ -137,6 +144,8 @@ private: QRectF m_lastRect; // Cache of last rect to avoid recalculating geometry QRectF m_contentRect; // Destination pixel coordinates, unclipped int m_orientation; + bool m_autoOrientation; + QVideoOutputOrientationHandler *m_screenOrientationHandler; QScopedPointer m_backend; }; diff --git a/src/multimedia/multimedia.pro b/src/multimedia/multimedia.pro index 2a1c6afb5..61dfb3d08 100644 --- a/src/multimedia/multimedia.pro +++ b/src/multimedia/multimedia.pro @@ -1,5 +1,5 @@ TARGET = QtMultimedia -QT = core-private network gui +QT = core-private network gui-private QMAKE_DOCS = $$PWD/doc/qtmultimedia.qdocconf diff --git a/src/multimedia/video/qvideooutputorientationhandler.cpp b/src/multimedia/video/qvideooutputorientationhandler.cpp new file mode 100644 index 000000000..4c966c02d --- /dev/null +++ b/src/multimedia/video/qvideooutputorientationhandler.cpp @@ -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 +#include +#include + +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 diff --git a/src/multimedia/video/qvideooutputorientationhandler_p.h b/src/multimedia/video/qvideooutputorientationhandler_p.h new file mode 100644 index 000000000..08a45c646 --- /dev/null +++ b/src/multimedia/video/qvideooutputorientationhandler_p.h @@ -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 + +#include + +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 diff --git a/src/multimedia/video/video.pri b/src/multimedia/video/video.pri index 1eaed32c1..161163783 100644 --- a/src/multimedia/video/video.pri +++ b/src/multimedia/video/video.pri @@ -12,6 +12,7 @@ PRIVATE_HEADERS += \ video/qabstractvideobuffer_p.h \ video/qimagevideobuffer_p.h \ video/qmemoryvideobuffer_p.h \ + video/qvideooutputorientationhandler_p.h \ video/qvideosurfaceoutput_p.h SOURCES += \ @@ -20,6 +21,7 @@ SOURCES += \ video/qimagevideobuffer.cpp \ video/qmemoryvideobuffer.cpp \ video/qvideoframe.cpp \ + video/qvideooutputorientationhandler.cpp \ video/qvideosurfaceformat.cpp \ video/qvideosurfaceoutput.cpp \ video/qvideoprobe.cpp -- cgit v1.2.3