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