//
// CAnalogInputFilters.cpp
//
/*-----------------------------------------------------*\
HQ Tech, Make Technology Easy!
More information, please go to http://hqtech.nease.net.
/*-----------------------------------------------------*/
#include "stdafx.h"
#include <streams.h>
#include "CAnalogInputFilters.h"
#include "crossbar.h"
#include "CVideoCaptureFilter.h"
#include "CAudioCaptureFilter.h"
#include "COverlayMixerFilter.h"
#include "CSmartTeeFilter.h"
#include "CLiveCapture.h"
#include "UDsUtils.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define _Trying_VMR
////////////////////////////////////////////////////////////////////////
CAnalogInputFilters::CAnalogInputFilters(CDXGraph * inGraph) :
CLiveInputFilters(inGraph),
cNTSCMaskBits(0x0000000f),
cPALMaskBits(0x00100ff0),
cSECAMMaskBits(0x000ff000)
{
mVideoCapture = NULL;
mAudioCapture = NULL;
mOverlayMixer = NULL;
mCrossbar = NULL;
mGraphBuilder = NULL;
mHasPreviewPin = TRUE;
}
CAnalogInputFilters::~CAnalogInputFilters()
{
Release();
if (mLiveCapture)
{
mLiveCapture->SetVMRPreferred(FALSE);
mLiveCapture->SetImageGrab(TRUE);
}
}
BOOL CAnalogInputFilters::Create(void)
{
ASSERT(mGraph);
ASSERT(mLiveCapture);
HRESULT hr = S_OK;
mVideoCapture = new CVideoCaptureFilter(mGraph->GetGraph(),
mLiveCapture->GetVideoDevice());
mAudioCapture = new CAudioCaptureFilter(mGraph->GetGraph(),
mLiveCapture->GetAudioDevice());
mSmartTee = new CSmartTeeFilter(mGraph->GetGraph());
mOverlayMixer = new COverlayMixerFilter(mGraph->GetGraph());
BOOL pass = CLiveInputFilters::Create();
if (pass)
{
pass = mVideoCapture->CreateFilter();
}
if (pass)
{
hr = CoCreateInstance((REFCLSID)CLSID_CaptureGraphBuilder2, 0,
CLSCTX_INPROC, (REFIID)IID_ICaptureGraphBuilder2, (void **)&mGraphBuilder);
pass = (mGraphBuilder != NULL);
}
if (pass)
{
mGraphBuilder->SetFiltergraph(mGraph->GetGraph());
// Build preview filter chain and filters before the capture filter
hr = mGraphBuilder->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video,
mVideoCapture->GetFilter(), 0, 0);
if (hr == VFW_S_NOPREVIEWPIN)
{
// Faked preview pin (using smart tee)
mHasPreviewPin = FALSE;
}
else if (hr != S_OK)
{
pass = FALSE;
}
}
if (pass)
{
CreateCrossBar(mVideoCapture->GetFilter());
// Remove all filters following the capture filter
UDsUtils::NukeDownstream(mGraph->GetGraph(), mVideoCapture->GetFilter());
SetVideoConnector(mLiveCapture->GetVideoConnector());
SetVideoResolution(mLiveCapture->GetVideoResolution());
#ifdef _Trying_VMR
if (!IsAGPCard() && mLiveCapture->GetWorkMode() == MD_Preview)
{
mLiveCapture->SetVMRPreferred(TRUE);
mLiveCapture->SetImageGrab(FALSE);
}
else
{
// AGP card doesn't use VMR
mLiveCapture->SetVMRPreferred(FALSE);
mLiveCapture->SetImageGrab(TRUE);
}
#endif // _Trying_VMR
AdjustOutput();
CheckSmartTee();
}
// Audio part
if (pass)
{
mAudioCapture->CreateFilter();
if (mLiveCapture->IsAudioConnectorValid())
{
mAudioCapture->SetConnector(mLiveCapture->GetAudioConnector());
}
else
{
mLiveCapture->SetNotifying(FALSE);
mLiveCapture->SetAudioConnector(mAudioCapture->GetConnector());
mLiveCapture->SetNotifying(TRUE);
}
}
return pass;
}
BOOL CAnalogInputFilters::IsAGPCard(void)
{
if (FindVideoPin(&PIN_CATEGORY_VIDEOPORT))
{
return TRUE;
}
return FALSE;
}
IPin * CAnalogInputFilters::GetVideoOutPin(void)
{
// Check smart tee first
if (mSmartTee && mSmartTee->GetFilter())
{
return mSmartTee->GetCapturePin();
}
return FindVideoPin(&PIN_CATEGORY_CAPTURE);
}
IPin * CAnalogInputFilters::GetPreviewPin(void)
{
// If AGP card, provide VP pin
if (IsAGPCard())
{
BOOL pass = TRUE;
if (!mOverlayMixer->GetFilter())
{
mOverlayMixer->CreateFilter();
IPin * pOut = FindVideoPin(&PIN_CATEGORY_VIDEOPORT);
IPin * pIn = mOverlayMixer->GetPin(TRUE);
pass = mGraph->ConnectFilters(pOut, pIn);
}
if (pass)
{
return mOverlayMixer->GetPin(FALSE);
}
}
// Check smart tee first
if (mSmartTee && mSmartTee->GetFilter())
{
return mSmartTee->GetPreviewPin();
}
IPin * pin = NULL;
if (mHasPreviewPin)
{
pin = FindVideoPin(&PIN_CATEGORY_PREVIEW);
}
else
{
// If the capture filter has no preview at all
pin = FindVideoPin(&PIN_CATEGORY_CAPTURE);
}
return pin;
}
IPin * CAnalogInputFilters::GetAudioOutPin(void)
{
if (mAudioCapture->GetFilter())
{
return mAudioCapture->GetPin(FALSE);
}
return NULL;
}
void CAnalogInputFilters::Release(void)
{
SAFE_DELETE(mCrossbar);
SAFE_DELETE(mSmartTee);
SAFE_DELETE(mOverlayMixer);
SAFE_DELETE(mVideoCapture);
SAFE_DELETE(mAudioCapture);
SAFE_RELEASE(mGraphBuilder);
}
IPin * CAnalogInputFilters::FindVideoPin(const GUID * inCategory)
{
if (mVideoCapture && mGraphBuilder)
{
IPin * pPin = NULL;
HRESULT hr = mGraphBuilder->FindPin(
mVideoCapture->GetFilter(), // Pointer to the capture filter.
PINDIR_OUTPUT, // Look for an output pin.
inCategory,
NULL, // Any media type.
FALSE, // Pin can be connected.
0, // Retrieve the first matching pin.
&pPin // Receives a pointer to the pin.
);
if (SUCCEEDED(hr))
{
pPin->Release();
return pPin;
}
}
return NULL;
}
BOOL CAnalogInputFilters::CreateCrossBar(IBaseFilter * inFilter)
{
IEnumPins * pins = NULL;
HRESULT hr = inFilter->EnumPins(&pins);
if (FAILED(hr))
{
return FALSE;
}
IPin * pPin= NULL;
IKsPropertySet * pKs = NULL;
ULONG count = 0;
BOOL found = FALSE;
PIN_INFO pinInfo;
while (!found && SUCCEEDED(pins->Next(1, &pPin, &count)) && count)
{
if (S_OK == pPin->QueryPinInfo(&pinInfo))
{
if (pinInfo.dir == PINDIR_INPUT)
{
// Is this pin an ANALOGVIDEOIN input pin?
if (pPin->QueryInterface(IID_IKsPropertySet, (void **)&pKs) == S_OK)
{
GUID guid;
DWORD dw = 0;
if (pKs->Get(AMPROPSETID_Pin, AMPROPERTY_PIN_CATEGORY, 0, 0,
&guid, sizeof(GUID), &dw) == S_OK)
{
if (guid == PIN_CATEGORY_ANALOGVIDEOIN)
{
found = TRUE;
}
}
pKs->Release();
}
if (found)
{
SAFE_DELETE(mCrossbar);
HRESULT hr = S_OK;
mCrossbar = new CCrossbar(pPin, &hr);
}
}
pinInfo.pFilter->Release();
}
pPin->Release();
}
pins->Release();
return found;
}
AM_MEDIA_TYPE * CAnalogInputFilters::SelectMediaType(void)
{
// RGB media type is preferred.
// Preferred sequence: RGB32, RGB24, RGB565, RGB555, YUY2, UYVY
VIDEO_STREAM_CONFIG_CAPS pSCC;
AM_MEDIA_TYPE * pmt = NULL;
HRESULT hr = S_OK;
int nCounts, nSize;
int preferredIndex = -1;
enum {
RGB32 = 0, RGB24, RGB565, RGB555, YUY2, UYVY, Unknown
} currentPreferred, temp;
currentPreferred = Unknown;
IAMStreamConfig * pCfg = GetStreamConfig(&PIN_CATEGORY_CAPTURE);
pCfg->GetNumberOfCapabilities(&nCounts, &nSize);
for (int i = 0; i < nCounts; i++)
{
if (pCfg->GetStreamCaps(i, &pmt, (BYTE *)&pSCC) == S_OK)
{
if (pmt->subtype == MEDIASUBTYPE_RGB32)
{
temp = RGB32;
}
else if (pmt->subtype == MEDIASUBTYPE_RGB24)
{
temp = RGB24;
}
else if (pmt->subtype == MEDIASUBTYPE_RGB565)
{
temp = RGB565;
}
else if (pmt->subtype == MEDIASUBTYPE_RGB555)
{
temp = RGB555;
}
else if (pmt->subtype == MEDIASUBTYPE_YUY2)
{
temp = YUY2;
}
else if (pmt->subtype == MEDIASUBTYPE_UYVY)
{
temp = UYVY;
}
else
{
temp = Unknown;
}
if (temp < currentPreferred)
{
current
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
得到了陆其明的指点,经过本人的修改的一款网络视频流媒体传输监控软件,通过基于基于udp的rtp原理传输进行组播,实时性高,健壮性强,运用DirectShow自己生成Filter,实时捕获视频资源,分成服务器端和客户机端,是远程监控的一个好程序.
资源详情
资源评论
资源推荐
收起资源包目录
AVCap.rar_capture network rtp_udp 视频_流媒体传输_视频 监控_视频监控 (105个子文件)
CAnalogInputFilters.cpp 21KB
crossbar.cpp 18KB
UDsUtils.cpp 13KB
CDXGraph.cpp 13KB
AVCapDlg.cpp 11KB
CTVInputFilters.cpp 8KB
CAudioCaptureFilter.cpp 6KB
CMulticastAdmin.cpp 6KB
CUDPManager.cpp 5KB
CStreamSocket.cpp 5KB
CLiveCapture.cpp 5KB
CImageGrabberFilter.cpp 5KB
CTCPListener.cpp 5KB
CDVInputFilters.cpp 4KB
CGraphController.cpp 4KB
CDVCaptureFilter.cpp 4KB
UNetwork.cpp 4KB
UFilterUtils.cpp 4KB
CPreviewController.cpp 4KB
CDeviceObserver.cpp 4KB
CVideoSourcePage.cpp 4KB
CNetOutPin.cpp 3KB
CCaptureController.cpp 3KB
CXInputPin.cpp 3KB
CAudioSourcePage.cpp 3KB
CVideoDevices.cpp 3KB
CFilterNetReceiver.cpp 3KB
COutputPage.cpp 3KB
CVideoWindow.cpp 2KB
CLiveInputFilters.cpp 2KB
CDXFilter.cpp 2KB
CFilterNetSender.cpp 2KB
AVCap.cpp 2KB
CVideoRendererFilter.cpp 2KB
CFileWriterFilter.cpp 2KB
CMsgStation.cpp 2KB
CMsgReceiver.cpp 1KB
CObjectList.cpp 1KB
CDSDevice.cpp 1KB
CAudioDevices.cpp 1KB
CVideoCaptureFilter.cpp 1KB
CSmartTeeFilter.cpp 713B
CAviMuxFilter.cpp 642B
CAudioRendererFilter.cpp 469B
COverlayMixerFilter.cpp 463B
StdAfx.cpp 207B
AVCap.dsp 10KB
AVCap.dsw 863B
crossbar.h 3KB
CAnalogInputFilters.h 2KB
AVCapDlg.h 2KB
CDXGraph.h 2KB
CLiveCapture.h 2KB
CVideoSourcePage.h 2KB
CAudioSourcePage.h 2KB
resource.h 2KB
UDsUtils.h 2KB
CGraphController.h 2KB
COutputPage.h 2KB
CLiveInputFilters.h 2KB
AVCap.h 1KB
GlobalDefs.h 1KB
CUDPManager.h 1KB
DeviceNotifyDefs.h 1KB
CStreamSocket.h 1KB
CDeviceObserver.h 1KB
CTVInputFilters.h 1KB
CFilterNetReceiver.h 1KB
CImageGrabberFilter.h 1KB
CAudioCaptureFilter.h 1020B
CXInputPin.h 1000B
StdAfx.h 999B
CVideoWindow.h 967B
CMulticastAdmin.h 965B
CDVInputFilters.h 907B
CTCPListener.h 894B
CDXFilter.h 887B
CVideoDevices.h 856B
CDVCaptureFilter.h 837B
CMsgStation.h 814B
CFilterNetSender.h 765B
CNetOutPin.h 754B
CDSDevice.h 704B
CPreviewController.h 676B
CCaptureController.h 594B
CMsgReceiver.h 569B
UFilterUtils.h 558B
CFileWriterFilter.h 521B
CVideoRendererFilter.h 473B
CVideoCaptureFilter.h 461B
CObjectList.h 460B
CAudioDevices.h 457B
CSmartTeeFilter.h 385B
CAviMuxFilter.h 351B
CAudioRendererFilter.h 330B
COverlayMixerFilter.h 323B
UNetwork.h 271B
AVCap.ico 1KB
AVCap.ncb 16.85MB
AVCap.rc 9KB
共 105 条
- 1
- 2
林当时
- 粉丝: 95
- 资源: 1万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0