vdr-plugin-softhddevice-drm-gles 1.6.4-d0291bb
videostream.h
Go to the documentation of this file.
1// SPDX-License-Identifier: AGPL-3.0-or-later
2
13#ifndef __VIDEOSTREAM_H
14#define __VIDEOSTREAM_H
15
16#include <atomic>
17#include <functional>
18#include <set>
19#include <string>
20#include <vector>
21
22extern "C" {
23#include <libavcodec/avcodec.h>
24}
25
26#include <vdr/thread.h>
27
28#include "queue.h"
29#include "videofilter.h"
30
31class cDrmBuffer;
32class cSoftHdConfig;
33class cVideoDecoder;
34class cVideoRender;
35
47class cVideoStream : public cThread {
48public:
49 virtual ~cVideoStream(void);
50
51 void DecodeInput(void);
52 bool IsInterlaced(void) { return false; };
53
54 void Open(AVCodecID, AVCodecParameters * = nullptr, AVRational = { .num = 1, .den = 90000 });
55 void Exit(void);
57 void FlushDecoder(void);
58 void CloseDecoder(void);
60 void Flush(void);
61
62 // decoding thread
63 void Stop(void);
64 void Halt(void) { m_mutex.lock(); };
65 void Resume(void) { m_mutex.unlock(); };
66
67 // getters and setters
68 cVideoDecoder *Decoder(void) { return m_pDecoder; };
69 void StartDecoder();
70 size_t GetAvPacketsFilled(void) { return m_packets.Size(); };
71 bool IsInputBufferFull(void) { return m_packets.Size() >= VIDEO_PACKET_MAX; };
72 enum AVCodecID GetCodecId(void) { return m_codecId; };
74 bool HasInputPts(void) { return m_inputPts != AV_NOPTS_VALUE; }
76 int64_t GetInputPts(void) { return m_inputPts; };
78 void GetVideoSize(int *, int *, double *);
79 int GetVideoPacketMax(void) { return VIDEO_PACKET_MAX; };
80
81 // Filter
82 void CancelFilterThread(void);
84
91
92protected:
93 cVideoStream(cVideoRender *, int, cQueue<cDrmBuffer> *, cSoftHdConfig *, bool, std::function<void(AVFrame *)>);
94 virtual void Action(void);
95
96private:
100 const char *m_identifier;
101 std::function<void(AVFrame *)> m_frameOutput;
104 std::mutex m_mutex;
105
113
114 constexpr static int VIDEO_PACKET_MAX = 192;
116
119 std::atomic<struct AVRational> m_timebase;
122 volatile bool m_newStream = false;
124
126
127 // h264 parsing
128 std::vector<std::string> m_naluTypesAtStart;
129 int m_numIFrames = 0;
130 int m_logPackets = 0;
132 std::set<int> m_dpbFrames;
137 bool m_isResend = false;
139
140 void RenderFrame(AVFrame *);
141 void CheckForcingFrameDecode(void);
142 void OpenDecoder(void);
144};
145
152public:
154 : cVideoStream(render, hardwareQuirks, buf, config, false, fn) {};
155};
156
163public:
165 : cVideoStream(render, hardwareQuirks, buf, config, true, fn) {};
166 void SetDeinterlacerDeactivated(bool) override {}; // deinterlacing is permanently disabled
167};
168
169#endif
DRM Buffer.
Definition drmbuffer.h:46
Main Video Stream.
cMainVideoStream(cVideoRender *render, int hardwareQuirks, cQueue< cDrmBuffer > *buf, cSoftHdConfig *config, std::function< void(AVFrame *)> fn)
PiP Video Stream.
cPipVideoStream(cVideoRender *render, int hardwareQuirks, 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.
Definition queue.h:121
Plugin Configuration.
Definition config.h:29
Video Decoder.
Definition codec_video.h:37
Video Filter.
Definition videofilter.h:41
Video Renderer.
Video Input Stream.
Definition videostream.h:47
std::mutex m_mutex
mutex for decoding thread control
bool m_interlaced
flag for interlaced stream
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.
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)
Definition videostream.h:90
cSoftHdConfig * m_pConfig
plugin config
Definition videostream.h:97
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
void Flush(void)
Flushes the video stream by finalizing any pending data.
bool m_parseH264Dimensions
parse width and height when starting an h264 stream
void StartDecoder()
Start the decoder.
cVideoDecoder * Decoder(void)
Definition videostream.h:68
void CheckForcingFrameDecode(void)
Check, if we need to force the decoder to decode the frame (force a decoder drain)
bool m_startDecodingWithIFrame
wait for an I-Frame to start h264 decoding
void ClearVdrCoreToDecoderQueue(void)
Clears all video stream data, which is buffered to be decoded.
bool m_userDisabledDeinterlacer
set, if the user configured the deinterlace to be disabled
void ResetInputPts(void)
Definition videostream.h:77
volatile bool m_newStream
flag for new stream
void Resume(void)
Definition videostream.h:65
int m_ppsNumRefIdxL1DefaultActiveMinus1
cache NumRefIdxL1DefaultActiveMinuns1 from a previous PPS parsing
enum AVCodecID m_codecId
current codec id
int GetVideoPacketMax(void)
Definition videostream.h:79
bool m_checkFilterThreadNeeded
set, if we have to check, if filter thread is needed at start of playback
bool IsInterlaced(void)
Definition videostream.h:52
int m_log2MaxFrameNumMinus4
cache Log2MaxFrameNumMinus4 from a previous SPS parsing
void SetStartDecodingWithIFrame(bool enable)
Definition videostream.h:88
size_t GetAvPacketsFilled(void)
Definition videostream.h:70
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
void DecodeInput(void)
Decodes a reassembled codec packet.
bool m_isResend
track, if we already tried to send the AVPacket to the decoder if so, skip the parsing
void Stop(void)
Stop the decoding thread.
cQueue< cDrmBuffer > * m_pDrmBufferQueue
pointer to renderer's DRM buffer queue
void DisableDeint(bool disable)
Definition videostream.h:87
virtual void Action(void)
Decoding thread loop, which periodically tries to decode input.
bool IsDeinterlacerDeactivated(void)
Definition videostream.h:86
void CloseDecoder(void)
Close the decoder.
int m_hardwareQuirks
hardware specific quirks
cVideoDecoder * m_pDecoder
video decoder
Definition videostream.h:98
cVideoFilter m_videoFilter
pointer to deinterlace/scaling video filter thread
int m_maxFrameNum
= 1 << Log2MaxFrameNumMinus4 + 4
void Exit(void)
Exit video stream.
virtual ~cVideoStream(void)
std::vector< std::string > m_naluTypesAtStart
array of strings to log the H.264 frames at stream start
void CancelFilterThread(void)
Stop filter thread.
int m_ppsNumRefIdxL0DefaultActiveMinus1
cache NumRefIdxL0DefaultActiveMinuns1 from a previous PPS parsing
cVideoRender * m_pRender
video renderer
Definition videostream.h:99
int m_trickpkts
how many avpkt does the decoder need in trickspeed mode?
void RenderFrame(AVFrame *)
Render a frame.
cQueue< AVPacket > m_packets
AVPackets queue.
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)
Definition videostream.h:71
int64_t GetInputPts(void)
Definition videostream.h:76
void ResetFilterThreadNeededCheck()
Definition videostream.h:83
int64_t GetInputPtsMs(void)
void SetParseH264Dimensions(bool enable)
Definition videostream.h:89
void Halt(void)
Definition videostream.h:64
virtual void SetDeinterlacerDeactivated(bool deactivate)
Definition videostream.h:85
int m_numIFrames
counter for the arriving I-Frames at H.264 stream start
void ResetTrickSpeedFramesSentCounter(void)
Definition videostream.h:73
enum AVCodecID GetCodecId(void)
Definition videostream.h:72
std::atomic< struct AVRational > m_timebase
current codec timebase
bool HasInputPts(void)
Definition videostream.h:74
std::set< int > m_dpbFrames
private set of reference frames (internal short-time decoded picture buffer)
#define AV_NOPTS_VALUE
Definition misc.h:74
Thread-safe Queue.
Deinterlace and Scaling Filters Header File.