FrameQueue.cpp 1.52 KB
#include "FrameQueue.h"

FrameQueue::FrameQueue(/* args */)
{
    for (size_t i = 0; i < Maxsize; i++)
    {
        base[i] = av_frame_alloc();
    }

	front = rear = 0;//头指针和尾指针置为零,队列为空
}

FrameQueue::~FrameQueue()
{
    if (base)
	{
        for (size_t i = 0; i < Maxsize; i++)
        {
            if (base[i])
            {
                av_frame_free(&base[i]);
            }
        }
	}

    rear = front = 0;
}
 
//循环队列的入队
AVFrame* FrameQueue::getTail()
{
	//插入一个元素e为Q的新的队尾元素
	if ((rear + 1) % Maxsize == front)
		return nullptr;//队满
	return base[rear];//获取队尾元素
}

// 将队尾元素添加到队列中
void FrameQueue::addTail()
{
     rear = (rear + 1) % Maxsize;//队尾指针加1
}
 
//循环队列的出队
AVFrame* FrameQueue::deQueue()
{
	//删除Q的队头元素,用e返回其值
	if (front == rear)
		return nullptr;//队空
	AVFrame* e = base[front];//保存队头元素
	front = (front + 1) % Maxsize;//队头指针加1
	return e;
}
 
//取循环队列的队头元素
AVFrame* FrameQueue::getHead()
{
	//返回Q的队头元素,不修改队头指针
	if (front == rear)
		return nullptr;//队列为空,取元素失败
	return base[front];
}

void FrameQueue::addHead()
{
    front = (front + 1) % Maxsize;//队头指针加1
}

int FrameQueue::length()
{
    return (rear - front + Maxsize) % Maxsize;
}

bool FrameQueue::isEmpty()
{
	if (front == rear)
		return true;

	return false;
}

void FrameQueue::clearQueue()
{
	rear = front = 0;
}