⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 videodecodertask.cpp

📁 播放被H264_AAC所压缩的avi文件的播放器。
💻 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 + -