diff options
author | Andy Shaw <andy.shaw@digia.com> | 2014-01-31 08:23:47 +0100 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2014-02-03 16:54:28 +0100 |
commit | 9a16423610405c0329fe40235313212946f08b05 (patch) | |
tree | 61e2691a8cdc7e4d34357efaeac67197214f0e0c /src/plugins/directshow | |
parent | 8fd3a5a198acaf32243617d46e269991284e8e13 (diff) | |
download | qtmultimedia-9a16423610405c0329fe40235313212946f08b05.tar.gz |
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>
Diffstat (limited to 'src/plugins/directshow')
-rw-r--r-- | src/plugins/directshow/camera/dscamerasession.cpp | 40 | ||||
-rw-r--r-- | src/plugins/directshow/camera/dscamerasession.h | 2 |
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(); |