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