You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
59 lines
1.4 KiB
59 lines
1.4 KiB
#ifndef VIDEO_BUFFER_H
|
|
#define VIDEO_BUFFER_H
|
|
|
|
#include <QMutex>
|
|
#include <QWaitCondition>
|
|
|
|
#include "fpscounter.h"
|
|
|
|
// forward declarations
|
|
typedef struct AVFrame AVFrame;
|
|
|
|
class VideoBuffer
|
|
{
|
|
public:
|
|
VideoBuffer();
|
|
virtual ~VideoBuffer();
|
|
|
|
bool init(bool renderExpiredFrames = false);
|
|
void deInit();
|
|
void lock();
|
|
void unLock();
|
|
|
|
AVFrame* decodingFrame();
|
|
// set the decoder frame as ready for rendering
|
|
// this function locks m_mutex during its execution
|
|
// returns true if the previous frame had been consumed
|
|
void offerDecodedFrame(bool& previousFrameSkipped);
|
|
|
|
// mark the rendering frame as consumed and return it
|
|
// MUST be called with m_mutex locked!!!
|
|
// the caller is expected to render the returned frame to some texture before
|
|
// unlocking m_mutex
|
|
const AVFrame* consumeRenderedFrame();
|
|
|
|
const AVFrame* peekRenderedFrame();
|
|
|
|
// wake up and avoid any blocking call
|
|
void interrupt();
|
|
|
|
private:
|
|
void swap();
|
|
|
|
private:
|
|
AVFrame* m_decodingFrame = Q_NULLPTR;
|
|
AVFrame* m_renderingframe = Q_NULLPTR;
|
|
QMutex m_mutex;
|
|
bool m_renderingFrameConsumed = true;
|
|
FpsCounter m_fpsCounter;
|
|
|
|
bool m_renderExpiredFrames = false;
|
|
QWaitCondition m_renderingFrameConsumedCond;
|
|
|
|
// interrupted is not used if expired frames are not rendered
|
|
// since offering a frame will never block
|
|
bool m_interrupted = false;
|
|
};
|
|
|
|
#endif // VIDEO_BUFFER_H
|