//
|
// Created by lilin on 2019-8-20.
|
//
|
|
#include "FrameQueue.h"
|
|
FrameQueue::FrameQueue() {
|
pthread_mutex_init(&mutexPacket, NULL);
|
pthread_cond_init(&condPacket, NULL);
|
}
|
|
|
int FrameQueue::putAvFrame(AVFrame *frame) {
|
pthread_mutex_lock(&mutexPacket);
|
queueFrame.push(frame);
|
pthread_cond_signal(&condPacket);
|
pthread_mutex_unlock(&mutexPacket);
|
return 0;
|
}
|
|
AVFrame *FrameQueue::getAvFrame() {
|
pthread_mutex_lock(&mutexPacket);
|
|
AVFrame *p = NULL;
|
if(!queueFrame.empty())
|
{
|
p = queueFrame.front();
|
queueFrame.pop();
|
} else{
|
pthread_cond_wait(&condPacket, &mutexPacket);
|
}
|
pthread_mutex_unlock(&mutexPacket);
|
return p;
|
}
|
|
void FrameQueue::clearQueue() {
|
pthread_mutex_lock(&mutexPacket);
|
while(true)
|
{
|
if(queueFrame.empty())
|
{
|
break;
|
}
|
AVFrame *p = queueFrame.front();
|
queueFrame.pop();
|
av_frame_free(&p);
|
p = NULL;
|
}
|
pthread_mutex_unlock(&mutexPacket);
|
}
|
|
void FrameQueue::notifyQueue() {
|
|
pthread_mutex_lock(&mutexPacket);
|
pthread_cond_signal(&condPacket);
|
pthread_mutex_unlock(&mutexPacket);
|
|
}
|
|
FrameQueue::~FrameQueue() {
|
clearQueue();
|
pthread_mutex_destroy(&mutexPacket);
|
pthread_cond_destroy(&condPacket);
|
}
|