winrt: Fix crash when initializing certain cameras

Some cameras return video properties when querying for
MediaStreamType_Photo, ie. Surface Book. This caused an assert.

Instead when asking for photo resolutions, only query the available
image resolutions and skip results not of type image.

Change-Id: Ia1886a11f47676d6713eec86f3a80c664871a968
Reviewed-by: Oliver Wolff <oliver.wolff@qt.io>
This commit is contained in:
Maurice Kalinowski
2016-05-11 09:34:06 +02:00
parent 6f3e6a78ca
commit c84bdf63e4

View File

@@ -101,15 +101,30 @@ HRESULT getMediaStreamResolutions(IMediaDeviceController *device,
ComPtr<IMediaEncodingProperties> properties; ComPtr<IMediaEncodingProperties> properties;
hr = (*propertiesList)->GetAt(index, &properties); hr = (*propertiesList)->GetAt(index, &properties);
Q_ASSERT_SUCCEEDED(hr); Q_ASSERT_SUCCEEDED(hr);
ComPtr<IVideoEncodingProperties> videoProperties; if (type == MediaStreamType_VideoRecord || type == MediaStreamType_VideoPreview) {
hr = properties.As(&videoProperties); ComPtr<IVideoEncodingProperties> videoProperties;
Q_ASSERT_SUCCEEDED(hr); hr = properties.As(&videoProperties);
UINT32 width, height; Q_ASSERT_SUCCEEDED(hr);
hr = videoProperties->get_Width(&width); UINT32 width, height;
Q_ASSERT_SUCCEEDED(hr); hr = videoProperties->get_Width(&width);
hr = videoProperties->get_Height(&height); Q_ASSERT_SUCCEEDED(hr);
Q_ASSERT_SUCCEEDED(hr); hr = videoProperties->get_Height(&height);
resolutions->append(QSize(width, height)); Q_ASSERT_SUCCEEDED(hr);
resolutions->append(QSize(width, height));
} else if (type == MediaStreamType_Photo) {
ComPtr<IImageEncodingProperties> imageProperties;
hr = properties.As(&imageProperties);
// Asking for Photo also returns video resolutions in addition
// We skip those, as we are only interested in image Type
if (FAILED(hr) || !imageProperties)
continue;
UINT32 width, height;
hr = imageProperties->get_Width(&width);
Q_ASSERT_SUCCEEDED(hr);
hr = imageProperties->get_Height(&height);
Q_ASSERT_SUCCEEDED(hr);
resolutions->append(QSize(width, height));
}
} }
return resolutions->isEmpty() ? MF_E_INVALID_FORMAT : hr; return resolutions->isEmpty() ? MF_E_INVALID_FORMAT : hr;
} }