VideoOutput: fix autoOrientation with a camera source.
authorYoann Lopes <yoann.lopes@digia.com>
Mon, 3 Feb 2014 20:38:56 +0000 (21:38 +0100)
committerThe Qt Project <gerrit-noreply@qt-project.org>
Fri, 28 Feb 2014 13:10:14 +0000 (14:10 +0100)
Don't assume the camera frames are always in the same orientation as the
display in its primary orientation. We now take into account the camera
sensor position and orientation to calculate the viewport orientation.

Change-Id: Ib333c87f1804d1010ada42cb757e4fab78d75a04
Reviewed-by: Christian Stromme <christian.stromme@digia.com>
src/multimedia/qtmultimediaquicktools_headers/qdeclarativevideooutput_p.h
src/multimedia/video/qvideooutputorientationhandler.cpp
src/qtmultimediaquicktools/qdeclarativevideooutput.cpp

index 2ca7c29..cc939b2 100644 (file)
@@ -47,6 +47,7 @@
 #include <QtCore/qsharedpointer.h>
 #include <QtQuick/qquickitem.h>
 #include <QtCore/qpointer.h>
+#include <QtMultimedia/qcamerainfo.h>
 
 #include <private/qtmultimediaquickdefs_p.h>
 
@@ -138,6 +139,7 @@ private:
     QPointer<QObject> m_source;
     QPointer<QMediaObject> m_mediaObject;
     QPointer<QMediaService> m_service;
+    QCameraInfo m_cameraInfo;
 
     FillMode m_fillMode;
     QSize m_nativeSize;
index 4c966c0..06fcb0c 100644 (file)
@@ -73,7 +73,7 @@ void QVideoOutputOrientationHandler::screenOrientationChanged(Qt::ScreenOrientat
     const QScreen *screen = QGuiApplication::primaryScreen();
     const QPlatformScreen *platformScreen = screen->handle();
 
-    const int angle = (360 - screen->angleBetween(platformScreen->nativeOrientation(), orientation));
+    const int angle = (360 - screen->angleBetween(platformScreen->nativeOrientation(), orientation)) % 360;
 
     if (angle == m_currentOrientation)
         return;
index a04b38c..5d2c57d 100644 (file)
@@ -273,12 +273,22 @@ void QDeclarativeVideoOutput::_q_updateMediaObject()
 
     m_mediaObject.clear();
     m_service.clear();
+    m_cameraInfo = QCameraInfo();
 
     if (mediaObject) {
         if (QMediaService *service = mediaObject->service()) {
             if (createBackend(service)) {
                 m_service = service;
                 m_mediaObject = mediaObject;
+                const QCamera *camera = qobject_cast<const QCamera *>(mediaObject);
+                if (camera) {
+                    m_cameraInfo = QCameraInfo(*camera);
+
+                    // The camera position and orientation need to be taken into account for
+                    // the viewport auto orientation
+                    if (m_autoOrientation)
+                        _q_screenOrientationChanged(m_screenOrientationHandler->currentOrientation());
+                }
             }
         }
     }
@@ -375,7 +385,21 @@ void QDeclarativeVideoOutput::_q_updateGeometry()
 
 void QDeclarativeVideoOutput::_q_screenOrientationChanged(int orientation)
 {
-    setOrientation(orientation);
+    // If the source is a camera, take into account its sensor position and orientation
+    if (!m_cameraInfo.isNull()) {
+        switch (m_cameraInfo.position()) {
+        case QCamera::FrontFace:
+            // Front facing cameras are flipped horizontally, compensate the mirror
+            orientation += (360 - m_cameraInfo.orientation());
+            break;
+        case QCamera::BackFace:
+        default:
+            orientation += m_cameraInfo.orientation();
+            break;
+        }
+    }
+
+    setOrientation(orientation % 360);
 }
 
 /*!