13#ifndef __VIDEOSTREAM_H
14#define __VIDEOSTREAM_H
23#include <libavcodec/avcodec.h>
26#include <vdr/thread.h>
105 virtual void Action(
void);
cMainVideoStream(cVideoRender *render, cQueue< cDrmBuffer > *buf, cSoftHdConfig *config, std::function< void(AVFrame *)> fn)
cPipVideoStream(cVideoRender *render, cQueue< cDrmBuffer > *buf, cSoftHdConfig *config, std::function< void(AVFrame *)> fn)
void SetDeinterlacerDeactivated(bool) override
size_t Size(void)
Get the current size of the queue.
std::mutex m_mutex
mutex for decoding thread control
bool m_interlaced
flag for interlaced stream
int m_dropInvalidPackets
drop P-Frames with invalid references until the given number of I-Frames arrived
std::function< void(AVFrame *)> m_frameOutput
function to output the frame
const char * m_identifier
identifier string for logging
void SetDecoderFallbackToSwNumPkts(int numPackets)
cSoftHdConfig * m_pConfig
plugin config
int64_t m_inputPts
PTS of the first packet in the input buffer.
bool m_deinterlacerDeactivated
set, if the deinterlacer should be disabled temporarily (trickspeed, stillpicture,...
int m_sentTrickPkts
how many avpkt have been sent to the decoder in trickspeed mode?
int m_logPackets
parse and log all frames until the number of given I-Frames arrived
bool m_parseH264Dimensions
parse width and height when starting an h264 stream
cVideoDecoder * Decoder(void)
bool m_startDecodingWithIFrame
wait for an I-Frame to start h264 decoding
bool m_userDisabledDeinterlacer
set, if the user configured the deinterlace to be disabled
volatile bool m_newStream
flag for new stream
int m_ppsNumRefIdxL1DefaultActiveMinus1
cache NumRefIdxL1DefaultActiveMinuns1 from a previous PPS parsing
enum AVCodecID m_codecId
current codec id
int GetVideoPacketMax(void)
bool m_checkFilterThreadNeeded
set, if we have to check, if filter thread is needed at start of playback
int m_log2MaxFrameNumMinus4
cache Log2MaxFrameNumMinus4 from a previous SPS parsing
void SetStartDecodingWithIFrame(bool enable)
size_t GetAvPacketsFilled(void)
AVCodecParameters * m_pPar
current codec parameters
static constexpr int VIDEO_PACKET_MAX
max number of video packets held in the buffer
int m_decoderFallbackToSwNumPkts
fallback to sw decoder if hw decoder fails after the given number of packets sent
bool m_isResend
track, if we already tried to send the AVPacket to the decoder if so, skip the parsing
cQueue< cDrmBuffer > * m_pDrmBufferQueue
pointer to renderer's DRM buffer queue
void DisableDeint(bool disable)
bool IsDeinterlacerDeactivated(void)
int m_hardwareQuirks
hardware specific quirks
cVideoDecoder * m_pDecoder
video decoder
cVideoFilter m_videoFilter
pointer to deinterlace/scaling video filter thread
int m_maxFrameNum
= 1 << Log2MaxFrameNumMinus4 + 4
std::vector< std::string > m_naluTypesAtStart
array of strings to log the H.264 frames at stream start
int m_ppsNumRefIdxL0DefaultActiveMinus1
cache NumRefIdxL0DefaultActiveMinuns1 from a previous PPS parsing
cVideoRender * m_pRender
video renderer
int m_trickpkts
how many avpkt does the decoder need in trickspeed mode?
cQueue< AVPacket > m_packets
AVPackets queue.
bool IsInputBufferFull(void)
int64_t GetInputPts(void)
void ResetFilterThreadNeededCheck()
void SetParseH264Dimensions(bool enable)
virtual void SetDeinterlacerDeactivated(bool deactivate)
int m_numIFrames
counter for the arriving I-Frames at H.264 stream start
void ResetTrickSpeedFramesSentCounter(void)
enum AVCodecID GetCodecId(void)
std::atomic< struct AVRational > m_timebase
current codec timebase
std::set< int > m_dpbFrames
private set of reference frames (internal short-time decoded picture buffer)
void GetVideoSize(int *, int *, double *)
Get video size and aspect ratio.
bool ParseH264Packet(AVPacket *)
Parse an H.264 packet.
void OpenDecoder(void)
Open the decoder including an H.264 parsing if needed.
HardwareQuirks
Hardware quirks, that are set depending on the hardware used.
void Flush(void)
Flushes the video stream by finalizing any pending data.
void StartDecoder()
Start the decoder.
void CheckForcingFrameDecode(void)
Check, if we need to force the decoder to decode the frame (force a decoder drain)
void ClearVdrCoreToDecoderQueue(void)
Clears all video stream data, which is buffered to be decoded.
void DecodeInput(void)
Decodes a reassembled codec packet.
void Stop(void)
Stop the decoding thread.
virtual void Action(void)
Decoding thread loop, which periodically tries to decode input.
void CloseDecoder(void)
Close the decoder.
void Exit(void)
Exit video stream.
virtual ~cVideoStream(void)
void CancelFilterThread(void)
Stop filter thread.
void RenderFrame(AVFrame *)
Render a frame.
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.
int64_t GetInputPtsMs(void)
@ QUIRK_CODEC_FLUSH_WORKAROUND
set, if we have to close and reopen the codec instead of avcodec_flush_buffers (rpi)
@ QUIRK_CODEC_SKIP_FIRST_FRAMES
set, if codec should skip first I-Frames
@ QUIRK_CODEC_SKIP_NUM_FRAMES
skip QUIRK_CODEC_SKIP_NUM_FRAMES, in case QUIRK_CODEC_SKIP_FIRST_FRAMES is set
@ QUIRK_CODEC_DISABLE_MPEG_HW
set, if disable mpeg hardware decoder
@ QUIRK_NO_HW_DEINT
set, if no hw deinterlacer available
@ QUIRK_CODEC_DISABLE_H264_HW
set, if disable h264 hardware decoder
@ QUIRK_CODEC_NEEDS_EXT_INIT
set, if codec needs some infos for init (coded_width and coded_height)
Deinterlace and Scaling Filters Header File.