免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3496 | 回复: 4
打印 上一主题 下一主题

[其他] 环形缓冲区 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-09-02 09:46 |只看该作者 |倒序浏览
20可用积分
通常看到的环形缓冲区里面的节点长度通常是相同的, 问下有没有长度不不固定的环形缓冲区的开源实现?
最好要总得内存大小固定, 读写高效

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
2 [报告]
发表于 2014-09-02 09:56 |只看该作者
数据项前面加个长度信息,应该很容易改造

论坛徽章:
0
3 [报告]
发表于 2014-09-02 10:05 |只看该作者
简单地处理,可以用数组或链表来实现,这样总长固定,元素长可以不定。
以前处理视频时的比较简陋的实现,不过不考虑其他情况读写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足够用了。如果你要求效率高的话,可以考虑用不加锁的内存数组。

论坛徽章:
0
4 [报告]
发表于 2014-09-02 11:03 |只看该作者
谢谢楼上

1. min(m_nBufLen, nLength) 可能造成数据丢失
2. 读写的时候用了内存拷贝
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP