typedef struct tagPoolHead{,下面我们就来聊聊关于回顾性队列的设计?接下来我们就一起去了解一下吧!

回顾性队列的设计(循环队列的设计概述)

回顾性队列的设计

  1. 在多媒体通信中,循环队列是常用的工具之一,尤其是在当前的直播及短视频应用,更是非常的广泛,那么循环队列该如何设计,是大家烧不过的话题。下面就粗略的谈谈循环队列的设计,和大奖一起探讨!
  2. 构建循环队列池的数据结构:如下:(说明:AV开头的为自定义类型,例如AVInt为自定义的整形数据类型,下同)

typedef struct tagPoolHead

{

AVInt lQueueMaxNum; /* 队列的最大个数 */

AVInt lQueueMaxSize; /* 每个队列的最大大小 */

AVInt lElemMaxNum; /* 队列的最大元素的个数 */

AVInt lElemMaxSize; /* 每个元素的最大大小 */

AVUChar *pcPoolData; /* 队列数据 */

} PoolHead_ST;

队列头数据结构:

typedef struct tagQueueHead

{

AVBool blIsUsed; /* 本队列是否使用 */

AVInt lElemMaxNum; /* 队列的最大元素的个数 */

AVInt lElemMaxSize; /* 每个元素的最大大小 */

AVInt lQueueHead; /* 对列头 */

AVInt lQueueTail; /* 队列尾 */

AVInt alElemCurLen[400]; /* 元素的当前长度 */

AVUChar *pcQueueData; /* 元素数据 */

} QueueHead_ST;

3. 创建完基本的数据结构后,后续主要就是要实现几个关键的函数。

函数1:构建对列池函数并实现之,如下:(说明:HPOOL为队列池句柄,相当于对象)

HPOOL utPoolConstruct(AVInt lQueueMaxNum,

AVInt lElemMaxNum,

AVInt lElemMaxSize)

函数2:销毁对列池函数:AVVoid utPoolDestroy(HPOOL hPool);

函数3:从对列池中分配队列:HQUEUE utPoolAllocQueue(HPOOL hPool);(说明:HQUEUE为队列句柄)

函数4:从对列池中销毁队列:AVVoid utPoolFreeQueue(HPOOL hPool, HQUEUE hQueue)

函数5:判断队列是否已满函数:AVBool utQueueIsFull(HQUEUE hQueue);

函数6:往队列中放入数据:AVInt utQueuePutData(HQUEUE hQueue, AVChar *pcData, AVInt lLen);

函数7:判断队列是否已空函数:AVBool utQueueIsEmpty(HQUEUE hQueue);

函数8:从队列中获取数据:AVInt utQueueGetData(HQUEUE hQueue, AVChar **pcData, AVInt *plLen);

函数9:释放队列中的数据:AVVoid utQueueReleaseData(HQUEUE hQueue);

4:研发人员,可以根据需要完善其中函数实现,即可完成循环队列的实现,完成后,可以将该循环对列封装库的形式供其他音视频应用人员使用。

,