diff options
author | Peng Wu <peng.wu@intopalo.com> | 2015-06-12 13:02:38 +0300 |
---|---|---|
committer | PengWu <peng.wu@intopalo.com> | 2015-06-23 13:16:13 +0000 |
commit | dc9e10d4b7acd9e752a7b094c7178a7ecbe96ff7 (patch) | |
tree | 1cd40393f9665daa33ffb967980fd962c5d44886 /src/plugins/winrt/qwinrtcameracontrol.cpp | |
parent | 3cb698c0fcd05334163ac86f1a5a599dae67025b (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.cpp | 40 |
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) |