14#ifndef __VIDEORENDER_H
15#define __VIDEORENDER_H
22#include <xf86drmMode.h>
25#include <libavutil/frame.h>
26#include <libavutil/hwcontext_drm.h>
35#include <vdr/thread.h>
59#define AV_SYNC_THRESHOLD_AUDIO_BEHIND_VIDEO_MS 35
60#define AV_SYNC_THRESHOLD_AUDIO_AHEAD_VIDEO_MS 5
222 virtual void Action(
void);
DRM Buffer: Get a Hardware Buffer to Reuse.
DRM Buffer: Get a Software Buffer to Reuse.
DRM Buffer: Get a Buffer to Use Once.
DRM Buffer Getting-Strategy.
virtual cDrmBuffer * GetBuffer(cDrmBufferPool *, AVDRMFrameDescriptor *)=0
virtual ~cBufferStrategy()=default
Prepare DRM Buffer for Hardware Decoding.
Prepare DRM Buffer for Software Decoding.
Strategy to Prepare DRM Buffer for Decoding.
virtual AVFrame * PrepareDrmBuffer(cDrmBuffer *, int, AVFrame *)=0
virtual ~cDecodingStrategy()=default
EGLDisplay EglDisplay(void)
EGLSurface EglSurface(void)
EGLContext EglContext(void)
size_t Size(void)
Get the current size of the queue.
Output Device Implementation.
int m_numWrongProgressive
counter for progressive frames sent in an interlaced stream (only used for logging)
int m_framesDuped
number of frames duplicated
bool m_osdShown
set, if osd is shown currently
cCondVar m_grabCond
condition gets signalled, if renederer finished to clone the grabbed buffers
EGLSurface EglSurface(void)
cDrmBuffer * m_pCurrentlyDisplayed
pointer to currently displayed DRM buffer
int m_pipScalePercent
scale factor for pip
int GetFramesFilled(void)
struct gbm_bo * m_pOldBo
pointer to old gbm buffer object (for later free)
EGLDisplay EglDisplay(void)
std::atomic< bool > m_resumeAudioScheduled
set, if audio resume is scheduled after a pause
struct gbm_bo * m_bo
pointer to current gbm buffer object
void SetEnableHdr(bool enable)
std::atomic< bool > m_forwardTrickspeed
true, if trickspeed plays forward
void ResetBufferReuseStrategy()
std::atomic< bool > m_displayOneFrameThenPause
set, if only one frame shall be displayed and then pause playback
std::vector< Event > m_eventQueue
event queue for incoming events
cDrmBufferPool m_pipDrmBufferPool
PIP pool of drm buffers.
cGrabBuffer m_grabVideo
keeps the current grabbed video
int m_framesDropped
number of frames dropped
std::atomic< int > m_framePresentationCounter
number of times the current frame has to be shown (for slow-motion)
std::atomic< bool > m_enableHdr
hdr is enabled
cGrabBuffer * GetGrabbedPipBuffer(void)
double m_refreshRateHz
screen refresh rate in Hz
void ScheduleVideoPlaybackPauseAt(int64_t ptsMs)
std::atomic< bool > m_pipActive
true, if pip should be displayed
void ScheduleResyncAtPtsMs(int64_t ptsMs)
void ResetDecodingStrategy()
std::atomic< bool > m_videoPlaybackPaused
set, if playback is frozen (used for pause)
std::atomic< int64_t > m_scheduleResyncAtPtsMs
if set, a resync (enter state BUFFERING) will be forced at the given pts
bool IsForwardTrickspeed(void)
cQueue< cDrmBuffer > m_drmBufferQueue
queue for DRM buffers to be displayed (VIDEO_SURFACES_MAX is defined in thread.h)
cGrabBuffer m_grabPip
keeps the current grabbed pip video
cGrabBuffer * GetGrabbedVideoBuffer(void)
cRect m_videoRect
rect of the currently displayed video
bool m_startgrab
internal flag to trigger grabbing
void ResetPipBufferReuseStrategy()
std::atomic< cDecodingStrategy * > m_pipDecodingStrategy
strategy for decoding setup
cGrabBuffer * GetGrabbedOsdBuffer(void)
std::atomic< cBufferStrategy * > m_bufferReuseStrategy
strategy to select drm buffers
bool IsStillpicture(void)
cSoftHdAudio * m_pAudio
pointer to cSoftHdAudio
AVRational m_timebase
timebase used for pts, set by first RenderFrame()
std::mutex m_mutex
mutex for thread control
std::atomic< int64_t > m_pts
current video PTS
int m_pipTopPercent
top margin for pip
cDrmBuffer * m_pBufOsd
pointer to osd drm buffer object
cHdrMetadata m_pHdrMetadata
hdr metadata object
std::mutex m_timebaseMutex
mutex used around m_timebase
EGLContext EglContext(void)
cSoftHdDevice * m_pDevice
pointer to cSoftHdDevice
void SetPipActive(bool on)
std::atomic< cBufferStrategy * > m_pipBufferReuseStrategy
strategy to select drm buffers
bool OglOsdDisabled(void)
std::atomic< bool > m_stillpicture
true, if stillpicture is active
cSoftHdConfig * m_pConfig
pointer to cSoftHdConfig
void SetVideoClock(int64_t pts)
IEventReceiver * m_pEventReceiver
pointer to event receiver
cQueue< cDrmBuffer > m_pipDrmBufferQueue
queue for PIP DRM buffers to be displayed (VIDEO_SURFACES_MAX is defined in thread....
cQueue< cDrmBuffer > * GetPipOutputBuffer(void)
void SetStillpicture(bool active)
bool m_disableOglOsd
set, if ogl osd is disabled
bool m_colorRangeStored
true, if the original color range was stored
void SchedulePlaybackStartAtPtsMs(int64_t ptsMs)
bool m_hasDoneHdrModeset
true, if we ever created an hdr blob and did a modesetting
cDrmBuffer * m_pCurrentlyPipDisplayed
pointer to currently displayed DRM buffer
int64_t GetVideoClock(void)
void SetScheduleAudioResume(bool resume)
cDrmDevice * m_pDrmDevice
pointer cDrmDevice object
cGrabBuffer m_grabOsd
keeps the current grabbed osd
std::atomic< double > m_trickspeedFactor
current trick speed
std::atomic< int64_t > m_videoPlaybackPauseScheduledAt
if set, video will be paused at the given pts
std::atomic< cDecodingStrategy * > m_decodingStrategy
strategy for decoding setup
void SetDisplayOneFrameThenPause(bool pause)
std::atomic< bool > m_trickspeed
true, if trickspeed is active
bool m_lastFrameWasDropped
true, if the last frame was dropped
int m_pipLeftPercent
left margin for pip
void SetPlaybackPaused(bool pause)
cDrmBufferPool m_drmBufferPool
pool of drm buffers
drmColorRange m_originalColorRange
initial color range
std::atomic< int64_t > m_schedulePlaybackStartAtPtsMs
if set, frames with PTS older than this will be dropped
int m_startCounter
counter for displayed frames, indicates a video start
bool m_videoIsScaled
true, if the currently displayed video is scaled
struct gbm_bo * m_pNextBo
pointer to next gbm buffer object (for later free)
void ResetPipDecodingStrategy()
cQueue< cDrmBuffer > * GetMainOutputBuffer(void)
cDrmBuffer m_bufBlack
black drm buffer object
HDR (High Dynamic Range) Header File.
State Machine and Event Header File.
Grabbing Interface Header File.
#define VIDEO_SURFACES_MAX
maximum video surfaces kept by the filter and render queues
void PushPipFrame(AVFrame *)
Push a PiP frame into the render ringbuffer.
void SetFrameFlags(AVFrame *, int)
Set frame flags.
int DrmHandleEvent(void)
Wrapper for drmHandleEvent()
bool IsOutputBufferFull(void)
Check, if the main render output buffer is full.
void SetHdrBlob(struct hdr_output_metadata)
Create an hdr blob and set it for the connector.
void Reset()
Reset the renderer.
void CreateGrabBuffers(bool)
Copy current video, osd and pip buffers to dedicated grabbing buffers.
int SetVideoBuffer(cDrmBuffer *)
Modesetting for video.
void ProcessEvents(void)
Process queued events and forward to event receiver.
void OsdClear(void)
Clear the OSD (draw an empty/ transparent OSD)
AVFrame * PrepareDrmBuffer(cDrmBuffer *, int, AVFrame *) override
cDrmBuffer * GetBuffer(cDrmBufferPool *, AVDRMFrameDescriptor *) override
int SetOsdBuffer(drmModeAtomicReqPtr)
Modesetting for osd.
void ClearDecoderToDisplayQueue(void)
Clear (empty) the decoder to display queue.
void Init(void)
Initialize the renderer.
void PushFrame(AVFrame *, bool, std::atomic< cBufferStrategy * > &, std::atomic< cDecodingStrategy * > &, cQueue< cDrmBuffer > *, cDrmBufferPool *)
Push the frame into the render ringbuffer.
void Exit(void)
Exit and cleanup the renderer.
AVFrame * PrepareDrmBuffer(cDrmBuffer *, int, AVFrame *) override
void SetColorSpace(drmColorRange)
Set kms color space, color encoding and color range.
~cVideoRender(void)
Destroy the video renderer.
void GetStats(int *, int *, int *)
Get some rendering statistics.
void DisplayBlackFrame(void)
void PushMainFrame(AVFrame *)
Push a main frame into the render ringbuffer.
void SetVideoOutputPosition(const cRect &)
Set size and position of the video on the screen.
int GetFrameFlags(AVFrame *)
Get frame flags.
int64_t GetOutputPtsMs(void)
Get the output PTS in milliseconds.
void ClearPipDecoderToDisplayQueue(void)
Clear (empty) the decoder to display queue.
int CommitBuffer(cDrmBuffer *, cDrmBuffer *)
Commit the frame to the hardware.
int TriggerGrab(void)
Trigger a screen grab.
int SetPipBuffer(cDrmBuffer *)
Modesetting for pip.
void ClearGrabBuffers(void)
Clear the grab drm buffers.
virtual void Action(void)
Thread loop, which tries to display frames and processes events.
void LogDroppedDuped(int64_t, int64_t, int)
Log A/V sync debug message.
bool DisplayFrame()
Display the frame (video and/or osd)
void Stop(void)
Stop the thread.
void OsdDrawARGB(int, int, int, int, int, const uint8_t *, int, int)
Draw an OSD ARGB image.
cDrmBuffer * GetBuffer(cDrmBufferPool *, AVDRMFrameDescriptor *) override
void SetScreenSize(int, int, double)
Wrapper to set the screen size in the device.
cDrmBuffer * GetBuffer(cDrmBufferPool *, AVDRMFrameDescriptor *) override
void SetPipSize(bool)
Set the size and position of the pip window.
bool PageFlip(cDrmBuffer *, cDrmBuffer *)
Do the pageflip.
void RestoreColorSpace()
Restore color space, color encoding and color range to BT709 and the original color range.
void ResetFrameCounter(void)
Send start condition to video thread.
int GetFramePresentationCount(int64_t)
Get the number of times the current frame shall be presented in trickspeed mode.
void SetTrickSpeed(double, bool, bool)
Set the trickspeed parameters.