[Dshow] 연결된 필터 이름 알아오기

관련 Site에서 간단하게 도움을 받아서 작성한 Function입니다.

* Wince에서 NullPlayer를 작성하여 OS에서 연결되는 Filter 정보를
확인하고자 하여 아래 함수를 작성하였습니다.

코드 :

HRESULT GetConnectFiltersName( IGraphBuilder *pGraph )
{
 IEnumFilters *pEnumFilter = NULL;
 HRESULT hr =  pGraph->EnumFilters( &pEnumFilter );
 IBaseFilter *pBaseFilter = NULL;
 FILTER_INFO stFilterInfo;

 while(  S_OK == pEnumFilter->Next( 1, &pBaseFilter, NULL ) )
 {
  pBaseFilter->QueryFilterInfo( &stFilterInfo );
  char sztmp[256];
  ::WideCharToMultiByte(CP_ACP, 0, stFilterInfo.achName, -1, sztmp, 256, NULL, NULL);
  ::printf( "%s\r\n", sztmp );
  pBaseFilter->Release();
 }

 pEnumFilter->Release();
 return S_OK;
}


그럼 고운하루 되세요

[Dshow] DirectShow Filter Build시 발생하는 Link Error 해결방법

Some of the DirectShow samples break if you install Visual Studio 2005 Beta 2. Most of the errors that I found fall into three categories:
  • C4430: Missing type specifier. To conform with C++, undeclared types do not default to int. All types must be declared. Fix: Declare the type, or suppress the warning with the "/wd4430" flag.
  • C4996: ‘ xxxx’ was declared deprecated. You may be including an older version of strsafe.h from the DirectX SDK or the Platform SDK. You should include the version installed with Visual Studio. (But it’s probably harmless to ignore this warning.) 
  • C2065: ‘xxx’: undeclared identifier. To conform with C++, the scope of a variable declared inside a "for" loop is restricted to the loop. Fixes: (a) Move the declaration outside the for loop. (b) Redeclare the variable in multiple scopes, if you don’t need it to persist outside the loop. (c)Set the /Zc:forScope flag.(You can find this under Project, Properties, Configuration Properties, C/C++, Language, Force Conformance In For Loop Scope. Set to "No".)

Here are the specific fixes that I made. Warning: I have not thoroughly tested these, and I only tried them under the "Windows XP 32-bit Debug" environment in Platform SDK. You should use your own judgment before making any of these fixes.

  • BaseClasses\ctlutil.h (278)  
       (LONG) operator=(LONG);
  • BaseClasses\wxdebug.cpp (564)
       static DWORD g_dwLastRefresh = 0;
  • BaseClasses\winutil.cpp (2092)
       UINT Count;
       for (Count = 0;Count < Result;Count++) {
  •  BaseClasses\outputq.cpp (635)
       long iDone = 0;
       for (iDone = 0;
  • Capture\AmCap\amcap.cpp (691)
       for(int i = 0; i < NUMELMS(gcap.rgpmAudioMenu); i++)
  • Capture\AmCap\amcap (2795)
       for(int i = 0; i < NUMELMS(gcap.rgpmAudioMenu); i++)
  • DMODemo\dsutil.cpp (686)
        DWORD i = 0;
        for( i=0; i<m_dwNumBuffers; i++ )
  • dmoimpl.h (622)   [In the Platform SDK headers]
        for (DWORD dw = 0; dw < NUMBEROFOUTPUTS; dw++) {
  • DMO\GargleDMO\MedParamBase\param.cpp (91)
        for (DWORD dwIndex = 0; dwIndex < cParams; dwIndex++)
  • DMO\GargleDMO\MedParamBase\param.cpp (309)
        CCurveItem *pCurve = NULL;
        for (pCurve = pCurveHead;
  • DMO\GargleDMO\gargle.cpp (145)
        for (DWORD i = 0; i < cOutputStreams && SUCCEEDED(hr); ++i)
  • Filters\Dump\dump.cpp (426)
        for (int Loop = 0;Loop < (DataLength % BYTES_PER_LINE);Loop++)
  • Filters\Gargle\gargle.cpp (212)
        static int m_nInstanceCount; // total instances
  • Filters\RGBFilters\RateSource\ratesource.cpp (382)
        for( int y = 0 ; y < DEFAULT_HEIGHT ; y++ )
  • Filters\RGBFilters\RateSource\ratesource.cpp (387)
        for( int y = 0 ; y < DEFAULT_WIDTH ; y++ )
  • VMR\VMRXclBasic and VMR\Ticker: LNK1181: cannot open input file ‘dxguid.lib’. This was an error in the makefile. Change to read:
        DXLIB="$(DXSDK_DIR)\Lib\x86"  (currently says "x32")
  • VMR\VMRXcl and VMR\VMRMulti: C1083: Cannot open include file: ‘d3dxmath.h’: No such file or directory. This is an old DX header that is no longer included in DX or in Visual Studio. Unfortunately the only fix is to download an older version of the DirectX SDK.
  • VMR9\MultiVMR9\GamePlayer\character.cpp (383)
        DWORD i = 0;
        for (i = 0; i < pMeshContainer->NumInfl; ++i)
  • VMR9\MultiVMR9\DLL\MixerControl.h (28)
        static const DWORD MultiVMR9Mixer_DefaultFVF = D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1;
  • VMR9\VMRAllocator: error LNK2019: unresolved external symbol "wchar_t * __stdcall _com_util::ConvertStringToBSTR(char const *)" (etc).  Add this to the makefile:

       comsuppw.lib \

본문스크랩 Dshow 구조도

DirectShow 기술을 사용하여 필터를 개발하는데 조금이나마 도움이 되었으면 좋겠네요
모든 baseclass에 대한 클래스 다이어그램은 아니지만,,,
일반적으로 많이 사용되는 클래스에 대해 정리해 보았습니다…
 
 
 
 
 
< 필터 관련 클래스 >
 
사용자 삽입 이미지

 

 


 

 

< 핀 관련 클래스 >

사용자 삽입 이미지

 

본문스크랩 BITMAPINFO

typedef struct tagBITMAPINFO
{
      BITMAPINFOHEADER bmiHeader;  

      RGBQUAD          bmiColors[1];
} BITMAPINFO, *PBITMAPINFO;

 

/////////////////////////////////////////////////////////////////////

 

static BITMAPINFO *pbmi = (BITMAPINFO *)malloc(sizeof(BITMAPINFOHEADER) + (sizeof(RGBQUAD)*256));

 pbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
 pbmi->bmiHeader.biWidth = px_width;
 pbmi->bmiHeader.biHeight = px_height;
 pbmi->bmiHeader.biPlanes = 1;
 pbmi->bmiHeader.biBitCount = 24;
 pbmi->bmiHeader.biCompression = BI_RGB;
 pbmi->bmiHeader.biSizeImage = px_width * px_height;
 pbmi->bmiHeader.biXPelsPerMeter = 0;
 pbmi->bmiHeader.biYPelsPerMeter = 0;
 pbmi->bmiHeader.biClrUsed = 0;
 pbmi->bmiHeader.biClrImportant = 0;

 // 컬러 세팅
 for (i=0; i<256; ++i)
 {
   pbmi->bmiColors[i].rgbRed = i;
   pbmi->bmiColors[i].rgbGreen = i;
   pbmi->bmiColors[i].rgbBlue = i;
   pbmi->bmiColors[i].rgbReserved = 0;
 }