00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #ifndef SISCAN_H
00031 #define SISCAN_H
00032
00033
00034 #include <QRunnable>
00035 #include <QString>
00036 #include <QList>
00037 #include <QPair>
00038 #include <QMap>
00039 #include <QSet>
00040
00041
00042 #include "frequencytables.h"
00043 #include "streamlisteners.h"
00044 #include "scanmonitor.h"
00045 #include "signalmonitorlistener.h"
00046 #include "dtvconfparserhelpers.h"
00047
00048 class MThread;
00049 class MSqlQuery;
00050
00051 class ChannelBase;
00052 class DTVChannel;
00053 class V4LChannel;
00054 class DVBChannel;
00055 class HDHRChannel;
00056
00057 class SignalMonitor;
00058 class DTVSignalMonitor;
00059 class DVBSignalMonitor;
00060
00061 typedef vector<const ProgramMapTable*> pmt_vec_t;
00062 typedef QMap<uint, pmt_vec_t> pmt_map_t;
00063 class ScannedChannelInfo;
00064 typedef QPair<transport_scan_items_it_t, ScannedChannelInfo*> ChannelListItem;
00065 typedef QList<ChannelListItem> ChannelList;
00066
00067 class ChannelScanSM;
00068 class AnalogSignalHandler : public SignalMonitorListener
00069 {
00070 public:
00071 AnalogSignalHandler(ChannelScanSM *_siscan) : siscan(_siscan) { }
00072
00073 public:
00074 virtual inline void AllGood(void);
00075 virtual void StatusSignalLock(const SignalMonitorValue&) { }
00076 virtual void StatusChannelTuned(const SignalMonitorValue&) { }
00077 virtual void StatusSignalStrength(const SignalMonitorValue&) { }
00078
00079 private:
00080 ChannelScanSM *siscan;
00081 };
00082
00083 class ChannelScanSM : public MPEGStreamListener,
00084 public ATSCMainStreamListener,
00085 public DVBMainStreamListener,
00086 public DVBOtherStreamListener,
00087 public QRunnable
00088 {
00089 friend class AnalogSignalHandler;
00090
00091 public:
00092 ChannelScanSM(
00093 ScanMonitor *_scan_monitor,
00094 const QString &_cardtype, ChannelBase* _channel, int _sourceID,
00095 uint signal_timeout, uint channel_timeout,
00096 const QString &_inputname, bool test_decryption);
00097 ~ChannelScanSM();
00098
00099 void StartScanner(void);
00100 void StopScanner(void);
00101
00102 bool ScanTransports(
00103 int src, const QString &std, const QString &mod, const QString &table,
00104 const QString &table_start = QString::null,
00105 const QString &table_end = QString::null);
00106 bool ScanTransportsStartingOn(
00107 int sourceid, const QMap<QString,QString> &valueMap);
00108 bool ScanTransport(uint mplexid, bool follow_nit);
00109 bool ScanCurrentTransport(const QString &sistandard);
00110 bool ScanForChannels(
00111 uint sourceid, const QString &std, const QString &cardtype,
00112 const DTVChannelList&);
00113
00114 bool ScanExistingTransports(uint sourceid, bool follow_nit);
00115
00116 void SetAnalog(bool is_analog);
00117 void SetSourceID(int _SourceID) { sourceID = _SourceID; }
00118 void SetSignalTimeout(uint val) { signalTimeout = val; }
00119 void SetChannelTimeout(uint val) { channelTimeout = val; }
00120 void SetScanDTVTunerType(DTVTunerType t) { scanDTVTunerType = t; }
00121
00122 uint GetSignalTimeout(void) const { return signalTimeout; }
00123 uint GetChannelTimeout(void) const { return channelTimeout; }
00124
00125 SignalMonitor *GetSignalMonitor(void) { return signalMonitor; }
00126 DTVSignalMonitor *GetDTVSignalMonitor(void);
00127 DVBSignalMonitor *GetDVBSignalMonitor(void);
00128
00129 typedef QMap<uint,ChannelInsertInfo> chan_info_map_t;
00130 chan_info_map_t GetChannelList(transport_scan_items_it_t trans_info,
00131 ScannedChannelInfo *scan_info) const;
00132 uint GetCurrentTransportInfo(QString &chan, QString &chan_tr) const;
00133 ScanDTVTransportList GetChannelList(void) const;
00134
00135
00136 void HandlePAT(const ProgramAssociationTable*);
00137 void HandleCAT(const ConditionalAccessTable*) { }
00138 void HandlePMT(uint, const ProgramMapTable*);
00139 void HandleEncryptionStatus(uint pnum, bool encrypted);
00140
00141
00142 void HandleSTT(const SystemTimeTable*) {}
00143 void HandleMGT(const MasterGuideTable*);
00144 void HandleVCT(uint tsid, const VirtualChannelTable*);
00145
00146
00147 void HandleNIT(const NetworkInformationTable*);
00148 void HandleSDT(uint tsid, const ServiceDescriptionTable*);
00149 void HandleTDT(const TimeDateTable*) {}
00150
00151
00152 void HandleNITo(const NetworkInformationTable*) {}
00153 void HandleSDTo(uint tsid, const ServiceDescriptionTable*);
00154 void HandleBAT(const BouquetAssociationTable*);
00155
00156 private:
00157
00158 DTVChannel *GetDTVChannel(void);
00159 const DTVChannel *GetDTVChannel(void) const;
00160 V4LChannel *GetV4LChannel(void);
00161 HDHRChannel *GetHDHRChannel(void);
00162 DVBChannel *GetDVBChannel(void);
00163 const DVBChannel *GetDVBChannel(void) const;
00164
00165 void run(void);
00166
00167 bool HasTimedOut(void);
00168 void HandleActiveScan(void);
00169 bool Tune(const transport_scan_items_it_t transport);
00170 uint InsertMultiplex(const transport_scan_items_it_t transport);
00171 void ScanTransport(const transport_scan_items_it_t transport);
00172 DTVTunerType GuessDTVTunerType(DTVTunerType) const;
00173
00175 inline void UpdateScanPercentCompleted(void);
00176
00177 bool CheckImportedList(const DTVChannelInfoList&,
00178 uint mpeg_program_num,
00179 QString &service_name,
00180 QString &callsign,
00181 QString &common_status_info);
00182
00183 void IgnoreDataOnlyMsg( const QString &name, int aux_num);
00184 void IgnoreEmptyChanMsg(const QString &name, int aux_num);
00185 void IgnoreAudioOnlyMsg(const QString &name, int aux_num);
00186 void IgnoreEncryptedMsg(const QString &name, int aux_num);
00187
00188 bool TestNextProgramEncryption(void);
00189 void UpdateScanTransports(const NetworkInformationTable *nit);
00190 bool UpdateChannelInfo(bool wait_until_complete);
00191
00192 void HandleAllGood(void);
00193
00194 bool AddToList(uint mplexid);
00195
00196 static QString loc(const ChannelScanSM*);
00197
00198 static const uint kDVBTableTimeout;
00199 static const uint kATSCTableTimeout;
00200 static const uint kMPEGTableTimeout;
00201
00202 private:
00203
00204 ScanMonitor *scan_monitor;
00205 ChannelBase *channel;
00206 SignalMonitor *signalMonitor;
00207 int sourceID;
00208 uint signalTimeout;
00209 uint channelTimeout;
00210 uint otherTableTimeout;
00211 uint otherTableTime;
00212 bool setOtherTables;
00213 QString inputname;
00214 bool m_test_decryption;
00215 bool extend_scan_list;
00216
00217
00218 DTVTunerType scanDTVTunerType;
00219
00221 mutable QMutex lock;
00222
00223
00224 bool scanning;
00225 volatile bool threadExit;
00226 bool waitingForTables;
00227 QTime timer;
00228
00229
00230 int transportsScanned;
00231 QSet<uint32_t> ts_scanned;
00232 QMap<uint32_t,DTVMultiplex> extend_transports;
00233 transport_scan_items_t scanTransports;
00234 transport_scan_items_it_t current;
00235 transport_scan_items_it_t nextIt;
00236 bool currentTestingDecryption;
00237 QMap<uint, uint> currentEncryptionStatus;
00238 QMap<uint, bool> currentEncryptionStatusChecked;
00239 QMap<uint64_t, QString> defAuthorities;
00240
00242 ChannelList channelList;
00243 uint channelsFound;
00244 ScannedChannelInfo *currentInfo;
00245
00246
00247 AnalogSignalHandler *analogSignalHandler;
00248
00250 MThread *scannerThread;
00251 };
00252
00253 inline void ChannelScanSM::UpdateScanPercentCompleted(void)
00254 {
00255 int tmp = (transportsScanned * 100) /
00256 (scanTransports.size() + extend_transports.size());
00257 scan_monitor->ScanPercentComplete(tmp);
00258 }
00259
00260 void AnalogSignalHandler::AllGood(void)
00261 {
00262 siscan->HandleAllGood();
00263 }
00264
00265 #endif // SISCAN_H