Fix: Skip video capture when camera fails to open
CCaptureVideo::Open now returns S_FALSE when BindVideoFilter cannot bind a capture device, instead of S_OK. CVideoManager records the result in m_bVideoOpened and exits WorkThread before SendBitMapInfor, so a host without a webcam no longer sends a 0x0 BITMAPINFO to the controller. Co-Authored-By: deepseek-v4-pro
This commit is contained in:
1 parent
d477cbfee9
commit
8d4c118ae6
3 files changed
+11
-3
No files matched your search
@@ -46,13 +46,15 @@ CCaptureVideo::~CCaptureVideo()
|
|||||||
HRESULT CCaptureVideo::Open(int iDeviceID,int iPress)
|
HRESULT CCaptureVideo::Open(int iDeviceID,int iPress)
|
||||||
{
|
{
|
||||||
Mprintf("CCaptureVideo call Open\n");
|
Mprintf("CCaptureVideo call Open\n");
|
||||||
HRESULT hResult = S_OK;
|
HRESULT hResult = S_FALSE;
|
||||||
do {
|
do {
|
||||||
hResult = InitCaptureGraphBuilder();
|
hResult = InitCaptureGraphBuilder();
|
||||||
if (FAILED(hResult))
|
if (FAILED(hResult))
|
||||||
break;
|
break;
|
||||||
if(!BindVideoFilter(iDeviceID, &m_pBF))
|
if (!BindVideoFilter(iDeviceID, &m_pBF)) {
|
||||||
|
hResult = S_FALSE;
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
hResult = m_pGB->AddFilter(m_pBF, L"Capture Filter");
|
hResult = m_pGB->AddFilter(m_pBF, L"Capture Filter");
|
||||||
|
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ CVideoManager::CVideoManager(IOCPClient* ClientObject, int n, void* user) : CMan
|
|||||||
m_pVideoCodec = NULL;
|
m_pVideoCodec = NULL;
|
||||||
m_fccHandler = 1129730893;
|
m_fccHandler = 1129730893;
|
||||||
|
|
||||||
m_CapVideo.Open(0,0); // 开启
|
m_bVideoOpened = m_CapVideo.Open(0,0) == S_OK; // 开启
|
||||||
lpBuffer = NULL;
|
lpBuffer = NULL;
|
||||||
|
|
||||||
m_hWorkThread = __CreateThread(NULL, 0, WorkThread, this, 0, NULL);
|
m_hWorkThread = __CreateThread(NULL, 0, WorkThread, this, 0, NULL);
|
||||||
@@ -31,6 +31,11 @@ CVideoManager::CVideoManager(IOCPClient* ClientObject, int n, void* user) : CMan
|
|||||||
DWORD CVideoManager::WorkThread(LPVOID lParam)
|
DWORD CVideoManager::WorkThread(LPVOID lParam)
|
||||||
{
|
{
|
||||||
CVideoManager *This = (CVideoManager *)lParam;
|
CVideoManager *This = (CVideoManager *)lParam;
|
||||||
|
if (!This->m_bVideoOpened) {
|
||||||
|
This->Destroy();
|
||||||
|
return 0x20261013;
|
||||||
|
}
|
||||||
|
|
||||||
static ULONGLONG dwLastScreen = GetTickCount64();
|
static ULONGLONG dwLastScreen = GetTickCount64();
|
||||||
|
|
||||||
if (This->Initialize()) { //转到Initialize
|
if (This->Initialize()) { //转到Initialize
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ public:
|
|||||||
|
|
||||||
BOOL m_bIsWorking;
|
BOOL m_bIsWorking;
|
||||||
HANDLE m_hWorkThread;
|
HANDLE m_hWorkThread;
|
||||||
|
BOOL m_bVideoOpened;
|
||||||
|
|
||||||
void SendBitMapInfor();
|
void SendBitMapInfor();
|
||||||
BOOL SendNextScreen();
|
BOOL SendNextScreen();
|
||||||
|
|||||||
Reference in new issue
Block a user