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