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

📄 cpreviewadmin.cpp

📁 陆其明的实务精选中附带光盘中的视频聊天源代码
💻 CPP
字号:
//
// CPreviewAdmin.cpp
//

/*-----------------------------------------------------*\
			HQ Tech, Make Technology Easy!       
 More information, please go to http://hqtech.nease.net.
/*-----------------------------------------------------*/

#include "stdafx.h"
#include <streams.h>
#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;

	mVideoFilter = new CVideoCaptureFilter2(mGraph->GetGraph());
	((CVideoCaptureFilter2 *)mVideoFilter)->SetDevice(mVideoDevice);
	pass |= mVideoFilter->CreateFilter();

	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;
	mVideoRenderer = new CDXFilter(mGraph->GetGraph(), 
		CLSID_VideoRenderer, "Video Renderer");
	pass = mVideoRenderer->CreateFilter();
	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;
}

⌨️ 快捷键说明

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