summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndy Shaw <andy.shaw@digia.com>2014-01-31 08:23:47 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2014-02-03 16:54:28 +0100
commit9a16423610405c0329fe40235313212946f08b05 (patch)
tree61e2691a8cdc7e4d34357efaeac67197214f0e0c
parent8fd3a5a198acaf32243617d46e269991284e8e13 (diff)
Don't mirror the image from the camera unless it has been flipped
The camera itself can have a mode set that causes the image to be flipped so instead of always mirroring the image that is taken from the camera we check for the supported modes first and then check the mode and only mirror if it is set. Otherwise we assume that it does not need horizontally flipping but that it needs vertically flipping which seems to be the standard for cameras on Windows. [ChangeLog][QtMultimedia][Windows] Fixed the incorrect mirroring of the image from the camera Task-number: QTBUG-30365 Change-Id: I166b1f354e8d91c9a6c64f64164d782b52df98d8 Reviewed-by: Yoann Lopes <yoann.lopes@digia.com>
-rw-r--r--src/plugins/directshow/camera/dscamerasession.cpp40
-rw-r--r--src/plugins/directshow/camera/dscamerasession.h2
2 files changed, 39 insertions, 3 deletions
diff --git a/src/plugins/directshow/camera/dscamerasession.cpp b/src/plugins/directshow/camera/dscamerasession.cpp
index cc1594feb..801367f68 100644
--- a/src/plugins/directshow/camera/dscamerasession.cpp
+++ b/src/plugins/directshow/camera/dscamerasession.cpp
@@ -173,6 +173,8 @@ public:
DSCameraSession::DSCameraSession(QObject *parent)
: QObject(parent)
,m_currentImageId(0)
+ , needsHorizontalMirroring(false)
+ , needsVerticalMirroring(true)
{
pBuild = NULL;
pGraph = NULL;
@@ -581,7 +583,7 @@ void DSCameraSession::captureFrame()
mutex.lock();
image = QImage(frames.at(0)->buffer,m_windowSize.width(),m_windowSize.height(),
- QImage::Format_RGB888).rgbSwapped().mirrored(true);
+ QImage::Format_RGB888).rgbSwapped().mirrored(needsHorizontalMirroring, needsVerticalMirroring);
QVideoFrame frame(image);
frame.setStartTime(frames.at(0)->time);
@@ -595,7 +597,7 @@ void DSCameraSession::captureFrame()
mutex.lock();
image = QImage(frames.at(0)->buffer,m_windowSize.width(),m_windowSize.height(),
- QImage::Format_RGB32).mirrored(true);
+ QImage::Format_RGB32).mirrored(needsHorizontalMirroring, needsVerticalMirroring);
QVideoFrame frame(image);
frame.setStartTime(frames.at(0)->time);
@@ -805,7 +807,39 @@ void DSCameraSession::updateProperties()
types.clear();
resolutions.clear();
-
+ IAMVideoControl *pVideoControl = 0;
+ hr = pBuild->FindInterface(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video,pCap,
+ IID_IAMVideoControl, (void**)&pVideoControl);
+ if (FAILED(hr)) {
+ qWarning() << "Failed to get the video control";
+ } else {
+ IPin *pPin = 0;
+ if (pCap) {
+ hr = getPin(pCap, PINDIR_OUTPUT, &pPin);
+ if (FAILED(hr)) {
+ qWarning() << "Failed to get the pin for the video control";
+ } else {
+ long supportedModes;
+ hr = pVideoControl->GetCaps(pPin, &supportedModes);
+ if (FAILED(hr)) {
+ qWarning() << "Failed to get the supported modes of the video control";
+ } else if (supportedModes & VideoControlFlag_FlipHorizontal || supportedModes & VideoControlFlag_FlipVertical) {
+ long mode;
+ hr = pVideoControl->GetMode(pPin, &mode);
+ if (FAILED(hr)) {
+ qWarning() << "Failed to get the mode of the video control";
+ } else {
+ if (supportedModes & VideoControlFlag_FlipHorizontal)
+ needsHorizontalMirroring = (mode & VideoControlFlag_FlipHorizontal);
+ if (supportedModes & VideoControlFlag_FlipVertical)
+ needsVerticalMirroring = (mode & VideoControlFlag_FlipVertical);
+ }
+ }
+ pPin->Release();
+ }
+ }
+ pVideoControl->Release();
+ }
for (int iIndex = 0; iIndex < iCount; iIndex++) {
hr = pConfig->GetStreamCaps(iIndex, &pmt, reinterpret_cast<BYTE*>(&scc));
if (hr == S_OK) {
diff --git a/src/plugins/directshow/camera/dscamerasession.h b/src/plugins/directshow/camera/dscamerasession.h
index e78358a5f..0fe12dec3 100644
--- a/src/plugins/directshow/camera/dscamerasession.h
+++ b/src/plugins/directshow/camera/dscamerasession.h
@@ -188,6 +188,8 @@ private:
QString m_snapshot;
int m_currentImageId;
+ bool needsHorizontalMirroring;
+ bool needsVerticalMirroring;
protected:
HRESULT getPin(IBaseFilter *pFilter, PIN_DIRECTION PinDir, IPin **ppPin);
bool createFilterGraph();