Vitaliy Margolen : dxdiagn: Use quartz' s IFilterMapper to get DirectShow filter information instead of looking through private structures .
Alexandre Julliard
julliard at winehq.org
Tue Jun 30 08:33:29 CDT 2009
Module: wine
Branch: master
Commit: 27072f296f6770a4fe2407c8aefefe5b25d0b5de
URL: http://source.winehq.org/git/wine.git/?a=commit;h=27072f296f6770a4fe2407c8aefefe5b25d0b5de
Author: Vitaliy Margolen <wine-patches at kievinfo.com>
Date: Mon Jun 29 22:06:30 2009 -0600
dxdiagn: Use quartz's IFilterMapper to get DirectShow filter information instead of looking through private structures.
---
dlls/dxdiagn/provider.c | 119 +++++++++++++++++++++++------------------------
1 files changed, 59 insertions(+), 60 deletions(-)
diff --git a/dlls/dxdiagn/provider.c b/dlls/dxdiagn/provider.c
index d3f0a26..fb13033 100644
--- a/dlls/dxdiagn/provider.c
+++ b/dlls/dxdiagn/provider.c
@@ -23,6 +23,7 @@
#define COBJMACROS
#define NONAMELESSUNION
+#define NONAMELESSSTRUCT
#include "dxdiag_private.h"
#include "wine/unicode.h"
#include "winver.h"
@@ -33,6 +34,9 @@
#include "mmddk.h"
#include "ddraw.h"
#include "d3d9.h"
+#include "strmif.h"
+#include "initguid.h"
+#include "fil_data.h"
#include "wine/debug.h"
@@ -572,28 +576,6 @@ static HRESULT DXDiag_InitDXDiagDirectPlayContainer(IDxDiagContainer* pSubCont)
return hr;
}
-struct REG_RF {
- DWORD dwVersion;
- DWORD dwMerit;
- DWORD dwPins;
- DWORD dwUnused;
-};
-struct REG_RFP {
- BYTE signature[4]; /* e.g. "0pi3" */
- DWORD dwFlags;
- DWORD dwInstances;
- DWORD dwMediaTypes;
- DWORD dwMediums;
- DWORD bCategory; /* is there a category clsid? */
- /* optional: dwOffsetCategoryClsid */
-};
-struct REG_TYPE {
- BYTE signature[4]; /* e.g. "0ty3" */
- DWORD dwUnused;
- DWORD dwOffsetMajor;
- DWORD dwOffsetMinor;
-};
-
static HRESULT DXDiag_InitDXDiagDirectShowFiltersContainer(IDxDiagContainer* pSubCont) {
HRESULT hr = S_OK;
static const WCHAR szName[] = {'s','z','N','a','m','e',0};
@@ -603,7 +585,7 @@ static HRESULT DXDiag_InitDXDiagDirectShowFiltersContainer(IDxDiagContainer* pSu
static const WCHAR ClsidFilterW[] = {'C','l','s','i','d','F','i','l','t','e','r',0};
static const WCHAR dwInputs[] = {'d','w','I','n','p','u','t','s',0};
static const WCHAR dwOutputs[] = {'d','w','O','u','t','p','u','t','s',0};
- static const WCHAR dwMerit[] = {'d','w','M','e','r','i','t',0};
+ static const WCHAR dwMeritW[] = {'d','w','M','e','r','i','t',0};
/*
static const WCHAR szFileName[] = {'s','z','F','i','l','e','N','a','m','e',0};
static const WCHAR szFileVersion[] = {'s','z','F','i','l','e','V','e','r','s','i','o','n',0};
@@ -672,13 +654,13 @@ static HRESULT DXDiag_InitDXDiagDirectShowFiltersContainer(IDxDiagContainer* pSu
hr = IMoniker_BindToStorage(pMoniker, NULL, NULL, &IID_IPropertyBag, (void**) &pPropFilterBag);
if (SUCCEEDED(hr)) {
LPBYTE pData = NULL;
- LPBYTE pCurrent = NULL;
- struct REG_RF* prrf = NULL;
- DWORD it;
DWORD dwNOutputs = 0;
DWORD dwNInputs = 0;
+ DWORD dwMerit = 0;
WCHAR bufferW[10];
IDxDiagContainer *pDShowSubCont = NULL;
+ IFilterMapper2 *pFileMapper = NULL;
+ IAMFilterData *pFilterData = NULL;
snprintfW(bufferW, sizeof(bufferW)/sizeof(bufferW[0]), szIdFormat, i);
if (FAILED(DXDiag_CreateDXDiagContainer(&IID_IDxDiagContainer, (void**) &pDShowSubCont)) ||
@@ -689,6 +671,7 @@ static HRESULT DXDiag_InitDXDiagDirectShowFiltersContainer(IDxDiagContainer* pSu
continue;
}
+ bufferW[0] = 0;
hr = IPropertyBag_Read(pPropFilterBag, wszFriendlyName, &v, 0);
hr = IDxDiagContainerImpl_AddProp(pDShowSubCont, szName, &v);
TRACE("\tName:%s\n", debugstr_w(V_BSTR(&v)));
@@ -699,45 +682,61 @@ static HRESULT DXDiag_InitDXDiagDirectShowFiltersContainer(IDxDiagContainer* pSu
hr = IDxDiagContainerImpl_AddProp(pDShowSubCont, ClsidFilterW, &v);
VariantClear(&v);
- add_prop_str(pDShowSubCont, szCatName, wszCatName);
- add_prop_str(pDShowSubCont, ClsidCatW, wszCatClsid);
-
- hr = IPropertyBag_Read(pPropFilterBag, wszFilterDataName, &v, NULL);
- hr = SafeArrayAccessData(V_UNION(&v, parray), (LPVOID*) &pData);
- prrf = (struct REG_RF*) pData;
- pCurrent = pData;
+ hr = CoCreateInstance(&CLSID_FilterMapper2, NULL, CLSCTX_INPROC, &IID_IFilterMapper2,
+ (LPVOID*)&pFileMapper);
+ if (SUCCEEDED(hr) &&
+ SUCCEEDED(IFilterMapper2_QueryInterface(pFileMapper, &IID_IAMFilterData, (void **)&pFilterData)))
+ {
+ DWORD array_size;
+ BYTE *tmp;
+ REGFILTER2 *pRF = NULL;
+
+ if (SUCCEEDED(IPropertyBag_Read(pPropFilterBag, wszFilterDataName, &v, NULL)) &&
+ SUCCEEDED(SafeArrayAccessData(V_UNION(&v, parray), (LPVOID*) &pData)))
+ {
+ ULONG j;
+ array_size = V_UNION(&v, parray)->rgsabound->cElements;
+
+ if (SUCCEEDED(IAMFilterData_ParseFilterData(pFilterData, pData, array_size, &tmp)))
+ {
+ pRF = ((REGFILTER2 **)tmp)[0];
+
+ snprintfW(bufferW, sizeof(bufferW)/sizeof(bufferW[0]), szVersionFormat, pRF->dwVersion);
+ if (pRF->dwVersion == 1)
+ {
+ for (j = 0; j < pRF->u.s.cPins; j++)
+ if (pRF->u.s.rgPins[j].bOutput)
+ dwNOutputs++;
+ else
+ dwNInputs++;
+ }
+ else if (pRF->dwVersion == 2)
+ {
+ for (j = 0; j < pRF->u.s1.cPins2; j++)
+ if (pRF->u.s1.rgPins2[j].dwFlags & REG_PINFLAG_B_OUTPUT)
+ dwNOutputs++;
+ else
+ dwNInputs++;
+ }
+
+ dwMerit = pRF->dwMerit;
+ CoTaskMemFree(tmp);
+ }
+
+ SafeArrayUnaccessData(V_UNION(&v, parray));
+ VariantClear(&v);
+ }
+ IFilterMapper2_Release(pFilterData);
+ }
+ if (pFileMapper) IFilterMapper2_Release(pFileMapper);
- snprintfW(bufferW, sizeof(bufferW)/sizeof(bufferW[0]), szVersionFormat, prrf->dwVersion);
add_prop_str(pDShowSubCont, szVersionW, bufferW);
-
- pCurrent += sizeof(struct REG_RF);
- for (it = 0; it < prrf->dwPins; ++it) {
- struct REG_RFP* prrfp = (struct REG_RFP*) pCurrent;
- UINT j;
-
- if (prrfp->dwFlags & REG_PINFLAG_B_OUTPUT) ++dwNOutputs;
- else ++dwNInputs;
-
- pCurrent += sizeof(struct REG_RFP);
- if (prrfp->bCategory) {
- pCurrent += sizeof(DWORD);
- }
- for (j = 0; j < prrfp->dwMediaTypes; ++j) {
- struct REG_TYPE* prt = (struct REG_TYPE *)pCurrent;
- pCurrent += sizeof(*prt);
- }
- for (j = 0; j < prrfp->dwMediums; ++j) {
- DWORD dwOffset = *(DWORD*) pCurrent;
- pCurrent += sizeof(dwOffset);
- }
- }
-
+ add_prop_str(pDShowSubCont, szCatName, wszCatName);
+ add_prop_str(pDShowSubCont, ClsidCatW, wszCatClsid);
add_prop_ui4(pDShowSubCont, dwInputs, dwNInputs);
add_prop_ui4(pDShowSubCont, dwOutputs, dwNOutputs);
- add_prop_ui4(pDShowSubCont, dwMerit, prrf->dwMerit);
+ add_prop_ui4(pDShowSubCont, dwMeritW, dwMerit);
- SafeArrayUnaccessData(V_UNION(&v, parray));
- VariantClear(&v);
i++;
}
IPropertyBag_Release(pPropFilterBag); pPropFilterBag = NULL;
More information about the wine-cvs
mailing list