MythTV master
iptvstreamhandler.h
Go to the documentation of this file.
1// -*- Mode: c++ -*-
2
3#ifndef IPTVSTREAMHANDLER_H
4#define IPTVSTREAMHANDLER_H
5
6#include <vector>
7
8#include <QHostAddress>
9#include <QUdpSocket>
10#include <QString>
11#include <QMutex>
12#include <QMap>
13
14#include <QNetworkAccessManager>
15
16#include "channelutil.h"
17#include "streamhandler.h"
18
19static constexpr size_t IPTV_SOCKET_COUNT { 3 };
20static constexpr std::chrono::milliseconds RTCP_TIMER { 10s };
21
24class MPEGStreamData;
25class PacketBuffer;
26class IPTVChannel;
27
28class IPTVStreamHandlerReadHelper : public QObject
29{
30 Q_OBJECT
31
32 public:
33 IPTVStreamHandlerReadHelper(IPTVStreamHandler *p, QUdpSocket *s, uint stream);
34
35 public slots:
36 void ReadPending(void);
37
38 private:
40 QUdpSocket *m_socket {nullptr};
41 QHostAddress m_sender;
43};
44
46{
47 Q_OBJECT
48
49public:
51 : m_parent(p) {}
53
54 void Start(void)
55 {
56 m_timer = startTimer(200ms);
57 }
58 void StartRTCPRR(void)
59 {
60 m_timerRtcp = startTimer(RTCP_TIMER);
61 }
62
63 void SendRTCPReport(void);
64
65private:
66 void timerEvent(QTimerEvent *event) override; // QObject
67
68private:
70 int m_timer {0};
71 int m_timerRtcp {0};
75 int m_lost {0};
77};
78
80{
83 public:
84 static IPTVStreamHandler *Get(const IPTVTuningData &tuning, int inputid);
85 static void Return(IPTVStreamHandler * & ref, int inputid);
86
88 bool /*allow_section_reader*/ = false,
89 bool /*needs_drb*/ = false,
90 const QString& output_file = QString()) override // StreamHandler
91 {
92 // Force allow_section_reader and needs_buffering to false;
93 StreamHandler::AddListener(data, false, false, output_file);
94 }
95
96 protected:
97 explicit IPTVStreamHandler(const IPTVTuningData &tuning, int inputid);
98
99 void run(void) override; // MThread
100
101 protected:
103 std::array<QUdpSocket*,IPTV_SOCKET_COUNT> m_sockets {};
104 std::array<IPTVStreamHandlerReadHelper*,IPTV_SOCKET_COUNT> m_readHelpers {};
105 std::array<QHostAddress,IPTV_SOCKET_COUNT> m_sender;
108
110 ushort m_rtspRtpPort {0};
111 ushort m_rtspRtcpPort {0};
112 uint32_t m_rtspSsrc {0};
113 QHostAddress m_rtcpDest;
114
115 // for implementing Get & Return
116 static QMutex s_iptvhandlers_lock;
117 static QMap<QString, IPTVStreamHandler*> s_iptvhandlers;
118 static QMap<QString, uint> s_iptvhandlers_refcnt;
119
120private:
121 void timerEvent(QTimerEvent*);
122
123};
124
125#endif // IPTVSTREAMHANDLER_H
This class is intended to detect the presence of needed tables.
IPTVStreamHandler * m_parent
IPTVStreamHandlerReadHelper(IPTVStreamHandler *p, QUdpSocket *s, uint stream)
void timerEvent(QTimerEvent *event) override
IPTVStreamHandlerWriteHelper(IPTVStreamHandler *p)
IPTVStreamHandler * m_parent
std::array< QHostAddress, IPTV_SOCKET_COUNT > m_sender
IPTVStreamHandler(const IPTVTuningData &tuning, int inputid)
QHostAddress m_rtcpDest
void run(void) override
Runs the Qt event loop unless we have a QRunnable, in which case we run the runnable run instead.
static QMap< QString, uint > s_iptvhandlers_refcnt
void timerEvent(QTimerEvent *)
IPTVTuningData m_tuning
std::array< QUdpSocket *, IPTV_SOCKET_COUNT > m_sockets
std::array< IPTVStreamHandlerReadHelper *, IPTV_SOCKET_COUNT > m_readHelpers
PacketBuffer * m_buffer
static IPTVStreamHandler * Get(const IPTVTuningData &tuning, int inputid)
static QMutex s_iptvhandlers_lock
static QMap< QString, IPTVStreamHandler * > s_iptvhandlers
static void Return(IPTVStreamHandler *&ref, int inputid)
IPTVStreamHandlerWriteHelper * m_writeHelper
void AddListener(MPEGStreamData *data, bool=false, bool=false, const QString &output_file=QString()) override
Encapsulates data about MPEG stream and emits events for each table.
virtual void AddListener(MPEGStreamData *data, bool allow_section_reader=false, bool needs_buffering=false, const QString &output_file=QString())
unsigned int uint
Definition: freesurround.h:24
static constexpr std::chrono::milliseconds RTCP_TIMER
static constexpr size_t IPTV_SOCKET_COUNT