diff options
author | Timur Pocheptsov <Timur.Pocheptsov@digia.com> | 2015-03-04 16:34:32 +0100 |
---|---|---|
committer | Timur Pocheptsov <Timur.Pocheptsov@digia.com> | 2015-03-10 16:35:59 +0000 |
commit | f839f9e3eb2cd89f2b458349a08f9e5444744f1b (patch) | |
tree | a39c78e2fe3541da7dfd8e2e2197faf1d039769c /src/plugins/avfoundation/camera/avfimageencodercontrol.mm | |
parent | dbcf44247d41fa456329da30ae378a69de19e3cd (diff) |
AVCaptureDeviceFormat - avoid duplicates (OS X/iOS)
Excluding video range (iOS) is not the right way to avoid "duplicates" - with
other devices there can be also duplicates (formats with the same resolutions),
but completely different pixel formats. Since we do not know what they will be in advance,
we take the media subtype from the initial preset for a capture device and use it
as a filter. Update viewfinder and image encoder settings controls.
Change-Id: If20aea24b19b43574d5c3e9bf2ba85f50fc08916
Reviewed-by: Yoann Lopes <yoann.lopes@theqtcompany.com>
Diffstat (limited to 'src/plugins/avfoundation/camera/avfimageencodercontrol.mm')
-rw-r--r-- | src/plugins/avfoundation/camera/avfimageencodercontrol.mm | 32 |
1 files changed, 10 insertions, 22 deletions
diff --git a/src/plugins/avfoundation/camera/avfimageencodercontrol.mm b/src/plugins/avfoundation/camera/avfimageencodercontrol.mm index ea25665eb..36050c3a2 100644 --- a/src/plugins/avfoundation/camera/avfimageencodercontrol.mm +++ b/src/plugins/avfoundation/camera/avfimageencodercontrol.mm @@ -48,20 +48,6 @@ QT_BEGIN_NAMESPACE -QSize qt_image_high_resolution(AVCaptureDeviceFormat *format) -{ - Q_ASSERT(format); - QSize res; -#if defined(Q_OS_IOS) && QT_IOS_PLATFORM_SDK_EQUAL_OR_ABOVE(__IPHONE_8_0) - if (QSysInfo::MacintoshVersion >= QSysInfo::MV_IOS_8_0) { - const CMVideoDimensions hrDim(format.highResolutionStillImageDimensions); - res.setWidth(hrDim.width); - res.setHeight(hrDim.height); - } -#endif - return res; -} - AVFImageEncoderControl::AVFImageEncoderControl(AVFCameraService *service) : m_service(service) { @@ -94,9 +80,11 @@ QList<QSize> AVFImageEncoderControl::supportedResolutions(const QImageEncoderSet #if QT_MAC_PLATFORM_SDK_EQUAL_OR_ABOVE(__MAC_10_7, __IPHONE_7_0) if (QSysInfo::MacintoshVersion >= qt_OS_limit(QSysInfo::MV_10_7, QSysInfo::MV_IOS_7_0)) { AVCaptureDevice *captureDevice = m_service->session()->videoCaptureDevice(); - for (AVCaptureDeviceFormat *format in captureDevice.formats) { - if (qt_is_video_range_subtype(format)) - continue; + const QVector<AVCaptureDeviceFormat *> formats(qt_unique_device_formats(captureDevice, + m_service->session()->defaultCodec())); + + for (int i = 0; i < formats.size(); ++i) { + AVCaptureDeviceFormat *format = formats[i]; const QSize res(qt_device_format_resolution(format)); if (!res.isNull() && res.isValid()) @@ -108,7 +96,7 @@ QList<QSize> AVFImageEncoderControl::supportedResolutions(const QImageEncoderSet // its source AVCaptureDevice instance’s activeFormat.formatDescription. However, // if you set this property to YES, the receiver emits still images at the capture // device’s highResolutionStillImageDimensions value. - const QSize hrRes(qt_image_high_resolution(format)); + const QSize hrRes(qt_device_format_high_resolution(format)); if (!hrRes.isNull() && hrRes.isValid()) resolutions << res; } @@ -152,7 +140,7 @@ QImageEncoderSettings AVFImageEncoderControl::imageSettings() const AVCaptureStillImageOutput *stillImageOutput = m_service->imageCaptureControl()->stillImageOutput(); if (stillImageOutput.highResolutionStillImageOutputEnabled) - res = qt_image_high_resolution(captureDevice.activeFormat); + res = qt_device_format_high_resolution(captureDevice.activeFormat); } #endif if (res.isNull() || !res.isValid()) { @@ -179,7 +167,6 @@ void AVFImageEncoderControl::setImageSettings(const QImageEncoderSettings &setti return; m_settings = settings; - applySettings(); } @@ -223,7 +210,8 @@ void AVFImageEncoderControl::applySettings() #if QT_MAC_PLATFORM_SDK_EQUAL_OR_ABOVE(__MAC_10_7, __IPHONE_7_0) if (QSysInfo::MacintoshVersion >= qt_OS_limit(QSysInfo::MV_10_7, QSysInfo::MV_IOS_7_0)) { AVCaptureDevice *captureDevice = m_service->session()->videoCaptureDevice(); - AVCaptureDeviceFormat *match = qt_find_best_resolution_match(captureDevice, res); + AVCaptureDeviceFormat *match = qt_find_best_resolution_match(captureDevice, res, + m_service->session()->defaultCodec()); if (!match) { qDebugCamera() << Q_FUNC_INFO << "unsupported resolution:" << res; @@ -242,7 +230,7 @@ void AVFImageEncoderControl::applySettings() #if defined(Q_OS_IOS) && QT_IOS_PLATFORM_SDK_EQUAL_OR_ABOVE(__IPHONE_8_0) if (QSysInfo::MacintoshVersion >= QSysInfo::MV_IOS_8_0) { AVCaptureStillImageOutput *imageOutput = m_service->imageCaptureControl()->stillImageOutput(); - if (res == qt_image_high_resolution(captureDevice.activeFormat)) + if (res == qt_device_format_high_resolution(captureDevice.activeFormat)) imageOutput.highResolutionStillImageOutputEnabled = YES; else imageOutput.highResolutionStillImageOutputEnabled = NO; |