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 ++++ 3 files changed, 59 insertions(+), 1 deletion(-) (limited to 'src/imports') 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; }; -- cgit v1.2.3