当前位置:   article > 正文

一种FIFO实现原理

如何自制一个简单的fifo器件

    FIFO是模拟双端口缓冲器而设计的,先进的数据先出,进出的数据可以是1个至n个不等,主要解决时序问题。就像排队买菜,先来的排在前面,后来的排后面,先来的先买菜。

1. 策略:排队需要缓冲区BUF队列,模仿“排队买菜”和“双端口器件”原理,维持BUF队列中第一个数据永远在第一个存储位。

2. 读出:一个或n个,从第一个存储位开始读,读完后将剩余数据提到最前端,第一个数据对齐第一个存储位。

3. 写入:从队列后加入。

头文件:

  1. #ifndef FIFOH
  2. #define FIFOH
  3. #include <windows.h>
  4. #define FifoMaxBufSize 200000UL //200KB
  5. class CFIFO
  6. {
  7. public:
  8. int iFifoBufSize;//当前缓冲区数
  9. void Reset(void);//复位数据
  10. bool Read(BYTE *pData, int iReadSize);//读出
  11. bool Write(BYTE *pData, int iWriteSize);//写入
  12. private:
  13. BYTE Buf[FifoMaxBufSize];//缓冲区队列
  14. };
  15. #endif

源文件:

  1. #include "FIFO.h"
  2. void CFIFO::Reset(void)//复位数据
  3. {
  4. iFifoBufSize = 0;//复位当前缓冲区数
  5. }
  6. bool CFIFO::Read(BYTE *pData, int iReadSize)//读出
  7. {
  8. if(iReadSize > iFifoBufSize) return false;//要求不能满足
  9. memcpy(pData, Buf, iReadSize);//考出
  10. iFifoBufSize -= iReadSize;//减去移走数据
  11. if (iReadSize > 0)//有数据需要移动
  12. {
  13. memcpy(&Buf[0], &Buf[iReadSize], iFifoBufSize);//移动缓冲区剩余数据至顶部
  14. }
  15. return true;
  16. }
  17. bool CFIFO::Write(BYTE *pData, int iWriteSize)//写入
  18. {
  19. if ((iFifoBufSize + iWriteSize) > FifoMaxBufSize) return false;//要求不能满足
  20. memcpy(&Buf[iFifoBufSize], pData, iWriteSize);//从队尾处写入
  21. iFifoBufSize += iWriteSize;//加入写入量
  22. return true;
  23. }

在读取FFmpeg解压后音频片数据获得成功,其他应用可调整最大队列量,确保不溢出。  

  

转载于:https://www.cnblogs.com/hbg200/p/10599312.html

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/酷酷是懒虫/article/detail/1009800
推荐阅读
相关标签
  

闽ICP备14008679号