summaryrefslogtreecommitdiffstats
path: root/src/plugins/directshow/camera/dscamerasession.cpp
diff options
context:
space:
mode:
authorLiang Qi <liang.qi@theqtcompany.com>2016-04-08 10:23:21 +0200
committerLiang Qi <liang.qi@theqtcompany.com>2016-04-08 10:23:21 +0200
commitd32aff3e0453475c1a22d5e8c7a106df18c0ad10 (patch)
treee547f0d8b6174e227add827a9143f5f7ef1d2fe3 /src/plugins/directshow/camera/dscamerasession.cpp
parentb26003419f054722c16cfc9bc3b4366261543bff (diff)
parentc8eed01f1ffe5ad03a82d0bb7c49b71d5cec09b3 (diff)
Merge remote-tracking branch 'origin/5.6' into 5.7
Diffstat (limited to 'src/plugins/directshow/camera/dscamerasession.cpp')
-rw-r--r--src/plugins/directshow/camera/dscamerasession.cpp16
1 files changed, 13 insertions, 3 deletions
diff --git a/src/plugins/directshow/camera/dscamerasession.cpp b/src/plugins/directshow/camera/dscamerasession.cpp
index a266e2226..9e1be9606 100644
--- a/src/plugins/directshow/camera/dscamerasession.cpp
+++ b/src/plugins/directshow/camera/dscamerasession.cpp
@@ -1098,9 +1098,19 @@ void DSCameraSession::disconnectGraph()
pPin = NULL;
}
- m_filterGraph->RemoveFilter(m_nullRendererFilter);
- m_filterGraph->RemoveFilter(m_previewFilter);
- m_filterGraph->RemoveFilter(m_sourceFilter);
+ // To avoid increasing the memory usage every time the graph is re-connected it's
+ // important that all filters are released; also the ones added by the "Intelligent Connect".
+ IEnumFilters *enumFilters = NULL;
+ hr = m_filterGraph->EnumFilters(&enumFilters);
+ if (SUCCEEDED(hr)) {
+ IBaseFilter *filter = NULL;
+ while (enumFilters->Next(1, &filter, NULL) == S_OK) {
+ m_filterGraph->RemoveFilter(filter);
+ enumFilters->Reset();
+ filter->Release();
+ }
+ enumFilters->Release();
+ }
}
static bool qt_frameRateRangeGreaterThan(const QCamera::FrameRateRange &r1, const QCamera::FrameRateRange &r2)