#include "Filter.h"
#include "DibHelper.h"
#include "MyConfig.h"
#include "resource.h"
CUnknown * WINAPI CVCam::CreateInstance(LPUNKNOWN lpunk, HRESULT *phr)
{
ASSERT(phr);
CUnknown *punk = new CVCam(lpunk, phr);
return punk;
}
CVCam::CVCam(LPUNKNOWN lpunk, HRESULT *phr) :
CSource(NAME("Virtual Camera"), lpunk, CLSID_VirtualCamera)
{
ASSERT(phr);
CAutoLock cAutoLock(&m_cStateLock);
m_paStreams = (CSourceStream **) new CVCamPin*[1];
m_paStreams[0] = new CVCamPin(phr, this);
}
STDMETHODIMP CVCam::QueryInterface(REFIID riid, void **ppv)
{
if(riid == IID_IAMStreamConfig || riid == IID_IKsPropertySet ||
riid == IID_IMyConfig || riid == IID_ISpecifyPropertyPages)
return m_paStreams[0]->QueryInterface(riid, ppv);
else
return CSource::QueryInterface(riid, ppv);
}
STDMETHODIMP CVCam::NonDelegatingQueryInterface(REFIID riid, void **ppv)
{
if(riid == IID_IAMStreamConfig || riid == IID_IKsPropertySet ||
riid == IID_ISpecifyPropertyPages || riid == IID_IMyConfig)
return m_paStreams[0]->NonDelegatingQueryInterface(riid, ppv);
else
return CSource::NonDelegatingQueryInterface(riid, ppv);
}
STDMETHODIMP CVCamPin::GetPages(CAUUID *pPages){
CheckPointer(pPages,E_POINTER);
pPages->cElems = 1;
pPages->pElems = (GUID *) CoTaskMemAlloc(sizeof(GUID));
if (pPages->pElems == NULL)
return E_OUTOFMEMORY;
*(pPages->pElems) = CLSID_MyPropertyPage;
return NOERROR;
} // GetPages
CVCamPin::CVCamPin(HRESULT *phr, CSource *pFilter)
: CSourceStream(NAME("Push Source Desktop"), phr, pFilter, L"Out"),
m_FramesWritten(0),
m_bZeroMemory(0),
m_iFrameNumber(0),
m_rtFrameLength(FPS_20), // Capture and display desktop 30 times per second
m_nCurrentBitDepth(32)
{
m_pParent = (CVCam*)pFilter;
m_hCursor = LoadCursor(0, MAKEINTRESOURCE(IDC_ARROW));
// Get the device context of the main display
HDC hDC;
hDC = CreateDC(TEXT("DISPLAY"), NULL, NULL, NULL);
HKEY hKEY;
DWORD dwDisposition = REG_OPENED_EXISTING_KEY;
long ret = RegCreateKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Virtual Camera", 0, TEXT(""), 0, KEY_ALL_ACCESS, NULL, &hKEY, &dwDisposition);
DWORD type = REG_DWORD;
DWORD type2 = REG_SZ;
DWORD size = sizeof(DWORD);
DWORD size2;
DWORD dwWidth = 320;
DWORD dwHeight = 240;
ret = RegQueryValueEx(hKEY, "top", NULL, &type, (LPBYTE)&m_rScreen.top, &size);
if(ret != ERROR_SUCCESS)
m_rScreen.top = 0;
ret = RegQueryValueEx(hKEY, "left", NULL, &type, (LPBYTE)&m_rScreen.left, &size);
if(ret != ERROR_SUCCESS)
m_rScreen.left = 0;
ret = RegQueryValueEx(hKEY, "width", NULL, &type, (LPBYTE)&dwWidth, &size);
m_rScreen.right = m_rScreen.left + dwWidth;
ret = RegQueryValueEx(hKEY, "height", NULL, &type, (LPBYTE)&dwHeight, &size);
m_rScreen.bottom = m_rScreen.top + dwHeight;
ret = RegQueryValueEx(hKEY, "auto", NULL, &type, (LPBYTE)&m_bAutoSetRect, &size);
if(ret != ERROR_SUCCESS)
m_bAutoSetRect = true;
ret = RegQueryValueEx(hKEY, "Text", NULL, &type2, (LPBYTE)&m_szText, &size2);
if(ret != ERROR_SUCCESS)
strcpy(m_szText, "");
// Save dimensions for later use in FillBuffer()
m_iImageWidth = 320;
m_iImageHeight = 240;
// Release the device context
DeleteDC(hDC);
}
CVCamPin::~CVCamPin()
{
}
//////////////////////////////////////////////////////////////////////////
// --- IMyConfig ---
//////////////////////////////////////////////////////////////////////////
STDMETHODIMP CVCamPin::put_Rect(RECT *rt)
{
CAutoLock l(&m_cSharedState);
m_rScreen.left = rt->left;
m_rScreen.top = rt->top;
m_rScreen.right = rt->right;
m_rScreen.bottom = rt->bottom;
HKEY hKEY;
DWORD dwDisposition = REG_OPENED_EXISTING_KEY;
RegCreateKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Virtual Camera",
0, "", 0, KEY_ALL_ACCESS, NULL, &hKEY, &dwDisposition);
DWORD dwWidth = rt->right-rt->left;
DWORD dwHeight = rt->bottom-rt->top;
RegSetValueEx(hKEY, "top", NULL, REG_DWORD, (const BYTE* )&rt->top, 4);
RegSetValueEx(hKEY, "left", NULL, REG_DWORD, (const BYTE* )&rt->left, 4);
RegSetValueEx(hKEY, "width", NULL, REG_DWORD, (const BYTE* )&dwWidth, 4);
RegSetValueEx(hKEY, "height", NULL, REG_DWORD, (const BYTE* )&dwHeight, 4);
return S_OK;
}
STDMETHODIMP CVCamPin::get_Rect(RECT *rt)
{
CAutoLock l(&m_cSharedState);
*rt = m_rScreen;
return S_OK;
}
STDMETHODIMP CVCamPin::put_AutoSetRect(bool *bSet)
{
CAutoLock l(&m_cSharedState);
m_bAutoSetRect = *bSet;
HKEY hKEY;
DWORD dwDisposition = REG_OPENED_EXISTING_KEY;
RegCreateKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Virtual Camera",
0, "", 0, KEY_ALL_ACCESS, NULL, &hKEY, &dwDisposition);
DWORD dwFlag = m_bAutoSetRect ? 1:0;
RegSetValueEx(hKEY, "auto", NULL, REG_DWORD, (const BYTE* )&dwFlag, 4);
return S_OK;
}
STDMETHODIMP CVCamPin::get_AutoSetRect(bool *bSet)
{
CAutoLock l(&m_cSharedState);
*bSet = m_bAutoSetRect;
return S_OK;
}
STDMETHODIMP CVCamPin::put_Text(char *pszText)
{
CAutoLock l(&m_cSharedState);
strcpy(m_szText, pszText);
HKEY hKEY;
DWORD dwDisposition = REG_OPENED_EXISTING_KEY;
RegCreateKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Virtual Camera",
0, "", 0, KEY_ALL_ACCESS, NULL, &hKEY, &dwDisposition);
RegSetValueEx(hKEY, "text", NULL, REG_SZ, (const BYTE* )&m_szText, strlen(m_szText));
return S_OK;
}
STDMETHODIMP CVCamPin::get_Text(char *pszText)
{
CAutoLock l(&m_cSharedState);
strcpy(pszText, m_szText);
return S_OK;
}
//
// GetMediaType
//
HRESULT CVCamPin::GetMediaType(CMediaType *pmt)
{
CheckPointer(pmt,E_POINTER);
CAutoLock cAutoLock(m_pFilter->pStateLock());
VIDEOINFO *pvi = (VIDEOINFO *) pmt->AllocFormatBuffer(sizeof(VIDEOINFO));
if(NULL == pvi)
return(E_OUTOFMEMORY);
// Initialize the VideoInfo structure before configuring its members
ZeroMemory(pvi, sizeof(VIDEOINFO));
pvi->bmiHeader.biCompression = BI_RGB;
pvi->bmiHeader.biBitCount = 32;
// Adjust the parameters common to all formats
pvi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
pvi->bmiHeader.biWidth = m_iImageWidth;
pvi->bmiHeader.biHeight = m_iImageHeight;
pvi->bmiHeader.biPlanes = 1;
pvi->bmiHeader.biSizeImage = GetBitmapSize(&pvi->bmiHeader);
pvi->bmiHeader.biClrImportant = 0;
pvi->AvgTimePerFrame = FPS_20;
SetRectEmpty(&(pvi->rcSource)); // we want the whole image area rendered.
SetRectEmpty(&(pvi->rcTarget)); // no particular destination rectangle
pmt->SetType(&MEDIATYPE_Video);
pmt->SetFormatType(&FORMAT_VideoInfo);
pmt->SetTemporalCompression(FALSE);
// Work out the GUID for the subtype from the header info.
const GUID SubTypeGUID = GetBitmapSubtype(&pvi->bmiHeader);
pmt->SetSubtype(&SubTypeGUID);
pmt->SetSampleSize(pvi->bmiHeader.biSizeImage);
return NOERROR;
} // GetMediaType
//
// CheckMediaType
//
HRESULT CVCamPin::CheckMediaType(const CMediaType *pMediaType)
{
CheckPointer(pMediaType,E_POINTER);
CAutoLock cAutoLock(m_pFilter->pStateLock());
if((*(pMediaType->Type()) != MEDIATYPE_Video) || // we only output video
!(pMediaType->IsFixedSize())) // in fixed size samples
{
return E_INVALIDARG;
}
// Check for the subtypes we support
const GUID *SubType = pMediaType->Subtype();
if (SubType == NULL)
return E_INVALIDARG;
if(/*(*SubType != MEDIASUBTYPE_RGB8)
&& (*SubType != MEDIASUBTYPE_RGB565)
&& (*SubType != MEDIASUBTYPE_RGB555)
&& (*SubType != MEDIASUBTYPE_RGB24)
&& */(*SubType != MEDIASUBTYPE_RGB32))
{
return E_INVALIDARG;
}
// Get the format area of the media type
VIDEOINFO *pvi = (VIDEOINFO *) pMediaType->Format();
if(pvi == NULL)
return E_INVALIDARG;
// Check if the image width & height have changed
if(pvi->bmiHeader.biWidth != m_iImageWidth ||
abs(pvi->bmiHeader.biHeight) != m_iImageHeight)
{
// If the image width/height is changed, fail CheckMediaType() to force
// the renderer to resize the image.
retu
没有合适的资源?快使用搜索试试~ 我知道了~
【重传】vc实现虚拟摄像头2例
共32个文件
h:9个
cpp:8个
bat:4个
5星 · 超过95%的资源 需积分: 50 16 下载量 18 浏览量
2009-05-26
12:43:52
上传
评论
收藏 114KB RAR 举报
温馨提示
VC6 + DirectShow编写。 内含两个不同模式的虚拟摄像头。一个是捕捉桌面,另一个是发送avi视频,国内尚无此类开源代码。本人待业在家呕心沥血所著。
资源推荐
资源详情
资源评论
收起资源包目录
VirtualCamera2.rar (32个子文件)
VirtualCamera_Desktop
Filter.h 6KB
resource.h 820B
DibHelper.cpp 3KB
bin
VCam.ax 132KB
注册.bat 16B
反注册.bat 19B
MyConfig.h 752B
DibHelper.h 2KB
VirtualCamera.dsw 549B
logo.bmp 32KB
Dll.def 257B
VirtualCamera.dsp 5KB
Dll.cpp 5KB
Filter.cpp 19KB
Script1.rc 4KB
VirtualCamera_Video
VirtualCamera.h 1010B
VirtualCamera.cpp 6KB
Resource.rc 3KB
resource.h 412B
TransFilter.h 424B
bin
注册.bat 25B
VirtualCamera.ax 100KB
反注册.bat 28B
VirtualCamera.dsw 549B
GraphBuilder.h 1KB
GraphBuilder.cpp 6KB
OutputPin.h 3KB
TransFilter.cpp 619B
VirtualCamera.dsp 5KB
OutputPin.cpp 4KB
Filter.cpp 4KB
Filter.def 266B
共 32 条
- 1
资源评论
- xj1992412021-10-09好像不行啊,win10...
bifei1983
- 粉丝: 12
- 资源: 18
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功