| 1 | // -*- Mode: c++ -*-
|
|---|
| 2 | // Copyright (c) 2003-2004, Daniel Thor Kristjansson
|
|---|
| 3 | #ifndef ATSCSTREAMDATA_H_
|
|---|
| 4 | #define ATSCSTREAMDATA_H_
|
|---|
| 5 |
|
|---|
| 6 | #include "mpegstreamdata.h"
|
|---|
| 7 | #include "mythtvexp.h"
|
|---|
| 8 |
|
|---|
| 9 | typedef QMap<uint, uint_vec_t> pid_tsid_vec_t;
|
|---|
| 10 | typedef TerrestrialVirtualChannelTable* tvct_ptr_t;
|
|---|
| 11 | typedef TerrestrialVirtualChannelTable const* tvct_const_ptr_t;
|
|---|
| 12 | typedef CableVirtualChannelTable* cvct_ptr_t;
|
|---|
| 13 | typedef CableVirtualChannelTable const* cvct_const_ptr_t;
|
|---|
| 14 | typedef vector<const TerrestrialVirtualChannelTable*> tvct_vec_t;
|
|---|
| 15 | typedef vector<const CableVirtualChannelTable*> cvct_vec_t;
|
|---|
| 16 | typedef QMap<uint, tvct_ptr_t> tvct_cache_t;
|
|---|
| 17 | typedef QMap<uint, cvct_ptr_t> cvct_cache_t;
|
|---|
| 18 | typedef QMap<uint, uint> atsc_eit_pid_map_t;
|
|---|
| 19 | typedef QMap<uint, uint> atsc_ett_pid_map_t;
|
|---|
| 20 |
|
|---|
| 21 | typedef vector<ATSCMainStreamListener*> atsc_main_listener_vec_t;
|
|---|
| 22 | typedef vector<SCTEMainStreamListener*> scte_main_listener_vec_t;
|
|---|
| 23 | typedef vector<ATSCAuxStreamListener*> atsc_aux_listener_vec_t;
|
|---|
| 24 | typedef vector<ATSCEITStreamListener*> atsc_eit_listener_vec_t;
|
|---|
| 25 | typedef vector<ATSC81EITStreamListener*> atsc81_eit_listener_vec_t;
|
|---|
| 26 |
|
|---|
| 27 | class MTV_PUBLIC ATSCStreamData : virtual public MPEGStreamData
|
|---|
| 28 | {
|
|---|
| 29 | public:
|
|---|
| 30 | ATSCStreamData(int desiredMajorChannel,
|
|---|
| 31 | int desiredMinorChannel,
|
|---|
| 32 | int cardnum, bool cacheTables = false);
|
|---|
| 33 | virtual ~ATSCStreamData();
|
|---|
| 34 |
|
|---|
| 35 | void Reset(void) { Reset(-1, -1); }
|
|---|
| 36 | void Reset(int desiredProgram);
|
|---|
| 37 | void Reset(int desiredMajorChannel, int desiredMinorChannel);
|
|---|
| 38 | void SetDesiredChannel(int major, int minor);
|
|---|
| 39 |
|
|---|
| 40 | // Table processing
|
|---|
| 41 | virtual bool HandleTables(uint pid, const PSIPTable &psip);
|
|---|
| 42 | virtual bool IsRedundant(uint, const PSIPTable&) const;
|
|---|
| 43 |
|
|---|
| 44 | /// Current UTC to GPS time offset in seconds
|
|---|
| 45 | uint GPSOffset(void) const { return _GPS_UTC_offset; }
|
|---|
| 46 |
|
|---|
| 47 | inline uint GetATSCMajorMinor(uint eit_sourceid) const;
|
|---|
| 48 | inline bool HasATSCMajorMinorMap(void) const;
|
|---|
| 49 | bool HasEITPIDChanges(const uint_vec_t &in_use_pid) const;
|
|---|
| 50 | bool GetEITPIDChanges(const uint_vec_t &in_use_pid,
|
|---|
| 51 | uint_vec_t &pids_to_add,
|
|---|
| 52 | uint_vec_t &pids_to_del) const;
|
|---|
| 53 |
|
|---|
| 54 | // Table versions
|
|---|
| 55 | void SetVersionMGT(int version)
|
|---|
| 56 | { _mgt_version = version; }
|
|---|
| 57 | void SetVersionTVCT(uint tsid, int version)
|
|---|
| 58 | { _tvct_version[tsid] = version; }
|
|---|
| 59 | void SetVersionCVCT(uint tsid, int version)
|
|---|
| 60 | { _cvct_version[tsid] = version; }
|
|---|
| 61 | void SetVersionRRT(uint region, int version)
|
|---|
| 62 | { _rrt_version[region&0xff] = version; }
|
|---|
| 63 |
|
|---|
| 64 | int VersionMGT() const { return _mgt_version; }
|
|---|
| 65 | inline int VersionTVCT(uint tsid) const;
|
|---|
| 66 | inline int VersionCVCT(uint tsid) const;
|
|---|
| 67 | inline int VersionRRT(uint region) const;
|
|---|
| 68 |
|
|---|
| 69 | // Caching
|
|---|
| 70 | bool HasCachedMGT(bool current = true) const;
|
|---|
| 71 | bool HasCachedTVCT(uint pid, bool current = true) const;
|
|---|
| 72 | bool HasCachedCVCT(uint pid, bool current = true) const;
|
|---|
| 73 |
|
|---|
| 74 | bool HasCachedAllTVCTs(bool current = true) const;
|
|---|
| 75 | bool HasCachedAllCVCTs(bool current = true) const;
|
|---|
| 76 | bool HasCachedAllVCTs(bool current = true) const
|
|---|
| 77 | { return HasCachedAllTVCTs(current) && HasCachedAllCVCTs(current); }
|
|---|
| 78 |
|
|---|
| 79 | bool HasCachedAnyTVCTs(bool current = true) const;
|
|---|
| 80 | bool HasCachedAnyCVCTs(bool current = true) const;
|
|---|
| 81 | bool HasCachedAnyVCTs(bool current = true) const
|
|---|
| 82 | { return HasCachedAnyTVCTs(current) || HasCachedAnyCVCTs(current); }
|
|---|
| 83 |
|
|---|
| 84 | const MasterGuideTable *GetCachedMGT(bool current = true) const;
|
|---|
| 85 | tvct_const_ptr_t GetCachedTVCT(uint pid, bool current = true) const;
|
|---|
| 86 | cvct_const_ptr_t GetCachedCVCT(uint pid, bool current = true) const;
|
|---|
| 87 |
|
|---|
| 88 | tvct_vec_t GetCachedTVCTs(bool current = true) const;
|
|---|
| 89 | cvct_vec_t GetCachedCVCTs(bool current = true) const;
|
|---|
| 90 |
|
|---|
| 91 | void ReturnCachedTVCTTables(tvct_vec_t&) const;
|
|---|
| 92 | void ReturnCachedCVCTTables(cvct_vec_t&) const;
|
|---|
| 93 |
|
|---|
| 94 | bool HasChannel(uint major, uint minor) const;
|
|---|
| 95 |
|
|---|
| 96 | // Single channel stuff
|
|---|
| 97 | int DesiredMajorChannel(void) const { return _desired_major_channel; }
|
|---|
| 98 | int DesiredMinorChannel(void) const { return _desired_minor_channel; }
|
|---|
| 99 |
|
|---|
| 100 | void AddATSCMainListener(ATSCMainStreamListener*);
|
|---|
| 101 | void AddSCTEMainListener(SCTEMainStreamListener*);
|
|---|
| 102 | void AddATSCAuxListener(ATSCAuxStreamListener*);
|
|---|
| 103 | void AddATSCEITListener(ATSCEITStreamListener*);
|
|---|
| 104 | void AddATSC81EITListener(ATSC81EITStreamListener*);
|
|---|
| 105 |
|
|---|
| 106 | void RemoveATSCMainListener(ATSCMainStreamListener*);
|
|---|
| 107 | void RemoveSCTEMainListener(SCTEMainStreamListener*);
|
|---|
| 108 | void RemoveATSCAuxListener(ATSCAuxStreamListener*);
|
|---|
| 109 | void RemoveATSCEITListener(ATSCEITStreamListener*);
|
|---|
| 110 | void RemoveATSC81EITListener(ATSC81EITStreamListener*);
|
|---|
| 111 |
|
|---|
| 112 | private:
|
|---|
| 113 | void ProcessMGT(const MasterGuideTable*);
|
|---|
| 114 | void ProcessVCT(uint tsid, const VirtualChannelTable*);
|
|---|
| 115 | void ProcessTVCT(uint tsid, const TerrestrialVirtualChannelTable*);
|
|---|
| 116 | void ProcessCVCT(uint tsid, const CableVirtualChannelTable*);
|
|---|
| 117 |
|
|---|
| 118 | // Caching
|
|---|
| 119 | void CacheMGT(MasterGuideTable*);
|
|---|
| 120 | void CacheTVCT(uint pid, TerrestrialVirtualChannelTable*);
|
|---|
| 121 | void CacheCVCT(uint pid, CableVirtualChannelTable*);
|
|---|
| 122 | protected:
|
|---|
| 123 | virtual bool DeleteCachedTable(PSIPTable *psip) const;
|
|---|
| 124 |
|
|---|
| 125 | private:
|
|---|
| 126 | uint _GPS_UTC_offset;
|
|---|
| 127 | mutable bool _atsc_eit_reset;
|
|---|
| 128 | atsc_eit_pid_map_t _atsc_eit_pids;
|
|---|
| 129 | atsc_ett_pid_map_t _atsc_ett_pids;
|
|---|
| 130 |
|
|---|
| 131 | QMap<uint,uint> _sourceid_to_atsc_maj_min;
|
|---|
| 132 |
|
|---|
| 133 |
|
|---|
| 134 | // Signals
|
|---|
| 135 | atsc_main_listener_vec_t _atsc_main_listeners;
|
|---|
| 136 | scte_main_listener_vec_t _scte_main_listeners;
|
|---|
| 137 | atsc_aux_listener_vec_t _atsc_aux_listeners;
|
|---|
| 138 | atsc_eit_listener_vec_t _atsc_eit_listeners;
|
|---|
| 139 | atsc81_eit_listener_vec_t _atsc81_eit_listeners;
|
|---|
| 140 |
|
|---|
| 141 | // Table versions
|
|---|
| 142 | int _mgt_version;
|
|---|
| 143 | QMap<uint, int> _tvct_version;
|
|---|
| 144 | QMap<uint, int> _cvct_version;
|
|---|
| 145 | QMap<uint, int> _rrt_version;
|
|---|
| 146 | TableStatusMap _eit_status;
|
|---|
| 147 |
|
|---|
| 148 | // Caching
|
|---|
| 149 | mutable MasterGuideTable *_cached_mgt;
|
|---|
| 150 | mutable tvct_cache_t _cached_tvcts; // pid->tvct
|
|---|
| 151 | mutable cvct_cache_t _cached_cvcts; // pid->cvct
|
|---|
| 152 |
|
|---|
| 153 | // Single program variables
|
|---|
| 154 | int _desired_major_channel;
|
|---|
| 155 | int _desired_minor_channel;
|
|---|
| 156 | };
|
|---|
| 157 |
|
|---|
| 158 |
|
|---|
| 159 | inline uint ATSCStreamData::GetATSCMajorMinor(uint eit_sourceid) const
|
|---|
| 160 | {
|
|---|
| 161 | QMutexLocker locker(&_listener_lock);
|
|---|
| 162 | return _sourceid_to_atsc_maj_min[eit_sourceid];
|
|---|
| 163 | }
|
|---|
| 164 |
|
|---|
| 165 | inline bool ATSCStreamData::HasATSCMajorMinorMap(void) const
|
|---|
| 166 | {
|
|---|
| 167 | QMutexLocker locker(&_listener_lock);
|
|---|
| 168 | return !_sourceid_to_atsc_maj_min.empty();
|
|---|
| 169 | }
|
|---|
| 170 |
|
|---|
| 171 | inline int ATSCStreamData::VersionTVCT(uint tsid) const
|
|---|
| 172 | {
|
|---|
| 173 | const QMap<uint, int>::const_iterator it = _tvct_version.find(tsid);
|
|---|
| 174 | if (it == _tvct_version.end())
|
|---|
| 175 | return -1;
|
|---|
| 176 | return *it;
|
|---|
| 177 | }
|
|---|
| 178 |
|
|---|
| 179 | inline int ATSCStreamData::VersionCVCT(uint tsid) const
|
|---|
| 180 | {
|
|---|
| 181 | const QMap<uint, int>::const_iterator it = _cvct_version.find(tsid);
|
|---|
| 182 | if (it == _cvct_version.end())
|
|---|
| 183 | return -1;
|
|---|
| 184 | return *it;
|
|---|
| 185 | }
|
|---|
| 186 |
|
|---|
| 187 | inline int ATSCStreamData::VersionRRT(uint region) const
|
|---|
| 188 | {
|
|---|
| 189 | const QMap<uint, int>::const_iterator it = _rrt_version.find(region&0xff);
|
|---|
| 190 | if (it == _rrt_version.end())
|
|---|
| 191 | return -1;
|
|---|
| 192 | return *it;
|
|---|
| 193 | }
|
|---|
| 194 |
|
|---|
| 195 | #endif
|
|---|