【VC开源代码栏目提醒】:文章导读:在新的一年中,各位网友都进入紧张的学习或是工作阶段。网学会员整理了VC开源代码-CMPEG1Builder.cpp的相关内容供大家参考,祝大家在新的一年里工作和学习顺利!
//
// CMPEG1Builder.cpp
//
#include <streams.h>
#include "FltGuids.h"
#include "CMPEG1Builder.h"
/////////////////////////////////////////////////////////////////////////////
CMPEG1Builder::CMPEG1Builder(LPUNKNOWN pUnk, HRESULT *phr) :
CUnknown(NAME("MPEG1 Builder"), pUnk)
{
}
CMPEG1Builder::~CMPEG1Builder()
{
}
//
// Expose our own interface
STDMETHODIMP CMPEG1Builder::NonDelegatingQueryInterface(REFIID riid, void ** ppv)
{
CheckPointer(ppv, E_POINTER);
if (riid == IID_IMPEG1Builder)
{
return GetInterface((IMPEG1Builder *) this, ppv);
}
else if (riid == IID_IDistributorNotify)
{
return GetInterface((IDistributorNotify *) this, ppv);
}
else
{
return CUnknown::NonDelegatingQueryInterface(riid, ppv);
}
}
// --- IMPEG1Builder methods ---
STDMETHODIMP CMPEG1Builder::IsMPEG1File(const char * inFilePath)
{
IGraphBuilder * pBuilder = RetrieveGraphBuilder();
// Create a file source filter
IBaseFilter * pSource = NULL;
WCHAR wcFilePath[MAX_PATH];
MultiByteToWideChar(CP_ACP, 0, inFilePath, -1, wcFilePath, MAX_PATH);
pBuilder->AddSourceFilter(wcFilePath, L"Source", &pSource);
pSource->Release();
// Create microsoft MPEG-1 Stream Splitter
IBaseFilter * pSplitter = NULL;
CoCreateInstance(CLSID_MPEG1Splitter , NULL, CLSCTX_INPROC_SERVER,
IID_IBaseFilter, (void **)&pSplitter);
pBuilder->AddFilter(pSplitter, L"MPEG-1 Splitter");
pSplitter->Release();
// Try to connect them...
IPin * pOut = GetPinByDirection(pSource, PINDIR_OUTPUT);
IPin * pIn = GetPinByDirection(pSplitter, PINDIR_INPUT);
HRESULT hr = pBuilder->ConnectDirect(pOut, pIn, NULL);
pBuilder->RemoveFilter(pSplitter);
pBuilder->RemoveFilter(pSource);
return SUCCEEDED(hr) ? S_OK : S_FALSE;
}
STDMETHODIMP CMPEG1Builder::RenderMPEG1File(const char * inFilePath)
{
IGraphBuilder * pBuilder = RetrieveGraphBuilder();
// Create a file source filter
IBaseFilter * pSource = NULL;
WCHAR wcFilePath[MAX_PATH];
MultiByteToWideChar(CP_ACP, 0, inFilePath, -1, wcFilePath, MAX_PATH);
pBuilder->AddSourceFilter(wcFilePath, L"Source", &pSource);
pSource->Release();
// Create microsoft MPEG-1 Stream Splitter
IBaseFilter * pSplitter = NULL;
CoCreateInstance(CLSID_MPEG1Splitter , NULL, CLSCTX_INPROC_SERVER,
IID_IBaseFilter, (void **)&pSplitter);
pBuilder->AddFilter(pSplitter, L"MPEG-1 Splitter");
pSplitter->Release();
// Create microsoft MPEG-1 Video Decoder
IBaseFilter * pVideoDec = NULL;
CoCreateInstance(CLSID_CMpegVideoCodec, NULL, CLSCTX_INPROC_SERVER,
IID_IBaseFilter, (void **)&pVideoDec);
pBuilder->AddFilter(pVideoDec, L"MPEG-1 Video Decoder");
pVideoDec->Release();
// Create microsoft MPEG-1 Audio Dedocer
IBaseFilter * pAudioDec = NULL;
CoCreateInstance(CLSID_CMpegAudioCodec, NULL, CLSCTX_INPROC_SERVER,
IID_IBaseFilter, (void **)&pAudioDec);
pBuilder->AddFilter(pAudioDec, L"MPEG-1 Audio Decoder");
pAudioDec->Release();
// Connect filters...
IPin * pOut = GetPinByDirection(pSource, PINDIR_OUTPUT);
IPin * pIn = GetPinByDirection(pSplitter, PINDIR_INPUT);
HRESULT hr = pBuilder->ConnectDirect(pOut, pIn, NULL);
pOut = GetPinByName(pSplitter, "Video");
pIn = GetPinByDirection(pVideoDec, PINDIR_INPUT);
if (pOut && pIn)
{
hr = pBuilder->ConnectDirect(pOut, pIn, NULL);
}
pOut = GetPinByName(pSplitter, "Audio");
pIn = GetPinByDirection(pAudioDec, PINDIR_INPUT);
if (pOut && pIn)
{
hr = pBuilder->ConnectDirect(pOut, pIn, NULL);
}
// Auto-build the rest of the filter graph
IP