⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cfiltertssource.cpp

📁 最近在学习directshow, Directshow实务精选的源代码
💻 CPP
字号:
//
// CFilterTSSource.cpp
//

#include <streams.h>          // quartz, includes windows
// Eliminate two expected level 4 warnings from the Microsoft compiler.
// The class does not have an assignment or copy operator, and so cannot
// be passed by value.  This is normal.  This file compiles clean at the
// highest (most picky) warning level (-W4).
#pragma warning(disable: 4511 4512)

#include <initguid.h>

// {237204D5-8343-400e-8037-B3C20DB2AB22}
DEFINE_GUID(CLSID_MPEG2_TS_Source, 
0x237204d5, 0x8343, 0x400e, 0x80, 0x37, 0xb3, 0xc2, 0xd, 0xb2, 0xab, 0x22);


#if (1100 > _MSC_VER)
#include <olectlid.h>
#else
#include <olectl.h>
#endif

#include "CFilterTSSource.h"

//
// setup data
//
const AMOVIESETUP_MEDIATYPE sudPinTypes =
{
    &MEDIATYPE_NULL,            // Major type
    &MEDIASUBTYPE_NULL          // Minor type
};

const AMOVIESETUP_PIN psudPins[] =
{
   { 
		L"Output",          // String pin name
		FALSE,              // Is it rendered
		TRUE,               // Is it an output
		FALSE,              // Allowed none
		FALSE,              // Allowed many
		&CLSID_NULL,        // Connects to filter
		L"Input",           // Connects to pin
		1,                  // Number of types
		&sudPinTypes        // The pin details
    }
};


const AMOVIESETUP_FILTER sudFilter =
{
    &CLSID_MPEG2_TS_Source,       // Filter CLSID
    L"MPEG2 TS Source",           // Filter name
    MERIT_DO_NOT_USE,         // Its merit
    1,                        // Number of pins
    psudPins                  // Pin details
};


// List of class IDs and creator functions for the class factory. This
// provides the link between the OLE entry point in the DLL and an object
// being created. The class factory will call the static CreateInstance
CFactoryTemplate g_Templates[] = 
{
	{ 
		L"MPEG2 TS Source",
		&CLSID_MPEG2_TS_Source,
		CFilterTSSource::CreateInstance,
		NULL,
		&sudFilter 
	}
};
int g_cTemplates = sizeof(g_Templates) / sizeof(g_Templates[0]);


// ----------------------------------------------------------------------------
//            Filter implementation
// ----------------------------------------------------------------------------
CFilterTSSource::CFilterTSSource(LPUNKNOWN lpunk, HRESULT *phr) :
CSource(NAME("TS Source"), lpunk, CLSID_MPEG2_TS_Source)
{
	CTSOutPin * outStream = new CTSOutPin(phr, this, L"Output");
	if (outStream == NULL)
	{
		*phr = E_OUTOFMEMORY;	
	}
}

CFilterTSSource::~CFilterTSSource()
{
}

//
// CreateInstance
//
// Override CClassFactory method.
// Provide the way for COM to create a CNullInPlace object
//
CUnknown * WINAPI CFilterTSSource::CreateInstance(LPUNKNOWN punk, HRESULT *phr) 
{
	CFilterTSSource *pNewObject = new CFilterTSSource(punk, phr);
	if (pNewObject == NULL) 
	{
		*phr = E_OUTOFMEMORY;
	}
	return pNewObject;
} 

//
// Basic COM - used here to reveal our own interfaces
STDMETHODIMP CFilterTSSource::NonDelegatingQueryInterface(REFIID riid, void ** ppv)
{
	CheckPointer(ppv, E_POINTER);

	if (riid == IID_IFileSourceFilter)
	{
		return GetInterface((IFileSourceFilter *) this, ppv);
	}
	else
	{
		return CSource::NonDelegatingQueryInterface(riid, ppv);
	}
}

int CFilterTSSource::GetPinCount()
{
	return 1;
}

CBasePin * CFilterTSSource::GetPin(int n)
{
	if (n == 0)
	{
		return m_paStreams[0];	
	}
	return NULL;
}

STDMETHODIMP CFilterTSSource::FindPin(LPCWSTR Id, IPin ** ppPin)
{
	return CBaseFilter::FindPin(Id, ppPin);
}

// --- IFileSourceFilter methods ---
STDMETHODIMP CFilterTSSource::Load(LPCOLESTR pszFileName, const AM_MEDIA_TYPE *pmt)
{
	char szAnsi[MAX_PATH];
	WideCharToMultiByte(CP_ACP, 0, pszFileName, -1, szAnsi, MAX_PATH, NULL, NULL);
	if (OutPin()->SetFileSource(szAnsi))
	{
		return NOERROR;
	}
	return E_FAIL;
}

STDMETHODIMP CFilterTSSource::GetCurFile(LPOLESTR *ppszFileName, AM_MEDIA_TYPE *pmt)
{
	char szAnsi[MAX_PATH];
	OutPin()->GetFileSource(szAnsi);

	DWORD n = sizeof(WCHAR) * (1 + strlen(szAnsi));
	*ppszFileName = (LPOLESTR) CoTaskMemAlloc( n );
	if (*ppszFileName != NULL) 
	{
		WCHAR   szwFile[MAX_PATH];
		MultiByteToWideChar(CP_ACP, 0, szAnsi, -1, szwFile, MAX_PATH);
		CopyMemory(*ppszFileName, szwFile, n);
	}
	return NOERROR;
}












//
// DllEntryPoint
//
extern "C" BOOL WINAPI DllEntryPoint(HINSTANCE, ULONG, LPVOID);

BOOL APIENTRY DllMain(HANDLE hModule, DWORD  dwReason, LPVOID lpReserved)
{
	return DllEntryPoint((HINSTANCE)(hModule), dwReason, lpReserved);
}

/******************************Public Routine******************************\
* exported entry points for registration and
* unregistration (in this case they only call
* through to default implmentations).
*
*
*
* History:
*
\**************************************************************************/
STDAPI DllRegisterServer()
{
	return AMovieDllRegisterServer2( TRUE );
}

STDAPI DllUnregisterServer()
{
	return AMovieDllRegisterServer2( FALSE );
}

// Microsoft C Compiler will give hundreds of warnings about
// unused inline functions in header files.  Try to disable them.
#pragma warning( disable:4514)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -