www.pudn.com > AudioVideoCapture.rar > CCaptureController.cpp
//
// CCaptureController.cpp
//
/*-----------------------------------------------------*\
HQ Tech, Make Technology Easy!
More information, please go to http://hqtech.nease.net.
/*-----------------------------------------------------*/
#include "stdafx.h"
#include "CCaptureController.h"
#include "GlobalDefs.h"
#include "CDXGraph.h"
#include "CLiveInputFilters.h"
#include "CAviMuxFilter.h"
#include "CFileWriterFilter.h"
#include "CLiveCapture.h"
#include "UDsUtils.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////
CCaptureController::CCaptureController()
{
mVideoEncoder = NULL;
mAviMux = NULL;
mFileWriter = NULL;
}
CCaptureController::~CCaptureController()
{
ReleaseOutputFilters();
}
BOOL CCaptureController::ConnectFilters(void)
{
BOOL pass = FALSE;
// Connect video preview
IPin * pOut = mInputFilters->GetPreviewPin();
IPin * pIn = mVideoRenderer->GetInputPin();
if (pOut && pIn)
{
pass = mGraph->ConnectFilters(pOut, pIn);
}
// Connect video stream to the mux filter
// Insert a encoder if necessary
pOut = mInputFilters->GetVideoOutPin();
if (pass && mVideoEncoder && mVideoEncoder->GetFilter())
{
// Connect to the encoder first
pIn = mVideoEncoder->GetPin(TRUE);
if (pOut && pIn)
{
pass = mGraph->ConnectFilters(pOut, pIn);
}
// Retrieve the output pin of the encoder
pOut = mVideoEncoder->GetPin(FALSE);
}
pIn = mAviMux->GetUnconnectedInputPin();
if (pass && pOut && pIn)
{
pass = mGraph->ConnectFilters(pOut, pIn);
}
// Connect audio stream to the mux filter
pOut = mInputFilters->GetAudioOutPin();
pIn = mAviMux->GetUnconnectedInputPin();
if (pass && pOut && pIn)
{
pass = mGraph->ConnectFilters(pOut, pIn);
}
// Connect the mux filter to the file writer
pOut = mAviMux->GetOutputPin();
pIn = mFileWriter->GetInputPin();
if (pass && pOut && pIn)
{
pass = mGraph->ConnectFilters(pOut, pIn);
}
return pass;
}
BOOL CCaptureController::CreateOutputFilters(void)
{
BOOL pass = CGraphController::CreateOutputFilters();
if (pass)
{
// Create mux filter
mAviMux = new CAviMuxFilter(mGraph->GetGraph());
pass = mAviMux->CreateFilter();
// Create file writer filter
mFileWriter = new CFileWriterFilter(mGraph->GetGraph());
pass = mFileWriter->CreateFilter();
mFileWriter->SetDestFile(mLiveCapture->GetOutputFile());
// Create encoder filter if necessary
if (mLiveCapture->GetEncodingType() == ET_DIVX)
{
IBaseFilter* pFlt = UDsUtils::CreateCompressor(TRUE,
"DivX 5.0.2 Codec");
if (pFlt)
{
mVideoEncoder = new CDXFilter(mGraph->GetGraph());
mVideoEncoder->Attach(pFlt, "DivX Encoder");
pFlt->Release();
pass = TRUE;
}
else
{
pass = FALSE;
AfxMessageBox("DivX Encoder failed to create!");
}
}
}
return pass;
}
void CCaptureController::ReleaseOutputFilters(void)
{
SAFE_DELETE(mVideoEncoder);
SAFE_DELETE(mAviMux);
SAFE_DELETE(mFileWriter);
CGraphController::ReleaseOutputFilters();
}