📄 videodecodertask.cpp
字号:
#include "VideoDecoderTask.h"
#include "Log.h"
//##ModelId=4753B7EA0292
CVideoDecoderTask::CVideoDecoderTask()
{
m_bSeek = FALSE;
m_nSeekPoint = 0;
m_nState = THREAD_STOP;
}
//##ModelId=4753B7EA0293
CVideoDecoderTask::~CVideoDecoderTask()
{
}
//##ModelId=4753B7EA0294
BOOL CVideoDecoderTask::InitDecTask(IMediaPlayer *pPlayerMedia, CSyncFifo *pVideoStream)
{
if( !pPlayerMedia || !pVideoStream )
return FALSE;
m_pPlayerMedia = pPlayerMedia;
m_pVideoStream = pVideoStream;
m_hStop = CreateEvent(NULL, FALSE, FALSE, NULL);
m_hPause = CreateEvent(NULL, FALSE, FALSE, NULL);
m_hWait = CreateEvent(NULL, FALSE, FALSE, NULL);
if( !m_hStop || !m_hPause || !m_hWait )
return FALSE;
if( CodecInit() < 0 )
return FALSE;
LogMsg(LOG_INFO, HCLN, "Initialize Video decoder task!");
return TRUE;
}
//##ModelId=4753B7EA02A0
BOOL CVideoDecoderTask::UninitDecTask()
{
if( m_nState == THREAD_PAUSE )
{
SetEvent(m_hPause);
m_nState = THREAD_RUNNING;
}
if( GetHandle() )
{
SetEvent(m_hStop);
WaitForClosure(INFINITE);
Close();
CloseHandle(m_hStop);
m_nState = THREAD_STOP;
}
CloseHandle(m_hPause);
CloseHandle(m_hWait);
CodecFree();
LogMsg(LOG_INFO, HCLN, "Uninitialize Video decoder task!");
return TRUE;
}
//##ModelId=4753B7EA02A1
BOOL CVideoDecoderTask::StartDecTask()
{
if( m_nState == THREAD_STOP )
{
if( !Create(ThreadEntry, this) )
return FALSE;
m_nState = THREAD_RUNNING;
LogMsg(LOG_INFO, HCLN, "Create Video Decoder Task!");
}
else if( m_nState == THREAD_PAUSE )
{
LogMsg(LOG_INFO, HCLN, "Start VideoDecoderTask!");
SetEvent(m_hPause);
}
return TRUE;
}
//##ModelId=4753B7EA02A2
BOOL CVideoDecoderTask::StopDecTask()
{
if( m_nState == THREAD_RUNNING )
{
SetEvent(m_hPause);
WaitForSingleObject(m_hWait, INFINITE);
LogMsg(LOG_INFO, HCLN, "Stop VideoDecoderTask!");
}
return TRUE;
}
//##ModelId=4753B7EA02A3
void CVideoDecoderTask::SetParam(int nWidth, int nHeight, int nCSP)
{
m_nWidth = nWidth;
m_nHeight = nHeight;
m_nCSP = nCSP;
switch( nCSP )
{
case CODEC_CSP_I420://IYUV
m_nImageSize = 3 * m_nWidth * m_nHeight / 2;
m_nStride = m_nWidth;
break;
case CODEC_CSP_RGB555:
case CODEC_CSP_RGB565:
m_nImageSize = 2 * m_nWidth * m_nHeight;
m_nStride = 2 * m_nWidth;
break;
case CODEC_CSP_BGR: //24bit
m_nImageSize = 3 * m_nWidth * m_nHeight;
m_nStride = 3 * m_nWidth;
break;
case CODEC_CSP_BGRA:
m_nImageSize = 4 * m_nWidth * m_nHeight;
m_nStride = 4 * m_nWidth;
break;
default:
m_nImageSize = 3 * m_nWidth * m_nHeight;
m_nStride = 3 * m_nWidth;
break;
}
SetColorSpace(nCSP, m_nStride);
}
//##ModelId=4753B7EA02AF
BOOL CVideoDecoderTask::SeekPoint(UINT nSeekTime)
{
m_nSeekPoint = nSeekTime;
m_bSeek = TRUE;
return TRUE;
}
//##ModelId=4753B7EA02B1
UINT WINAPI CVideoDecoderTask::ThreadEntry(void *lpParam)
{
((CVideoDecoderTask *) lpParam)->RunDecoding();
return 0;
}
//##ModelId=4753B7EA02B4
void CVideoDecoderTask::RunDecoding()
{
BYTE *lpEncData = NULL;
UINT nEncLen;
DWORD nTime;
BYTE *pData = NULL;
HANDLE hEvents[2];
DWORD nRet;
while (TRUE)
{
hEvents[0] = m_hStop;
hEvents[1] = m_hPause;
nRet = WaitForMultipleObjects(2, hEvents, FALSE, 0);
if( nRet == WAIT_OBJECT_0 )
break;
else if( nRet == WAIT_OBJECT_0 + 1 )
{
SetEvent(m_hWait);
m_nState = THREAD_PAUSE;
WaitForSingleObject(m_hPause, INFINITE);
m_nState = THREAD_RUNNING;
continue;
}
if( ( pData = (BYTE *)m_pVideoStream->GetPushBuffer(m_nImageSize) ) &&
( nEncLen = m_pPlayerMedia->OnReadFrame(&lpEncData, nTime) ) )
{
if( Decode(lpEncData, nEncLen, pData) )
{
m_pVideoStream->Push(m_nImageSize, nTime);
//LogMsg(LOG_DEBUG, HCLN, "Success decode!");
}
else
Sleep(10);
}
else
{
//LogMsg(LOG_DEBUG, HCLN, "Task sleep!");
Sleep(20);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -