cframelist.cpp

来自「最近在学习directshow, Directshow实务精选的源代码」· C++ 代码 · 共 105 行

CPP
105
字号
//
// 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 + =
减小字号Ctrl + -
显示快捷键?