summaryrefslogtreecommitdiffstats
path: root/src/plugins/directshow/camera
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/directshow/camera')
-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 6b474e898..1ecc368e7 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();