MythTV  master
channelutil.h
Go to the documentation of this file.
1 // -*- Mode: c++ -*-
2 #ifndef CHANUTIL_H
3 #define CHANUTIL_H
4 
5 // C++ headers
6 #include <cstdint>
7 #include <deque>
8 #include <vector>
9 
10 // Qt headers
11 #include <QString>
12 #include <QCoreApplication>
13 
14 // MythTV headers
15 #include "mythtvexp.h"
16 #include "dtvmultiplex.h"
17 #include "channelinfo.h"
18 #include "iptvtuningdata.h"
19 #include "tv.h" // for CHANNEL_DIRECTION
20 
22 class TestEITFixups;
23 
25 {
26  public:
27  pid_cache_item_t() = default;
28  pid_cache_item_t(uint pid, uint sid_tid) :
29  m_pid(pid), m_sidTid(sid_tid) {}
30  uint GetPID(void) const { return m_pid; }
31  uint GetStreamID(void) const
32  { return (m_sidTid&0x100) ? GetID() : 0; }
33  uint GetTableID(void) const
34  { return (m_sidTid&0x100) ? 0 : GetID(); }
35  uint GetID(void) const { return m_sidTid & 0xff; }
36  bool IsPCRPID(void) const { return ( m_sidTid&0x200 ) != 0; }
37  bool IsPermanent(void) const { return ( m_sidTid&0x10000 ) != 0; }
38  uint GetComposite(void) const { return m_sidTid; }
39  private:
40  uint m_pid {0};
42 };
43 using pid_cache_t = std::vector<pid_cache_item_t>;
44 
49 {
50  friend class TestEITFixups;
51 
52  Q_DECLARE_TR_FUNCTIONS(ChannelUtil);
53 
54  public:
55  // Multiplex Stuff
56 
57  static uint CreateMultiplex(
58  int sourceid, const QString& sistandard,
59  uint64_t frequency, const QString& modulation,
60  int transport_id = -1, int network_id = -1);
61 
62  static uint CreateMultiplex(
63  int sourceid, const QString& sistandard,
64  uint64_t frequency, const QString& modulation,
65  // DVB specific
66  int transport_id, int network_id,
67  int symbol_rate, signed char bandwidth,
68  signed char polarity, signed char inversion,
69  signed char trans_mode,
70  const QString& inner_FEC, const QString& constellation,
71  signed char hierarchy, const QString& hp_code_rate,
72  const QString& lp_code_rate, const QString& guard_interval,
73  const QString& mod_sys, const QString& rolloff);
74 
75  static uint CreateMultiplex(uint sourceid, const DTVMultiplex &mux,
76  int transport_id, int network_id);
77 
78  static std::vector<uint> CreateMultiplexes(
79  int sourceid, const NetworkInformationTable *nit);
80 
81  static uint GetMplexID(uint sourceid, const QString &channum);
82  static int GetMplexID(uint sourceid, uint64_t frequency);
83  static int GetMplexID(uint sourceid, uint64_t frequency,
84  uint transport_id, uint network_id);
85  static int GetMplexID(uint sourceid,
86  uint transport_id, uint network_id);
87  static uint GetMplexID(uint chanid);
88  static int GetBetterMplexID(int current_mplexid,
89  int transport_id, int network_id);
90 
91  static bool GetTuningParams(uint mplexid,
92  QString &modulation,
93  uint64_t &frequency,
94  uint &dvb_transportid,
95  uint &dvb_networkid,
96  QString &si_std);
97 
98  static bool GetATSCChannel(uint sourceid, const QString &channum,
99  uint &major, uint &minor);
100  static bool IsATSCChannel(uint sourceid, const QString &channum)
101  {
102  uint m1 = 0;
103  uint m2 = 0;
104  GetATSCChannel(sourceid, channum, m1,m2);
105  return m2 != 0U;
106  }
107 
108  // Channel/Service Stuff
109  static int CreateChanID(uint sourceid, const QString &chan_num);
110 
111  static bool CreateChannel(uint db_mplexid,
112  uint db_sourceid,
113  uint new_channel_id,
114  const QString &callsign,
115  const QString &service_name,
116  const QString &chan_num,
117  uint service_id,
118  uint atsc_major_channel,
119  uint atsc_minor_channel,
120  bool use_on_air_guide,
121  ChannelVisibleType visible,
122  const QString &freqid,
123  const QString& icon = QString(),
124  QString format = "Default",
125  const QString& xmltvid = QString(),
126  const QString& default_authority = QString(),
127  uint service_type = 0,
128  int recpriority = 0,
129  int tmOffset = 0,
130  int commMethod = -1);
131 
132  static bool UpdateChannel(uint db_mplexid,
133  uint source_id,
134  uint channel_id,
135  const QString &callsign,
136  const QString &service_name,
137  const QString &chan_num,
138  uint service_id,
139  uint atsc_major_channel,
140  uint atsc_minor_channel,
141  bool use_on_air_guide,
142  ChannelVisibleType visible,
143  const QString& freqid = QString(),
144  const QString& icon = QString(),
145  QString format = QString(),
146  const QString& xmltvid = QString(),
147  const QString& default_authority = QString(),
148  uint service_type = 0,
149  // note INT_MIN is invalid for these fields
150  // to indicate that they are not to be updated
151  int recpriority = INT_MIN,
152  int tmOffset = INT_MIN,
153  int commMethod = INT_MIN);
154 
155  static bool CreateIPTVTuningData(
156  uint channel_id, const IPTVTuningData &tuning)
157  {
158  return UpdateIPTVTuningData(channel_id, tuning);
159  }
160 
161  static bool UpdateIPTVTuningData(
162  uint channel_id, const IPTVTuningData &tuning);
163 
164  static void UpdateInsertInfoFromDB(ChannelInsertInfo &chan);
165  static void UpdateChannelNumberFromDB(ChannelInsertInfo &chan);
166 
167  static bool DeleteChannel(uint channel_id);
168 
169  static bool SetVisible(uint channel_id, ChannelVisibleType visible);
170 
171  static bool SetServiceVersion(int mplexid, int version);
172 
173  static int GetChanID(int db_mplexid, int service_transport_id,
174  int major_channel, int minor_channel,
175  int program_number);
176 
177  static int GetServiceVersion(int mplexid);
178 
179  // Misc gets
180  static QString GetDefaultAuthority(uint chanid);
181  static QString GetIcon(uint chanid);
182  static std::vector<uint> GetInputIDs(uint chanid);
183  static QString GetUnknownCallsign(void);
184  static uint FindChannel(uint sourceid, const QString &freqid);
185  static int GetChanID(uint sourceid, const QString &channum)
186  { return GetChannelValueInt("chanid", sourceid, channum); }
187  static bool GetChannelData(
188  uint sourceid,
189  uint &chanid, const QString &channum,
190  QString &tvformat, QString &modulation,
191  QString &freqtable, QString &freqid,
192  int &finetune, uint64_t &frequency,
193  QString &dtv_si_std, int &mpeg_prog_num,
194  uint &atsc_major, uint &atsc_minor,
195  uint &dvb_transportid, uint &dvb_networkid,
196  uint &mplexid, bool &commfree);
197  static int GetProgramNumber(uint sourceid, const QString &channum)
198  { return GetChannelValueInt("serviceid", sourceid, channum); }
199  static QString GetVideoFilters(uint sourceid, const QString &channum)
200  { return GetChannelValueStr("videofilters", sourceid, channum); }
201  static IPTVTuningData GetIPTVTuningData(uint chanid);
202 
203  // Are there any other possibly useful sort orders?
204  // e.g. Sorting by sourceid would probably be better done by two distinct
205  // calls to LoadChannels specifying the sourceid
206  enum OrderBy
207  {
211  };
212 
213  enum GroupBy
214  {
217  kChanGroupByChanid // Because of the nature of the query we always need to group
218  };
219 
236  static ChannelInfoList LoadChannels(uint startIndex, uint count,
237  uint &totalAvailable,
238  bool ignoreHidden = true,
239  OrderBy orderBy = kChanOrderByChanNum,
240  GroupBy groupBy = kChanGroupByChanid,
241  uint sourceID = 0,
242  uint channelGroupID = 0,
243  bool liveTVOnly = false,
244  const QString& callsign = "",
245  const QString& channum = "",
246  bool ignoreUntunable = true);
247 
252  uint sourceid, bool visible_only,
253  const QString &group_by = QString(), uint channel_groupid = 0)
254  {
255  return GetChannelsInternal(sourceid, visible_only, false,
256  group_by, channel_groupid);
257  }
258 
261 
265  {
266  return GetChannelsInternal(sourceid, false, true, QString(), 0);
267  }
268  static std::vector<uint> GetChanIDs(int sourceid = -1, bool onlyVisible = false);
269  static uint GetChannelCount(int sourceid = -1);
270  static void SortChannels(ChannelInfoList &list, const QString &order,
271  bool eliminate_duplicates = false);
272  static int GetNearestChannel(const ChannelInfoList &list,
273  const QString &channum);
274 
275  static uint GetNextChannel(const ChannelInfoList &sorted,
276  uint old_chanid,
277  uint mplexid_restriction,
278  uint chanid_restriction,
279  ChannelChangeDirection direction,
280  bool skip_non_visible = true,
281  bool skip_same_channum_and_callsign = false,
282  bool skip_other_sources = false);
283 
284  static QString GetChannelValueStr(const QString &channel_field,
285  uint sourceid,
286  const QString &channum);
287 
288  static int GetChannelValueInt(const QString &channel_field,
289  uint sourceid,
290  const QString &channum);
291 
292  static bool IsOnSameMultiplex(uint srcid,
293  const QString &new_channum,
294  const QString &old_channum);
295 
296  static QStringList GetValidRecorderList(uint chanid,
297  const QString &channum);
298 
299  static bool IsConflicting(const QString &channum,
300  uint sourceid = 0, uint excluded_chanid = 0)
301  {
302  std::vector<uint> chanids = GetConflicting(channum, sourceid);
303  return (chanids.size() > 1) ||
304  ((1 == chanids.size()) && (chanids[0] != excluded_chanid));
305  }
306 
307  static std::vector<uint> GetConflicting(const QString &channum,
308  uint sourceid = 0);
309 
314  static QString GetChanNum(int chan_id);
315 
320  static std::chrono::minutes GetTimeOffset(int chan_id);
321  static int GetSourceID(int mplexid);
322  static uint GetSourceIDForChannel(uint chanid);
323 
324  static QStringList GetInputTypes(uint chanid);
325 
326  static bool GetCachedPids(uint chanid, pid_cache_t &pid_cache);
327 
328  // Misc sets
329  static bool SetChannelValue(const QString &field_name,
330  const QString& value,
331  uint sourceid,
332  const QString &channum);
333 
334  static bool SetChannelValue(const QString &field_name,
335  const QString& value,
336  int chanid);
337 
338  static bool SaveCachedPids(uint chanid,
339  const pid_cache_t &_pid_cache,
340  bool delete_all = false);
341 
342  static const QString kATSCSeparators;
343 
344  private:
348  static ChannelInfoList GetChannelsInternal(
349  uint sourceid, bool visible_only, bool include_disconnected,
350  const QString &group_by, uint channel_groupid);
351  static QString GetChannelStringField(int chan_id, const QString &field);
352 
353  static QReadWriteLock s_channelDefaultAuthorityMapLock;
354  static QMap<uint,QString> s_channelDefaultAuthorityMap;
356 };
357 
358 #endif // CHANUTIL_H
DTVMultiplex
Definition: dtvmultiplex.h:24
tv.h
ChannelChangeDirection
ChannelChangeDirection
ChannelChangeDirection is an enumeration of possible channel changing directions.
Definition: tv.h:28
pid_cache_item_t
Definition: channelutil.h:24
ChannelUtil::OrderBy
OrderBy
Definition: channelutil.h:206
mythtvexp.h
ChannelUtil::GetProgramNumber
static int GetProgramNumber(uint sourceid, const QString &channum)
Definition: channelutil.h:197
pid_cache_item_t::pid_cache_item_t
pid_cache_item_t()=default
ChannelUtil::kChanOrderByLiveTV
@ kChanOrderByLiveTV
Definition: channelutil.h:210
ChannelUtil::kChanOrderByName
@ kChanOrderByName
Definition: channelutil.h:209
pid_cache_item_t::IsPCRPID
bool IsPCRPID(void) const
Definition: channelutil.h:36
dtvmultiplex.h
ChannelUtil::GetChanID
static int GetChanID(uint sourceid, const QString &channum)
Definition: channelutil.h:185
ChannelInsertInfo
Definition: channelinfo.h:133
ChannelUtil::s_channelDefaultAuthorityMap
static QMap< uint, QString > s_channelDefaultAuthorityMap
Definition: channelutil.h:354
minor
#define minor(X)
Definition: compat.h:78
pid_cache_item_t::GetTableID
uint GetTableID(void) const
Definition: channelutil.h:33
ChannelUtil::IsATSCChannel
static bool IsATSCChannel(uint sourceid, const QString &channum)
Definition: channelutil.h:100
pid_cache_item_t::IsPermanent
bool IsPermanent(void) const
Definition: channelutil.h:37
pid_cache_t
std::vector< pid_cache_item_t > pid_cache_t
Definition: channelutil.h:43
pid_cache_item_t::GetID
uint GetID(void) const
Definition: channelutil.h:35
ChannelUtil::s_channelDefaultAuthorityMapLock
static QReadWriteLock s_channelDefaultAuthorityMapLock
Definition: channelutil.h:353
IPTVTuningData
Definition: iptvtuningdata.h:21
iptvtuningdata.h
ChannelVisibleType
ChannelVisibleType
Definition: channelinfo.h:20
ChannelUtil::s_channelDefaultAuthority_runInit
static bool s_channelDefaultAuthority_runInit
Definition: channelutil.h:355
ChannelUtil::GetChannels
static ChannelInfoList GetChannels(uint sourceid, bool visible_only, const QString &group_by=QString(), uint channel_groupid=0)
Definition: channelutil.h:251
uint
unsigned int uint
Definition: compat.h:81
pid_cache_item_t::GetComposite
uint GetComposite(void) const
Definition: channelutil.h:38
pid_cache_item_t::GetStreamID
uint GetStreamID(void) const
Definition: channelutil.h:31
ChannelUtil::IsConflicting
static bool IsConflicting(const QString &channum, uint sourceid=0, uint excluded_chanid=0)
Definition: channelutil.h:299
ChannelUtil::GetVideoFilters
static QString GetVideoFilters(uint sourceid, const QString &channum)
Definition: channelutil.h:199
MTV_PUBLIC
#define MTV_PUBLIC
Definition: mythtvexp.h:15
channelinfo.h
pid_cache_item_t::GetPID
uint GetPID(void) const
Definition: channelutil.h:30
ChannelUtil::GroupBy
GroupBy
Definition: channelutil.h:213
ChannelUtil::CreateIPTVTuningData
static bool CreateIPTVTuningData(uint channel_id, const IPTVTuningData &tuning)
Definition: channelutil.h:155
ChannelUtil::kChanGroupByCallsignAndChannum
@ kChanGroupByCallsignAndChannum
Definition: channelutil.h:216
pid_cache_item_t::m_pid
uint m_pid
Definition: channelutil.h:40
pid_cache_item_t::m_sidTid
uint m_sidTid
Definition: channelutil.h:41
ChannelUtil::GetAllChannels
static ChannelInfoList GetAllChannels(uint sourceid)
Returns channels that are not connected to an input and channels that are not marked as visible.
Definition: channelutil.h:264
nv_python_libs.bbciplayer.bbciplayer_api.version
string version
Definition: bbciplayer_api.py:77
pid_cache_item_t::pid_cache_item_t
pid_cache_item_t(uint pid, uint sid_tid)
Definition: channelutil.h:28
ChannelUtil::kATSCSeparators
static const QString kATSCSeparators
Definition: channelutil.h:342
ChannelUtil::kChanOrderByChanNum
@ kChanOrderByChanNum
Definition: channelutil.h:208
ChannelUtil::kChanGroupByCallsign
@ kChanGroupByCallsign
Definition: channelutil.h:215
ChannelUtil
Collection of helper utilities for channel DB use.
Definition: channelutil.h:48
NetworkInformationTable
This table tells the decoder on which PIDs to find other tables.
Definition: dvbtables.h:28
ChannelInfoList
std::vector< ChannelInfo > ChannelInfoList
Definition: channelinfo.h:131