// // 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); }