summaryrefslogtreecommitdiffstats
path: root/src/plugins/winrt/qwinrtcameracontrol.cpp
diff options
context:
space:
mode:
authorPeng Wu <peng.wu@intopalo.com>2015-06-12 13:02:38 +0300
committerPengWu <peng.wu@intopalo.com>2015-06-23 13:16:13 +0000
commitdc9e10d4b7acd9e752a7b094c7178a7ecbe96ff7 (patch)
tree1cd40393f9665daa33ffb967980fd962c5d44886 /src/plugins/winrt/qwinrtcameracontrol.cpp
parent3cb698c0fcd05334163ac86f1a5a599dae67025b (diff)
winrt: Implement QImageEncoderControl for camera
Implement QImageEncoderControl for camera still image capture. It provides the functions to set camera capture resolution and get supported resolutions list. Task-number: QTBUG-46456 Change-Id: Ideb1aa02d420be3a30d588bebf31714fa4fa6415 Reviewed-by: Oliver Wolff <oliver.wolff@theqtcompany.com>
Diffstat (limited to 'src/plugins/winrt/qwinrtcameracontrol.cpp')
-rw-r--r--src/plugins/winrt/qwinrtcameracontrol.cpp40
1 files changed, 30 insertions, 10 deletions
diff --git a/src/plugins/winrt/qwinrtcameracontrol.cpp b/src/plugins/winrt/qwinrtcameracontrol.cpp
index e4a577642..f5b75d9ab 100644
--- a/src/plugins/winrt/qwinrtcameracontrol.cpp
+++ b/src/plugins/winrt/qwinrtcameracontrol.cpp
@@ -38,6 +38,7 @@
#include "qwinrtcameravideorenderercontrol.h"
#include "qwinrtvideodeviceselectorcontrol.h"
#include "qwinrtcameraimagecapturecontrol.h"
+#include "qwinrtimageencodercontrol.h"
#include <QtCore/qfunctions_winrt.h>
#include <QtCore/QCoreApplication>
@@ -75,6 +76,10 @@ QT_USE_NAMESPACE
RETURN_VOID_IF_FAILED(msg); \
}
+inline uint qHash (const QSize &key) {
+ return key.width() * key.height();
+}
+
class CriticalSectionLocker
{
public:
@@ -453,6 +458,7 @@ public:
QPointer<QWinRTCameraVideoRendererControl> videoRenderer;
QPointer<QWinRTVideoDeviceSelectorControl> videoDeviceSelector;
QPointer<QWinRTCameraImageCaptureControl> imageCaptureControl;
+ QPointer<QWinRTImageEncoderControl> imageEncoderControl;
};
QWinRTCameraControl::QWinRTCameraControl(QObject *parent)
@@ -470,6 +476,7 @@ QWinRTCameraControl::QWinRTCameraControl(QObject *parent)
this, &QWinRTCameraControl::onBufferRequested);
d->videoDeviceSelector = new QWinRTVideoDeviceSelectorControl(this);
d->imageCaptureControl = new QWinRTCameraImageCaptureControl(this);
+ d->imageEncoderControl = new QWinRTImageEncoderControl(this);
}
QWinRTCameraControl::~QWinRTCameraControl()
@@ -654,16 +661,16 @@ QCameraImageCaptureControl *QWinRTCameraControl::imageCaptureControl() const
return d->imageCaptureControl;
}
-IMediaCapture *QWinRTCameraControl::handle() const
+QImageEncoderControl *QWinRTCameraControl::imageEncoderControl() const
{
Q_D(const QWinRTCameraControl);
- return d->capture.Get();
+ return d->imageEncoderControl;
}
-QSize QWinRTCameraControl::imageSize() const
+IMediaCapture *QWinRTCameraControl::handle() const
{
Q_D(const QWinRTCameraControl);
- return d->size;
+ return d->capture.Get();
}
void QWinRTCameraControl::onBufferRequested()
@@ -763,10 +770,11 @@ HRESULT QWinRTCameraControl::initialize()
Q_ASSERT_SUCCEEDED(hr);
d->size = QSize();
- ComPtr<IVideoEncodingProperties> videoEncodingProperties;
quint32 encodingPropertiesListSize;
hr = encodingPropertiesList->get_Size(&encodingPropertiesListSize);
Q_ASSERT_SUCCEEDED(hr);
+ QHash<QSize, ComPtr<IVideoEncodingProperties>> videoEncodingPropertiesList;
+ int pixelCount = 0;
for (quint32 i = 0; i < encodingPropertiesListSize; ++i) {
ComPtr<IMediaEncodingProperties> properties;
hr = encodingPropertiesList->GetAt(i, &properties);
@@ -779,21 +787,33 @@ HRESULT QWinRTCameraControl::initialize()
Q_ASSERT_SUCCEEDED(hr);
hr = videoProperties->get_Height(&height);
Q_ASSERT_SUCCEEDED(hr);
- // Choose the highest-quality format
- if (int(width * height) > d->size.width() * d->size.height()) {
- d->size = QSize(width, height);
- videoEncodingProperties = videoProperties;
+ if (d->captureMode != QCamera::CaptureStillImage && int(width * height) > pixelCount) {
+ d->size = QSize(width, height);// Choose the Highest-quality format
+ pixelCount = d->size.width() * d->size.height();
}
+ videoEncodingPropertiesList.insert(QSize(width, height), videoProperties);
}
- if (!videoEncodingProperties || d->size.isEmpty()) {
+ if (videoEncodingPropertiesList.isEmpty()) {
hr = MF_E_INVALID_FORMAT;
RETURN_HR_IF_FAILED("Failed to find a suitable video format");
}
+ if (d->captureMode == QCamera::CaptureStillImage) {
+ d->imageEncoderControl->setSupportedResolutionsList(videoEncodingPropertiesList.keys());
+ d->size = d->imageEncoderControl->imageSettings().resolution();
+ }
+
hr = RoActivateInstance(HString::MakeReference(RuntimeClass_Windows_Media_MediaProperties_MediaEncodingProfile).Get(),
&d->encodingProfile);
Q_ASSERT_SUCCEEDED(hr);
+
+ const ComPtr<IVideoEncodingProperties> videoEncodingProperties = videoEncodingPropertiesList[d->size];
+ if (!videoEncodingProperties) {
+ hr = MF_E_INVALID_FORMAT;
+ RETURN_HR_IF_FAILED("Failed to find a suitable video format properties");
+ }
+
hr = d->encodingProfile->put_Video(videoEncodingProperties.Get());
Q_ASSERT_SUCCEEDED(hr);
if (d->videoRenderer)