diff options
author | Val Doroshchuk <valentyn.doroshchuk@qt.io> | 2020-09-22 13:04:44 +0200 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2020-09-24 10:10:06 +0000 |
commit | 67cac1524f56af09289eb76b5e2a38ca6d2a78c6 (patch) | |
tree | 4d0df139806d510e7823ce5886ca50c51d156e88 /src/plugins/directshow/common | |
parent | 9862bf04d18d8453c5bf2667768c0b8fbafe512c (diff) |
DirectShow: Use also pin category when negotiating
The pin should be negotiated once and use PIN_CATEGORY_CAPTURE.
The same logic is implemented in chromium.
Change-Id: I89ac13c1a7e982c1011b2a872e853ee5bc2036b2
Reviewed-by: Andy Shaw <andy.shaw@qt.io>
(cherry picked from commit bf82ab669c53c4b9abb724e197252a788323095e)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
Diffstat (limited to 'src/plugins/directshow/common')
-rw-r--r-- | src/plugins/directshow/common/directshowutils.cpp | 29 | ||||
-rw-r--r-- | src/plugins/directshow/common/directshowutils.h | 2 |
2 files changed, 26 insertions, 5 deletions
diff --git a/src/plugins/directshow/common/directshowutils.cpp b/src/plugins/directshow/common/directshowutils.cpp index 1457837ce..9222ad779 100644 --- a/src/plugins/directshow/common/directshowutils.cpp +++ b/src/plugins/directshow/common/directshowutils.cpp @@ -93,6 +93,25 @@ bool DirectShowUtils::hasPinDirection(IPin *pin, PIN_DIRECTION direction, HRESUL return (pinDir == direction); } +bool pinMatchesCategory(IPin* pPin, REFGUID category) +{ + bool found = false; + IKsPropertySet *pKs = nullptr; + DirectShowUtils::ScopedSafeRelease<IKsPropertySet> ks_property { &pKs }; + HRESULT hr = pPin->QueryInterface(IID_PPV_ARGS(&pKs)); + + if (SUCCEEDED(hr)) { + GUID pin_category; + DWORD return_value; + hr = pKs->Get(AMPROPSETID_Pin, AMPROPERTY_PIN_CATEGORY, NULL, 0, + &pin_category, sizeof(pin_category), &return_value); + if (SUCCEEDED(hr) && (return_value == sizeof(pin_category))) + found = (pin_category == category); + } + + return found; +} + /** * @brief DirectShowUtils::getPin * @param filter @@ -101,7 +120,7 @@ bool DirectShowUtils::hasPinDirection(IPin *pin, PIN_DIRECTION direction, HRESUL * @param hrOut * @return */ -bool DirectShowUtils::getPin(IBaseFilter *filter, PIN_DIRECTION pinDirection, IPin **pin, HRESULT *hrOut) +bool DirectShowUtils::getPin(IBaseFilter *filter, PIN_DIRECTION pinDirection, REFGUID category, IPin **pin, HRESULT *hrOut) { IEnumPins *enumPins = nullptr; const ScopedSafeRelease<IEnumPins> releaseEnumPins { &enumPins }; @@ -122,9 +141,11 @@ bool DirectShowUtils::getPin(IBaseFilter *filter, PIN_DIRECTION pinDirection, IP PIN_DIRECTION currentPinDir; *hrOut = nextPin->QueryDirection(¤tPinDir); if (currentPinDir == pinDirection) { - *pin = nextPin; - (*pin)->AddRef(); - return true; + if (category == GUID_NULL || pinMatchesCategory(nextPin, category)) { + *pin = nextPin; + (*pin)->AddRef(); + return true; + } } } diff --git a/src/plugins/directshow/common/directshowutils.h b/src/plugins/directshow/common/directshowutils.h index 5f2cfaa23..ec761abe6 100644 --- a/src/plugins/directshow/common/directshowutils.h +++ b/src/plugins/directshow/common/directshowutils.h @@ -68,7 +68,7 @@ struct ScopedSafeRelease } }; -bool getPin(IBaseFilter *filter, PIN_DIRECTION pinDirection, IPin **pin, HRESULT *hrOut); +bool getPin(IBaseFilter *filter, PIN_DIRECTION pinDirection, REFGUID category, IPin **pin, HRESULT *hrOut); bool isPinConnected(IPin *pin, HRESULT *hrOut = nullptr); bool hasPinDirection(IPin *pin, PIN_DIRECTION direction, HRESULT *hrOut = nullptr); bool matchPin(IPin *pin, PIN_DIRECTION pinDirection, BOOL shouldBeConnected, HRESULT *hrOut = nullptr); |