MythTV
master
libs
libmythtv
recorders
HLS
HLSStreamWorker.cpp
Go to the documentation of this file.
1
#include "
HLSReader.h
"
2
#include "
HLSStreamWorker.h
"
3
4
#define LOC QString("%1 worker: ").arg(m_parent->StreamURL().isEmpty() ? "Stream" : m_parent->StreamURL())
5
6
HLSStreamWorker::HLSStreamWorker
(
HLSReader
*parent)
7
:
MThread
(
"HLSStream"
),
8
m_parent(parent)
9
{
10
LOG
(VB_RECORD, LOG_DEBUG,
LOC
+
"ctor"
);
11
}
12
13
HLSStreamWorker::~HLSStreamWorker
(
void
)
14
{
15
LOG
(VB_RECORD, LOG_DEBUG,
LOC
+
"dtor"
);
16
}
17
18
void
HLSStreamWorker::Cancel
(
void
)
19
{
20
LOG
(VB_RECORD, LOG_INFO,
LOC
+
"Cancel -- begin"
);
21
m_cancel
=
true
;
22
Wakeup
();
23
CancelCurrentDownload
();
24
wait
();
25
LOG
(VB_RECORD, LOG_INFO,
LOC
+
"Cancel -- end"
);
26
}
27
28
void
HLSStreamWorker::CancelCurrentDownload
(
void
)
29
{
30
QMutexLocker locker(&
m_downloaderLock
);
31
if
(
m_downloader
)
32
m_downloader
->
Cancel
();
33
}
34
35
void
HLSStreamWorker::run
(
void
)
36
{
37
LOG
(VB_RECORD, LOG_INFO,
LOC
+
"run -- begin"
);
38
RunProlog
();
39
40
m_downloaderLock
.lock();
41
m_downloader
=
new
MythSingleDownload
;
42
m_downloaderLock
.unlock();
43
44
std::chrono::milliseconds delay = 0ms;
45
int
retries = 0;
46
while
(!
m_cancel
)
47
{
48
if
(
m_parent
->
FatalError
())
49
{
50
LOG
(VB_GENERAL, LOG_CRIT,
LOC
+
"Fatal error detected"
);
51
break
;
52
}
53
if
(!
m_parent
->
LoadSegments
(*
m_downloader
))
54
{
55
LOG
(VB_RECORD, LOG_WARNING,
LOC
+
56
QString(
"download failed, retry #%1"
).
arg
(++retries));
57
58
// Asking QNetworkAccessManager to redownload after a
59
// failure seems to result in another failure, even if the
60
// segment is now available. So, create a new instance.
61
m_downloaderLock
.lock();
62
delete
m_downloader
;
63
m_downloader
=
new
MythSingleDownload
;
64
m_downloaderLock
.unlock();
65
66
if
(retries == 1)
// first error
67
continue
;
// will retry immediately
68
if
(retries > 2)
69
m_parent
->
EnableDebugging
();
70
if
(retries == 10)
71
m_parent
->
ResetSequence
();
72
73
delay = 500ms * retries * retries;
74
if
(delay > 20s)
75
delay = 20s;
76
}
77
else
78
{
79
retries = 0;
80
delay = 11s;
81
}
82
83
m_lock
.lock();
84
if
(!
m_wokenup
&& !
m_cancel
)
85
{
86
if
(delay < 1s)
87
LOG
(VB_RECORD, LOG_WARNING,
LOC
+
"waiting to retry"
);
88
else
89
LOG
(VB_RECORD, LOG_DEBUG,
LOC
+
"waiting for work"
);
90
m_waitCond
.wait(&
m_lock
, delay.count());
91
}
92
m_wokenup
=
false
;
93
m_lock
.unlock();
94
}
95
96
m_downloader
->
Cancel
();
97
delete
m_downloader
;
98
m_downloader
=
nullptr
;
99
100
LOG
(VB_RECORD, LOG_INFO,
LOC
+
"run -- end"
);
101
RunEpilog
();
102
}
HLSStreamWorker.h
LOC
#define LOC
Definition:
HLSStreamWorker.cpp:4
HLSStreamWorker::~HLSStreamWorker
~HLSStreamWorker(void) override
Definition:
HLSStreamWorker.cpp:13
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:53
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:303
arg
arg(title).arg(filename).arg(doDelete))
HLSStreamWorker::Cancel
void Cancel(void)
Definition:
HLSStreamWorker.cpp:18
HLSStreamWorker::HLSStreamWorker
HLSStreamWorker(HLSReader *parent)
Definition:
HLSStreamWorker.cpp:6
LOG
#define LOG(_MASK_, _LEVEL_, _QSTRING_)
Definition:
mythlogging.h:23
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:58
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:28
HLSStreamWorker::m_lock
QMutex m_lock
Definition:
HLSStreamWorker.h:33
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:35
HLSReader::LoadSegments
bool LoadSegments(MythSingleDownload &downloader)
Definition:
HLSReader.cpp:769
HLSReader::EnableDebugging
void EnableDebugging(void)
Definition:
HLSReader.cpp:1029
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:34
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:49
HLSStreamWorker::m_parent
HLSReader * m_parent
Definition:
HLSStreamWorker.h:29
HLSStreamWorker::Wakeup
void Wakeup(void)
Definition:
HLSStreamWorker.h:20
HLSReader.h
Generated on Thu Jan 28 2021 03:16:52 for MythTV by
1.8.17