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

📄 cframelist.cpp

📁 最近在学习directshow, Directshow实务精选的源代码
💻 CPP
字号:
//
// CFrameList.cpp
//

/*-----------------------------------------------------*\
			HQ Tech, Make Technology Easy!       
 More information, please go to http://hqtech.nease.net.
/*-----------------------------------------------------*/

#include <streams.h>
#include "CFrameList.h"

////////////////////////////////////////////////////////////////////////////
CFrameList::CFrameList(long inFrameSize, long inMaxCount)
{
	mFrameCounter    = 0;
	mFrameSize       = inFrameSize;
	mMaxFrameCount   = inMaxCount;
	mLastFrameOffset = (mMaxFrameCount - 1) * mFrameSize;
	mFrameBuffer     = new BYTE[inFrameSize * inMaxCount];
	mReachEnd        = FALSE;
	mIndexWhenEndReached = 0;
}

CFrameList::~CFrameList()
{
	if (mFrameBuffer)
	{
		delete[] mFrameBuffer;
		mFrameBuffer = NULL;
	}
}

__inline void CFrameList::MoveOneFrameUp(void)
{
	for (int i = 1; i < mMaxFrameCount; i++)
	{
		BYTE * pCurrent = mFrameBuffer + i * mFrameSize;
		memcpy(pCurrent - mFrameSize, pCurrent, mFrameSize);
	}
}

void CFrameList::AddFrame(BYTE * inFrame)
{
	CAutoLock  lck(&mSyncBuffer);
	MoveOneFrameUp();
	// Then add new frame to the bottom of buffer
	memcpy(mFrameBuffer + mLastFrameOffset, inFrame, mFrameSize);
	mFrameCounter++;
}

void CFrameList::GetFrame(PBYTE * outFrame)
{
	mSyncBuffer.Lock();
	if (mFrameCounter < mMaxFrameCount)
	{
		*outFrame = NULL;
	}
	else
	{
		*outFrame = mFrameBuffer;
		// If reach end of stream, we should pop up the last sevel frames
		if (mReachEnd)
		{
			if (mIndexWhenEndReached < mMaxFrameCount)
			{
				*outFrame = mFrameBuffer + mIndexWhenEndReached * mFrameSize;
				mIndexWhenEndReached++;
			}
			else
			{
				*outFrame = NULL;
			}
		}
	}	

	// If no frame to pop up, remember to release the buffer-lock.
	if (*outFrame == NULL)
	{
		mSyncBuffer.Unlock();
	}
}

void CFrameList::ReleaseFrame(void)
{
	mSyncBuffer.Unlock();
}

// Determine if the frame buffer is full filled?
BOOL CFrameList::IsFrameBufferFull(void)
{
	return (mFrameCounter >= mMaxFrameCount);
}

void CFrameList::Flush(void)
{
	CAutoLock  lck(&mSyncBuffer);
	mFrameCounter = 0;
}

void CFrameList::SetReachEnd(BOOL inIsEnd)
{
	mReachEnd = inIsEnd;
	mIndexWhenEndReached = 0;
}

⌨️ 快捷键说明

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