24#include <libavcodec/avcodec.h>
27#include <vdr/dvbspu.h>
29#include <vdr/status.h>
30#include <vdr/thread.h>
57 m_pipUseAlt(m_pConfig->ConfigPipUseAlt)
135 cDevice::MakePrimaryDevice(
on);
146 if (device != cDevice::PrimaryDevice())
323 LOGDEBUG(
"device: audio only detected");
327 LOGDEBUG(
"device: video only detected");
331 LOGFATAL(
"device: buffering threshold reached and no a/v available. This is a bug.");
370 LOGFATAL(
"device: play event in PLAY state with NONE playback mode. This is a bug.");
839 if (data[0] == 0x47) {
840 cDevice::StillPicture(data, size);
1045 LOGDEBUG2(
L_CODEC,
"Stream: %02X%02X%02X | %02X | %02X%02X | %02X%02X%02X | %02X%02X%02X%02X %02X%02X%02X%02X %02X%02X%02X%02X %02X%02X%02X%02X",
1107 auto now = std::chrono::steady_clock::now();
1149 }
while (
avpkt !=
nullptr);
1254 if (
stream->IsInputBufferFull())
1267 auto now = std::chrono::steady_clock::now();
1377 LOGDEBUG2(
L_AV_SYNC,
"First received PTS: %s (audio), %s (video) buffer fill levels: %ldms (audio) %ldms (video)",
1433 if (!width || !height) {
1446 LOGDEBUG2(
L_GRAB,
"device: %s: %d, %d, %d, %dx%d",
__FUNCTION__, size,
jpeg,
quality, width, height);
1487 if (width <= 0 || height <= 0)
1493 return cRect(x, y, width, height);
1744 if (cDevice::Replaying()) {
1871 LOGDEBUG(
"Add display mode change event to %s mode %dx%d@%.2f%s",
1888 LOGDEBUG(
"Set display mode: %dx%d@%.2f%s",
1902 : cThread(
"event handler"),
1904 m_pEventReceiver(device)
1922 LOGDEBUG(
"device: event queue handler thread started");
1925 std::vector<Event>
local;
1938 LOGDEBUG(
"device: event queue handler thread stopped");
Audio Interface Header File.
virtual void OnEventReceived(const Event &)=0
void FlushBuffers(void)
Flush the audio decoder buffers.
void Decode(const AVPacket *)
Forward an audio packet either to the decoder or passthrough.
AVCodecID GetCodecId() const
void SetPassthroughMask(int)
Set audio pass-through mask.
void Open(AVCodecID, AVCodecParameters *=nullptr, AVRational={ .num=1,.den=90000 })
Open and initiate the audio decoder.
void Close(void)
Close the audio decoder.
void AddEvent(Event)
Add an event to the queue.
std::vector< Event > m_eventQueue
event fifo queue
cEventHandler(cSoftHdDevice *)
Create and start the event handler thread.
std::mutex m_mutex
queue mutex
virtual ~cEventHandler(void)
Stop and delete the event handler thread.
IEventReceiver * m_pEventReceiver
pointer to event receiver
virtual void Action(void) override
Periodically send events in the queue to the final event receiver/handler.
int GetQuirks(void)
Get Hardware Quirks.
int GetShortTermMaxJitterMs(void)
int GetLongTermMaxJitterMs(void)
void PacketReceived(void)
Called each time a packet is received.
void Reset(void)
Resets the jitter tracker.
void ChannelChange(int)
Change the pip channel.
void SwapPosition(void)
Swap pip between normal and alternative position.
void Toggle(void)
Toggle picture-in-picture.
void Disable(void)
Stop picture-in-picture.
void ChannelSwap(bool)
Swap the pip channel with main live channel.
void Enable(void)
Start picture-in-picture.
void SetSize(void)
Set size and position for the pip window.
AVPacket * PopAvPacket(void) override
Pop an audio AVPacket from the reassembly buffer.
Video Stream Reassembly Buffer.
AVPacket * PopAvPacket(void) override
bool HasLeadingZero(const uint8_t *, int)
Check if video data has a leading zero byte before the start code.
bool ParseCodecHeader(const uint8_t *, int)
Parse video codec header to detect codec type.
void Reset(void)
Reset the reassembly buffer.
virtual void Push(const uint8_t *data, int size, int64_t pts)
void LazyInit(void)
Initialize audio output module (alsa)
void ResetHwDelayBaseline(void)
Reset the hw delay baseline.
int64_t GetInputPtsMs(void)
void SetHwDelayBaseline(void)
Set the hw delay baseline.
int64_t GetHardwareOutputPtsTimebaseUnits(void)
Get the hardware output PTS in timebase units.
void SetVolume(int)
Set mixer volume (0-1000)
void DropSamplesOlderThanPtsMs(int64_t)
Drop samples older than the given PTS.
int64_t GetOutputPtsMs(void)
Get the output PTS of the ringbuffer.
void ClockDriftCompensation(void)
Calculate clock drift compensation.
void Exit(void)
Cleanup audio output module (alsa)
void SetPaused(bool)
Set audio playback pause state.
void SetPassthroughMask(int mask)
void FlushBuffers(void)
Flush audio buffers.
bool ConfigParseH264Dimensions
parse h264 stream for width and height for decoder init
sDrmMode RequestedDrmMode
is set to the requested mode which should be changed to
int ConfigVideoAudioDelayMs
config audio delay
std::atomic< int > StatMaxLongTermAudioJitterMs
logged max overall audio jitter since stream start
int ConfigMaxSizeGPUImageCache
config max gpu image cache size
std::atomic< int > StatMaxShortTermAudioJitterMs
logged max audio jitter of the last 1000 packets
int ConfigDecoderFallbackToSwNumPkts
maximum number of packets sent before fallback to sw decoder
std::vector< sDrmMode > CollectedDrmModes
collected available drm modes on the current connector
bool ConfigDisableDeint
disable deinterlacer
int ConfigDisableOglOsd
config disable ogl osd
int ConfigAdditionalBufferLengthMs
config size ms of a/v buffer
bool CompareCurrentMode(sDrmMode *)
Return true, if the given mode is equal to the current display mode.
std::atomic< int > StatMaxShortTermVideoJitterMs
logged max video jitter of the last 1000 packets
bool ConfigDecoderNeedsIFrame
start h264 decoder only when an I-Frame arrives
sDrmMode AutoDetectedDrmMode
auto detected mode on the first startup (maybe equal to UserSetMode)
std::atomic< int > StatMaxLongTermVideoJitterMs
logged max overall video jitter since stream start
sDrmMode CurrentVideoDrmMode
currently used video drm mode
Output Device Implementation.
void SetState(State)
Sets the device into the given state.
void OsdDrawARGB(int, int, int, int, int, const uint8_t *, int, int)
Draw an OSD pixmap.
cReassemblyBufferVideo m_videoReassemblyBuffer
video pes reassembly buffer
void Stop(void)
Called by VDR when the plugin is stopped.
bool m_pipUseAlt
use alternative pip position
cReassemblyBufferVideo m_pipReassemblyBuffer
pip pes reassembly buffer
void PipChannelSwap(bool)
cVideoStream * m_pPipStream
pointer to pip video stream
void FlushAudio(void)
Clear all audio data from the decoder and ringbuffer.
void PipSwapPosition(void)
static constexpr int MIN_BUFFER_FILL_LEVEL_THRESHOLD_MS
min buffering threshold in ms
int m_volume
track the volume in the device (for attach)
void SetScreenSize(int, int)
Set the screen size.
virtual void StillPicture(const uchar *, int)
Display the given I-frame as a still picture.
void HandleDisplayModeChange(const sDrmMode &)
Set the display mode.
cSoftOsdProvider * m_pOsdProvider
pointer to cSoftOsdProvider object
cVideoStream * m_pVideoStream
pointer to main video stream
cReassemblyBufferAudio m_audioReassemblyBuffer
audio pes reassembly buffer
int MaxSizeGPUImageCache(void)
Get the maximum GPU image cache size.
std::atomic< bool > m_receivedAudio
flag if audio packets have been received
void SetRenderPipSize(void)
cDvbSpuDecoder * m_pSpuDecoder
pointer to spu decoder
void OnEnteringState(State)
Actions to be performed when entering a state.
int Start(void)
Called by VDR when the plugin is started.
void SetEnableOglOsd(void)
Enables OpenGL/ES Osd.
virtual void GetVideoSize(int &, int &, double &)
Get the video size.
int PlayAudioPkts(AVPacket *)
Play an audio packet.
virtual void GetOsdSize(int &, int &, double &)
Returns the width, height and aspect ratio the OSD should have.
void SetEnableHdr(bool)
Enable HDR display mode.
void SetRenderPipActive(bool)
void GetStats(int *, int *, int *)
Get statistics from the renderer.
void ResetChannelId(void)
Reset the channel ID (restarts audio)
cHardwareDevice * m_pHardwareDevice
pointer to hardware device description
virtual bool CanReplay(void) const
Return true if this device can currently start a replay session.
virtual void SetDigitalAudioDevice(bool)
std::mutex m_mutex
mutex to lock the state machine
virtual bool HasDecoder(void) const
Tells whether this device has an MPEG decoder.
virtual void Clear(void)
Clears all video and audio data from the device.
cEventHandler * m_pEventHandler
event handler thread
void OnEventReceived(const Event &)
Event handler for playback state transitions.
cPipHandler * m_pPipHandler
pointer to pip handler
void Detach(void)
Detach the device.
virtual int PlayVideo(const uchar *, int)
Play a video packet of the main videostream.
void ResetPipStream(void)
Resets pip stream and render pipeline.
std::chrono::steady_clock::time_point m_dataReceivedTime
timestamp, when the first audio or video data after a channel switch arrives in Play*()
std::atomic< State > m_state
current plugin state, normal plugin start sets detached state
void OnLeavingState(State)
Actions to be performed when leaving a state.
virtual bool SetPlayMode(ePlayMode)
Sets the device into the given play mode.
cAudioDecoder * m_pAudioDecoder
pointer to cAudioDecoder object
void SetAudioCodec(enum AVCodecID, AVCodecParameters *, AVRational)
Open an audio codec.
virtual void Play(void)
Sets the device into play mode (after a previous trick mode, or pause)
bool IsBufferingThresholdReached(void)
Check if the buffering threshold has been reached.
cVideoRender * m_pRender
pointer to cVideoRender object
virtual void SetAudioChannelDevice(int)
void SetOsdSize(int, int)
Set the OSD size.
cSoftHdGrab * m_pGrab
pointer to grabber object
int OglOsdIsDisabled(void)
Is the OpenGL/ES osd disabled?
cSoftHdDevice(cSoftHdConfig *)
Create the device.
int PlayPipVideo(const uchar *, int)
Play a video packet of the pip videostream.
bool m_needsMakePrimary
true, if device should be made a primary device after attach
virtual void ChannelSwitch(const cDevice *, int, bool)
Monitor a channel switch triggered by VDR (cStatus::ChannelSwitch())
cSoftHdAudio * m_pAudio
pointer to cSoftHdAudio object
cSoftHdConfig * m_pConfig
pointer to cSoftHdConfig object
virtual cRect CanScaleVideo(const cRect &, int taCenter)
Ask the output, if it can scale video.
virtual void SetVolumeDevice(int)
Sets the audio volume on this device (Volume = 0...255).
virtual int64_t GetSTC(void)
Gets the current System Time Counter, which can be used to synchronize audio, video and subtitles.
virtual bool Flush(int=0)
Flush the device output buffers.
bool IsDetached(void) const
Returns true, if the device is detached.
virtual void TrickSpeed(int, bool)
Sets the device into a mode where replay is done slower.
std::chrono::steady_clock::time_point m_channelSwitchStartTime
timestamp, when VDR triggered a channel switch
void SetDecoderFallbackToSw(bool)
Force the decoder to fallback to software if the hardware decoder fails after the configured amount o...
virtual int PlayAudio(const uchar *, int, uchar)
Play an audio packet.
bool PipIsEnabled(void)
Returns true, if pip is currently enabled.
std::mutex m_sizeMutex
mutex to lock screen size (which is accessed by different threads)
bool Initialize(void)
Initialize the device.
std::atomic< bool > m_receivedVideo
flag if video packets have been received
void SetDecoderNeedsIFrame(void)
Forces the h264 decoder to wait for an I-Frame to start.
virtual int GetAudioChannelDevice(void)
int PlayVideoPkts(AVPacket *)
Play a video packet.
std::atomic< bool > m_receivedValidAudio
flag if valid audio packets have been received
cJitterTracker m_audioJitterTracker
audio jitter tracker
std::atomic< bool > m_receivedValidVideo
flag if valid video packets have been received
int GetBufferFillLevelThresholdMs()
Returns the buffer fill level threshold in milliseconds.
void HandleStillPicture(const uchar *data, int size)
The still picture data received from VDR can contain multiple PES packets.
int PlayVideoInternal(cVideoStream *, cReassemblyBufferVideo *, const uchar *, int, bool, bool)
Play a video packet.
virtual void SetVideoDisplayFormat(eVideoDisplayFormat)
Sets the video display format.
virtual void Freeze(void)
Puts the device into "freeze frame" mode.
void SetParseH264Dimensions(void)
Parse the h264 stream width and height before starting the decoder.
void SetDisableOglOsd(void)
Disables OpenGL/ES Osd (called from setup menu or conf)
bool m_forceDetached
start the plugin in detached state
virtual ~cSoftHdDevice(void)
Destroy the device.
int m_audioChannelID
current audio channel ID
virtual void SetVideoFormat(bool)
Set the video format.
virtual void MakePrimaryDevice(bool)
Informs a device that it will be the primary device.
void SetVideoCodec(enum AVCodecID, AVCodecParameters *, AVRational)
Open a video codec.
void SetPassthroughMask(int)
Set the passthrough mask (called from setup menu or conf)
void SetDisableDeint(void)
Disables deinterlacer (called from setup menu or conf)
virtual uchar * GrabImage(int &, bool, int, int, int)
Grabs the currently visible screen image.
virtual cSpuDecoder * GetSpuDecoder(void)
Get the device SPU decoder.
cJitterTracker m_videoJitterTracker
video jitter tracker
virtual void SetAudioTrackDevice(eTrackType)
std::atomic< PlaybackMode > m_playbackMode
current playback mode
void OsdClose(void)
Close the OSD.
int64_t GetFirstAudioPtsMsToPlay()
Calculate the first audio PTS that should be played during synchronized playback.
virtual void ScaleVideo(const cRect &=cRect::Null)
Scale the currently shown video.
int64_t GetFirstVideoPtsMsToPlay()
void SetDisplayMode(int)
Trigger a display mode change event if the mode changed.
void PipChannelChange(int)
virtual bool Poll(cPoller &, int=0)
Return true if the device itself or any of the file handles in poller is ready for further action.
void Attach(void)
Attach the device again.
bool m_externalPlayerActive
true, if we detached for an external player
bool Start(bool, int, int, int, int, int)
Start a grab in the video renderer.
bool ProcessGrab(void)
Start the conversion.
void Finish(void)
Clean up.
void RequestStopOpenGlThread(void)
Initiate a stop of the OpenGL thread without waiting.
void StopOpenGlThread(void)
Stop the OpenGL thread and cancel it if necessary.
void UnlockOpenGlThread(void)
Unlock the OpenGL thread.
bool LockOpenGlThread(void)
Lock the OpenGL thread.
void PushPipFrame(AVFrame *)
Push a PiP frame into the render ringbuffer.
bool IsOutputBufferFull(void)
Check, if the main render output buffer is full.
void SetEnableHdr(bool enable)
void Reset()
Reset the renderer.
void ResetBufferReuseStrategy()
void ReInitDisplayMode(void)
Re-Initialize the drm device with current display mode settings.
void OsdClear(void)
Clear the OSD (draw an empty/ transparent OSD)
void ScheduleVideoPlaybackPauseAt(int64_t ptsMs)
void ScheduleResyncAtPtsMs(int64_t ptsMs)
void ClearDecoderToDisplayQueue(void)
Clear (empty) the decoder to display queue.
void Init(void)
Initialize the renderer.
void ResetDecodingStrategy()
void Exit(void)
Exit and cleanup the renderer.
void ResetPipBufferReuseStrategy()
void GetStats(int *, int *, int *)
Get some rendering statistics.
void DisplayBlackFrame(void)
Display a black video frame.
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.
int64_t GetOutputPtsMs(void)
Get the output PTS in milliseconds.
void SetPipActive(bool on)
void ClearPipDecoderToDisplayQueue(void)
Clear (empty) the decoder to display queue.
cQueue< cDrmBuffer > * GetPipOutputBuffer(void)
void SetStillpicture(bool active)
void SchedulePlaybackStartAtPtsMs(int64_t ptsMs)
int64_t GetVideoClock(void)
void OsdDrawARGB(int, int, int, int, int, const uint8_t *, int, int)
Draw an OSD ARGB image.
void SetScheduleAudioResume(bool resume)
void SetDisplayOneFrameThenPause(bool pause)
void SetPipSize(bool)
Set the size and position of the pip window.
void SetPlaybackPaused(bool pause)
void ResetFrameCounter(void)
Send start condition to video thread.
bool CanHandleMode(sDrmMode *)
Wrapper to check, if drm can handle the display mode.
void SetTrickSpeed(double, bool, bool)
Set the trickspeed parameters.
void ResetPipDecodingStrategy()
cQueue< cDrmBuffer > * GetMainOutputBuffer(void)
void GetVideoSize(int *, int *, double *)
Get video size and aspect ratio.
void SetDecoderFallbackToSwNumPkts(int numPackets)
void Flush(void)
Flushes the video stream by finalizing any pending data.
void StartDecoder()
Start the decoder.
void ClearVdrCoreToDecoderQueue(void)
Clears all video stream data, which is buffered to be decoded.
int GetVideoPacketMax(void)
void SetStartDecodingWithIFrame(bool enable)
size_t GetAvPacketsFilled(void)
void DisableDeint(bool disable)
void CloseDecoder(void)
Close the decoder.
void Exit(void)
Exit video stream.
void CancelFilterThread(void)
Stop filter thread.
void FlushDecoder(void)
Flush the decoder.
void Open(AVCodecID, AVCodecParameters *=nullptr, AVRational={ .num=1,.den=90000 })
Open a video codec.
bool PushAvPacket(AVPacket *avpkt)
Pushes a pre-assembled AVPacket directly to the processing queue.
bool IsInputBufferFull(void)
void ResetFilterThreadNeededCheck()
int64_t GetInputPtsMs(void)
void SetParseH264Dimensions(bool enable)
virtual void SetDeinterlacerDeactivated(bool deactivate)
void ResetTrickSpeedFramesSentCounter(void)
Audio Decoder Header File.
Plugin Configuration Header File.
@ CONFIG_DISPLAY_MODE_DEFAULT
@ CONFIG_DISPLAY_MODE_FOLLOW_VIDEO_INTERLACED
@ CONFIG_DISPLAY_MODE_FOLLOW_VIDEO
@ CONFIG_DISPLAY_MODE_MANUAL
__attribute__((weak)) union gbm_bo_handle gbm_bo_get_handle_for_plane(struct gbm_bo *bo
State Machine and Event Header File.
Grabbing Interface Header File.
const char * EventToString(const Event &e)
const char * StateToString(State s)
static void PrintStreamData(const uchar *payload)
Print the start code, stream id, length, first three bytes (start code) of the payload,...
#define LOGDEBUG2
log to LOG_DEBUG and add a prefix
#define LOGDEBUG
log to LOG_DEBUG
#define LOGERROR
log to LOG_ERR
std::variant< PlayEvent, PauseEvent, StopEvent, TrickSpeedEvent, StillPictureEvent, DetachEvent, AttachEvent, BufferUnderrunEvent, BufferingThresholdReachedEvent, ScheduleResyncAtPtsMsEvent, ResyncEvent, DisplayChangeEvent > Event
#define LOGWARNING
log to LOG_WARN
#define LOGFATAL
log to LOG_ERR and abort
static const char * Timestamp2String(int64_t ts, uint8_t divisor)
Nice time-stamp string.
@ L_AV_SYNC
audio/video sync logs
Describes a hardware device.
Jitter Tracking of Incoming Packets Header File.
PES Packet Parser Header File.
PiP (Picture-in-Picture) Interface Header File.
Output Device Header File.
OSD Provider Header File.
Holds possible display configurations.
bool interlaced
is this an interlaced mode?
double refreshRateHz
display refresh rate
Video Renderer (Display) Header File.
Video Input Stream Header File.