|
@@ -28,6 +28,7 @@ CCaptureVideo::~CCaptureVideo()
|
|
SAFE_RELEASE(m_pMC);
|
|
SAFE_RELEASE(m_pMC);
|
|
SAFE_RELEASE(m_pGB);
|
|
SAFE_RELEASE(m_pGB);
|
|
SAFE_RELEASE(m_pBF);
|
|
SAFE_RELEASE(m_pBF);
|
|
|
|
+ SAFE_RELEASE(m_pGrabber);
|
|
CoUninitialize( );
|
|
CoUninitialize( );
|
|
}
|
|
}
|
|
|
|
|
|
@@ -39,16 +40,18 @@ int CCaptureVideo::EnumDevices(HWND hList)
|
|
//枚举视频扑捉设备
|
|
//枚举视频扑捉设备
|
|
ICreateDevEnum *pCreateDevEnum;
|
|
ICreateDevEnum *pCreateDevEnum;
|
|
HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER,IID_ICreateDevEnum, (void**)&pCreateDevEnum);
|
|
HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER,IID_ICreateDevEnum, (void**)&pCreateDevEnum);
|
|
- if (hr != NOERROR)return -1;
|
|
|
|
- IEnumMoniker *pEm;
|
|
|
|
- hr = pCreateDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory,&pEm, 0);
|
|
|
|
if (hr != NOERROR)
|
|
if (hr != NOERROR)
|
|
return -1;
|
|
return -1;
|
|
|
|
|
|
- pEm->Reset();
|
|
|
|
|
|
+ IEnumMoniker *pEnum;
|
|
|
|
+ hr = pCreateDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory,&pEnum, 0);
|
|
|
|
+ if (hr != NOERROR)
|
|
|
|
+ return -1;
|
|
|
|
+
|
|
|
|
+ pEnum->Reset();
|
|
ULONG cFetched;
|
|
ULONG cFetched;
|
|
IMoniker *pM;
|
|
IMoniker *pM;
|
|
- while(hr = pEm->Next(1, &pM, &cFetched), hr==S_OK)
|
|
|
|
|
|
+ while(hr = pEnum->Next(1, &pM, &cFetched), hr==S_OK)
|
|
{
|
|
{
|
|
IPropertyBag *pBag;
|
|
IPropertyBag *pBag;
|
|
hr = pM->BindToStorage(0, 0, IID_IPropertyBag, (void **)&pBag);
|
|
hr = pM->BindToStorage(0, 0, IID_IPropertyBag, (void **)&pBag);
|
|
@@ -69,6 +72,10 @@ int CCaptureVideo::EnumDevices(HWND hList)
|
|
}
|
|
}
|
|
pM->Release();
|
|
pM->Release();
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ pEnum->Release();
|
|
|
|
+ pEnum = NULL;
|
|
|
|
+
|
|
return id;
|
|
return id;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -117,11 +124,13 @@ HRESULT CCaptureVideo::Init(int iDeviceID, HWND hWnd)
|
|
AfxMessageBox("Can’t build the graph");
|
|
AfxMessageBox("Can’t build the graph");
|
|
return hr;
|
|
return hr;
|
|
}
|
|
}
|
|
|
|
+
|
|
hr = m_pGrabber->GetConnectedMediaType( &mt );
|
|
hr = m_pGrabber->GetConnectedMediaType( &mt );
|
|
if ( FAILED( hr) ){
|
|
if ( FAILED( hr) ){
|
|
AfxMessageBox("Failt to read the connected media type");
|
|
AfxMessageBox("Failt to read the connected media type");
|
|
return hr;
|
|
return hr;
|
|
}
|
|
}
|
|
|
|
+
|
|
VIDEOINFOHEADER * vih = (VIDEOINFOHEADER*) mt.pbFormat;
|
|
VIDEOINFOHEADER * vih = (VIDEOINFOHEADER*) mt.pbFormat;
|
|
mCB.lWidth = vih->bmiHeader.biWidth;
|
|
mCB.lWidth = vih->bmiHeader.biWidth;
|
|
mCB.lHeight = vih->bmiHeader.biHeight;
|
|
mCB.lHeight = vih->bmiHeader.biHeight;
|
|
@@ -133,7 +142,11 @@ HRESULT CCaptureVideo::Init(int iDeviceID, HWND hWnd)
|
|
m_hWnd = hWnd ;
|
|
m_hWnd = hWnd ;
|
|
SetupVideoWindow();
|
|
SetupVideoWindow();
|
|
hr = m_pMC->Run();//开始视频捕捉
|
|
hr = m_pMC->Run();//开始视频捕捉
|
|
- if(FAILED(hr)){AfxMessageBox("Couldn’t run the graph!");return hr;}
|
|
|
|
|
|
+ if(FAILED(hr))
|
|
|
|
+ {
|
|
|
|
+ AfxMessageBox("Couldn’t run the graph!");
|
|
|
|
+ return hr;
|
|
|
|
+ }
|
|
return S_OK;
|
|
return S_OK;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -143,8 +156,7 @@ bool CCaptureVideo::BindFilter(int deviceId, IBaseFilter **pFilter)
|
|
return false;
|
|
return false;
|
|
// enumerate all video capture devices
|
|
// enumerate all video capture devices
|
|
ICreateDevEnum* pCreateDevEnum;
|
|
ICreateDevEnum* pCreateDevEnum;
|
|
- HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER,
|
|
|
|
- IID_ICreateDevEnum, (void**)&pCreateDevEnum);
|
|
|
|
|
|
+ HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER, IID_ICreateDevEnum, (void**)&pCreateDevEnum);
|
|
if (hr != NOERROR)
|
|
if (hr != NOERROR)
|
|
{
|
|
{
|
|
return false;
|
|
return false;
|
|
@@ -181,6 +193,9 @@ bool CCaptureVideo::BindFilter(int deviceId, IBaseFilter **pFilter)
|
|
pM->Release();
|
|
pM->Release();
|
|
index++;
|
|
index++;
|
|
}
|
|
}
|
|
|
|
+ pEm->Release();
|
|
|
|
+ pEm = NULL;
|
|
|
|
+
|
|
return true;
|
|
return true;
|
|
}
|
|
}
|
|
|
|
|