From 67cac1524f56af09289eb76b5e2a38ca6d2a78c6 Mon Sep 17 00:00:00 2001 From: Val Doroshchuk Date: Tue, 22 Sep 2020 13:04:44 +0200 Subject: 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 (cherry picked from commit bf82ab669c53c4b9abb724e197252a788323095e) Reviewed-by: Qt Cherry-pick Bot --- src/plugins/directshow/common/directshowutils.cpp | 29 +++++++++++++++++++---- src/plugins/directshow/common/directshowutils.h | 2 +- 2 files changed, 26 insertions(+), 5 deletions(-) (limited to 'src/plugins/directshow/common') 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 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 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); -- cgit v1.2.3