- 論壇徽章:
- 0
|
簡單地處理,可以用數(shù)組或鏈表來實(shí)現(xiàn),這樣總長固定,元素長可以不定。
以前處理視頻時(shí)的比較簡陋的實(shí)現(xiàn),不過不考慮其他情況讀寫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;
前后加上各變量初始化,就這么簡單。當(dāng)然效率一般,因?yàn)閿z像機(jī)每秒25幀,速度要求不高,所以上面這種普通的同步lock足夠用了。如果你要求效率高的話,可以考慮用不加鎖的內(nèi)存數(shù)組。
|
|