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
22class 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:
42};
43using pid_cache_t = std::vector<pid_cache_item_t>;
44
49{
50 friend class TestEITFixups;
51
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
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 &name, QString &callsign,
191 QString &tvformat, QString &modulation,
192 QString &freqtable, QString &freqid,
193 int &finetune, uint64_t &frequency,
194 QString &dtv_si_std, int &mpeg_prog_num,
195 uint &atsc_major, uint &atsc_minor,
196 uint &dvb_transportid, uint &dvb_networkid,
197 uint &mplexid, bool &commfree);
198 static int GetProgramNumber(uint sourceid, const QString &channum)
199 { return GetChannelValueInt("serviceid", sourceid, channum); }
200 static QString GetVideoFilters(uint sourceid, const QString &channum)
201 { return GetChannelValueStr("videofilters", sourceid, channum); }
202 static IPTVTuningData GetIPTVTuningData(uint chanid);
203
204 // Are there any other possibly useful sort orders?
205 // e.g. Sorting by sourceid would probably be better done by two distinct
206 // calls to LoadChannels specifying the sourceid
207 enum OrderBy : std::uint8_t
208 {
212 };
213
214 enum GroupBy : std::uint8_t
215 {
218 kChanGroupByChanid // Because of the nature of the query we always need to group
219 };
220
237 static ChannelInfoList LoadChannels(uint startIndex, uint count,
238 uint &totalAvailable,
239 bool ignoreHidden = true,
240 OrderBy orderBy = kChanOrderByChanNum,
241 GroupBy groupBy = kChanGroupByChanid,
242 uint sourceID = 0,
243 uint channelGroupID = 0,
244 bool liveTVOnly = false,
245 const QString& callsign = "",
246 const QString& channum = "",
247 bool ignoreUntunable = true);
248
253 uint sourceid, bool visible_only,
254 const QString &group_by = QString(), uint channel_groupid = 0)
255 {
256 return GetChannelsInternal(sourceid, visible_only, false,
257 group_by, channel_groupid);
258 }
259
262
266 {
267 return GetChannelsInternal(sourceid, false, true, QString(), 0);
268 }
269 static std::vector<uint> GetChanIDs(int sourceid = -1, bool onlyVisible = false);
270 static uint GetChannelCount(int sourceid = -1);
271 static void SortChannels(ChannelInfoList &list, const QString &order,
272 bool eliminate_duplicates = false);
273 static int GetNearestChannel(const ChannelInfoList &list,
274 const QString &channum);
275
276 static uint GetNextChannel(const ChannelInfoList &sorted,
277 uint old_chanid,
278 uint mplexid_restriction,
279 uint chanid_restriction,
280 ChannelChangeDirection direction,
281 bool skip_non_visible = true,
282 bool skip_same_channum_and_callsign = false,
283 bool skip_other_sources = false);
284
285 static QString GetChannelValueStr(const QString &channel_field,
286 uint sourceid,
287 const QString &channum);
288
289 static int GetChannelValueInt(const QString &channel_field,
290 uint sourceid,
291 const QString &channum);
292
293 static QString GetChannelNumber(uint sourceid,
294 const QString &channel_name);
295
296 static bool IsOnSameMultiplex(uint srcid,
297 const QString &new_channum,
298 const QString &old_channum);
299
300 static QStringList GetValidRecorderList(uint chanid,
301 const QString &channum);
302
303 static bool IsConflicting(const QString &channum,
304 uint sourceid = 0, uint excluded_chanid = 0)
305 {
306 std::vector<uint> chanids = GetConflicting(channum, sourceid);
307 return (chanids.size() > 1) ||
308 ((1 == chanids.size()) && (chanids[0] != excluded_chanid));
309 }
310
311 static std::vector<uint> GetConflicting(const QString &channum,
312 uint sourceid = 0);
313
318 static QString GetChanNum(int chan_id);
319
324 static std::chrono::minutes GetTimeOffset(int chan_id);
325 static int GetSourceID(int mplexid);
326 static uint GetSourceIDForChannel(uint chanid);
327
328 static QStringList GetInputTypes(uint chanid);
329
330 static bool GetCachedPids(uint chanid, pid_cache_t &pid_cache);
331
332 // Misc sets
333 static bool SetChannelValue(const QString &field_name,
334 const QString& value,
335 uint sourceid,
336 const QString &channum);
337
338 static bool SetChannelValue(const QString &field_name,
339 const QString& value,
340 int chanid);
341
342 static bool SaveCachedPids(uint chanid,
343 const pid_cache_t &_pid_cache,
344 bool delete_all = false);
345
346 static const QString kATSCSeparators;
347
348 private:
352 static ChannelInfoList GetChannelsInternal(
353 uint sourceid, bool visible_only, bool include_disconnected,
354 const QString &group_by, uint channel_groupid);
355 static QString GetChannelStringField(int chan_id, const QString &field);
356
357 static QReadWriteLock s_channelDefaultAuthorityMapLock;
358 static QMap<uint,QString> s_channelDefaultAuthorityMap;
360};
361
362#endif // CHANUTIL_H
ChannelVisibleType
Definition: channelinfo.h:20
std::vector< ChannelInfo > ChannelInfoList
Definition: channelinfo.h:130
std::vector< pid_cache_item_t > pid_cache_t
Definition: channelutil.h:43
Collection of helper utilities for channel DB use.
Definition: channelutil.h:49
static bool s_channelDefaultAuthority_runInit
Definition: channelutil.h:359
static QMap< uint, QString > s_channelDefaultAuthorityMap
Definition: channelutil.h:358
static QReadWriteLock s_channelDefaultAuthorityMapLock
Definition: channelutil.h:357
static bool CreateIPTVTuningData(uint channel_id, const IPTVTuningData &tuning)
Definition: channelutil.h:155
static int GetProgramNumber(uint sourceid, const QString &channum)
Definition: channelutil.h:198
static QString GetVideoFilters(uint sourceid, const QString &channum)
Definition: channelutil.h:200
static const QString kATSCSeparators
Definition: channelutil.h:346
static bool IsATSCChannel(uint sourceid, const QString &channum)
Definition: channelutil.h:100
@ kChanGroupByCallsignAndChannum
Definition: channelutil.h:217
@ kChanGroupByCallsign
Definition: channelutil.h:216
Q_DECLARE_TR_FUNCTIONS(ChannelUtil)
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:265
static std::vector< uint > GetInputIDs(uint chanid)
static int GetChanID(uint sourceid, const QString &channum)
Definition: channelutil.h:185
static ChannelInfoList GetChannels(uint sourceid, bool visible_only, const QString &group_by=QString(), uint channel_groupid=0)
Definition: channelutil.h:252
static bool IsConflicting(const QString &channum, uint sourceid=0, uint excluded_chanid=0)
Definition: channelutil.h:303
@ kChanOrderByChanNum
Definition: channelutil.h:209
@ kChanOrderByLiveTV
Definition: channelutil.h:211
This table tells the decoder on which PIDs to find other tables.
Definition: dvbtables.h:34
uint GetPID(void) const
Definition: channelutil.h:30
uint GetComposite(void) const
Definition: channelutil.h:38
uint GetStreamID(void) const
Definition: channelutil.h:31
pid_cache_item_t(uint pid, uint sid_tid)
Definition: channelutil.h:28
bool IsPCRPID(void) const
Definition: channelutil.h:36
bool IsPermanent(void) const
Definition: channelutil.h:37
pid_cache_item_t()=default
uint GetID(void) const
Definition: channelutil.h:35
uint GetTableID(void) const
Definition: channelutil.h:33
unsigned int uint
Definition: compat.h:60
#define minor(X)
Definition: compat.h:58
#define MTV_PUBLIC
Definition: mythtvexp.h:11
string version
Definition: giantbomb.py:185
ChannelChangeDirection
ChannelChangeDirection is an enumeration of possible channel changing directions.
Definition: tv.h:32