summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAndrew Knight <andrew.knight@digia.com>2014-12-11 09:48:52 +0200
committerYoann Lopes <yoann.lopes@theqtcompany.com>2014-12-11 16:48:38 +0100
commit791febc1d3bfc1ec39f4379214ec5fb473ddaeb5 (patch)
tree05845504e307a21de0773a66742255e18c7d378b /src
parent2b181d546970d18a48a0f36f5d1a22418b61cd4d (diff)
winrt: Fix camera auto rotation
There is no Windows Runtime API to find the camera sensor rotation, so assume that phones always have a camera mounting of 270 degrees. Tablet and webcams remain mounted at the default (0 degrees). As the frame is not flipped automatically by the system, the scan line direction is set to BottomToTop for front-facing cameras to achieve compatibility with other platforms. Task-number: QTBUG-41066 Change-Id: Icf17ecd4aca9fa9d5b24d94e5b21b63ee6f21f28 Reviewed-by: Oliver Wolff <oliver.wolff@theqtcompany.com> Reviewed-by: Yoann Lopes <yoann.lopes@theqtcompany.com>
Diffstat (limited to 'src')
-rw-r--r--src/plugins/winrt/qwinrtabstractvideorenderercontrol.cpp10
-rw-r--r--src/plugins/winrt/qwinrtabstractvideorenderercontrol.h3
-rw-r--r--src/plugins/winrt/qwinrtcameracontrol.cpp3
-rw-r--r--src/plugins/winrt/qwinrtvideodeviceselectorcontrol.cpp10
4 files changed, 26 insertions, 0 deletions
diff --git a/src/plugins/winrt/qwinrtabstractvideorenderercontrol.cpp b/src/plugins/winrt/qwinrtabstractvideorenderercontrol.cpp
index 175fec1d5..be0436261 100644
--- a/src/plugins/winrt/qwinrtabstractvideorenderercontrol.cpp
+++ b/src/plugins/winrt/qwinrtabstractvideorenderercontrol.cpp
@@ -310,6 +310,16 @@ void QWinRTAbstractVideoRendererControl::setSize(const QSize &size)
d->dirtyState = TextureDirty;
}
+void QWinRTAbstractVideoRendererControl::setScanLineDirection(QVideoSurfaceFormat::Direction scanLineDirection)
+{
+ Q_D(QWinRTAbstractVideoRendererControl);
+
+ if (d->format.scanLineDirection() == scanLineDirection)
+ return;
+
+ d->format.setScanLineDirection(scanLineDirection);
+}
+
void QWinRTAbstractVideoRendererControl::setActive(bool active)
{
Q_D(QWinRTAbstractVideoRendererControl);
diff --git a/src/plugins/winrt/qwinrtabstractvideorenderercontrol.h b/src/plugins/winrt/qwinrtabstractvideorenderercontrol.h
index 86a7b15f9..b06b18a2a 100644
--- a/src/plugins/winrt/qwinrtabstractvideorenderercontrol.h
+++ b/src/plugins/winrt/qwinrtabstractvideorenderercontrol.h
@@ -43,6 +43,7 @@
#define QWINRTABSTRACTVIDEORENDERERCONTROL_H
#include <QtMultimedia/QVideoRendererControl>
+#include <QtMultimedia/QVideoSurfaceFormat>
struct ID3D11Device;
struct ID3D11Texture2D;
@@ -63,6 +64,8 @@ public:
QSize size() const;
void setSize(const QSize &size);
+ void setScanLineDirection(QVideoSurfaceFormat::Direction direction);
+
void setActive(bool active);
virtual bool render(ID3D11Texture2D *texture) = 0;
diff --git a/src/plugins/winrt/qwinrtcameracontrol.cpp b/src/plugins/winrt/qwinrtcameracontrol.cpp
index 619e97315..f4e57b438 100644
--- a/src/plugins/winrt/qwinrtcameracontrol.cpp
+++ b/src/plugins/winrt/qwinrtcameracontrol.cpp
@@ -677,6 +677,9 @@ HRESULT QWinRTCameraControl::initialize()
return E_FAIL;
}
+ if (d->videoDeviceSelector->cameraPosition(deviceName) == QCamera::FrontFace)
+ d->videoRenderer->setScanLineDirection(QVideoSurfaceFormat::BottomToTop);
+
ComPtr<IMediaCaptureInitializationSettings> settings;
hr = RoActivateInstance(HString::MakeReference(RuntimeClass_Windows_Media_Capture_MediaCaptureInitializationSettings).Get(),
&settings);
diff --git a/src/plugins/winrt/qwinrtvideodeviceselectorcontrol.cpp b/src/plugins/winrt/qwinrtvideodeviceselectorcontrol.cpp
index 8058c3dad..969ef6f30 100644
--- a/src/plugins/winrt/qwinrtvideodeviceselectorcontrol.cpp
+++ b/src/plugins/winrt/qwinrtvideodeviceselectorcontrol.cpp
@@ -337,7 +337,17 @@ QCamera::Position QWinRTVideoDeviceSelectorControl::cameraPosition(const QString
int QWinRTVideoDeviceSelectorControl::cameraOrientation(const QString &deviceName)
{
+#ifdef Q_OS_WINPHONE
+ switch (cameraPosition(deviceName)) {
+ case QCamera::FrontFace:
+ case QCamera::BackFace:
+ return 270;
+ default:
+ break;
+ }
+#else
Q_UNUSED(deviceName);
+#endif
return 0;
}