/
channelscan_sm.h
275 lines (229 loc) · 9.93 KB
/
channelscan_sm.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
/* -*- Mode: c++ -*-
* vim: set expandtab tabstop=4 shiftwidth=4:
*
* Original Project
* MythTV http://www.mythtv.org
*
* Copyright (c) 2004, 2005 John Pullan <john@pullan.org>
* Copyright (c) 2005 - 2007 Daniel Kristjansson
*
* Description:
* Collection of classes to provide channel scanning functionallity
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
* Or, point your browser to http://www.gnu.org/copyleft/gpl.html
*
*/
#ifndef SISCAN_H
#define SISCAN_H
// Qt includes
#include <QRunnable>
#include <QString>
#include <QList>
#include <QPair>
#include <QMap>
#include <QSet>
#include <QMutex>
// MythTV includes
#include "frequencytables.h"
#include "iptvchannelfetcher.h"
#include "streamlisteners.h"
#include "scanmonitor.h"
#include "signalmonitorlistener.h"
#include "dtvconfparserhelpers.h" // for DTVTunerType
class MThread;
class MSqlQuery;
class ChannelBase;
class DTVChannel;
class V4LChannel;
class DVBChannel;
class HDHRChannel;
class SignalMonitor;
class DTVSignalMonitor;
class DVBSignalMonitor;
typedef vector<const ProgramMapTable*> pmt_vec_t;
typedef QMap<uint, pmt_vec_t> pmt_map_t;
class ScannedChannelInfo;
typedef QPair<transport_scan_items_it_t, ScannedChannelInfo*> ChannelListItem;
typedef QList<ChannelListItem> ChannelList;
class ChannelScanSM;
class AnalogSignalHandler : public SignalMonitorListener
{
public:
explicit AnalogSignalHandler(ChannelScanSM *_siscan) : siscan(_siscan) { }
public:
inline void AllGood(void) override; // SignalMonitorListener
void StatusSignalLock(const SignalMonitorValue&) override { } // SignalMonitorListener
void StatusChannelTuned(const SignalMonitorValue&) override { } // SignalMonitorListener
void StatusSignalStrength(const SignalMonitorValue&) override { } // SignalMonitorListener
private:
ChannelScanSM *siscan;
};
class ChannelScanSM : public MPEGStreamListener,
public ATSCMainStreamListener,
public DVBMainStreamListener,
public DVBOtherStreamListener,
public QRunnable
{
friend class AnalogSignalHandler;
public:
ChannelScanSM(ScanMonitor *_scan_monitor,
const QString &_cardtype, ChannelBase* _channel, int _sourceID,
uint signal_timeout, uint channel_timeout,
QString _inputname, bool test_decryption);
~ChannelScanSM();
void StartScanner(void);
void StopScanner(void);
bool ScanTransports(
int SourceID, const QString &std, const QString &mod, const QString &country,
const QString &table_start = QString(),
const QString &table_end = QString());
bool ScanTransportsStartingOn(
int sourceid, const QMap<QString,QString> &startChan);
bool ScanTransport(uint mplexid, bool follow_nit);
bool ScanCurrentTransport(const QString &sistandard);
bool ScanForChannels(
uint sourceid, const QString &std, const QString &cardtype,
const DTVChannelList&);
bool ScanIPTVChannels(uint sourceid, const fbox_chan_map_t &iptv_channels);
bool ScanExistingTransports(uint sourceid, bool follow_nit);
void SetAnalog(bool is_analog);
void SetSourceID(int _SourceID) { m_sourceID = _SourceID; }
void SetSignalTimeout(uint val) { m_signalTimeout = val; }
void SetChannelTimeout(uint val) { m_channelTimeout = val; }
void SetScanDTVTunerType(DTVTunerType t) { m_scanDTVTunerType = t; }
void SetScanDTVTunerType(int t) { m_scanDTVTunerType = DTVTunerType(t); }
uint GetSignalTimeout(void) const { return m_signalTimeout; }
uint GetChannelTimeout(void) const { return m_channelTimeout; }
SignalMonitor *GetSignalMonitor(void) { return m_signalMonitor; }
DTVSignalMonitor *GetDTVSignalMonitor(void);
DVBSignalMonitor *GetDVBSignalMonitor(void);
typedef QMap<uint,ChannelInsertInfo> chan_info_map_t;
chan_info_map_t GetChannelList(transport_scan_items_it_t trans_info,
ScannedChannelInfo *scan_info) const;
uint GetCurrentTransportInfo(QString &chan, QString &chan_tr) const;
ScanDTVTransportList GetChannelList(bool addFullTS) const;
// MPEG
void HandlePAT(const ProgramAssociationTable*) override; // MPEGStreamListener
void HandleCAT(const ConditionalAccessTable*) override { } // MPEGStreamListener
void HandlePMT(uint, const ProgramMapTable*) override; // MPEGStreamListener
void HandleEncryptionStatus(uint pnum, bool encrypted) override; // MPEGStreamListener
// ATSC Main
void HandleSTT(const SystemTimeTable*) override {} // ATSCMainStreamListener
void HandleMGT(const MasterGuideTable*) override; // ATSCMainStreamListener
void HandleVCT(uint tsid, const VirtualChannelTable*) override; // ATSCMainStreamListener
// DVB Main
void HandleNIT(const NetworkInformationTable*) override; // DVBMainStreamListener
void HandleSDT(uint tsid, const ServiceDescriptionTable*) override; // DVBMainStreamListener
void HandleTDT(const TimeDateTable*) override {} // DVBMainStreamListener
// DVB Other
void HandleNITo(const NetworkInformationTable*) override {} // DVBOtherStreamListener
void HandleSDTo(uint tsid, const ServiceDescriptionTable*) override; // DVBOtherStreamListener
void HandleBAT(const BouquetAssociationTable*) override; // DVBOtherStreamListener
private:
// some useful gets
DTVChannel *GetDTVChannel(void);
const DTVChannel *GetDTVChannel(void) const;
V4LChannel *GetV4LChannel(void);
HDHRChannel *GetHDHRChannel(void);
DVBChannel *GetDVBChannel(void);
const DVBChannel *GetDVBChannel(void) const;
void run(void) override; // QRunnable
bool HasTimedOut(void);
void HandleActiveScan(void);
bool Tune(const transport_scan_items_it_t &transport);
void ScanTransport(const transport_scan_items_it_t &transport);
DTVTunerType GuessDTVTunerType(DTVTunerType) const;
static void LogLines(const QString& string);
/// \brief Updates Transport Scan progress bar
inline void UpdateScanPercentCompleted(void);
bool CheckImportedList(const DTVChannelInfoList&,
uint mpeg_program_num,
QString &service_name,
QString &callsign,
QString &common_status_info);
void IgnoreDataOnlyMsg( const QString &name, int aux_num);
void IgnoreEmptyChanMsg(const QString &name, int aux_num);
void IgnoreAudioOnlyMsg(const QString &name, int aux_num);
void IgnoreEncryptedMsg(const QString &name, int aux_num);
bool TestNextProgramEncryption(void);
void UpdateScanTransports(const NetworkInformationTable *nit);
bool UpdateChannelInfo(bool wait_until_complete);
void HandleAllGood(void); // used for analog scanner
bool AddToList(uint mplexid);
static QString loc(const ChannelScanSM*);
static const uint kDVBTableTimeout;
static const uint kATSCTableTimeout;
static const uint kMPEGTableTimeout;
private:
// Set in constructor
ScanMonitor *m_scanMonitor;
ChannelBase *m_channel;
SignalMonitor *m_signalMonitor;
int m_sourceID;
uint m_signalTimeout;
uint m_channelTimeout;
uint m_otherTableTimeout {0};
uint m_otherTableTime {0};
bool m_setOtherTables {false};
QString m_inputName;
bool m_testDecryption;
bool m_extendScanList {false};
// Scanning parameters
uint m_frequency {0};
uint m_bouquet_id {0};
uint m_region_id {0};
// Optional info
DTVTunerType m_scanDTVTunerType {DTVTunerType::kTunerTypeUnknown};
/// The big lock
mutable QMutex m_lock;
// State
bool m_scanning {false};
volatile bool m_threadExit {false};
bool m_waitingForTables {false};
QTime m_timer;
// Transports List
int m_transportsScanned {0};
QSet<uint32_t> m_tsScanned;
QMap<uint32_t,DTVMultiplex> m_extendTransports;
transport_scan_items_t m_scanTransports;
transport_scan_items_it_t m_current;
transport_scan_items_it_t m_nextIt;
bool m_currentTestingDecryption {false};
QMap<uint, uint> m_currentEncryptionStatus;
QMap<uint, bool> m_currentEncryptionStatusChecked;
QMap<uint64_t, QString> m_defAuthorities;
bool m_dvbt2Tried {false};
/// Found Channel Info
ChannelList m_channelList;
uint m_channelsFound {0};
ScannedChannelInfo *m_currentInfo {nullptr};
// Analog Info
AnalogSignalHandler *m_analogSignalHandler {nullptr};
/// Scanner thread, runs ChannelScanSM::run()
MThread *m_scannerThread {nullptr};
QMutex m_mutex;
};
inline void ChannelScanSM::UpdateScanPercentCompleted(void)
{
int tmp = (m_transportsScanned * 100) /
(m_scanTransports.size() + m_extendTransports.size());
m_scanMonitor->ScanPercentComplete(tmp);
}
void AnalogSignalHandler::AllGood(void)
{
siscan->HandleAllGood();
}
#endif // SISCAN_H