VideoOutput: fix autoOrientation with a camera source.
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>
This commit is contained in:
committed by
The Qt Project
parent
b28ee24628
commit
f783c48a17
@@ -47,6 +47,7 @@
|
|||||||
#include <QtCore/qsharedpointer.h>
|
#include <QtCore/qsharedpointer.h>
|
||||||
#include <QtQuick/qquickitem.h>
|
#include <QtQuick/qquickitem.h>
|
||||||
#include <QtCore/qpointer.h>
|
#include <QtCore/qpointer.h>
|
||||||
|
#include <QtMultimedia/qcamerainfo.h>
|
||||||
|
|
||||||
#include <private/qtmultimediaquickdefs_p.h>
|
#include <private/qtmultimediaquickdefs_p.h>
|
||||||
|
|
||||||
@@ -138,6 +139,7 @@ private:
|
|||||||
QPointer<QObject> m_source;
|
QPointer<QObject> m_source;
|
||||||
QPointer<QMediaObject> m_mediaObject;
|
QPointer<QMediaObject> m_mediaObject;
|
||||||
QPointer<QMediaService> m_service;
|
QPointer<QMediaService> m_service;
|
||||||
|
QCameraInfo m_cameraInfo;
|
||||||
|
|
||||||
FillMode m_fillMode;
|
FillMode m_fillMode;
|
||||||
QSize m_nativeSize;
|
QSize m_nativeSize;
|
||||||
|
|||||||
@@ -73,7 +73,7 @@ void QVideoOutputOrientationHandler::screenOrientationChanged(Qt::ScreenOrientat
|
|||||||
const QScreen *screen = QGuiApplication::primaryScreen();
|
const QScreen *screen = QGuiApplication::primaryScreen();
|
||||||
const QPlatformScreen *platformScreen = screen->handle();
|
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)
|
if (angle == m_currentOrientation)
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -273,12 +273,22 @@ void QDeclarativeVideoOutput::_q_updateMediaObject()
|
|||||||
|
|
||||||
m_mediaObject.clear();
|
m_mediaObject.clear();
|
||||||
m_service.clear();
|
m_service.clear();
|
||||||
|
m_cameraInfo = QCameraInfo();
|
||||||
|
|
||||||
if (mediaObject) {
|
if (mediaObject) {
|
||||||
if (QMediaService *service = mediaObject->service()) {
|
if (QMediaService *service = mediaObject->service()) {
|
||||||
if (createBackend(service)) {
|
if (createBackend(service)) {
|
||||||
m_service = service;
|
m_service = service;
|
||||||
m_mediaObject = mediaObject;
|
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)
|
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
|||||||
Reference in New Issue
Block a user