MythTV  master
HLSStreamWorker.cpp
Go to the documentation of this file.
1 #include "HLSReader.h"
2 #include "HLSStreamWorker.h"
3 
5 
6 #define LOC QString("%1 worker: ").arg(m_parent->StreamURL().isEmpty() ? "Stream" : m_parent->StreamURL())
7 
9  : MThread("HLSStream"),
10  m_parent(parent)
11 {
12  LOG(VB_RECORD, LOG_DEBUG, LOC + "ctor");
13 }
14 
16 {
17  LOG(VB_RECORD, LOG_DEBUG, LOC + "dtor");
18 }
19 
21 {
22  LOG(VB_RECORD, LOG_INFO, LOC + "Cancel -- begin");
23  m_cancel = true;
24  Wakeup();
26  wait();
27  LOG(VB_RECORD, LOG_INFO, LOC + "Cancel -- end");
28 }
29 
31 {
32  QMutexLocker locker(&m_downloaderLock);
33  if (m_downloader)
35 }
36 
38 {
39  LOG(VB_RECORD, LOG_INFO, LOC + "run -- begin");
40  RunProlog();
41 
42  m_downloaderLock.lock();
44  m_downloaderLock.unlock();
45 
46  std::chrono::milliseconds delay = 0ms;
47  int retries = 0;
48  while (!m_cancel)
49  {
50  if (m_parent->FatalError())
51  {
52  LOG(VB_GENERAL, LOG_CRIT, LOC + "Fatal error detected");
53  break;
54  }
56  {
57  LOG(VB_RECORD, LOG_WARNING, LOC +
58  QString("download failed, retry #%1").arg(++retries));
59 
60  // Asking QNetworkAccessManager to redownload after a
61  // failure seems to result in another failure, even if the
62  // segment is now available. So, create a new instance.
63  m_downloaderLock.lock();
64  delete m_downloader;
66  m_downloaderLock.unlock();
67 
68  if (retries == 1) // first error
69  continue; // will retry immediately
70  if (retries > 2)
72  if (retries == 10)
74 
75  delay = 500ms * retries * retries;
76  if (delay > 20s)
77  delay = 20s;
78  }
79  else
80  {
81  retries = 0;
82  delay = 11s;
83  }
84 
85  m_lock.lock();
86  if (!m_wokenup && !m_cancel)
87  {
88  if (delay < 1s)
89  LOG(VB_RECORD, LOG_WARNING, LOC + "waiting to retry");
90  else
91  LOG(VB_RECORD, LOG_DEBUG, LOC + "waiting for work");
92  m_waitCond.wait(&m_lock, delay.count());
93  }
94  m_wokenup = false;
95  m_lock.unlock();
96  }
97 
99  delete m_downloader;
100  m_downloader = nullptr;
101 
102  LOG(VB_RECORD, LOG_INFO, LOC + "run -- end");
103  RunEpilog();
104 }
HLSStreamWorker.h
LOC
#define LOC
Definition: HLSStreamWorker.cpp:6
HLSStreamWorker::~HLSStreamWorker
~HLSStreamWorker(void) override
Definition: HLSStreamWorker.cpp:15
MythSingleDownload::Cancel
void Cancel(void)
Definition: mythsingledownload.cpp:108
HLSStreamWorker::m_cancel
bool m_cancel
Definition: HLSStreamWorker.h:31
HLSReader::FatalError
bool FatalError(void) const
Definition: HLSReader.h:52
MThread::wait
bool wait(std::chrono::milliseconds time=std::chrono::milliseconds::max())
Wait for the MThread to exit, with a maximum timeout.
Definition: mthread.cpp:300
HLSStreamWorker::Cancel
void Cancel(void)
Definition: HLSStreamWorker.cpp:20
HLSStreamWorker::HLSStreamWorker
HLSStreamWorker(HLSReader *parent)
Definition: HLSStreamWorker.cpp:8
LOG
#define LOG(_MASK_, _LEVEL_, _QSTRING_)
Definition: mythlogging.h:39
MThread::RunProlog
void RunProlog(void)
Sets up a thread, call this if you reimplement run().
Definition: mthread.cpp:196
HLSReader::ResetSequence
void ResetSequence(void)
Definition: HLSReader.h:57
HLSStreamWorker::m_waitCond
QWaitCondition m_waitCond
Definition: HLSStreamWorker.h:35
HLSStreamWorker::m_downloader
MythSingleDownload * m_downloader
Definition: HLSStreamWorker.h:30
HLSStreamWorker::CancelCurrentDownload
void CancelCurrentDownload(void)
Definition: HLSStreamWorker.cpp:30
HLSStreamWorker::m_lock
QMutex m_lock
Definition: HLSStreamWorker.h:33
mythlogging.h
HLSStreamWorker::run
void run() override
Runs the Qt event loop unless we have a QRunnable, in which case we run the runnable run instead.
Definition: HLSStreamWorker.cpp:37
HLSReader::LoadSegments
bool LoadSegments(MythSingleDownload &downloader)
Definition: HLSReader.cpp:881
HLSReader::EnableDebugging
void EnableDebugging(void)
Definition: HLSReader.cpp:1161
MThread::RunEpilog
void RunEpilog(void)
Cleans up a thread's resources, call this if you reimplement run().
Definition: mthread.cpp:209
HLSReader
Definition: HLSReader.h:33
MythSingleDownload
Definition: mythsingledownload.h:25
HLSStreamWorker::m_wokenup
bool m_wokenup
Definition: HLSStreamWorker.h:32
HLSStreamWorker::m_downloaderLock
QMutex m_downloaderLock
Definition: HLSStreamWorker.h:34
MThread
This is a wrapper around QThread that does several additional things.
Definition: mthread.h:48
HLSStreamWorker::m_parent
HLSReader * m_parent
Definition: HLSStreamWorker.h:29
HLSStreamWorker::Wakeup
void Wakeup(void)
Definition: HLSStreamWorker.h:20
HLSReader.h