MythTV  master
HLSStream.h
Go to the documentation of this file.
1 #ifndef HLS_STREAM_
2 #define HLS_STREAM_
3 
4 #ifdef USING_LIBCRYPTO
5 // encryption related stuff
6 #include <openssl/aes.h>
7 #endif // USING_LIBCRYPTO
8 
9 #include <QMap>
10 #include <QQueue>
11 
13 #include "HLSSegment.h"
14 
16 {
17  friend class HLSReader;
18 
19  public:
20 #ifdef USING_LIBCRYPTO
21  using AESKeyMap = QMap<QString, AES_KEY* >;
22 #endif
23 
24  HLSRecStream(int seq, uint64_t bitrate, QString m3u8_url, QString segment_base_url);
25  ~HLSRecStream(void);
26 
27  int Read(uint8_t* buffer, int len);
28 
29  QString toString(void) const;
30  int Id(void) const { return m_id; }
31  int Version(void) const { return m_version; }
32  void SetVersion(int x) { m_version = x; }
33  std::chrono::seconds TargetDuration(void) const { return m_targetDuration; }
34  void SetTargetDuration(std::chrono::seconds x) { m_targetDuration = x; }
35  uint64_t AverageBandwidth(void) const { return static_cast<uint64_t>(m_bandwidth); }
36  uint64_t Bitrate(void) const { return m_bitrate; }
37  void SetBitrate(uint64_t bitrate) { m_bitrate = bitrate; }
38  uint64_t CurrentByteRate(void) const { return m_curByteRate; }
39  void SetCurrentByteRate(uint64_t byterate) { m_curByteRate = byterate; }
40  bool Cache(void) const { return m_cache; }
41  void SetCache(bool x) { m_cache = x; }
42  bool Live(void) const { return m_live; }
43  void SetLive(bool x) { m_live = x; }
44  QString M3U8Url(void) const { return m_m3u8Url; }
45  QString SegmentBaseUrl(void) const { return m_segmentBaseUrl; }
46  void SetSegmentBaseUrl(const QString &n) { m_segmentBaseUrl = n; }
47 
48  std::chrono::seconds Duration(void) const;
49  uint NumCachedSegments(void) const;
50  uint NumReleasedSegments(void) const;
51  uint NumTotalSegments(void) const;
52 
53  void Good(void) { m_retries = 0; }
54  void Retrying(void) { ++m_retries; }
55  int RetryCount(void) const { return m_retries; }
56 
57  static bool IsGreater(const HLSRecStream *s1, const HLSRecStream *s2);
58  bool operator<(const HLSRecStream &b) const;
59  bool operator>(const HLSRecStream &b) const;
60 
61 #ifdef USING_LIBCRYPTO
62  protected:
63  bool DownloadKey(MythSingleDownload& downloader,
64  const QString& keypath, AES_KEY* aeskey);
65  bool DecodeData(MythSingleDownload& downloader,
66  const QByteArray& IV, const QString& keypath,
67  QByteArray& data, int64_t sequence);
68  bool SetAESIV(QString line);
69  bool IVLoaded(void) const { return m_ivLoaded; }
70 
71  QByteArray AESIV(void) { return m_aesIV; }
72  void SetKeyPath(const QString& x) { m_keypath = x; }
73 #endif // USING_LIBCRYPTO
74 
75  protected:
76  void AverageBandwidth(int64_t bandwidth);
77 
78  private:
79  int m_id; // program id
80  int m_version {1}; // protocol version should be 1
81  std::chrono::seconds m_targetDuration {-1s}; // maximum duration per segment
82  uint64_t m_curByteRate {0};
83  uint64_t m_bitrate; // bitrate of stream content (bits per second)
84  std::chrono::seconds m_duration {0s}; // duration of the stream
85  bool m_live {true};
86  int64_t m_bandwidth {0}; // measured average download bandwidth (bits/second)
87  double m_sumBandwidth {0.0};
88  QQueue<int64_t> m_bandwidthSegs;
89 
90  QString m_m3u8Url ; // uri to m3u8
91  QString m_segmentBaseUrl; // uri to base for relative segments (m3u8 redirect target)
92  mutable QMutex m_lock;
93  bool m_cache {false}; // allow caching
94  int m_retries {0};
95 
96 #ifdef USING_LIBCRYPTO
97  private:
98  QString m_keypath; // URL path of the encrypted key
99  bool m_ivLoaded {false};
100  QByteArray m_aesIV {AES_BLOCK_SIZE,0};// IV used when decypher the block
101  AESKeyMap m_aesKeys; // AES-128 keys by path
102 #endif // USING_LIBCRYPTO
103 };
104 
105 #endif // HLS_STREAM_H
HLSRecStream::~HLSRecStream
~HLSRecStream(void)
Definition: HLSStream.cpp:22
HLSRecStream::Version
int Version(void) const
Definition: HLSStream.h:31
HLSRecStream::Cache
bool Cache(void) const
Definition: HLSStream.h:40
HLSRecStream::Duration
std::chrono::seconds Duration(void) const
Definition: HLSStream.cpp:145
HLSRecStream::NumReleasedSegments
uint NumReleasedSegments(void) const
HLSRecStream::RetryCount
int RetryCount(void) const
Definition: HLSStream.h:55
HLSRecStream::HLSRecStream
HLSRecStream(int seq, uint64_t bitrate, QString m3u8_url, QString segment_base_url)
Definition: HLSStream.cpp:13
HLSRecStream::SetVersion
void SetVersion(int x)
Definition: HLSStream.h:32
HLSRecStream::operator<
bool operator<(const HLSRecStream &b) const
Definition: HLSStream.cpp:151
HLSRecStream::IsGreater
static bool IsGreater(const HLSRecStream *s1, const HLSRecStream *s2)
HLSRecStream::m_m3u8Url
QString m_m3u8Url
Definition: HLSStream.h:90
mythsingledownload.h
HLSRecStream::Good
void Good(void)
Definition: HLSStream.h:53
HLSRecStream::m_duration
std::chrono::seconds m_duration
Definition: HLSStream.h:84
HLSRecStream::Read
int Read(uint8_t *buffer, int len)
HLSRecStream
Definition: HLSStream.h:15
HLSRecStream::m_live
bool m_live
Definition: HLSStream.h:85
HLSRecStream::SetLive
void SetLive(bool x)
Definition: HLSStream.h:43
HLSRecStream::NumTotalSegments
uint NumTotalSegments(void) const
HLSRecStream::SegmentBaseUrl
QString SegmentBaseUrl(void) const
Definition: HLSStream.h:45
HLSRecStream::m_targetDuration
std::chrono::seconds m_targetDuration
Definition: HLSStream.h:81
HLSRecStream::Retrying
void Retrying(void)
Definition: HLSStream.h:54
HLSRecStream::SetBitrate
void SetBitrate(uint64_t bitrate)
Definition: HLSStream.h:37
HLSRecStream::TargetDuration
std::chrono::seconds TargetDuration(void) const
Definition: HLSStream.h:33
HLSRecStream::AverageBandwidth
uint64_t AverageBandwidth(void) const
Definition: HLSStream.h:35
HLSRecStream::m_segmentBaseUrl
QString m_segmentBaseUrl
Definition: HLSStream.h:91
HLSRecStream::toString
QString toString(void) const
Definition: HLSStream.cpp:34
uint
unsigned int uint
Definition: compat.h:81
HLSRecStream::m_bitrate
uint64_t m_bitrate
Definition: HLSStream.h:83
HLSRecStream::m_retries
int m_retries
Definition: HLSStream.h:94
HLSRecStream::m_bandwidthSegs
QQueue< int64_t > m_bandwidthSegs
Definition: HLSStream.h:88
HLSReader
Definition: HLSReader.h:34
MythSingleDownload
Definition: mythsingledownload.h:25
HLSRecStream::SetTargetDuration
void SetTargetDuration(std::chrono::seconds x)
Definition: HLSStream.h:34
HLSRecStream::m_id
int m_id
Definition: HLSStream.h:79
HLSRecStream::Live
bool Live(void) const
Definition: HLSStream.h:42
HLSRecStream::Bitrate
uint64_t Bitrate(void) const
Definition: HLSStream.h:36
HLSRecStream::m_version
int m_version
Definition: HLSStream.h:80
HLSRecStream::m_lock
QMutex m_lock
Definition: HLSStream.h:92
HLSRecStream::operator>
bool operator>(const HLSRecStream &b) const
Definition: HLSStream.cpp:156
HLSRecStream::m_sumBandwidth
double m_sumBandwidth
Definition: HLSStream.h:87
HLSRecStream::SetCache
void SetCache(bool x)
Definition: HLSStream.h:41
HLSRecStream::SetSegmentBaseUrl
void SetSegmentBaseUrl(const QString &n)
Definition: HLSStream.h:46
HLSSegment.h
HLSRecStream::SetCurrentByteRate
void SetCurrentByteRate(uint64_t byterate)
Definition: HLSStream.h:39
HLSRecStream::Id
int Id(void) const
Definition: HLSStream.h:30
HLSRecStream::m_bandwidth
int64_t m_bandwidth
Definition: HLSStream.h:86
HLSRecStream::CurrentByteRate
uint64_t CurrentByteRate(void) const
Definition: HLSStream.h:38
HLSRecStream::m_cache
bool m_cache
Definition: HLSStream.h:93
HLSRecStream::NumCachedSegments
uint NumCachedSegments(void) const
HLSRecStream::M3U8Url
QString M3U8Url(void) const
Definition: HLSStream.h:44
HLSRecStream::m_curByteRate
uint64_t m_curByteRate
Definition: HLSStream.h:82