- 论坛徽章:
- 0
|
简单地处理,可以用数组或链表来实现,这样总长固定,元素长可以不定。
以前处理视频时的比较简陋的实现,不过不考虑其他情况读写h264帧够用了:
HRESULT CCycleBuffer::WriteBuffer(IN void* pBuffer, IN int nLength)
{
CAutoLock lock(&m_cStateLock);
CopyMemory(m_pCycleBuffer[m_nWriteIndex].pBuffer, pBuffer, min(m_nBufLen, nLength));
m_pCycleBuffer[m_nWriteIndex].lLength = min(m_nBufLen, nLength);
m_nWriteIndex++;
m_nWriteIndex %= m_nBufCount;
return S_OK;
}
HRESULT CCycleBuffer::ReadBuffer(IN void* pBuffer, IN OUT int* pReadLength)
{
CheckPointer(pReadLength, E_POINTER);
CheckPointer(pBuffer, E_POINTER);
CAutoLock lock(&m_cStateLock);
if (m_nReadIndex == m_nWriteIndex || m_pCycleBuffer[m_nReadIndex].lLength == 0)
{ //Can't read
m_cStateLock.Unlock();
*pReadLength = 0;
return S_OK;
}
CopyMemory(pBuffer, m_pCycleBuffer[m_nReadIndex].pBuffer, min(m_pCycleBuffer[m_nReadIndex].lLength, *pReadLength));
* pReadLength = min(m_pCycleBuffer[m_nReadIndex].lLength, *pReadLength);
m_pCycleBuffer[m_nReadIndex].lLength = 0;
m_nReadIndex++;
m_nReadIndex %= m_nBufCount;
return S_OK;
}
其中:CYCLE_BUFFER* m_pCycleBuffer;
typedef struct _tagCycleBuffer
{
BYTE* pBuffer;
long lLength;
}CYCLE_BUFFER;
前后加上各变量初始化,就这么简单。当然效率一般,因为摄像机每秒25帧,速度要求不高,所以上面这种普通的同步lock足够用了。如果你要求效率高的话,可以考虑用不加锁的内存数组。
|
|