diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/imports/multimedia/multimedia.cpp | 1 | ||||
-rw-r--r-- | src/imports/multimedia/qdeclarativevideooutput.cpp | 50 | ||||
-rw-r--r-- | src/imports/multimedia/qdeclarativevideooutput_p.h | 9 | ||||
-rw-r--r-- | src/multimedia/audio/qaudiodeviceinfo_alsa_p.cpp | 226 | ||||
-rw-r--r-- | src/multimedia/audio/qaudiooutput_alsa_p.cpp | 2 | ||||
-rw-r--r-- | src/multimedia/audio/qsamplecache_p.cpp | 2 | ||||
-rw-r--r-- | src/multimedia/doc/qtmultimedia.qdocconf | 4 | ||||
-rw-r--r-- | src/multimedia/multimedia.pro | 2 | ||||
-rw-r--r-- | src/multimedia/video/qvideooutputorientationhandler.cpp | 85 | ||||
-rw-r--r-- | src/multimedia/video/qvideooutputorientationhandler_p.h | 72 | ||||
-rw-r--r-- | src/multimedia/video/video.pri | 2 | ||||
-rw-r--r-- | src/multimediawidgets/doc/qtmultimediawidgets.qdocconf | 3 |
12 files changed, 302 insertions, 156 deletions
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<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"); diff --git a/src/imports/multimedia/qdeclarativevideooutput.cpp b/src/imports/multimedia/qdeclarativevideooutput.cpp index 653d45b6d..53c810403 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 <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 @@ -411,6 +420,45 @@ void QDeclarativeVideoOutput::setOrientation(int orientation) } /*! + \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 This property holds the item coordinates of the area that 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<QDeclarativeVideoBackend> m_backend; }; diff --git a/src/multimedia/audio/qaudiodeviceinfo_alsa_p.cpp b/src/multimedia/audio/qaudiodeviceinfo_alsa_p.cpp index 9b9c3fb25..d2a4eea3a 100644 --- a/src/multimedia/audio/qaudiodeviceinfo_alsa_p.cpp +++ b/src/multimedia/audio/qaudiodeviceinfo_alsa_p.cpp @@ -197,23 +197,22 @@ bool QAudioDeviceInfoInternal::testSettings(const QAudioFormat& format) const { // Set nearest to closest settings that do work. // See if what is in settings will work (return value). - int err = 0; - snd_pcm_t* handle; + int err = -1; + snd_pcm_t* pcmHandle; snd_pcm_hw_params_t *params; - QString dev = device; - - QList<QByteArray> devices = QAudioDeviceInfoInternal::availableDevices(QAudio::AudioOutput); + QString dev; - if(dev.compare(QLatin1String("default")) == 0) { #if(SND_LIB_MAJOR == 1 && SND_LIB_MINOR == 0 && SND_LIB_SUBMINOR >= 14) - dev = QLatin1String(devices.first().constData()); + dev = device; + if (dev.compare(QLatin1String("default")) == 0) { + QList<QByteArray> devices = availableDevices(QAudio::AudioOutput); + if (!devices.isEmpty()) + dev = QLatin1String(devices.first().constData()); + } #else + if (dev.compare(QLatin1String("default")) == 0) { dev = QLatin1String("hw:0,0"); -#endif } else { -#if(SND_LIB_MAJOR == 1 && SND_LIB_MINOR == 0 && SND_LIB_SUBMINOR >= 14) - dev = device; -#else int idx = 0; char *name; @@ -225,156 +224,81 @@ bool QAudioDeviceInfoInternal::testSettings(const QAudioFormat& format) const idx++; } dev = QString(QLatin1String("hw:%1,0")).arg(idx); -#endif - } - if(mode == QAudio::AudioOutput) { - err=snd_pcm_open( &handle,dev.toLocal8Bit().constData(),SND_PCM_STREAM_PLAYBACK,0); - } else { - err=snd_pcm_open( &handle,dev.toLocal8Bit().constData(),SND_PCM_STREAM_CAPTURE,0); - } - if(err < 0) { - handle = 0; - return false; } +#endif - bool testChannel = false; - bool testCodec = false; - bool testSampleRate = false; - bool testType = false; - bool testSize = false; + snd_pcm_stream_t stream = mode == QAudio::AudioOutput + ? SND_PCM_STREAM_PLAYBACK : SND_PCM_STREAM_CAPTURE; - int dir = 0; + if (snd_pcm_open(&pcmHandle, dev.toLocal8Bit().constData(), stream, 0) < 0) + return false; - snd_pcm_nonblock( handle, 0 ); - snd_pcm_hw_params_alloca( ¶ms ); - snd_pcm_hw_params_any( handle, params ); + snd_pcm_nonblock(pcmHandle, 0); + snd_pcm_hw_params_alloca(¶ms); + snd_pcm_hw_params_any(pcmHandle, params); // set the values! - snd_pcm_hw_params_set_channels(handle,params,format.channelCount()); - snd_pcm_hw_params_set_rate(handle,params,format.sampleRate(),dir); - - err = -1; - - switch(format.sampleSize()) { - case 8: - if(format.sampleType() == QAudioFormat::SignedInt) - err = snd_pcm_hw_params_set_format(handle,params,SND_PCM_FORMAT_S8); - else if(format.sampleType() == QAudioFormat::UnSignedInt) - err = snd_pcm_hw_params_set_format(handle,params,SND_PCM_FORMAT_U8); - break; - case 16: - if(format.sampleType() == QAudioFormat::SignedInt) { - if(format.byteOrder() == QAudioFormat::LittleEndian) - err = snd_pcm_hw_params_set_format(handle,params,SND_PCM_FORMAT_S16_LE); - else if(format.byteOrder() == QAudioFormat::BigEndian) - err = snd_pcm_hw_params_set_format(handle,params,SND_PCM_FORMAT_S16_BE); - } else if(format.sampleType() == QAudioFormat::UnSignedInt) { - if(format.byteOrder() == QAudioFormat::LittleEndian) - err = snd_pcm_hw_params_set_format(handle,params,SND_PCM_FORMAT_U16_LE); - else if(format.byteOrder() == QAudioFormat::BigEndian) - err = snd_pcm_hw_params_set_format(handle,params,SND_PCM_FORMAT_U16_BE); - } - break; - case 32: - if(format.sampleType() == QAudioFormat::SignedInt) { - if(format.byteOrder() == QAudioFormat::LittleEndian) - err = snd_pcm_hw_params_set_format(handle,params,SND_PCM_FORMAT_S32_LE); - else if(format.byteOrder() == QAudioFormat::BigEndian) - err = snd_pcm_hw_params_set_format(handle,params,SND_PCM_FORMAT_S32_BE); - } else if(format.sampleType() == QAudioFormat::UnSignedInt) { - if(format.byteOrder() == QAudioFormat::LittleEndian) - err = snd_pcm_hw_params_set_format(handle,params,SND_PCM_FORMAT_U32_LE); - else if(format.byteOrder() == QAudioFormat::BigEndian) - err = snd_pcm_hw_params_set_format(handle,params,SND_PCM_FORMAT_U32_BE); - } else if (format.sampleType() == QAudioFormat::Float) { - if (format.byteOrder() == QAudioFormat::LittleEndian) - err = snd_pcm_hw_params_set_format(handle,params,SND_PCM_FORMAT_FLOAT_LE); - else if (format.byteOrder() == QAudioFormat::BigEndian) - err = snd_pcm_hw_params_set_format(handle,params,SND_PCM_FORMAT_FLOAT_BE); - } + snd_pcm_hw_params_set_channels(pcmHandle, params, format.channelCount()); + snd_pcm_hw_params_set_rate(pcmHandle, params, format.sampleRate(), 0); + + snd_pcm_format_t pcmFormat = SND_PCM_FORMAT_UNKNOWN; + switch (format.sampleSize()) { + case 8: + if (format.sampleType() == QAudioFormat::SignedInt) + pcmFormat = SND_PCM_FORMAT_S8; + else if (format.sampleType() == QAudioFormat::UnSignedInt) + pcmFormat = SND_PCM_FORMAT_U8; + break; + case 16: + if (format.sampleType() == QAudioFormat::SignedInt) { + pcmFormat = format.byteOrder() == QAudioFormat::LittleEndian + ? SND_PCM_FORMAT_S16_LE : SND_PCM_FORMAT_S16_BE; + } else if (format.sampleType() == QAudioFormat::UnSignedInt) { + pcmFormat = format.byteOrder() == QAudioFormat::LittleEndian + ? SND_PCM_FORMAT_U16_LE : SND_PCM_FORMAT_U16_BE; + } + break; + case 32: + if (format.sampleType() == QAudioFormat::SignedInt) { + pcmFormat = format.byteOrder() == QAudioFormat::LittleEndian + ? SND_PCM_FORMAT_S32_LE : SND_PCM_FORMAT_S32_BE; + } else if (format.sampleType() == QAudioFormat::UnSignedInt) { + pcmFormat = format.byteOrder() == QAudioFormat::LittleEndian + ? SND_PCM_FORMAT_U32_LE : SND_PCM_FORMAT_U32_BE; + } else if (format.sampleType() == QAudioFormat::Float) { + pcmFormat = format.byteOrder() == QAudioFormat::LittleEndian + ? SND_PCM_FORMAT_FLOAT_LE : SND_PCM_FORMAT_FLOAT_BE; + } } + if (pcmFormat != SND_PCM_FORMAT_UNKNOWN) + err = snd_pcm_hw_params_set_format(pcmHandle, params, pcmFormat); + // For now, just accept only audio/pcm codec - if(!format.codec().startsWith(QLatin1String("audio/pcm"))) { - err=-1; - } else - testCodec = true; - - if (err>=0 && format.channelCount() != -1) { - err = snd_pcm_hw_params_test_channels(handle,params,format.channelCount()); - if(err>=0) - err = snd_pcm_hw_params_set_channels(handle,params,format.channelCount()); - if(err>=0) - testChannel = true; - } + if (!format.codec().startsWith(QLatin1String("audio/pcm"))) + err = -1; - if (err>=0 && format.sampleRate() != -1) { - err = snd_pcm_hw_params_test_rate(handle,params,format.sampleRate(),0); - if(err>=0) - err = snd_pcm_hw_params_set_rate(handle,params,format.sampleRate(),dir); - if(err>=0) - testSampleRate = true; + if (err >= 0 && format.channelCount() != -1) { + err = snd_pcm_hw_params_test_channels(pcmHandle, params, format.channelCount()); + if (err >= 0) + err = snd_pcm_hw_params_set_channels(pcmHandle, params, format.channelCount()); } - if((err>=0 && format.sampleSize() != -1) && - (format.sampleType() != QAudioFormat::Unknown)) { - switch(format.sampleSize()) { - case 8: - if(format.sampleType() == QAudioFormat::SignedInt) - err = snd_pcm_hw_params_set_format(handle,params,SND_PCM_FORMAT_S8); - else if(format.sampleType() == QAudioFormat::UnSignedInt) - err = snd_pcm_hw_params_set_format(handle,params,SND_PCM_FORMAT_U8); - break; - case 16: - if(format.sampleType() == QAudioFormat::SignedInt) { - if(format.byteOrder() == QAudioFormat::LittleEndian) - err = snd_pcm_hw_params_set_format(handle,params,SND_PCM_FORMAT_S16_LE); - else if(format.byteOrder() == QAudioFormat::BigEndian) - err = snd_pcm_hw_params_set_format(handle,params,SND_PCM_FORMAT_S16_BE); - } else if(format.sampleType() == QAudioFormat::UnSignedInt) { - if(format.byteOrder() == QAudioFormat::LittleEndian) - err = snd_pcm_hw_params_set_format(handle,params,SND_PCM_FORMAT_U16_LE); - else if(format.byteOrder() == QAudioFormat::BigEndian) - err = snd_pcm_hw_params_set_format(handle,params,SND_PCM_FORMAT_U16_BE); - } - break; - case 32: - if(format.sampleType() == QAudioFormat::SignedInt) { - if(format.byteOrder() == QAudioFormat::LittleEndian) - err = snd_pcm_hw_params_set_format(handle,params,SND_PCM_FORMAT_S32_LE); - else if(format.byteOrder() == QAudioFormat::BigEndian) - err = snd_pcm_hw_params_set_format(handle,params,SND_PCM_FORMAT_S32_BE); - } else if(format.sampleType() == QAudioFormat::UnSignedInt) { - if(format.byteOrder() == QAudioFormat::LittleEndian) - err = snd_pcm_hw_params_set_format(handle,params,SND_PCM_FORMAT_U32_LE); - else if(format.byteOrder() == QAudioFormat::BigEndian) - err = snd_pcm_hw_params_set_format(handle,params,SND_PCM_FORMAT_U32_BE); - } else if (format.sampleType() == QAudioFormat::Float) { - if (format.byteOrder() == QAudioFormat::LittleEndian) - err = snd_pcm_hw_params_set_format(handle,params,SND_PCM_FORMAT_FLOAT_LE); - else if (format.byteOrder() == QAudioFormat::BigEndian) - err = snd_pcm_hw_params_set_format(handle,params,SND_PCM_FORMAT_FLOAT_BE); - } - } - if(err>=0) { - testSize = true; - testType = true; - } - } - if(err>=0) - err = snd_pcm_hw_params(handle, params); - - if(err == 0) { - // settings work - // close() - if(handle) - snd_pcm_close(handle); - return true; + if (err >= 0 && format.sampleRate() != -1) { + err = snd_pcm_hw_params_test_rate(pcmHandle, params, format.sampleRate(), 0); + if (err >= 0) + err = snd_pcm_hw_params_set_rate(pcmHandle, params, format.sampleRate(), 0); } - if(handle) - snd_pcm_close(handle); - return false; + if (err >= 0 && pcmFormat != SND_PCM_FORMAT_UNKNOWN) + err = snd_pcm_hw_params_set_format(pcmHandle, params, pcmFormat); + + if (err >= 0) + err = snd_pcm_hw_params(pcmHandle, params); + + snd_pcm_close(pcmHandle); + + return (err == 0); } void QAudioDeviceInfoInternal::updateLists() @@ -451,12 +375,10 @@ QList<QByteArray> QAudioDeviceInfoInternal::availableDevices(QAudio::Mode mode) devices.append(deviceName.toLocal8Bit().constData()); } - free(name); - if (descr != NULL) - free(descr); - if (io != NULL) - free(io); + free(descr); + free(io); } + free(name); ++n; } snd_device_name_free_hint(hints); diff --git a/src/multimedia/audio/qaudiooutput_alsa_p.cpp b/src/multimedia/audio/qaudiooutput_alsa_p.cpp index 1384dfdc5..3a779f322 100644 --- a/src/multimedia/audio/qaudiooutput_alsa_p.cpp +++ b/src/multimedia/audio/qaudiooutput_alsa_p.cpp @@ -125,7 +125,7 @@ void QAudioOutputPrivate::async_callback(snd_async_handler_t *ahandler) audioOut = static_cast<QAudioOutputPrivate*> (snd_async_handler_get_callback_private(ahandler)); - if((audioOut->deviceState==QAudio::ActiveState)||(audioOut->resuming)) + if (audioOut && (audioOut->deviceState == QAudio::ActiveState || audioOut->resuming)) audioOut->feedback(); } diff --git a/src/multimedia/audio/qsamplecache_p.cpp b/src/multimedia/audio/qsamplecache_p.cpp index 03ed5710a..39e924f08 100644 --- a/src/multimedia/audio/qsamplecache_p.cpp +++ b/src/multimedia/audio/qsamplecache_p.cpp @@ -129,7 +129,7 @@ QSampleCache::~QSampleCache() foreach (QSample* sample, m_staleSamples) delete sample; // deleting a sample does affect the m_staleSamples list, but foreach copies it - delete m_networkAccessManager; + m_networkAccessManager->deleteLater(); } void QSampleCache::loadingRelease() diff --git a/src/multimedia/doc/qtmultimedia.qdocconf b/src/multimedia/doc/qtmultimedia.qdocconf index b78c91989..5f82a330b 100644 --- a/src/multimedia/doc/qtmultimedia.qdocconf +++ b/src/multimedia/doc/qtmultimedia.qdocconf @@ -44,3 +44,7 @@ sourcedirs += ../.. excludedirs += ../../multimediawidgets depends += qtcore qtdoc qtquick qtqml qtmultimediawidgets + +navigation.landingpage = "Qt Multimedia" +navigation.cppclassespage = "Qt Multimedia C++ Classes" +navigation.qmltypespage = "Qt Multimedia QML Types" diff --git a/src/multimedia/multimedia.pro b/src/multimedia/multimedia.pro index 96b9e79ec..265728552 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 <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 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 <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 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 diff --git a/src/multimediawidgets/doc/qtmultimediawidgets.qdocconf b/src/multimediawidgets/doc/qtmultimediawidgets.qdocconf index e44a73d77..5648041ad 100644 --- a/src/multimediawidgets/doc/qtmultimediawidgets.qdocconf +++ b/src/multimediawidgets/doc/qtmultimediawidgets.qdocconf @@ -40,3 +40,6 @@ sourcedirs += ../ excludedirs += depends += qtcore qtdoc qtquick qtqml qtmultimedia qtwidgets qtgui + +navigation.landingpage = "Qt Multimedia Widgets" +navigation.cppclassespage = "Qt Multimedia Widgets C++ Classes" |