//
// CDXGraph.cpp
//
#include "stdafx.h"
#include "CDXGraph.h"
#include "GlobalDefs.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
////////////////////////////////////////////////////////////////////////////////
CDXGraph::CDXGraph()
{
//初始化
mGraph = NULL;
mMediaControl = NULL;
mEvent = NULL;
mBasicVideo = NULL;
mBasicAudio = NULL;
mVideoWindow = NULL;
mSeeking = NULL;
mObjectTableEntry = 0;
mGraphState = GS_Stopped;
}
CDXGraph::~CDXGraph()
{
Release();
}
//创建一个CDXGraph
BOOL CDXGraph::Create(void)
{
if (!mGraph)
{
if (SUCCEEDED(CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
IID_IGraphBuilder, (void **)&mGraph)))
{
AddToObjectTable();
return QueryInterfaces();
}
mGraph = NULL;
}
return FALSE;
}
//询问接口
BOOL CDXGraph::QueryInterfaces(void)
{
if (mGraph)
{
HRESULT hr = NOERROR;
hr |= mGraph->QueryInterface(IID_IMediaControl, (void **)&mMediaControl);
hr |= mGraph->QueryInterface(IID_IMediaEventEx, (void **)&mEvent);
hr |= mGraph->QueryInterface(IID_IBasicVideo, (void **)&mBasicVideo);
hr |= mGraph->QueryInterface(IID_IBasicAudio, (void **)&mBasicAudio);
hr |= mGraph->QueryInterface(IID_IVideoWindow, (void **)&mVideoWindow);
hr |= mGraph->QueryInterface(IID_IMediaSeeking, (void **)&mSeeking);
if (mSeeking)
{
mSeeking->SetTimeFormat(&TIME_FORMAT_MEDIA_TIME);
}
return SUCCEEDED(hr);
}
return FALSE;
}
//释放部分CDXGraph
void CDXGraph::Release(void)
{
if (mSeeking)
{
mSeeking->Release();
mSeeking = NULL;
}
if (mMediaControl)
{
mMediaControl->Release();
mMediaControl = NULL;
}
if (mEvent)
{
mEvent->Release();
mEvent = NULL;
}
if (mBasicVideo)
{
mBasicVideo->Release();
mBasicVideo = NULL;
}
if (mBasicAudio)
{
mBasicAudio->Release();
mBasicAudio = NULL;
}
if (mVideoWindow)
{
mVideoWindow->put_Visible(OAFALSE);
mVideoWindow->put_MessageDrain((OAHWND)NULL);
mVideoWindow->put_Owner(OAHWND(0));
mVideoWindow->Release();
mVideoWindow = NULL;
}
RemoveFromObjectTable();
if (mGraph)
{
mGraph->Release();
mGraph = 0;
}
}
BOOL CDXGraph::Attach(IGraphBuilder * inGraphBuilder)
{
Release();
if (inGraphBuilder)
{
mGraph = inGraphBuilder;
mGraph->AddRef();
AddToObjectTable();
return QueryInterfaces();
}
return TRUE;
}
IGraphBuilder * CDXGraph::GetGraph(void)
{
return mGraph;
}
BOOL CDXGraph::AddFilter(IBaseFilter * inFilter, LPCWSTR inName)
{
if (mGraph)
{
HRESULT hr = mGraph->AddFilter(inFilter, inName);
return SUCCEEDED(hr);
}
return FALSE;
}
//把 filter 从上游指针连接到下游的指针
BOOL CDXGraph::ConnectFilters(IPin * inOutputPin, IPin * inInputPin,
const AM_MEDIA_TYPE * inMediaType)
{
if (mGraph && inOutputPin && inInputPin)
{
HRESULT hr = mGraph->ConnectDirect(inOutputPin, inInputPin, inMediaType);
return SUCCEEDED(hr) ? TRUE : FALSE;
}
return FALSE;
}
void CDXGraph::DisconnectFilters(IPin * inOutputPin)
{
if (mGraph && inOutputPin)
{
HRESULT hr = mGraph->Disconnect(inOutputPin);
}
}
//设置显示窗口
BOOL CDXGraph::SetDisplayWindow(HWND inWindow)
{
if (mVideoWindow)
{
// 长 lVisible;
// mVideoWindow->get_Visible(&lVisible);
// 首先掩藏视频窗口
mVideoWindow->put_Visible(OAFALSE);
mVideoWindow->put_Owner((OAHWND)inWindow);
RECT windowRect;
::GetClientRect(inWindow, &windowRect);
mVideoWindow->put_Left(0);
mVideoWindow->put_Top(0);
mVideoWindow->put_Width(windowRect.right - windowRect.left);
mVideoWindow->put_Height(windowRect.bottom - windowRect.top);
mVideoWindow->put_WindowStyle(WS_CHILD|WS_CLIPCHILDREN|WS_CLIPSIBLINGS);
mVideoWindow->put_MessageDrain((OAHWND) inWindow);
// 恢复视频窗口
if (inWindow != NULL)
{
// mVideoWindow->put_Visible(lVisible);
mVideoWindow->put_Visible(OATRUE);
}
else
{
mVideoWindow->put_Visible(OAFALSE);
}
return TRUE;
}
return FALSE;
}
BOOL CDXGraph::ResizeVideoWindow(long inLeft, long inTop, long inWidth, long inHeight)
{
if (mVideoWindow)
{
long lVisible = OATRUE;
mVideoWindow->get_Visible(&lVisible);
// 首先掩藏视频窗口
mVideoWindow->put_Visible(OAFALSE);
mVideoWindow->put_Left(inLeft);
mVideoWindow->put_Top(inTop);
mVideoWindow->put_Width(inWidth);
mVideoWindow->put_Height(inHeight);
// 恢复视频窗口
mVideoWindow->put_Visible(lVisible);
return TRUE;
}
return FALSE;
}
//设置提示窗口
BOOL CDXGraph::SetNotifyWindow(HWND inWindow)
{
if (mEvent)
{
mEvent->SetNotifyWindow((OAHWND)inWindow, WM_GRAPHNOTIFY, 0);
return TRUE;
}
return FALSE;
}
void CDXGraph::HandleEvent(WPARAM inWParam, LPARAM inLParam)
{
if (mEvent)
{
LONG eventCode = 0, eventParam1 = 0, eventParam2 = 0;
while (SUCCEEDED(mEvent->GetEvent(&eventCode, &eventParam1, &eventParam2, 0)))
{
mEvent->FreeEventParams(eventCode, eventParam1, eventParam2);
switch (eventCode)
{
case EC_COMPLETE:
case EC_USERABORT:
case EC_ERRORABORT:
Broadcast(msg_FilterGraphError);
break;
case EC_DEVICE_LOST:
// 因为,窗口首先将处理设备失去的事件。
//我们在DirectShow不需要再处理这个事件的。
if (eventParam2 == 0)
{
// Broadcast(msg_DShowDeviceLost, &eventParam1);
}
break;
default:
break;
}
}
}
}
//运行采集设备的自检
BOOL CDXGraph::Run(void)
{
if (mGraph && mMediaControl)
{
if (!IsRunning())
{
if (SUCCEEDED(mMediaControl->Run()))
{
mGraphState = GS_Running;
return TRUE;
}
}
else
{
return TRUE;
}
}
return FALSE;
}
//停止采集设备的自检
BOOL CDXGraph::Stop(void)
{
if (mGraph && mMediaControl)
{
if (!IsStopped())
{
if (SUCCEEDED(mMediaControl->Stop()))
{
mGraphState = GS_Stopped;
return TRUE;
}
}
else
{
return TRUE;
}
}
return FALSE;
}
//暂停采集设备的自检
BOOL CDXGraph::Pause(void)
{
if (mGraph && mMediaControl)
{
if (!IsPaused())
{
if (SUCCEEDED(mMediaControl->Pause()))
{
mGraphState = GS_Paused;
return TRUE;
}
}
else
{
return TRUE;
}
}
return FALSE;
}
BOOL CDXGraph::IsRunning(void)
{
/* if (mGraph && mMediaControl)
{
OAFilterState state = State_Stopped;
if (SUCCEEDED(mMediaControl->GetState(10, &state)))
{
return state == State_Running;
}
}
return FALSE;*/
return (mGraphState == GS_Running);
}
BOOL CDXGraph::IsStopped(void)
{
/* if (mGraph && mMediaControl)
{
OAFilterState state = State_Stopped;
if (SUCCEEDED(mMediaControl->GetState(10, &state)))
{
return state == State_Stopped;
}
}
return FALSE;*/
return (mGraphState == GS_Stopped);
}
BOOL CDXGraph::IsPaused(void)
{
/* if (mGraph && mMediaControl)
{
OAFilterState state = State_Stopped;
if (SUCCEEDED(mMediaControl->GetState(10, &state)))
{
return state == State_Paused;
}
}
return FALSE;*/
return (mGraphState == GS_Paused);
}
//设置整个显示屏幕
BOOL CDXGraph::SetFullScreen(BOOL inEnabled)
{
if (mVideoWindow)
{
HRESULT hr = mVideoWindow->put_FullScreenMode(inEnabled ? OATRUE : OAFALSE);
return SUCCEEDED(hr);
}
return FALSE;
}
BOOL CDXGraph::GetFullScreen(void)
{
if (mVideoWindow)
{
long fullScreenMode = OAFALSE;
mVideoWindow->get_FullScreenMode(&fullScreenMode);
return (fullScreenMode == OATRUE);
}
return FALSE;
}
//?????
BOOL CDXGraph::SetSyncSource(IBaseFilter * inFilter)
{
if (inFilter)
{
IReferenceClock *pClock = 0;
inFilter->QueryInterface(IID_IReferenceClock, (void**)&pClock);
if (pClock)
{
// 设置 graph控制时钟
IMediaFilter *pMediaFilter = 0;
mGraph->QueryInterface(IID_IMediaFilter, (void**)&pMediaFilte
没有合适的资源?快使用搜索试试~ 我知道了~
Video-Conf.zip_bizconfvideo 注册_bizconfvideo注册_conf.lsmwebcast.co
共69个文件
h:31个
cpp:29个
aps:1个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 124 浏览量
2022-09-21
17:49:01
上传
评论
收藏 133KB ZIP 举报
温馨提示
基于directshow的视频会议系统,通过网络对多媒体数据进行实时传输,实现人与人之间“面对面”的虚拟会议坏境。
资源推荐
资源详情
资源评论
收起资源包目录
Video-Conf.zip (69个子文件)
Video Conf
CRoleDlg.cpp 1KB
AVChat.aps 22KB
Network
CUDPManager.h 1KB
UNetwork.h 271B
CTCPListener.h 894B
CStreamSocket.cpp 5KB
UNetwork.cpp 4KB
CStreamSocket.h 1KB
CTCPListener.cpp 5KB
CUDPManager.cpp 5KB
CMsgStation.h 814B
AVChat.opt 69KB
UFilterUtils.cpp 5KB
CRoleAdmin.h 2KB
CAVDevice.h 863B
CDXFilter.cpp 2KB
res
AVChat.rc2 398B
AVChat.ico 1KB
CVideoCaptureFilter2.h 722B
CAVDevice.cpp 2KB
CVideoWindow.h 967B
CVideoCaptureFilter2.cpp 5KB
AVChat.ncb 273KB
CPreviewAdmin.cpp 7KB
CMsgReceiver.cpp 1KB
CClientAdmin.h 598B
CRoleAdmin.cpp 11KB
CClientAdmin.cpp 2KB
CMsgReceiver.h 569B
UFilterUtils.h 857B
CServerAdmin.cpp 2KB
CCallDlg.cpp 1KB
CPreviewAdmin.h 1KB
CVideoWindow.cpp 2KB
CObjectList.cpp 1KB
CMsgStation.cpp 1KB
CDXGraph.cpp 13KB
UDsUtils.cpp 7KB
StdAfx.cpp 134B
AVChat.dsp 9KB
resource.h 1KB
CDXFilter.h 961B
AVChat.h 1KB
AVChat.dsw 537B
CSelfCheckDlg.h 2KB
GlobalDefs.h 3KB
StdAfx.h 1KB
CDXGraph.h 2KB
CAudioCaptureFilter2.cpp 6KB
AVChat.plg 4KB
AVChatDlg.h 2KB
CObjectList.h 460B
UDsUtils.h 695B
CSelfCheckDlg.cpp 3KB
CAudioCaptureFilter2.h 1KB
CCallDlg.h 1KB
AVChat.rc 7KB
AVChatDlg.cpp 6KB
CRoleDlg.h 1KB
Filters
CFilterNetSender.cpp 2KB
CFilterNetReceiver.cpp 4KB
CNetOutPin.h 754B
CXInputPin.h 1000B
CFilterNetSender.h 765B
CXInputPin.cpp 3KB
CNetOutPin.cpp 4KB
CFilterNetReceiver.h 1KB
AVChat.cpp 2KB
CServerAdmin.h 539B
共 69 条
- 1
资源评论
JaniceLu
- 粉丝: 78
- 资源: 1万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功