141 lines
2.5 KiB
C++
141 lines
2.5 KiB
C++
#include "Inc/toolkit/LocalCamera.h"
|
|
#include "Inc/toolkit/StringConvert.h"
|
|
#include <atlbase.h>
|
|
#include <dshow.h>
|
|
#pragma comment(lib,"strmiids.lib")
|
|
|
|
|
|
CamObj::CamObj():
|
|
devID(-1),
|
|
m_bRun(false)
|
|
{
|
|
m_event_exit = ::CreateEvent(NULL, FALSE, FALSE, NULL);
|
|
}
|
|
|
|
CamObj::~CamObj()
|
|
{
|
|
}
|
|
|
|
int CamObj::Open(CamFrameCallBack fuc)
|
|
{
|
|
if (!m_camera.open(devID))
|
|
return 1;
|
|
|
|
std::thread([this, &fuc]() {
|
|
this->m_bRun = true;
|
|
while (WaitForSingleObject(this->m_event_exit, 50) != WAIT_OBJECT_0)
|
|
{
|
|
cv::Mat img;
|
|
this->m_camera >> img;
|
|
fuc(devID, devName, img);
|
|
}
|
|
m_camera.release();
|
|
this->m_bRun = false;
|
|
}).join();
|
|
|
|
return 0;
|
|
}
|
|
|
|
int CamObj::Close()
|
|
{
|
|
if (m_camera.isOpened())
|
|
{
|
|
::SetEvent(m_event_exit);
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
LocalCamera::LocalCamera()
|
|
{
|
|
|
|
}
|
|
|
|
LocalCamera::~LocalCamera()
|
|
{
|
|
|
|
}
|
|
|
|
int LocalCamera::GetAllCam(std::vector<CamObj>& cameras)
|
|
{
|
|
cameras.clear();
|
|
if (FAILED(CoInitialize(NULL)))
|
|
{//CoInitialize Failed ...
|
|
return -1;
|
|
}
|
|
int id = 0;
|
|
ICreateDevEnum *pCreateDevEnum;
|
|
HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL,
|
|
CLSCTX_INPROC_SERVER, IID_ICreateDevEnum, (void**)&pCreateDevEnum);
|
|
if (hr != NOERROR)
|
|
return -1;
|
|
|
|
CComPtr<IEnumMoniker> pEm;
|
|
hr = pCreateDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pEm, 0);
|
|
if (hr != NOERROR)
|
|
return -1;
|
|
pEm->Reset();
|
|
|
|
ULONG cFetched;
|
|
IMoniker *pM;
|
|
while (hr = pEm->Next(1, &pM, &cFetched), hr == S_OK)
|
|
{
|
|
IPropertyBag *pBag;
|
|
hr = pM->BindToStorage(0, 0, IID_IPropertyBag, (void **)&pBag);
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
CamObj TmpCam;
|
|
TmpCam.devID = id;
|
|
|
|
VARIANT var;
|
|
var.vt = VT_BSTR;
|
|
hr = pBag->Read(L"DevicePath", &var, NULL);
|
|
if (hr == 0)
|
|
{
|
|
std::wstring str = L"";
|
|
std::wstring strVid, strPid;
|
|
int Count = 0;
|
|
while (var.bstrVal[Count] != 0x00)
|
|
{
|
|
str += var.bstrVal[Count];
|
|
Count++;
|
|
}
|
|
|
|
strVid = str.substr(str.find(L"vid_") + 4, 4);
|
|
strPid = str.substr(str.find(L"pid_") + 4, 4);
|
|
|
|
TmpCam.devVID = dp::StringConvert::UnicodeToUTF8(strVid);
|
|
TmpCam.devPID = dp::StringConvert::UnicodeToUTF8(strPid);
|
|
}
|
|
|
|
VARIANT var1;
|
|
var1.vt = VT_BSTR;
|
|
hr = pBag->Read(L"FriendlyName", &var1, NULL);
|
|
if (hr == 0)
|
|
{
|
|
std::wstring str = L"";
|
|
int Count = 0;
|
|
while (var1.bstrVal[Count] != 0x00)
|
|
{
|
|
str += var1.bstrVal[Count];
|
|
Count++;
|
|
}
|
|
|
|
TmpCam.devName = dp::StringConvert::UnicodeToUTF8(str);
|
|
}
|
|
|
|
if (TmpCam.devName.find("screen-capture-recorder") == -1)
|
|
{
|
|
cameras.push_back(TmpCam);
|
|
id++;
|
|
}
|
|
|
|
pBag->Release();
|
|
}
|
|
pM->Release();
|
|
}
|
|
return cameras.size();
|
|
|
|
}
|