MythTV master
HLSStream.h
Go to the documentation of this file.
1#ifndef HLS_STREAM_
2#define HLS_STREAM_
3
4#include <array>
5#include <cstdint>
6
7#include <QChar> // Fix Qt6 GCC SFINAE warning
8#include <QByteArray>
9#include <QDateTime>
10#include <QMap>
11#include <QMutex>
12#include <QQueue>
13#include <QString>
14
15#include "libmythbase/mythconfig.h"
18
19// 128-bit AES key for HLS segment decryption
20static constexpr uint8_t AES128_KEY_SIZE { 16 };
22 std::array<uint8_t,AES128_KEY_SIZE> key;
23};
25
27{
28 friend class HLSReader;
29
30 public:
31#if CONFIG_LIBCRYPTO
32 using AESKeyMap = QMap<QString, HLS_AES_KEY* >;
33#endif // CONFIG_LIBCRYPTO
34
35 HLSRecStream(int inputId, int seq, uint64_t bitrate, QString m3u8_url, QString segment_base_url);
36 ~HLSRecStream(void);
37
38 int Read(uint8_t* buffer, int len);
39
40 QString toString(void) const;
41 int Id(void) const { return m_id; }
42 int Version(void) const { return m_version; }
43 void SetVersion(int x) { m_version = x; }
44 std::chrono::seconds TargetDuration(void) const { return m_targetDuration; }
45 void SetTargetDuration(std::chrono::seconds x) { m_targetDuration = x; }
46 int DiscontinuitySequence(void) const { return m_discontSeq; }
48 uint64_t AverageBandwidth(void) const { return static_cast<uint64_t>(m_bandwidth); }
49 uint64_t Bitrate(void) const { return m_bitrate; }
50 void SetBitrate(uint64_t bitrate) { m_bitrate = bitrate; }
51 uint64_t CurrentByteRate(void) const { return m_curByteRate; }
52 void SetCurrentByteRate(uint64_t byterate) { m_curByteRate = byterate; }
53 bool Cache(void) const { return m_cache; }
54 void SetCache(bool x) { m_cache = x; }
55 void SetDateTime(QDateTime &dt) { m_dateTime = dt; }
56 bool Live(void) const { return m_live; }
57 void SetLive(bool x) { m_live = x; }
58 QString M3U8Url(void) const { return m_m3u8Url; }
59 QString SegmentBaseUrl(void) const { return m_segmentBaseUrl; }
60 void SetSegmentBaseUrl(const QString &n) { m_segmentBaseUrl = n; }
61 QString MapUri(void) const { return m_mapUri; }
62 void SetMapUri(const QString& x) { m_mapUri = x; }
63
64 std::chrono::seconds Duration(void) const;
68
69 void Good(void) { m_retries = 0; }
70 void Retrying(void) { ++m_retries; }
71 int RetryCount(void) const { return m_retries; }
72
73 static bool IsGreater(const HLSRecStream *s1, const HLSRecStream *s2);
74 bool operator<(const HLSRecStream &b) const;
75 bool operator>(const HLSRecStream &b) const;
76
77#if CONFIG_LIBCRYPTO
78 protected:
79 int Decrypt(unsigned char *ciphertext, int ciphertext_len, unsigned char *key,
80 unsigned char *iv, unsigned char *plaintext) const;
81 bool DownloadKey(MythSingleDownload& downloader,
82 const QString& keypath, HLS_AES_KEY* aeskey) const;
83 bool DecodeData(MythSingleDownload& downloader,
84 const QByteArray& IV, const QString& keypath,
85 QByteArray& data, int64_t sequence);
86#endif // CONFIG_LIBCRYPTO
87
88 protected:
89 void AverageBandwidth(int64_t bandwidth);
90
91 private:
92 int m_inputId {0}; // input card ID
93 int m_id; // program id
94 int m_version {1}; // HLS protocol version
95 std::chrono::seconds m_targetDuration {-1s}; // maximum duration per segment
96 uint64_t m_curByteRate {0};
97 uint64_t m_bitrate {0}; // bitrate of stream content (bits per second)
98 std::chrono::seconds m_duration {0s}; // duration of the stream
99 int m_discontSeq {0}; // discontinuity sequence number
100 bool m_live {true};
101 int64_t m_bandwidth {0}; // measured average download bandwidth (bits/second)
102 double m_sumBandwidth {0.0};
103 QQueue<int64_t> m_bandwidthSegs;
104
105 QString m_m3u8Url ; // uri to m3u8
106 QString m_segmentBaseUrl; // uri to base for relative segments (m3u8 redirect target)
107 mutable QMutex m_lock;
108 bool m_cache {false}; // allow caching
109 QDateTime m_dateTime; // #EXT-X-PROGRAM-DATE-TIME
110 int m_retries {0};
111
112 QString m_mapUri; // URI of Media Initialisation Sequence
113
114#if CONFIG_LIBCRYPTO
115 private:
116 AESKeyMap m_aesKeys; // AES-128 keys by path
117#endif // CONFIG_LIBCRYPTO
118};
119
120#endif // HLS_STREAM_H
static constexpr uint8_t AES128_KEY_SIZE
Definition: HLSStream.h:20
void Good(void)
Definition: HLSStream.h:69
std::chrono::seconds Duration(void) const
Definition: HLSStream.cpp:231
bool operator>(const HLSRecStream &b) const
Definition: HLSStream.cpp:242
QDateTime m_dateTime
Definition: HLSStream.h:109
void SetDiscontinuitySequence(int s)
Definition: HLSStream.h:47
void SetCache(bool x)
Definition: HLSStream.h:54
int m_version
Definition: HLSStream.h:94
QString M3U8Url(void) const
Definition: HLSStream.h:58
bool Live(void) const
Definition: HLSStream.h:56
std::chrono::seconds m_duration
Definition: HLSStream.h:98
void SetSegmentBaseUrl(const QString &n)
Definition: HLSStream.h:60
void SetCurrentByteRate(uint64_t byterate)
Definition: HLSStream.h:52
int64_t m_bandwidth
Definition: HLSStream.h:101
int m_inputId
Definition: HLSStream.h:92
std::chrono::seconds TargetDuration(void) const
Definition: HLSStream.h:44
~HLSRecStream(void)
Definition: HLSStream.cpp:36
uint64_t m_curByteRate
Definition: HLSStream.h:96
std::chrono::seconds m_targetDuration
Definition: HLSStream.h:95
double m_sumBandwidth
Definition: HLSStream.h:102
QString toString(void) const
Definition: HLSStream.cpp:47
uint64_t m_bitrate
Definition: HLSStream.h:97
void SetLive(bool x)
Definition: HLSStream.h:57
void SetDateTime(QDateTime &dt)
Definition: HLSStream.h:55
void SetTargetDuration(std::chrono::seconds x)
Definition: HLSStream.h:45
QString m_m3u8Url
Definition: HLSStream.h:105
QString SegmentBaseUrl(void) const
Definition: HLSStream.h:59
QString m_segmentBaseUrl
Definition: HLSStream.h:106
bool Cache(void) const
Definition: HLSStream.h:53
uint64_t Bitrate(void) const
Definition: HLSStream.h:49
int RetryCount(void) const
Definition: HLSStream.h:71
int m_discontSeq
Definition: HLSStream.h:99
uint64_t CurrentByteRate(void) const
Definition: HLSStream.h:51
uint NumCachedSegments(void) const
uint NumTotalSegments(void) const
static bool IsGreater(const HLSRecStream *s1, const HLSRecStream *s2)
QString MapUri(void) const
Definition: HLSStream.h:61
HLSRecStream(int inputId, int seq, uint64_t bitrate, QString m3u8_url, QString segment_base_url)
Definition: HLSStream.cpp:26
QString m_mapUri
Definition: HLSStream.h:112
bool m_cache
Definition: HLSStream.h:108
int Id(void) const
Definition: HLSStream.h:41
bool operator<(const HLSRecStream &b) const
Definition: HLSStream.cpp:237
uint NumReleasedSegments(void) const
QQueue< int64_t > m_bandwidthSegs
Definition: HLSStream.h:103
void SetMapUri(const QString &x)
Definition: HLSStream.h:62
void Retrying(void)
Definition: HLSStream.h:70
int Version(void) const
Definition: HLSStream.h:42
int Read(uint8_t *buffer, int len)
void SetBitrate(uint64_t bitrate)
Definition: HLSStream.h:50
void SetVersion(int x)
Definition: HLSStream.h:43
uint64_t AverageBandwidth(void) const
Definition: HLSStream.h:48
int DiscontinuitySequence(void) const
Definition: HLSStream.h:46
QMutex m_lock
Definition: HLSStream.h:107
unsigned int uint
Definition: compat.h:60
std::array< uint8_t, AES128_KEY_SIZE > key
Definition: HLSStream.h:22