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

📄 vidrendf.cpp

📁 linux下的一款播放器
💻 CPP
📖 第 1 页 / 共 2 页
字号:
 *  Method: *    CVideoFormat::Dequeue * */CMediaPacket* CVideoFormat::Dequeue(void){
    CMediaPacket* pPacket = (CMediaPacket*) m_pOutputQueue->Get();
#ifdef ENABLE_FRAME_TRACE    if (pPacket && (ulFrameTraceIdx < MAX_FRAME_TRACE_ENTRIES))    {	frameTraceArray[ulFrameTraceIdx][2] = pPacket->m_ulTime;	frameTraceArray[ulFrameTraceIdx][0] = 	    (LONG32) pPacket->m_pData;	frameTraceArray[ulFrameTraceIdx++][1] = 'G';    }#endif	// ENABLE_FRAME_TRACE    return pPacket;}/**************************************************************************** *  Method: *    CVideoFormat::Reset * */void CVideoFormat::Reset(void){    _Reset();}void CVideoFormat::_Reset(){    m_pMutex->Lock();    CMediaPacket* pFrame;        while (!m_InputQueue.IsEmpty())    {	pFrame = (CMediaPacket*) m_InputQueue.RemoveHead();		pFrame->Clear();	delete pFrame;    }        FlushOutputQueue();    m_pMutex->Unlock();}/**************************************************************************** *  Method: *    CVideoFormat::DecodeFrame * */void CVideoFormat::FlushOutputQueue(void){    CMediaPacket* pFrame;    if (m_pOutputQueue)    {	while ((pFrame = (CMediaPacket*) m_pOutputQueue->Get()) != NULL)	{#ifdef ENABLE_FRAME_TRACE	    if (ulFrameTraceIdx < MAX_FRAME_TRACE_ENTRIES)	    {		frameTraceArray[ulFrameTraceIdx][2] = pFrame->m_ulTime;		frameTraceArray[ulFrameTraceIdx][0] = 		    (LONG32) pFrame->m_pData;		frameTraceArray[ulFrameTraceIdx++][1] = 'F';	    }#endif	// ENABLE_FRAME_TRACE	    pFrame->Clear();	    delete pFrame;	}    }}/**************************************************************************** *  Method: *    CVideoFormat::DecodeFrame * */BOOL CVideoFormat::DecodeFrame(void){    CMediaPacket* pEncodedPacket;    CMediaPacket* pDecodedPacket = NULL;    ULONG32 ulLoopCounter = 0;    m_pVideoRenderer->BltIfNeeded();    m_pDecoderMutex->Lock();    m_pMutex->Lock();        if ((!m_InputQueue.IsEmpty()) &&	(!m_pOutputQueue->IsFull()) &&	(!m_bDecodeSuspended))    {	do	{	    pEncodedPacket = (CMediaPacket*) m_InputQueue.RemoveHead();	    m_pMutex->Unlock();	    pDecodedPacket = CreateDecodedPacket(pEncodedPacket);	    if (pDecodedPacket)	    {#ifdef ENABLE_FRAME_TRACE		if (ulFrameTraceIdx < MAX_FRAME_TRACE_ENTRIES)		{		    frameTraceArray[ulFrameTraceIdx][2] = pDecodedPacket->m_ulTime;		    frameTraceArray[ulFrameTraceIdx][0] = 			(LONG32) pDecodedPacket->m_pData;		    frameTraceArray[ulFrameTraceIdx++][1] = 'D';		}#endif	// ENABLE_FRAME_TRACE		m_pOutputQueue->Put(pDecodedPacket);		
		if (pDecodedPacket->m_pData)		{		    m_pDecoderMutex->Unlock();		    m_pVideoRenderer->BltIfNeeded();		    return TRUE;		}	    }	    m_pDecoderMutex->Unlock();            if( m_LastError == HXR_OUTOFMEMORY )            {                m_bDecodeSuspended = TRUE;            }            else            {                m_pVideoRenderer->BltIfNeeded();            }	    ulLoopCounter++;	    m_pDecoderMutex->Lock();	    m_pMutex->Lock();	} while ((!m_InputQueue.IsEmpty()) &&		 (!m_pOutputQueue->IsFull()) &&		 ((ulLoopCounter++) < MAX_DECODE_SPIN) &&		 (!m_bDecodeSuspended));    }    m_pMutex->Unlock();    m_pDecoderMutex->Unlock();        return pDecodedPacket ? TRUE : FALSE;}/**************************************************************************** *  Method: *    CVideoFormat::ReturnDecodedPacket * */BOOL CVideoFormat::ReturnDecodedPacket(CMediaPacket* pDecodedPacket){    BOOL bPacketAccepted = FALSE;    if (pDecodedPacket)    {#ifdef ENABLE_FRAME_TRACE	if (ulFrameTraceIdx < MAX_FRAME_TRACE_ENTRIES)	{	    frameTraceArray[ulFrameTraceIdx][2] = pDecodedPacket->m_ulTime;	    frameTraceArray[ulFrameTraceIdx][0] = 		(LONG32) pDecodedPacket->m_pData;	    frameTraceArray[ulFrameTraceIdx++][1] = 'D';	}#endif	// ENABLE_FRAME_TRACE	    	bPacketAccepted = m_pOutputQueue->Put(pDecodedPacket);    }    return bPacketAccepted;}/**************************************************************************** *  Method: *    CVideoFormat::GetMaxDecodedFrames * */ULONG32 CVideoFormat::GetMaxDecodedFrames(void){    return MAX_BUFFERED_DECODED_FRAMES;}/**************************************************************************** *  Method: *    CVideoFormat::CreateDecodedPacket * */CMediaPacket* CVideoFormat::CreateDecodedPacket(CMediaPacket* pCodedPacket){    CMediaPacket* pDecodedPacket = NULL;    if (pCodedPacket != NULL)    {	pCodedPacket->Clear();	delete pCodedPacket;	pCodedPacket = NULL;    }    return pDecodedPacket;}/**************************************************************************** *  Method: *    CVideoFormat::OnDecodedPacketRelease * */void CVideoFormat::OnDecodedPacketRelease(CMediaPacket* &pPacket){#ifdef ENABLE_FRAME_TRACE    if (ulFrameTraceIdx < MAX_FRAME_TRACE_ENTRIES)    {	frameTraceArray[ulFrameTraceIdx][2] = pPacket->m_ulTime;	frameTraceArray[ulFrameTraceIdx][0] = 	    (LONG32) pPacket->m_pData;	frameTraceArray[ulFrameTraceIdx++][1] = 'R';    }#endif	// ENABLE_FRAME_TRACE    ;}/**************************************************************************** *  Method: *    CVideoFormat::InitBitmapInfoHeader * */HX_RESULT CVideoFormat::InitBitmapInfoHeader(    HXBitmapInfoHeader &BitmapInfoHeader,    CMediaPacket* pVideoPacket){    HX_RESULT retVal = HXR_OK;    return retVal;}/**************************************************************************** *  Method: *    CVideoFormat::GetDefaultPreroll * */ULONG32 CVideoFormat::GetDefaultPreroll(IHXValues* pValues){    return FORMAT_DEFAULT_PREROLL;}/**************************************************************************** *  Method: *    CVideoFormat::GetMinimumPreroll * */ULONG32 CVideoFormat::GetMinimumPreroll(IHXValues* pValues){    return FORMAT_MINIMUM_PREROLL;}/**************************************************************************** *  Method: *    CVideoFormat::GetMaximumPreroll * */ULONG32 CVideoFormat::GetMaximumPreroll(IHXValues* pValues){    return FORMAT_MAXIMUM_PREROLL;}/**************************************************************************** *  Method: *    CVideoFormat::GetMimeTypes * */const char** CVideoFormat::GetMimeTypes(void){    return NULL;}// *** IUnknown methods ***/*****************************************************************************  IUnknown::AddRef                                            ref:  hxcom.h**  This routine increases the object reference count in a thread safe*  manner. The reference count is used to manage the lifetime of an object.*  This method must be explicitly called by the user whenever a new*  reference to an object is used.*/STDMETHODIMP_(ULONG32) CVideoFormat::AddRef(){    return InterlockedIncrement(&m_lRefCount);}/*****************************************************************************  IUnknown::Release                                           ref:  hxcom.h**  This routine decreases the object reference count in a thread safe*  manner, and deletes the object if no more references to it exist. It must*  be called explicitly by the user whenever an object is no longer needed.*/STDMETHODIMP_(ULONG32) CVideoFormat::Release(){    if (InterlockedDecrement(&m_lRefCount) > 0)    {        return m_lRefCount;    }        delete this;    return 0;}/*****************************************************************************  IUnknown::QueryInterface                                    ref:  hxcom.h**  This routine indicates which interfaces this object supports. If a given*  interface is supported, the object's reference count is incremented, and*  a reference to that interface is returned. Otherwise a NULL object and*  error code are returned. This method is called by other objects to*  discover the functionality of this object.*/STDMETHODIMP CVideoFormat::QueryInterface(REFIID riid, void** ppvObj){    if (IsEqualIID(riid, IID_IUnknown))    {	AddRef();	*ppvObj = (IUnknown*)(IHXPlugin*) this;	return HXR_OK;    }        *ppvObj = NULL;    return HXR_NOINTERFACE;}HX_RESULTCVideoFormat::GetLastError(){    return m_LastError;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -