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>
This commit is contained in:
Andrew Knight
2014-12-11 09:48:52 +02:00
committed by Yoann Lopes
parent 2b181d5469
commit 791febc1d3
4 changed files with 26 additions and 0 deletions

View File

@@ -310,6 +310,16 @@ void QWinRTAbstractVideoRendererControl::setSize(const QSize &size)
d->dirtyState = TextureDirty; 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) void QWinRTAbstractVideoRendererControl::setActive(bool active)
{ {
Q_D(QWinRTAbstractVideoRendererControl); Q_D(QWinRTAbstractVideoRendererControl);

View File

@@ -43,6 +43,7 @@
#define QWINRTABSTRACTVIDEORENDERERCONTROL_H #define QWINRTABSTRACTVIDEORENDERERCONTROL_H
#include <QtMultimedia/QVideoRendererControl> #include <QtMultimedia/QVideoRendererControl>
#include <QtMultimedia/QVideoSurfaceFormat>
struct ID3D11Device; struct ID3D11Device;
struct ID3D11Texture2D; struct ID3D11Texture2D;
@@ -63,6 +64,8 @@ public:
QSize size() const; QSize size() const;
void setSize(const QSize &size); void setSize(const QSize &size);
void setScanLineDirection(QVideoSurfaceFormat::Direction direction);
void setActive(bool active); void setActive(bool active);
virtual bool render(ID3D11Texture2D *texture) = 0; virtual bool render(ID3D11Texture2D *texture) = 0;

View File

@@ -677,6 +677,9 @@ HRESULT QWinRTCameraControl::initialize()
return E_FAIL; return E_FAIL;
} }
if (d->videoDeviceSelector->cameraPosition(deviceName) == QCamera::FrontFace)
d->videoRenderer->setScanLineDirection(QVideoSurfaceFormat::BottomToTop);
ComPtr<IMediaCaptureInitializationSettings> settings; ComPtr<IMediaCaptureInitializationSettings> settings;
hr = RoActivateInstance(HString::MakeReference(RuntimeClass_Windows_Media_Capture_MediaCaptureInitializationSettings).Get(), hr = RoActivateInstance(HString::MakeReference(RuntimeClass_Windows_Media_Capture_MediaCaptureInitializationSettings).Get(),
&settings); &settings);

View File

@@ -337,7 +337,17 @@ QCamera::Position QWinRTVideoDeviceSelectorControl::cameraPosition(const QString
int QWinRTVideoDeviceSelectorControl::cameraOrientation(const QString &deviceName) 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); Q_UNUSED(deviceName);
#endif
return 0; return 0;
} }