Files
DeepCamFaceSDK2.0/Src/toolkit/LocalCamera.cpp
2024-12-13 23:33:37 +08:00

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();
}