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