www.pudn.com > AVChat0926.rar > CPreviewAdmin.cpp


// 
// CPreviewAdmin.cpp 
// 
 
/*-----------------------------------------------------*\ 
			HQ Tech, Make Technology Easy!        
 More information, please go to http://hqtech.nease.net. 
/*-----------------------------------------------------*/ 
 
#include "stdafx.h" 
#include  
#include "CPreviewAdmin.h" 
 
#include "CDXGraph.h" 
#include "CDXFilter.h" 
#include "CAVDevice.h" 
#include "CVideoWindow.h" 
#include "GlobalDefs.h" 
#include "UDsUtils.h" 
 
#include "CVideoCaptureFilter2.h" 
#include "CAudioCaptureFilter2.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////// 
CPreviewAdmin::CPreviewAdmin() 
{ 
	mGraph   	 = NULL; 
	mVideoWindow = NULL; 
	mVideoDevice = NULL; 
	mAudioDevice = NULL; 
	 
	mVideoFilter = NULL; 
	mAudioFilter = NULL; 
	mVideoRenderer = NULL; 
	mAudioRenderer = NULL; 
} 
 
CPreviewAdmin::~CPreviewAdmin() 
{ 
	Deactivate(); 
} 
 
void CPreviewAdmin::SetAVDevice(CAVDevice * inVideo, CAVDevice * inAudio) 
{ 
	mVideoDevice = inVideo; 
	mAudioDevice = inAudio; 
} 
 
void CPreviewAdmin::SetVideoWindow(CVideoWindow * inWindow) 
{ 
	mVideoWindow = inWindow; 
} 
 
BOOL CPreviewAdmin::Activate(void) 
{ 
	BOOL pass = CreateGraph(); 
	if (pass) 
	{ 
		pass = CreateInputFilters(); 
	} 
	if (pass) 
	{ 
		pass = CreateOutputFilters(); 
	} 
	if (pass) 
	{ 
		pass = ConnectFilters(); 
	} 
	if (pass) 
	{ 
		pass = AfterBuildGraph(); 
	} 
	return pass; 
} 
 
void CPreviewAdmin::Deactivate(void) 
{ 
	StopGraph(); 
 
	ReleaseInputFilters(); 
	ReleaseOutputFilters(); 
	DeleteGraph(); 
} 
 
BOOL CPreviewAdmin::CreateGraph(void) 
{ 
	mGraph = new CDXGraph(); 
	BOOL pass = mGraph->Create(); 
	return pass; 
} 
 
void CPreviewAdmin::DeleteGraph(void) 
{ 
	// Clean up the video window 
	if (mVideoWindow) 
	{ 
		mVideoWindow->SetGraph(0); 
	} 
	SAFE_DELETE(mGraph); 
} 
 
BOOL CPreviewAdmin::CreateInputFilters(void) 
{ 
	BOOL pass = FALSE; 
 
	mAudioFilter = new CAudioCaptureFilter2(mGraph->GetGraph()); 
	((CAudioCaptureFilter2 *)mAudioFilter)->SetDevice(mAudioDevice); 
	pass |= mAudioFilter->CreateFilter(); 
	 
	return pass; 
} 
 
void CPreviewAdmin::ReleaseInputFilters(void) 
{ 
	SAFE_DELETE(mVideoFilter); 
	SAFE_DELETE(mAudioFilter); 
} 
 
BOOL CPreviewAdmin::CreateOutputFilters(void) 
{ 
	BOOL pass = TRUE; 
	mAudioRenderer = new CDXFilter(mGraph->GetGraph(),  
		CLSID_DSoundRender, "Audio Renderer"); 
	pass = mAudioRenderer->CreateFilter(); 
	 
	return pass; 
} 
 
void CPreviewAdmin::ReleaseOutputFilters(void) 
{ 
	SAFE_DELETE(mVideoRenderer); 
	SAFE_DELETE(mAudioRenderer); 
} 
 
// Connect input filters to output filters 
BOOL CPreviewAdmin::ConnectFilters(void) 
{ 
	BOOL pass   = FALSE; 
	IPin * pOut = NULL; 
	IPin * pIn  = NULL; 
 
	// Connect audio capture filter to audio renderer 
	if (mAudioDevice->IsDeviceAvailable()) 
	{ 
		pOut = mAudioFilter->GetPin(FALSE); 
		pIn  = mAudioRenderer->GetPin(TRUE); 
		pass = mGraph->ConnectFilters(pOut, pIn); 
	} 
 
	// Connect video filters 
	if (pass && mVideoDevice->IsDeviceAvailable()) 
	{ 
		// DV camcorder 
		if (mVideoDevice->IsDVDevice()) 
		{ 
			pOut = mVideoFilter->GetPin(FALSE, "DV Vid Out"); 
			pIn  = mVideoRenderer->GetPin(TRUE); 
			pass = RenderDVVideo(mGraph, pOut, pIn); 
		} 
		else // USB camera 
		{ 
			pOut = mVideoFilter->GetPin(FALSE, "Capture"); 
			pIn  = mVideoRenderer->GetPin(TRUE); 
			// Try intelligent connect 
			HRESULT hr = mGraph->GetGraph()->Connect(pOut, pIn); 
			pass = SUCCEEDED(hr); 
		} 
	} 
 
	return pass; 
} 
 
BOOL CPreviewAdmin::AfterBuildGraph(void) 
{ 
	if (mVideoWindow) 
	{ 
		mVideoWindow->SetGraph(mGraph); 
		// Auto-play 
		PlayGraph(); 
		return TRUE; 
	} 
	return FALSE; 
} 
 
BOOL CPreviewAdmin::PlayGraph(void) 
{ 
	if (mGraph) 
	{ 
		mGraph->Run(); 
		return TRUE; 
	} 
	return FALSE; 
} 
 
BOOL CPreviewAdmin::PauseGraph(void) 
{ 
	if (mGraph) 
	{ 
		mGraph->Pause(); 
		return TRUE; 
	} 
	return FALSE; 
} 
 
BOOL CPreviewAdmin::StopGraph(void) 
{ 
	if (mGraph) 
	{ 
		mGraph->Stop(); 
		return TRUE; 
	} 
	return FALSE; 
} 
 
void CPreviewAdmin::ShowVideoCapturePropertyPage(void) 
{ 
	if (!mVideoDevice->IsDVDevice()) 
	{ 
		UDsUtils::ShowFilterPropertyPage(mVideoFilter->GetFilter()); 
 
		// Update new resolution? 
		long format = ((CVideoCaptureFilter2 *)mVideoFilter)->GetResolution(); 
		mVideoDevice->SetVideoResolution(format); 
	} 
} 
 
void CPreviewAdmin::ShowAudioCapturePropertyPage(void) 
{ 
	UDsUtils::ShowFilterPropertyPage(mAudioFilter->GetFilter()); 
 
	// Update new connector? 
	long index = ((CAudioCaptureFilter2 *)mAudioFilter)->GetConnector(); 
	mAudioDevice->SetAudioConnector(index); 
} 
 
// Utilities 
// Render DV to renderer, inserting a DV decoder filter 
BOOL CPreviewAdmin::RenderDVVideo(CDXGraph * inGraph, IPin * inDVPin, IPin * inRenderedPin) 
{ 
	BOOL pass   = FALSE; 
	IPin * pOut = NULL; 
	IPin * pIn  = NULL; 
 
	if (inGraph) 
	{ 
		// Add DV video decoder 
		CDXFilter * pDecoder = NULL; 
		pDecoder = new CDXFilter(inGraph->GetGraph(), CLSID_DVVideoCodec, 
			"DV Video Decoder"); 
		pDecoder->CreateFilter(); 
		// Settings on DV Video Decoder 
		IIPDVDec *  pIPDVDec = NULL;  
		pDecoder->QueryInterface(IID_IIPDVDec, (void**)&pIPDVDec); 
		if (pIPDVDec) 
		{ 
			pIPDVDec->Release(); 
			// DVRESOLUTION_HALF? DVRESOLUTION_QUARTER? 
			pIPDVDec->put_IPDisplay(DVRESOLUTION_HALF); 
		} 
 
		pIn  = pDecoder->GetPin(TRUE); 
		pass = inGraph->ConnectFilters(inDVPin, pIn); 
 
		pOut = pDecoder->GetPin(FALSE); 
		pass = inGraph->ConnectFilters(pOut, inRenderedPin); 
 
		pDecoder->Detach(); 
		delete pDecoder; 
	} 
 
	return pass; 
}