typedef struct tagPoolHead{,下面我们就来聊聊关于回顾性队列的设计?接下来我们就一起去了解一下吧!
回顾性队列的设计
- 在多媒体通信中,循环队列是常用的工具之一,尤其是在当前的直播及短视频应用,更是非常的广泛,那么循环队列该如何设计,是大家烧不过的话题。下面就粗略的谈谈循环队列的设计,和大奖一起探讨!
- 构建循环队列池的数据结构:如下:(说明: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:研发人员,可以根据需要完善其中函数实现,即可完成循环队列的实现,完成后,可以将该循环对列封装库的形式供其他音视频应用人员使用。
,