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, "MediaPlayer");
qmlRegisterType<QDeclarativeVideoOutput>(uri, 5, 0, "VideoOutput");
qmlRegisterType<QDeclarativeVideoOutput, 1>(uri, 5, 1, "VideoOutput");
qmlRegisterType<QDeclarativeRadio>(uri, 5, 0, "Radio");
qmlRegisterType<QDeclarativeRadioData>(uri, 5, 0, "RadioData");
qmlRegisterType<QDeclarativeCamera>(uri, 5, 0, "Camera");

View File

@@ -43,6 +43,7 @@
#include "qdeclarativevideooutput_render_p.h"
#include "qdeclarativevideooutput_window_p.h"
#include <private/qvideooutputorientationhandler_p.h>
#include <QtMultimedia/qmediaobject.h>
#include <QtMultimedia/qmediaservice.h>
@@ -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

View File

@@ -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<QDeclarativeVideoBackend> m_backend;
};